From 1bd1d38e86c39b13e265f8ff534fc1463c25fef3 Mon Sep 17 00:00:00 2001 From: prascle Date: Mon, 17 Oct 2005 10:29:57 +0000 Subject: [PATCH] PR: merge from branch BR_UnitTests tag mergeto_trunk_17oct05 --- INSTALL | 13 +- Makefile.in | 81 +- README | 327 +- README.FIRST.txt | 50 + bin/VERSION | 2 +- bin/addToKillList.py | 55 + bin/appliskel/.bashrc | 10 + bin/appliskel/CatalogResources.xml | 28 + bin/appliskel/README | 42 + bin/appliskel/SalomeApp.xml | 100 + bin/appliskel/env.d/atFirst.sh | 62 + bin/appliskel/env.d/envProducts.sh | 120 + bin/appliskel/env.d/envSalome.sh | 27 + bin/appliskel/envd | 3 + bin/appliskel/runAppli | 71 + bin/appliskel/runConsole | 25 + bin/appliskel/runParam | 5 + bin/appliskel/runRemote.sh | 56 + bin/appliskel/runSession | 38 + bin/appliskel/runTests | 70 + bin/createAppli.sh | 7 + bin/killSalome.py | 2 +- bin/killSalomeWithPort.py | 10 +- bin/launchConfigureParser.py | 269 +- bin/orbmodule.py | 25 +- bin/runNS.sh | 2 +- bin/runSalome | 13 +- bin/runSalome.py | 262 +- bin/salome.launch | 1 - bin/salomeConsole.py | 2 +- configure.in.base | 41 +- doc/INSTALL.txt | 380 + doc/SALOME_Application.txt | 156 + doc/UnitTests.txt | 157 + doc/salome/Parallelisme_dans_Salome.pdf | Bin 0 -> 175359 bytes doc/salome/Parallelisme_dans_Salome.ps | 15829 ++++++++++++++++ doc/salome/ResourcesManagerManual.pdf | Bin 0 -> 52431 bytes doc/salome/gui/KERNEL/cshdat_robohelp.htm | 12 +- doc/salome/gui/KERNEL/cshdat_webhelp.htm | 6 +- doc/salome/gui/KERNEL/default.css | 310 +- doc/salome/gui/KERNEL/default_ns.css | 40 +- doc/salome/gui/KERNEL/ehelp.xml | 10 + doc/salome/gui/KERNEL/ehlpdhtm.js | 1216 +- doc/salome/gui/KERNEL/image57.gif | Bin 0 -> 7867 bytes doc/salome/gui/KERNEL/image58.gif | Bin 0 -> 6872 bytes doc/salome/gui/KERNEL/image59.gif | Bin 0 -> 4233 bytes doc/salome/gui/KERNEL/image60.gif | Bin 0 -> 5067 bytes doc/salome/gui/KERNEL/image61.gif | Bin 0 -> 3208 bytes doc/salome/gui/KERNEL/kernel.htm | 139 + doc/salome/gui/KERNEL/kernel.log | 272 + doc/salome/gui/KERNEL/kernel_csh.htm | 106 + doc/salome/gui/KERNEL/kernel_rhc.htm | 106 + doc/salome/gui/KERNEL/robohhre.lng | 101 + doc/salome/gui/KERNEL/webhelp.cab | Bin 87764 -> 89619 bytes doc/salome/gui/KERNEL/webhelp.jar | Bin 132680 -> 134517 bytes doc/salome/gui/KERNEL/whcsh_home.htm | 600 + doc/salome/gui/KERNEL/whcshdata.htm | 87 + doc/salome/gui/KERNEL/whdata/whftdata.js | 1 + doc/salome/gui/KERNEL/whdata/whftdata0.htm | 55 +- doc/salome/gui/KERNEL/whdata/whfts.htm | 8 +- doc/salome/gui/KERNEL/whdata/whfts.js | 1 + doc/salome/gui/KERNEL/whdata/whfwdata.js | 1 + doc/salome/gui/KERNEL/whdata/whfwdata0.htm | 1858 +- doc/salome/gui/KERNEL/whdata/whgdata.js | 1 + doc/salome/gui/KERNEL/whdata/whgdata0.htm | 4 +- doc/salome/gui/KERNEL/whdata/whglo.htm | 4 +- doc/salome/gui/KERNEL/whdata/whglo.js | 1 + doc/salome/gui/KERNEL/whdata/whidata.js | 1 + doc/salome/gui/KERNEL/whdata/whidx.htm | 8 +- doc/salome/gui/KERNEL/whdata/whidx.js | 1 + doc/salome/gui/KERNEL/whdata/whtdata.js | 6 + doc/salome/gui/KERNEL/whdata/whtdata0.htm | 52 +- doc/salome/gui/KERNEL/whdata/whtoc.htm | 6 +- doc/salome/gui/KERNEL/whdata/whtoc.js | 3 + doc/salome/gui/KERNEL/whfbody.htm | 4 +- doc/salome/gui/KERNEL/whfdhtml.htm | 4 +- doc/salome/gui/KERNEL/whfform.htm | 4 +- doc/salome/gui/KERNEL/whfhost.js | 41 +- doc/salome/gui/KERNEL/whform.js | 1 + doc/salome/gui/KERNEL/whframes.js | 1 + doc/salome/gui/KERNEL/whgbody.htm | 4 +- doc/salome/gui/KERNEL/whgdata/whlstf0.htm | 16 +- doc/salome/gui/KERNEL/whgdata/whlstf1.htm | 12 +- doc/salome/gui/KERNEL/whgdata/whlstf2.htm | 14 +- doc/salome/gui/KERNEL/whgdata/whlstf3.htm | 22 +- doc/salome/gui/KERNEL/whgdata/whlstf4.htm | 18 +- doc/salome/gui/KERNEL/whgdata/whlstf5.htm | 16 +- doc/salome/gui/KERNEL/whgdata/whlstf6.htm | 16 +- doc/salome/gui/KERNEL/whgdata/whlstf7.htm | 14 +- doc/salome/gui/KERNEL/whgdata/whlstf8.htm | 21 +- doc/salome/gui/KERNEL/whgdata/whlstfl0.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl1.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl10.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl11.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl12.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl13.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl14.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl15.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl16.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl17.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl18.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl19.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl2.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl20.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl21.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl22.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl23.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl24.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl25.htm | 45 + doc/salome/gui/KERNEL/whgdata/whlstfl3.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl4.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl5.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl6.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl7.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl8.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstfl9.htm | 8 +- doc/salome/gui/KERNEL/whgdata/whlstg0.htm | 117 +- doc/salome/gui/KERNEL/whgdata/whlsti0.htm | 9 +- doc/salome/gui/KERNEL/whgdata/whlstt0.htm | 13 +- doc/salome/gui/KERNEL/whgdata/whlstt1.htm | 19 +- doc/salome/gui/KERNEL/whgdata/whlstt2.htm | 21 +- doc/salome/gui/KERNEL/whgdata/whlstt3.htm | 31 +- doc/salome/gui/KERNEL/whgdata/whlstt4.htm | 43 +- doc/salome/gui/KERNEL/whgdata/whnvf30.htm | 7 +- doc/salome/gui/KERNEL/whgdata/whnvf31.htm | 7 +- doc/salome/gui/KERNEL/whgdata/whnvf32.htm | 7 +- doc/salome/gui/KERNEL/whgdata/whnvf33.htm | 7 +- doc/salome/gui/KERNEL/whgdata/whnvl31.htm | 9 +- doc/salome/gui/KERNEL/whgdata/whnvl32.htm | 63 +- doc/salome/gui/KERNEL/whgdata/whnvl33.htm | 9 +- doc/salome/gui/KERNEL/whgdata/whnvp30.htm | 6 +- doc/salome/gui/KERNEL/whgdata/whnvp31.htm | 6 +- doc/salome/gui/KERNEL/whgdata/whnvp32.htm | 7 +- doc/salome/gui/KERNEL/whgdata/whnvp33.htm | 6 +- doc/salome/gui/KERNEL/whgdata/whnvt30.htm | 13 +- doc/salome/gui/KERNEL/whgdata/whnvt31.htm | 11 +- doc/salome/gui/KERNEL/whgdata/whnvt32.htm | 11 +- doc/salome/gui/KERNEL/whgdata/whnvt33.htm | 11 +- doc/salome/gui/KERNEL/whgdef.htm | 4 +- doc/salome/gui/KERNEL/whgdhtml.htm | 4 +- doc/salome/gui/KERNEL/whghost.js | 68 +- doc/salome/gui/KERNEL/whhost.js | 17 +- doc/salome/gui/KERNEL/whibody.htm | 18 +- doc/salome/gui/KERNEL/whidhtml.htm | 4 +- doc/salome/gui/KERNEL/whiform.htm | 4 +- doc/salome/gui/KERNEL/whihost.js | 18 +- doc/salome/gui/KERNEL/whlang.js | 15 +- doc/salome/gui/KERNEL/whmozemu.js | 41 +- doc/salome/gui/KERNEL/whmsg.js | 9 +- doc/salome/gui/KERNEL/whnjs.htm | 18 +- doc/salome/gui/KERNEL/whphost.js | 105 +- doc/salome/gui/KERNEL/whproj.htm | 4 +- doc/salome/gui/KERNEL/whproj.js | 3 + doc/salome/gui/KERNEL/whproj.xml | 4 +- doc/salome/gui/KERNEL/whproxy.js | 13 +- doc/salome/gui/KERNEL/whres.xml | 27 +- doc/salome/gui/KERNEL/whskin_banner.htm | 28 +- doc/salome/gui/KERNEL/whskin_blank.htm | 4 +- doc/salome/gui/KERNEL/whskin_frmset01.htm | 2 +- doc/salome/gui/KERNEL/whskin_frmset010.htm | 4 +- doc/salome/gui/KERNEL/whskin_homepage.htm | 139 + doc/salome/gui/KERNEL/whskin_info.htm | 16 +- doc/salome/gui/KERNEL/whskin_mbars.htm | 5 +- doc/salome/gui/KERNEL/whskin_papplet.htm | 203 +- doc/salome/gui/KERNEL/whskin_pdhtml.htm | 11 +- doc/salome/gui/KERNEL/whskin_pickup.htm | 229 + doc/salome/gui/KERNEL/whskin_plist.htm | 198 +- doc/salome/gui/KERNEL/whskin_tbars.htm | 7 +- doc/salome/gui/KERNEL/whskin_tw.htm | 63 + doc/salome/gui/KERNEL/whst_topics.xml | 3 +- doc/salome/gui/KERNEL/whstart.js | 214 +- doc/salome/gui/KERNEL/whstub.js | 11 +- doc/salome/gui/KERNEL/wht_abge.jpg | Bin 23356 -> 6210 bytes doc/salome/gui/KERNEL/wht_abgi.jpg | Bin 24385 -> 4967 bytes doc/salome/gui/KERNEL/wht_abgw.jpg | Bin 22665 -> 5659 bytes doc/salome/gui/KERNEL/wht_abte.jpg | Bin 8785 -> 9810 bytes doc/salome/gui/KERNEL/wht_abti.jpg | Bin 6985 -> 3863 bytes doc/salome/gui/KERNEL/wht_abtw.jpg | Bin 7382 -> 3973 bytes doc/salome/gui/KERNEL/whtbar.js | 75 +- doc/salome/gui/KERNEL/whtdhtml.htm | 4 +- doc/salome/gui/KERNEL/whthost.js | 452 +- doc/salome/gui/KERNEL/whtopic.js | 628 +- doc/salome/gui/KERNEL/whutils.js | 108 +- doc/salome/gui/KERNEL/whver.js | 91 +- doc/salome/tui/KERNEL/doxyfile | 1 - idl/Makefile.in | 1 - idl/SALOMEDS.idl | 106 +- idl/SALOME_Comm.idl | 33 +- idl/SALOME_Component.idl | 311 +- idl/SALOME_ContainerManager.idl | 25 +- idl/SALOME_MPIContainer.idl | 14 +- resources/CatalogResources.xml | 52 +- resources/KERNELCatalog.xml | 6 +- resources/Plugin.in | 10 + salome_adm/Makefile.in | 2 + salome_adm/unix/SALOMEconfig.h.in | 8 + salome_adm/unix/config_files/ac_cxx_bool.m4 | 2 +- .../unix/config_files/ac_cxx_depend_flag.m4 | 5 +- .../unix/config_files/ac_cxx_mutable.m4 | 2 +- .../unix/config_files/ac_cxx_namespaces.m4 | 2 +- .../ac_cxx_partial_specialization.m4 | 2 +- .../unix/config_files/ac_cxx_typename.m4 | 2 +- salome_adm/unix/config_files/check_boost.m4 | 5 +- salome_adm/unix/config_files/check_cas.m4 | 52 +- salome_adm/unix/config_files/check_cppunit.m4 | 108 + salome_adm/unix/config_files/check_hdf5.m4 | 7 +- salome_adm/unix/config_files/check_lam.m4 | 7 +- salome_adm/unix/config_files/check_lsf.m4 | 10 +- salome_adm/unix/config_files/check_mico.m4 | 7 +- salome_adm/unix/config_files/check_mpi.m4 | 7 +- salome_adm/unix/config_files/check_mpich.m4 | 7 +- salome_adm/unix/config_files/check_msg2qm.m4 | 57 + salome_adm/unix/config_files/check_omniorb.m4 | 7 +- salome_adm/unix/config_files/check_opengl.m4 | 21 +- salome_adm/unix/config_files/check_openpbs.m4 | 10 +- .../unix/config_files/check_pthreads.m4 | 2 +- salome_adm/unix/config_files/check_pyqt.m4 | 305 +- salome_adm/unix/config_files/check_qt.m4 | 34 +- salome_adm/unix/config_files/check_qwt.m4 | 59 +- salome_adm/unix/config_files/check_sip.m4 | 170 +- salome_adm/unix/config_files/check_vtk.m4 | 24 +- salome_adm/unix/config_files/libtool.m4 | 46 +- salome_adm/unix/config_files/production.m4 | 8 +- salome_adm/unix/config_files/pyembed.m4 | 4 +- salome_adm/unix/config_files/python.m4 | 2 +- salome_adm/unix/depend.in | 23 +- salome_adm/unix/make_commence.in | 20 +- salome_adm/unix/make_conclude.in | 44 +- salome_adm/unix/make_module.in | 7 +- src/Basics/BasicsGenericDestructor.cxx | 192 + src/Basics/BasicsGenericDestructor.hxx | 186 + src/Basics/Makefile.in | 52 + src/Basics/Test/BasicMainTest.hxx | 69 + src/Basics/Test/Makefile.in | 61 + src/CASCatch/CASCatch_CatchSignals.cxx | 314 + src/CASCatch/CASCatch_CatchSignals.hxx | 44 + src/CASCatch/CASCatch_ErrorHandler.cxx | 103 + src/CASCatch/CASCatch_ErrorHandler.hxx | 73 + src/CASCatch/CASCatch_Failure.cxx | 107 + src/CASCatch/CASCatch_Failure.hxx | 41 + src/CASCatch/Makefile.in | 37 +- src/Communication/Makefile.in | 2 +- src/Communication/MultiCommException.hxx | 7 +- src/Communication/Receiver.hxx | 30 +- src/Communication/ReceiverFactory.cxx | 181 +- src/Communication/ReceiverFactory.hxx | 6 +- src/Communication/Receivers.cxx | 128 +- src/Communication/Receivers.hxx | 56 +- src/Communication/SALOMEMultiComm.cxx | 2 + src/Communication/SALOMEMultiComm.hxx | 8 +- src/Communication/SALOME_Comm_i.cxx | 116 +- src/Communication/SALOME_Comm_i.hxx | 100 +- src/Communication/SenderFactory.cxx | 45 +- src/Communication/SenderFactory.hxx | 35 +- src/Communication/libSALOME_Comm.i | 117 + src/Container/Component_i.cxx | 778 +- src/Container/Container_i.cxx | 1073 +- src/Container/Container_init_python.cxx | 58 + src/Container/Container_init_python.hxx | 86 + src/Container/Makefile.in | 21 +- src/Container/SALOME_ComponentPy.py | 95 +- src/Container/SALOME_Component_i.hxx | 75 +- src/Container/SALOME_Container.cxx | 200 +- src/Container/SALOME_Container.py | 108 + src/Container/SALOME_ContainerManager.cxx | 252 +- src/Container/SALOME_ContainerManager.hxx | 51 +- .../SALOME_ContainerManagerServer.cxx | 45 + src/Container/SALOME_ContainerPy.py | 118 +- src/Container/SALOME_Container_i.hxx | 93 +- src/DataTypeCatalog/Makefile.in | 5 +- .../SALOME_DataTypeCatalog_Client.cxx | 2 +- .../SALOME_DataTypeCatalog_Handler.hxx | 16 +- .../SALOME_DataTypeCatalog_Server.cxx | 18 +- .../SALOME_DataTypeCatalog_impl.cxx | 4 + .../SALOME_DataTypeCatalog_impl.hxx | 16 +- src/GenericObj/SALOME_GenericObj_i.cc | 4 + src/GenericObj/SALOME_GenericObj_i.hh | 16 +- src/HDFPersist/HDFascii.cc | 24 +- src/HDFPersist/HDFascii.hxx | 4 +- src/HDFPersist/HDFcontainerObject.hxx | 3 +- src/HDFPersist/HDFconvert.cc | 26 +- src/HDFPersist/HDFconvert.hxx | 3 + src/HDFPersist/HDFdataset.cc | 2 +- src/HDFPersist/HDFdataset.hxx | 3 +- src/HDFPersist/HDFdatasetWrite.c | 19 +- src/HDFPersist/HDFfile.cc | 7 +- src/HDFPersist/HDFfile.hxx | 3 +- src/HDFPersist/HDFgroup.hxx | 3 +- src/HDFPersist/HDFinternalObject.cc | 2 + src/HDFPersist/HDFinternalObject.hxx | 3 +- src/HDFPersist/HDFobject.hxx | 3 +- src/KERNEL_PY/Help.py | 141 + src/KERNEL_PY/Makefile.in | 38 + src/KERNEL_PY/PyInterp.py | 101 + src/KERNEL_PY/batchmode_salome.py | 270 + src/KERNEL_PY/import_hook.py | 109 + src/KERNEL_PY/kernel_shared_modules.py | 112 + src/KERNEL_PY/salome.py | 63 + src/KERNEL_PY/salome_ComponentGUI.py | 56 + src/KERNEL_PY/salome_iapp.py | 74 + src/KERNEL_PY/salome_kernel.py | 55 + src/KERNEL_PY/salome_shared_modules.py | 92 + src/KERNEL_PY/salome_study.py | 323 + src/KERNEL_PY/salome_test.py | 486 + src/LifeCycleCORBA/Launchers.cxx | 9 + src/LifeCycleCORBA/Makefile.in | 8 +- src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx | 572 +- src/LifeCycleCORBA/SALOME_LifeCycleCORBA.hxx | 92 +- .../Test/LifeCycleCORBATest.cxx | 650 + .../Test/LifeCycleCORBATest.hxx | 63 + src/LifeCycleCORBA/Test/Makefile.in | 70 + .../Test/TestLifeCycleCORBA.cxx | 18 + src/LifeCycleCORBA/Test/TestLifeCycleCORBA.py | 67 + src/LifeCycleCORBA/Test_LifeCycleCORBA.cxx | 142 + src/LifeCycleCORBA_SWIG/LifeCycleCORBA.py | 41 + src/LifeCycleCORBA_SWIG/Makefile.in | 52 + src/LifeCycleCORBA_SWIG/TestLifeCycleCORBA.py | 18 + .../libSALOME_LifeCycleCORBA.i | 116 + src/Logger/SALOME_Logger_Server.cxx | 116 +- src/Logger/SALOME_Logger_Server.hxx | 9 + src/Logger/SALOME_Trace.cxx | 14 +- src/Logger/SALOME_Trace.py | 2 +- src/Logger/Test/Makefile.in | 61 + src/Logger/Test/TestKiller.py | 36 + src/MPIContainer/MPIContainer_i.cxx | 441 +- src/MPIContainer/MPIContainer_i.hxx | 38 +- src/MPIContainer/Makefile.in | 7 +- src/MPIContainer/SALOME_MPIContainer.cxx | 15 +- src/Makefile.in | 65 +- src/ModuleCatalog/Makefile.in | 14 +- .../SALOME_ModuleCatalog_Acomponent_impl.cxx | 16 +- .../SALOME_ModuleCatalog_Acomponent_impl.hxx | 16 +- .../SALOME_ModuleCatalog_Client.cxx | 10 +- .../SALOME_ModuleCatalog_Handler.hxx | 16 +- .../SALOME_ModuleCatalog_Server.cxx | 16 +- .../SALOME_ModuleCatalog_impl.cxx | 63 +- .../SALOME_ModuleCatalog_impl.hxx | 18 +- src/ModuleGenerator/IDLparser.py | 22 +- src/NamingService/Makefile.in | 1 + .../NamingService_WaitForServerReadiness.cxx | 10 +- .../NamingService_WaitForServerReadiness.hxx | 7 +- src/NamingService/SALOME_NamingService.cxx | 278 +- src/NamingService/SALOME_NamingService.hxx | 39 +- src/NamingService/SALOME_NamingServicePy.py | 18 +- src/NamingService/ServiceUnreachable.hxx | 16 +- src/Notification/NOTIFICATION.cxx | 4 +- src/Notification/NOTIFICATION.hxx | 19 +- src/Notification/NOTIFICATION_Consumer.hxx | 16 +- src/Notification/NOTIFICATION_Supplier.hxx | 16 +- src/Registry/Makefile.in | 4 +- src/Registry/RegistryConnexion.cxx | 6 +- src/Registry/RegistryConnexion.hxx | 16 +- src/Registry/RegistryService.cxx | 16 +- src/Registry/RegistryService.hxx | 22 +- src/Registry/SALOME_Registry_Server.cxx | 20 +- src/ResourcesManager/Makefile.in | 4 +- .../SALOME_LoadRateManager.cxx | 7 + .../SALOME_LoadRateManager.hxx | 26 +- .../SALOME_ResourcesCatalog_Handler.cxx | 526 +- .../SALOME_ResourcesCatalog_Handler.hxx | 185 +- .../SALOME_ResourcesCatalog_Parser.cxx | 160 +- .../SALOME_ResourcesCatalog_Parser.hxx | 123 +- .../SALOME_ResourcesManager.cxx | 893 +- .../SALOME_ResourcesManager.hxx | 148 +- src/RessourcesCatalog/Makefile.in | 4 +- .../SALOME_RessourcesCatalog_Client.cxx | 14 +- .../SALOME_RessourcesCatalog_Handler.hxx | 16 +- .../SALOME_RessourcesCatalog_Server.cxx | 18 +- .../SALOME_RessourcesCatalog_impl.cxx | 4 + .../SALOME_RessourcesCatalog_impl.hxx | 16 +- src/SALOMEDS/Makefile.in | 125 +- src/SALOMEDS/SALOMEDS.cxx | 57 + src/SALOMEDS/SALOMEDS.hxx | 67 + src/SALOMEDS/SALOMEDS_AttributeComment.cxx | 36 + src/SALOMEDS/SALOMEDS_AttributeComment.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeComment_i.cxx | 52 +- src/SALOMEDS/SALOMEDS_AttributeComment_i.hxx | 52 +- src/SALOMEDS/SALOMEDS_AttributeDrawable.cxx | 34 + src/SALOMEDS/SALOMEDS_AttributeDrawable.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeDrawable_i.cxx | 50 +- src/SALOMEDS/SALOMEDS_AttributeDrawable_i.hxx | 49 +- src/SALOMEDS/SALOMEDS_AttributeExpandable.cxx | 34 + src/SALOMEDS/SALOMEDS_AttributeExpandable.hxx | 28 + .../SALOMEDS_AttributeExpandable_i.cxx | 50 +- .../SALOMEDS_AttributeExpandable_i.hxx | 45 +- .../SALOMEDS_AttributeExternalFileDef.cxx | 36 + .../SALOMEDS_AttributeExternalFileDef.hxx | 28 + .../SALOMEDS_AttributeExternalFileDef_i.cxx | 41 +- .../SALOMEDS_AttributeExternalFileDef_i.hxx | 41 +- src/SALOMEDS/SALOMEDS_AttributeFileType.cxx | 36 + src/SALOMEDS/SALOMEDS_AttributeFileType.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeFileType_i.cxx | 38 +- src/SALOMEDS/SALOMEDS_AttributeFileType_i.hxx | 44 +- src/SALOMEDS/SALOMEDS_AttributeFlags.cxx | 50 + src/SALOMEDS/SALOMEDS_AttributeFlags.hxx | 31 + src/SALOMEDS/SALOMEDS_AttributeFlags_i.cxx | 53 +- src/SALOMEDS/SALOMEDS_AttributeFlags_i.hxx | 41 +- src/SALOMEDS/SALOMEDS_AttributeGraphic.cxx | 34 + src/SALOMEDS/SALOMEDS_AttributeGraphic.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeGraphic_i.cxx | 47 +- src/SALOMEDS/SALOMEDS_AttributeGraphic_i.hxx | 43 +- src/SALOMEDS/SALOMEDS_AttributeIOR.cxx | 36 + src/SALOMEDS/SALOMEDS_AttributeIOR.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeIOR_i.cxx | 45 +- src/SALOMEDS/SALOMEDS_AttributeIOR_i.hxx | 45 +- src/SALOMEDS/SALOMEDS_AttributeInteger.cxx | 34 + src/SALOMEDS/SALOMEDS_AttributeInteger.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeInteger_i.cxx | 50 +- src/SALOMEDS/SALOMEDS_AttributeInteger_i.hxx | 51 +- src/SALOMEDS/SALOMEDS_AttributeLocalID.cxx | 34 + src/SALOMEDS/SALOMEDS_AttributeLocalID.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeLocalID_i.cxx | 51 +- src/SALOMEDS/SALOMEDS_AttributeLocalID_i.hxx | 44 +- src/SALOMEDS/SALOMEDS_AttributeName.cxx | 36 + src/SALOMEDS/SALOMEDS_AttributeName.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeName_i.cxx | 51 +- src/SALOMEDS/SALOMEDS_AttributeName_i.hxx | 46 +- src/SALOMEDS/SALOMEDS_AttributeOpened.cxx | 33 + src/SALOMEDS/SALOMEDS_AttributeOpened.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeOpened_i.cxx | 49 +- src/SALOMEDS/SALOMEDS_AttributeOpened_i.hxx | 44 +- .../SALOMEDS_AttributePersistentRef.cxx | 36 + .../SALOMEDS_AttributePersistentRef.hxx | 28 + .../SALOMEDS_AttributePersistentRef_i.cxx | 45 +- .../SALOMEDS_AttributePersistentRef_i.hxx | 49 +- src/SALOMEDS/SALOMEDS_AttributePixMap.cxx | 44 + src/SALOMEDS/SALOMEDS_AttributePixMap.hxx | 30 + src/SALOMEDS/SALOMEDS_AttributePixMap_i.cxx | 57 +- src/SALOMEDS/SALOMEDS_AttributePixMap_i.hxx | 45 +- .../SALOMEDS_AttributePythonObject.cxx | 44 + .../SALOMEDS_AttributePythonObject.hxx | 35 + .../SALOMEDS_AttributePythonObject_i.cxx | 40 +- .../SALOMEDS_AttributePythonObject_i.hxx | 32 +- src/SALOMEDS/SALOMEDS_AttributeReal.cxx | 34 + src/SALOMEDS/SALOMEDS_AttributeReal.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeReal_i.cxx | 74 +- src/SALOMEDS/SALOMEDS_AttributeReal_i.hxx | 50 +- src/SALOMEDS/SALOMEDS_AttributeSelectable.cxx | 33 + src/SALOMEDS/SALOMEDS_AttributeSelectable.hxx | 28 + .../SALOMEDS_AttributeSelectable_i.cxx | 47 +- .../SALOMEDS_AttributeSelectable_i.hxx | 49 +- .../SALOMEDS_AttributeSequenceOfInteger.cxx | 89 + .../SALOMEDS_AttributeSequenceOfInteger.hxx | 36 + .../SALOMEDS_AttributeSequenceOfInteger_i.cxx | 79 +- .../SALOMEDS_AttributeSequenceOfInteger_i.hxx | 49 +- .../SALOMEDS_AttributeSequenceOfReal.cxx | 89 + .../SALOMEDS_AttributeSequenceOfReal.hxx | 36 + .../SALOMEDS_AttributeSequenceOfReal_i.cxx | 77 +- .../SALOMEDS_AttributeSequenceOfReal_i.hxx | 48 +- .../SALOMEDS_AttributeStudyProperties.cxx | 236 + .../SALOMEDS_AttributeStudyProperties.hxx | 60 + .../SALOMEDS_AttributeStudyProperties_i.cxx | 225 +- .../SALOMEDS_AttributeStudyProperties_i.hxx | 29 +- .../SALOMEDS_AttributeTableOfInteger.cxx | 383 + .../SALOMEDS_AttributeTableOfInteger.hxx | 56 + .../SALOMEDS_AttributeTableOfInteger_i.cxx | 181 +- .../SALOMEDS_AttributeTableOfInteger_i.hxx | 32 +- .../SALOMEDS_AttributeTableOfReal.cxx | 383 + .../SALOMEDS_AttributeTableOfReal.hxx | 56 + .../SALOMEDS_AttributeTableOfReal_i.cxx | 182 +- .../SALOMEDS_AttributeTableOfReal_i.hxx | 32 +- .../SALOMEDS_AttributeTableOfString.cxx | 387 + .../SALOMEDS_AttributeTableOfString.hxx | 56 + .../SALOMEDS_AttributeTableOfString_i.cxx | 186 +- .../SALOMEDS_AttributeTableOfString_i.hxx | 31 +- src/SALOMEDS/SALOMEDS_AttributeTarget.cxx | 63 + src/SALOMEDS/SALOMEDS_AttributeTarget.hxx | 31 + src/SALOMEDS/SALOMEDS_AttributeTarget_i.cxx | 77 +- src/SALOMEDS/SALOMEDS_AttributeTarget_i.hxx | 46 +- src/SALOMEDS/SALOMEDS_AttributeTextColor.cxx | 56 + src/SALOMEDS/SALOMEDS_AttributeTextColor.hxx | 32 + .../SALOMEDS_AttributeTextColor_i.cxx | 56 +- .../SALOMEDS_AttributeTextColor_i.hxx | 44 +- .../SALOMEDS_AttributeTextHighlightColor.cxx | 56 + .../SALOMEDS_AttributeTextHighlightColor.hxx | 32 + ...SALOMEDS_AttributeTextHighlightColor_i.cxx | 57 +- ...SALOMEDS_AttributeTextHighlightColor_i.hxx | 46 +- src/SALOMEDS/SALOMEDS_AttributeTreeNode.cxx | 381 + src/SALOMEDS/SALOMEDS_AttributeTreeNode.hxx | 51 + src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.cxx | 298 +- src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.hxx | 48 +- src/SALOMEDS/SALOMEDS_AttributeUserID.cxx | 40 + src/SALOMEDS/SALOMEDS_AttributeUserID.hxx | 28 + src/SALOMEDS/SALOMEDS_AttributeUserID_i.cxx | 46 +- src/SALOMEDS/SALOMEDS_AttributeUserID_i.hxx | 49 +- src/SALOMEDS/SALOMEDS_Attributes.hxx | 107 + src/SALOMEDS/SALOMEDS_ChildIterator.cxx | 63 + src/SALOMEDS/SALOMEDS_ChildIterator.hxx | 34 + src/SALOMEDS/SALOMEDS_ChildIterator_i.cxx | 66 +- src/SALOMEDS/SALOMEDS_ChildIterator_i.hxx | 62 +- src/SALOMEDS/SALOMEDS_Client.cxx | 1 + src/SALOMEDS/SALOMEDS_ClientAttributes.hxx | 140 + src/SALOMEDS/SALOMEDS_Driver_i.cxx | 251 + src/SALOMEDS/SALOMEDS_Driver_i.hxx | 124 + src/SALOMEDS/SALOMEDS_GenericAttribute.cxx | 127 + src/SALOMEDS/SALOMEDS_GenericAttribute.hxx | 38 + src/SALOMEDS/SALOMEDS_GenericAttribute_i.cxx | 128 +- src/SALOMEDS/SALOMEDS_GenericAttribute_i.hxx | 156 +- src/SALOMEDS/SALOMEDS_SAttribute_i.hxx | 2 +- src/SALOMEDS/SALOMEDS_SComponent.cxx | 67 + src/SALOMEDS/SALOMEDS_SComponent.hxx | 29 + src/SALOMEDS/SALOMEDS_SComponentIterator.cxx | 53 + src/SALOMEDS/SALOMEDS_SComponentIterator.hxx | 33 + .../SALOMEDS_SComponentIterator_i.cxx | 60 +- .../SALOMEDS_SComponentIterator_i.hxx | 58 +- src/SALOMEDS/SALOMEDS_SComponent_i.cxx | 140 +- src/SALOMEDS/SALOMEDS_SComponent_i.hxx | 72 +- src/SALOMEDS/SALOMEDS_SObject.cxx | 268 + src/SALOMEDS/SALOMEDS_SObject.hxx | 61 + src/SALOMEDS/SALOMEDS_SObject_i.cxx | 814 +- src/SALOMEDS/SALOMEDS_SObject_i.hxx | 158 +- src/SALOMEDS/SALOMEDS_Server.cxx | 14 +- src/SALOMEDS/SALOMEDS_Study.cxx | 571 + src/SALOMEDS/SALOMEDS_Study.hxx | 81 + src/SALOMEDS/SALOMEDS_StudyBuilder.cxx | 423 + src/SALOMEDS/SALOMEDS_StudyBuilder.hxx | 68 + src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx | 806 +- src/SALOMEDS/SALOMEDS_StudyBuilder_i.hxx | 65 +- src/SALOMEDS/SALOMEDS_StudyManager.cxx | 294 + src/SALOMEDS/SALOMEDS_StudyManager.hxx | 52 + src/SALOMEDS/SALOMEDS_StudyManager_i.cxx | 1425 +- src/SALOMEDS/SALOMEDS_StudyManager_i.hxx | 122 +- src/SALOMEDS/SALOMEDS_Study_i.cxx | 1199 +- src/SALOMEDS/SALOMEDS_Study_i.hxx | 161 +- src/SALOMEDS/SALOMEDS_UseCaseBuilder.cxx | 149 + src/SALOMEDS/SALOMEDS_UseCaseBuilder.hxx | 44 + src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.cxx | 330 +- src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.hxx | 43 +- src/SALOMEDS/SALOMEDS_UseCaseIterator.cxx | 57 + src/SALOMEDS/SALOMEDS_UseCaseIterator.hxx | 35 + src/SALOMEDS/SALOMEDS_UseCaseIterator_i.cxx | 47 +- src/SALOMEDS/SALOMEDS_UseCaseIterator_i.hxx | 43 +- src/SALOMEDS/SALOME_DriverPy.py | 44 + src/SALOMEDSClient/Makefile.in | 55 + src/SALOMEDSClient/SALOMEDSClient.hxx | 44 + .../SALOMEDSClient_AttributeComment.hxx | 19 + .../SALOMEDSClient_AttributeDrawable.hxx | 18 + .../SALOMEDSClient_AttributeExpandable.hxx | 21 + ...ALOMEDSClient_AttributeExternalFileDef.hxx | 21 + .../SALOMEDSClient_AttributeFileType.hxx | 22 + .../SALOMEDSClient_AttributeFlags.hxx | 24 + .../SALOMEDSClient_AttributeGraphic.hxx | 21 + .../SALOMEDSClient_AttributeIOR.hxx | 22 + .../SALOMEDSClient_AttributeInteger.hxx | 21 + .../SALOMEDSClient_AttributeLocalID.hxx | 22 + .../SALOMEDSClient_AttributeName.hxx | 25 + .../SALOMEDSClient_AttributeOpened.hxx | 22 + .../SALOMEDSClient_AttributePersistentRef.hxx | 23 + .../SALOMEDSClient_AttributePixMap.hxx | 23 + .../SALOMEDSClient_AttributePythonObject.hxx | 25 + .../SALOMEDSClient_AttributeReal.hxx | 20 + .../SALOMEDSClient_AttributeSelectable.hxx | 22 + ...OMEDSClient_AttributeSequenceOfInteger.hxx | 26 + ...SALOMEDSClient_AttributeSequenceOfReal.hxx | 28 + ...ALOMEDSClient_AttributeStudyProperties.hxx | 45 + ...SALOMEDSClient_AttributeTableOfInteger.hxx | 48 + .../SALOMEDSClient_AttributeTableOfReal.hxx | 47 + .../SALOMEDSClient_AttributeTableOfString.hxx | 47 + .../SALOMEDSClient_AttributeTarget.hxx | 21 + .../SALOMEDSClient_AttributeTextColor.hxx | 23 + ...MEDSClient_AttributeTextHighlightColor.hxx | 21 + .../SALOMEDSClient_AttributeTreeNode.hxx | 43 + .../SALOMEDSClient_AttributeUserID.hxx | 24 + .../SALOMEDSClient_ChildIterator.hxx | 22 + .../SALOMEDSClient_GenericAttribute.hxx | 23 + .../SALOMEDSClient_SComponent.hxx | 21 + .../SALOMEDSClient_SComponentIterator.hxx | 22 + src/SALOMEDSClient/SALOMEDSClient_SObject.hxx | 40 + src/SALOMEDSClient/SALOMEDSClient_Study.hxx | 67 + .../SALOMEDSClient_StudyBuilder.hxx | 53 + .../SALOMEDSClient_StudyManager.hxx | 36 + .../SALOMEDSClient_UseCaseBuilder.hxx | 35 + .../SALOMEDSClient_UseCaseIterator.hxx | 23 + .../SALOMEDSClient_definitions.hxx | 50 + src/SALOMEDSImpl/Makefile.in | 133 + .../SALOMEDSImpl_AttributeComment.cxx | 88 + .../SALOMEDSImpl_AttributeComment.hxx | 51 + .../SALOMEDSImpl_AttributeDrawable.cxx | 105 + .../SALOMEDSImpl_AttributeDrawable.hxx | 48 + .../SALOMEDSImpl_AttributeExpandable.cxx | 104 + .../SALOMEDSImpl_AttributeExpandable.hxx | 47 + .../SALOMEDSImpl_AttributeExternalFileDef.cxx | 104 + .../SALOMEDSImpl_AttributeExternalFileDef.hxx | 44 + .../SALOMEDSImpl_AttributeFileType.cxx | 109 + .../SALOMEDSImpl_AttributeFileType.hxx | 45 + .../SALOMEDSImpl_AttributeFlags.cxx | 138 + .../SALOMEDSImpl_AttributeFlags.hxx | 54 + .../SALOMEDSImpl_AttributeGraphic.cxx | 161 + .../SALOMEDSImpl_AttributeGraphic.hxx | 62 + .../SALOMEDSImpl_AttributeIOR.cxx | 126 + .../SALOMEDSImpl_AttributeIOR.hxx | 45 + .../SALOMEDSImpl_AttributeInteger.cxx | 83 + .../SALOMEDSImpl_AttributeInteger.hxx | 48 + .../SALOMEDSImpl_AttributeLocalID.cxx | 110 + .../SALOMEDSImpl_AttributeLocalID.hxx | 48 + .../SALOMEDSImpl_AttributeName.cxx | 87 + .../SALOMEDSImpl_AttributeName.hxx | 52 + .../SALOMEDSImpl_AttributeOpened.cxx | 105 + .../SALOMEDSImpl_AttributeOpened.hxx | 46 + .../SALOMEDSImpl_AttributePersistentRef.cxx | 110 + .../SALOMEDSImpl_AttributePersistentRef.hxx | 48 + .../SALOMEDSImpl_AttributePixMap.cxx | 111 + .../SALOMEDSImpl_AttributePixMap.hxx | 51 + .../SALOMEDSImpl_AttributePythonObject.cxx | 101 + .../SALOMEDSImpl_AttributePythonObject.hxx | 56 + .../SALOMEDSImpl_AttributeReal.cxx | 85 + .../SALOMEDSImpl_AttributeReal.hxx | 48 + .../SALOMEDSImpl_AttributeReference.cxx | 108 + .../SALOMEDSImpl_AttributeReference.hxx | 50 + .../SALOMEDSImpl_AttributeSelectable.cxx | 104 + .../SALOMEDSImpl_AttributeSelectable.hxx | 49 + ...ALOMEDSImpl_AttributeSequenceOfInteger.cxx | 179 + ...ALOMEDSImpl_AttributeSequenceOfInteger.hxx | 54 + .../SALOMEDSImpl_AttributeSequenceOfReal.cxx | 179 + .../SALOMEDSImpl_AttributeSequenceOfReal.hxx | 53 + .../SALOMEDSImpl_AttributeStudyProperties.cxx | 301 + .../SALOMEDSImpl_AttributeStudyProperties.hxx | 97 + .../SALOMEDSImpl_AttributeTableOfInteger.cxx | 542 + .../SALOMEDSImpl_AttributeTableOfInteger.hxx | 94 + .../SALOMEDSImpl_AttributeTableOfReal.cxx | 546 + .../SALOMEDSImpl_AttributeTableOfReal.hxx | 97 + .../SALOMEDSImpl_AttributeTableOfString.cxx | 566 + .../SALOMEDSImpl_AttributeTableOfString.hxx | 98 + .../SALOMEDSImpl_AttributeTarget.cxx | 166 + .../SALOMEDSImpl_AttributeTarget.hxx | 53 + .../SALOMEDSImpl_AttributeTextColor.cxx | 137 + .../SALOMEDSImpl_AttributeTextColor.hxx | 45 + ...LOMEDSImpl_AttributeTextHighlightColor.cxx | 139 + ...LOMEDSImpl_AttributeTextHighlightColor.hxx | 45 + .../SALOMEDSImpl_AttributeTreeNode.cxx | 574 + .../SALOMEDSImpl_AttributeTreeNode.hxx | 94 + .../SALOMEDSImpl_AttributeUserID.cxx | 91 + .../SALOMEDSImpl_AttributeUserID.hxx | 51 + src/SALOMEDSImpl/SALOMEDSImpl_Attributes.hxx | 128 + src/SALOMEDSImpl/SALOMEDSImpl_Callback.cxx | 9 + src/SALOMEDSImpl/SALOMEDSImpl_Callback.hxx | 42 + .../SALOMEDSImpl_ChildIterator.cxx | 62 + .../SALOMEDSImpl_ChildIterator.hxx | 41 + .../SALOMEDSImpl_ChildNodeIterator.cxx | 75 + .../SALOMEDSImpl_ChildNodeIterator.hxx | 45 + src/SALOMEDSImpl/SALOMEDSImpl_Driver.hxx | 80 + .../SALOMEDSImpl_GenericAttribute.cxx | 67 + .../SALOMEDSImpl_GenericAttribute.hxx | 52 + .../SALOMEDSImpl_OCAFApplication.cxx | 46 + .../SALOMEDSImpl_OCAFApplication.hxx | 32 + src/SALOMEDSImpl/SALOMEDSImpl_SComponent.cxx | 78 + src/SALOMEDSImpl/SALOMEDSImpl_SComponent.hxx | 41 + .../SALOMEDSImpl_SComponentIterator.cxx | 68 + .../SALOMEDSImpl_SComponentIterator.hxx | 44 + src/SALOMEDSImpl/SALOMEDSImpl_SObject.cxx | 221 + src/SALOMEDSImpl/SALOMEDSImpl_SObject.hxx | 66 + src/SALOMEDSImpl/SALOMEDSImpl_Study.cxx | 1476 ++ src/SALOMEDSImpl/SALOMEDSImpl_Study.hxx | 258 + .../SALOMEDSImpl_StudyBuilder.cxx | 1028 + .../SALOMEDSImpl_StudyBuilder.hxx | 106 + src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.cxx | 95 + src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.hxx | 54 + .../SALOMEDSImpl_StudyManager.cxx | 1278 ++ .../SALOMEDSImpl_StudyManager.hxx | 129 + src/SALOMEDSImpl/SALOMEDSImpl_Tool.cxx | 155 + src/SALOMEDSImpl/SALOMEDSImpl_Tool.hxx | 62 + .../SALOMEDSImpl_UseCaseBuilder.cxx | 391 + .../SALOMEDSImpl_UseCaseBuilder.hxx | 67 + .../SALOMEDSImpl_UseCaseIterator.cxx | 80 + .../SALOMEDSImpl_UseCaseIterator.hxx | 47 + src/SALOMEDSImpl/testDS.cxx | 78 + src/SALOMELocalTrace/BaseTraceCollector.cxx | 68 + src/SALOMELocalTrace/BaseTraceCollector.hxx | 66 + src/SALOMELocalTrace/FileTraceCollector.cxx | 202 + src/SALOMELocalTrace/FileTraceCollector.hxx | 50 + src/SALOMELocalTrace/LocalTraceBufferPool.cxx | 110 +- src/SALOMELocalTrace/LocalTraceBufferPool.hxx | 11 +- src/SALOMELocalTrace/LocalTraceCollector.cxx | 182 +- src/SALOMELocalTrace/LocalTraceCollector.hxx | 16 +- src/SALOMELocalTrace/Makefile.in | 8 +- src/SALOMELocalTrace/Test/Makefile.in | 62 + .../Test/SALOMELocalTraceTest.cxx | 169 + .../Test/SALOMELocalTraceTest.hxx | 24 + .../Test/TestSALOMELocalTrace.cxx | 12 + .../Test/TestSALOMELocalTrace.py | 16 + src/SALOMELocalTrace/utilities.h | 17 +- src/SALOMETraceCollector/Makefile.in | 4 +- .../SALOMETraceCollector.cxx | 254 +- .../SALOMETraceCollector.hxx | 29 +- src/SALOMETraceCollector/Test/Makefile.in | 64 + .../Test/SALOMETraceCollectorTest.cxx | 90 + .../Test/SALOMETraceCollectorTest.hxx | 20 + .../Test/TestSALOMETraceCollector.cxx | 14 + .../Test/TestSALOMETraceCollector.py | 29 + .../TraceCollector_WaitForServerReadiness.cxx | 16 +- src/TOOLSDS/Makefile.in | 6 +- src/TOOLSDS/SALOMEDS_Tool.cxx | 20 +- src/TOOLSDS/SALOMEDS_Tool.hxx | 9 +- src/TestContainer/Makefile.in | 4 +- src/TestContainer/SALOME_TestComponent_i.cxx | 7 +- src/TestContainer/TestComponentPy.py | 4 +- src/TestContainer/TestContainer.cxx | 193 +- src/TestMPIContainer/Makefile.in | 2 +- src/TestMPIContainer/TestMPIContainer.cxx | 8 +- src/UnitTests/Makefile.in | 68 + src/UnitTests/UnitTests.cxx | 18 + src/UnitTests/UnitTests.py | 67 + src/Utils/Makefile.in | 6 +- src/Utils/OpUtil.cxx | 16 +- src/Utils/OpUtil.hxx | 18 +- src/Utils/Test/Makefile.in | 64 + src/Utils/Test/TestUtils.cxx | 16 + src/Utils/Test/TestUtils.py | 29 + src/Utils/Test/UtilsTest.cxx | 97 + src/Utils/Test/UtilsTest.hxx | 23 + src/Utils/Utils_CommException.hxx | 2 +- src/Utils/Utils_CorbaException.hxx | 2 +- src/Utils/Utils_DESTRUCTEUR_GENERIQUE.cxx | 78 +- src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx | 32 +- src/Utils/Utils_ExceptHandlers.hxx | 34 +- src/Utils/Utils_Identity.cxx | 119 +- src/Utils/Utils_Identity.hxx | 49 +- src/Utils/Utils_Mutex.cxx | 93 + src/Utils/Utils_Mutex.hxx | 73 + src/Utils/Utils_ORB_INIT.cxx | 16 +- src/Utils/Utils_ORB_INIT.hxx | 16 +- src/Utils/Utils_SALOME_Exception.cxx | 13 +- src/Utils/Utils_SALOME_Exception.hxx | 15 +- src/Utils/Utils_SINGLETON.hxx | 12 +- src/Utils/Utils_SignalsHandler.cxx | 12 +- src/Utils/Utils_SignalsHandler.h | 18 +- src/Utils/Utils_Timer.cxx | 39 +- src/Utils/Utils_Timer.hxx | 12 + src/Utils/duplicate.cxx | 10 +- 729 files changed, 62123 insertions(+), 13929 deletions(-) create mode 100644 README.FIRST.txt create mode 100755 bin/addToKillList.py create mode 100644 bin/appliskel/.bashrc create mode 100644 bin/appliskel/CatalogResources.xml create mode 100644 bin/appliskel/README create mode 100644 bin/appliskel/SalomeApp.xml create mode 100644 bin/appliskel/env.d/atFirst.sh create mode 100644 bin/appliskel/env.d/envProducts.sh create mode 100644 bin/appliskel/env.d/envSalome.sh create mode 100644 bin/appliskel/envd create mode 100755 bin/appliskel/runAppli create mode 100755 bin/appliskel/runConsole create mode 100755 bin/appliskel/runParam create mode 100755 bin/appliskel/runRemote.sh create mode 100755 bin/appliskel/runSession create mode 100755 bin/appliskel/runTests create mode 100755 bin/createAppli.sh create mode 100644 doc/INSTALL.txt create mode 100644 doc/SALOME_Application.txt create mode 100644 doc/UnitTests.txt create mode 100644 doc/salome/Parallelisme_dans_Salome.pdf create mode 100644 doc/salome/Parallelisme_dans_Salome.ps create mode 100644 doc/salome/ResourcesManagerManual.pdf create mode 100755 doc/salome/gui/KERNEL/ehelp.xml create mode 100755 doc/salome/gui/KERNEL/image57.gif create mode 100755 doc/salome/gui/KERNEL/image58.gif create mode 100755 doc/salome/gui/KERNEL/image59.gif create mode 100755 doc/salome/gui/KERNEL/image60.gif create mode 100755 doc/salome/gui/KERNEL/image61.gif create mode 100755 doc/salome/gui/KERNEL/kernel.htm create mode 100755 doc/salome/gui/KERNEL/kernel.log create mode 100755 doc/salome/gui/KERNEL/kernel_csh.htm create mode 100755 doc/salome/gui/KERNEL/kernel_rhc.htm create mode 100755 doc/salome/gui/KERNEL/robohhre.lng create mode 100755 doc/salome/gui/KERNEL/whcsh_home.htm create mode 100755 doc/salome/gui/KERNEL/whcshdata.htm create mode 100755 doc/salome/gui/KERNEL/whgdata/whlstfl25.htm create mode 100755 doc/salome/gui/KERNEL/whskin_homepage.htm create mode 100755 doc/salome/gui/KERNEL/whskin_pickup.htm create mode 100755 doc/salome/gui/KERNEL/whskin_tw.htm create mode 100755 resources/Plugin.in create mode 100644 salome_adm/unix/config_files/check_cppunit.m4 create mode 100755 salome_adm/unix/config_files/check_msg2qm.m4 create mode 100644 src/Basics/BasicsGenericDestructor.cxx create mode 100644 src/Basics/BasicsGenericDestructor.hxx create mode 100644 src/Basics/Makefile.in create mode 100644 src/Basics/Test/BasicMainTest.hxx create mode 100644 src/Basics/Test/Makefile.in create mode 100644 src/CASCatch/CASCatch_CatchSignals.cxx create mode 100644 src/CASCatch/CASCatch_CatchSignals.hxx create mode 100644 src/CASCatch/CASCatch_ErrorHandler.cxx create mode 100644 src/CASCatch/CASCatch_ErrorHandler.hxx create mode 100644 src/CASCatch/CASCatch_Failure.cxx create mode 100644 src/CASCatch/CASCatch_Failure.hxx create mode 100644 src/Communication/libSALOME_Comm.i create mode 100644 src/Container/Container_init_python.cxx create mode 100644 src/Container/Container_init_python.hxx create mode 100644 src/Container/SALOME_Container.py create mode 100644 src/Container/SALOME_ContainerManagerServer.cxx create mode 100755 src/KERNEL_PY/Help.py create mode 100755 src/KERNEL_PY/Makefile.in create mode 100755 src/KERNEL_PY/PyInterp.py create mode 100755 src/KERNEL_PY/batchmode_salome.py create mode 100755 src/KERNEL_PY/import_hook.py create mode 100755 src/KERNEL_PY/kernel_shared_modules.py create mode 100755 src/KERNEL_PY/salome.py create mode 100644 src/KERNEL_PY/salome_ComponentGUI.py create mode 100644 src/KERNEL_PY/salome_iapp.py create mode 100644 src/KERNEL_PY/salome_kernel.py create mode 100755 src/KERNEL_PY/salome_shared_modules.py create mode 100644 src/KERNEL_PY/salome_study.py create mode 100755 src/KERNEL_PY/salome_test.py create mode 100644 src/LifeCycleCORBA/Test/LifeCycleCORBATest.cxx create mode 100644 src/LifeCycleCORBA/Test/LifeCycleCORBATest.hxx create mode 100644 src/LifeCycleCORBA/Test/Makefile.in create mode 100644 src/LifeCycleCORBA/Test/TestLifeCycleCORBA.cxx create mode 100644 src/LifeCycleCORBA/Test/TestLifeCycleCORBA.py create mode 100644 src/LifeCycleCORBA/Test_LifeCycleCORBA.cxx create mode 100644 src/LifeCycleCORBA_SWIG/LifeCycleCORBA.py create mode 100644 src/LifeCycleCORBA_SWIG/Makefile.in create mode 100644 src/LifeCycleCORBA_SWIG/TestLifeCycleCORBA.py create mode 100644 src/LifeCycleCORBA_SWIG/libSALOME_LifeCycleCORBA.i create mode 100644 src/Logger/Test/Makefile.in create mode 100644 src/Logger/Test/TestKiller.py create mode 100644 src/SALOMEDS/SALOMEDS.cxx create mode 100644 src/SALOMEDS/SALOMEDS.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeComment.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeComment.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeDrawable.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeDrawable.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeExpandable.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeExpandable.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeExternalFileDef.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeExternalFileDef.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeFileType.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeFileType.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeFlags.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeFlags.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeGraphic.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeGraphic.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeIOR.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeIOR.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeInteger.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeInteger.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeLocalID.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeLocalID.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeName.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeName.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeOpened.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeOpened.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributePersistentRef.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributePersistentRef.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributePixMap.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributePixMap.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributePythonObject.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributePythonObject.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeReal.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeReal.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeSelectable.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeSelectable.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeStudyProperties.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeStudyProperties.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTableOfInteger.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTableOfInteger.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTableOfReal.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTableOfReal.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTableOfString.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTableOfString.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTarget.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTarget.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTextColor.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTextColor.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTreeNode.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeTreeNode.hxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeUserID.cxx create mode 100644 src/SALOMEDS/SALOMEDS_AttributeUserID.hxx create mode 100644 src/SALOMEDS/SALOMEDS_Attributes.hxx create mode 100644 src/SALOMEDS/SALOMEDS_ChildIterator.cxx create mode 100644 src/SALOMEDS/SALOMEDS_ChildIterator.hxx create mode 100644 src/SALOMEDS/SALOMEDS_ClientAttributes.hxx create mode 100644 src/SALOMEDS/SALOMEDS_Driver_i.cxx create mode 100644 src/SALOMEDS/SALOMEDS_Driver_i.hxx create mode 100644 src/SALOMEDS/SALOMEDS_GenericAttribute.cxx create mode 100644 src/SALOMEDS/SALOMEDS_GenericAttribute.hxx create mode 100644 src/SALOMEDS/SALOMEDS_SComponent.cxx create mode 100644 src/SALOMEDS/SALOMEDS_SComponent.hxx create mode 100644 src/SALOMEDS/SALOMEDS_SComponentIterator.cxx create mode 100644 src/SALOMEDS/SALOMEDS_SComponentIterator.hxx create mode 100644 src/SALOMEDS/SALOMEDS_SObject.cxx create mode 100644 src/SALOMEDS/SALOMEDS_SObject.hxx create mode 100644 src/SALOMEDS/SALOMEDS_Study.cxx create mode 100644 src/SALOMEDS/SALOMEDS_Study.hxx create mode 100644 src/SALOMEDS/SALOMEDS_StudyBuilder.cxx create mode 100644 src/SALOMEDS/SALOMEDS_StudyBuilder.hxx create mode 100644 src/SALOMEDS/SALOMEDS_StudyManager.cxx create mode 100644 src/SALOMEDS/SALOMEDS_StudyManager.hxx create mode 100644 src/SALOMEDS/SALOMEDS_UseCaseBuilder.cxx create mode 100644 src/SALOMEDS/SALOMEDS_UseCaseBuilder.hxx create mode 100644 src/SALOMEDS/SALOMEDS_UseCaseIterator.cxx create mode 100644 src/SALOMEDS/SALOMEDS_UseCaseIterator.hxx create mode 100644 src/SALOMEDS/SALOME_DriverPy.py create mode 100644 src/SALOMEDSClient/Makefile.in create mode 100644 src/SALOMEDSClient/SALOMEDSClient.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeComment.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeDrawable.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeExpandable.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeExternalFileDef.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeFileType.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeFlags.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeGraphic.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeIOR.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeInteger.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeLocalID.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeName.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeOpened.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributePersistentRef.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributePixMap.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributePythonObject.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeReal.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeSelectable.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeSequenceOfInteger.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeSequenceOfReal.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeStudyProperties.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfInteger.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfReal.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfString.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeTarget.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeTextColor.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeTextHighlightColor.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeTreeNode.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_AttributeUserID.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_ChildIterator.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_GenericAttribute.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_SComponent.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_SComponentIterator.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_SObject.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_Study.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_StudyBuilder.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_StudyManager.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_UseCaseBuilder.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_UseCaseIterator.hxx create mode 100644 src/SALOMEDSClient/SALOMEDSClient_definitions.hxx create mode 100644 src/SALOMEDSImpl/Makefile.in create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeComment.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeComment.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeDrawable.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeDrawable.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeExpandable.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeExpandable.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeExternalFileDef.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeExternalFileDef.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeFileType.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeFileType.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeFlags.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeFlags.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeGraphic.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeGraphic.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeInteger.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeInteger.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeLocalID.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeLocalID.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeName.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeName.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeOpened.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeOpened.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributePersistentRef.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributePersistentRef.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributePixMap.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributePixMap.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributePythonObject.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributePythonObject.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeReal.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeReal.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeReference.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeReference.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeSelectable.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeSelectable.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfInteger.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfInteger.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfReal.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfReal.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeStudyProperties.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeStudyProperties.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfInteger.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfInteger.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfReal.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfReal.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfString.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfString.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTarget.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTarget.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextColor.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextColor.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextHighlightColor.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextHighlightColor.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeUserID.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_AttributeUserID.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_Attributes.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_Callback.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_Callback.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_ChildIterator.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_ChildIterator.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_Driver.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_OCAFApplication.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_OCAFApplication.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_SComponent.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_SComponent.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_SComponentIterator.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_SComponentIterator.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_SObject.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_SObject.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_Study.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_Study.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_Tool.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_Tool.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.hxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_UseCaseIterator.cxx create mode 100644 src/SALOMEDSImpl/SALOMEDSImpl_UseCaseIterator.hxx create mode 100644 src/SALOMEDSImpl/testDS.cxx create mode 100644 src/SALOMELocalTrace/BaseTraceCollector.cxx create mode 100644 src/SALOMELocalTrace/BaseTraceCollector.hxx create mode 100644 src/SALOMELocalTrace/FileTraceCollector.cxx create mode 100644 src/SALOMELocalTrace/FileTraceCollector.hxx create mode 100644 src/SALOMELocalTrace/Test/Makefile.in create mode 100644 src/SALOMELocalTrace/Test/SALOMELocalTraceTest.cxx create mode 100644 src/SALOMELocalTrace/Test/SALOMELocalTraceTest.hxx create mode 100644 src/SALOMELocalTrace/Test/TestSALOMELocalTrace.cxx create mode 100644 src/SALOMELocalTrace/Test/TestSALOMELocalTrace.py create mode 100644 src/SALOMETraceCollector/Test/Makefile.in create mode 100644 src/SALOMETraceCollector/Test/SALOMETraceCollectorTest.cxx create mode 100644 src/SALOMETraceCollector/Test/SALOMETraceCollectorTest.hxx create mode 100644 src/SALOMETraceCollector/Test/TestSALOMETraceCollector.cxx create mode 100644 src/SALOMETraceCollector/Test/TestSALOMETraceCollector.py create mode 100644 src/UnitTests/Makefile.in create mode 100644 src/UnitTests/UnitTests.cxx create mode 100644 src/UnitTests/UnitTests.py create mode 100644 src/Utils/Test/Makefile.in create mode 100644 src/Utils/Test/TestUtils.cxx create mode 100644 src/Utils/Test/TestUtils.py create mode 100644 src/Utils/Test/UtilsTest.cxx create mode 100644 src/Utils/Test/UtilsTest.hxx create mode 100644 src/Utils/Utils_Mutex.cxx create mode 100644 src/Utils/Utils_Mutex.hxx diff --git a/INSTALL b/INSTALL index f3e4b6917..33e3a6454 100644 --- a/INSTALL +++ b/INSTALL @@ -1,8 +1,15 @@ -This is the version 2.2.0 of KERNEL - +This is the version 3.1.0a of KERNEL Previous versions : - - 2.1.0 + - 3.0.0 + - 2.2.4 + - 2.2.3 + - 2.2.2 + - 2.2.1 + - 2.2.0 + - 2.1.1 + - 2.1.0 - 2.0.0 - 1.4.1 - 1.3.0 - 1.2.1 + diff --git a/Makefile.in b/Makefile.in index 5c92e402e..4b00a7b08 100644 --- a/Makefile.in +++ b/Makefile.in @@ -17,73 +17,12 @@ VPATH=.:@srcdir@:@top_srcdir@/bin:./bin/salome:@top_srcdir@/resources:./bin:@top SUBDIRS = idl src examples doc salome_adm RESOURCES_FILES = \ -back.xpm \ -cascade.png \ CatalogDataType.xml \ KERNELCatalog.xml \ CatalogResources.xml \ -CatalogRessources.xml \ close.png \ config \ -default.png \ -dl_delete.png \ -dl_insert.png \ -dl_moveup.png \ -dl_movedown.png \ -forward.xpm \ -help.png \ -home.xpm \ -new.png \ -open.png \ -print.png \ -redo.png \ -reset.png \ -Application-Logo.png \ -Application-Splash.png \ -Application-About.png \ -save.png \ -select1.png \ -tile.png \ -Tools_en.xml \ -undo.png \ -view_back.png \ -view_bottom.png \ -view_camera_dump.png \ -view_fitall.png \ -view_fitarea.png \ -view_front.png \ -view_glpan.png \ -view_left.png \ -view_pan.png \ -view_reset.png \ -view_right.png \ -view_rotate.png \ -view_top.png \ -view_triedre.png \ -view_zoom.png \ -copy.png \ -paste.png \ -plot2d_dump.png \ -plot2d_fitall.png \ -plot2d_fitarea.png \ -plot2d_legend.png \ -plot2d_linear.png \ -plot2d_linear_y.png \ -plot2d_lines.png \ -plot2d_log.png \ -plot2d_log_y.png \ -plot2d_pan.png \ -plot2d_points.png \ -plot2d_settings.png \ -plot2d_splines.png \ -plot2d_zoom.png \ -uc_add.png \ -uc_current.png \ -uc_del.png \ -uc_new.png \ -uc_clear.png \ channel.cfg \ -Plugin \ SALOMEDS_Resources BIN_SCRIPT= \ @@ -96,11 +35,13 @@ killSalomeWithPort.py \ runSalome \ runSalome.csh \ runNS.sh \ +createAppli.sh \ launchConfigureParser.py \ salome.launch \ envSalome.py \ salomeConsole.py \ -showNS.py +showNS.py \ +addToKillList.py # copy header files in common directory OWN_CONFIG_H=@OWN_CONFIG_H@ @@ -171,10 +112,20 @@ install-include: $(include_list) done # install script in $(bindir) : +install-appliskel: + $(INSTALL) -d $(bindir) + if test -d $(top_builddir)/bin/salome/appliskel; then \ + cp -rp $(top_builddir)/bin/salome/appliskel $(bindir); \ + fi; + install-bin: $(BIN_SCRIPT) $(INSTALL) -d $(bindir) $(INSTALL_PROGRAM) $^ $(bindir) +# install Plugin file +install-plugin: $(top_builddir)/share/salome/resources/Plugin + ($(INSTALL_DATA) $^ $(datadir)/resources/. || exit 1); \ + uninstall: uninstall-idl uninstall-idl: @@ -190,5 +141,9 @@ distclean-other: @MODULE@ -install: install-bin install-include install-make install-end +$(top_builddir)/share/salome/resources/Plugin: resources/Plugin + cp -f $< $@ ; \ + +resources: $(top_builddir)/share/salome/resources/Plugin +install: install-bin install-appliskel install-include install-make install-plugin install-end diff --git a/README b/README index ec06c9d5b..03708f80d 100644 --- a/README +++ b/README @@ -1,330 +1,5 @@ # # ================================================================= -# Installation instructions, up to date for 2.2.0 version +# This is SALOME2 version 3.1 alpha # ================================================================= # - -You'll find here generic instructions for installing the SALOME2 platform. - - -1. Quick Overview - -------------- - -First of all, you have to check (or install if needed) the dependant -software programs on your system. These programs are: - -- common development tools as gcc, automake, autoconf and libtools. -- third party softwares used in SALOME building or runtime process - (python, OCC, VTK, ...) - -Further details can be found in sections [2] and [3]. - -If the dependencies are installed on your system, then you have to set -your shell environment to get access to the software components -(cf. [4]. "Preparing the shell environment"). - -The next step is to install the KERNEL (cf. [5] "Installing KERNEL"): -$ mkdir -$ mkdir -$ cd -$ ./build_configure -$ cd -$ /configure --prefix= -$ make -$ make install - -Then, the SALOME components GEOM, MED, VISU, ... can be installed -with a similar procedure (cf. [6]). - -Eventually, the platform can be run by executing the shell script -runSalome (cf. [7]). Here, somme additionnal variables have to be set -to describe the SALOME runtime configuration (_ROOT_DIR, -OMNIORB_CONFIG) - -The following provides you with specific instructions for each step. - - -2. System configuration - -------------------- - -We suggest the following configuration for building process: -- gcc-3.2 (3.2.3 if gcc3-2 is not the native compiler of your distribution) -- automake-1.9 (only aclocal is used) -- autoconf-2.59 -- libtool-1.5.6 - -remarks : -- This is the minimum level of automake,autoconf & libtool, if you need - to compile all the third party softwares (included OpenCascade 5.2). -- SALOME2 is compiled and tested on a RedHat 8.0 version, with - - gcc-3.2 - and - - automake-1.6.3 - - autoconf-2.53 - - libtool-1.4.2 - This level of automake,autoconf & libtool is OK if you do not need to - recompile OpenCascade 5.2. - -3. Third-party dependencies - ------------------------ - -The SALOME platform relies on a set of third-party softwares. The -current version depends on: - - CAS-5.2 OpenCascade (try binaries,a source patch is needed) - PyQt-3.3.2 Python-Qt Wrapper - Python-2.2.2 Python interpreter - SWIG-1.3.17 SWIG library - VTK-4.2.2 VTK 3D-viewer - boost-1_31_0 C++ library (only include templates are used) - hdf5-1.4.4 Files Database library - med-2.1.6 MED Data Format support for file records - omniORB-3.0.5 ORB used in SALOME - qt-x11-free-3.0.5 Qt library - qwt-0.4.1 Graph components for Qt - sip-3.3.2 langage binding software - tcl8.3 Tcl interpreter - tk8.3 Tk widgets - -And, in order to build the documentation: - - doxygen-1.3-rc2 - graphviz-1.9 - -Additionnal software may be installed for optional features: - - netgen4.3_calibre3_gcc3.2.3.tgz - tix8.1.4_calibre3_gcc3.2.3.tgz - openpbs-2.3.16 - lsf-??? - -###### -###### To Do ------------------------- -###### -- Instructions for installing these software programs can be found in a - special note doc/configuration_examples/install-prerequis. -- Installation shell scripts are also provided. - These scripts have to be adapted to your own configuration. - -- See doc/configuration_examples/* -###### -###### To Do ------------------------- -###### - -In the following, we assume that all the third-party softwares are -installed in the same root directory, named /prerequis. -Then, your file system should probably look like: - -/prerequis/Python-2.2.2 -/prerequis/omniORB-3.0.5 -/prerequis/qt-x11-free-3.0.5 -... - - -4. Preparing the shell environment - ------------------------------- - -Some variables have to be set to get acces to third-party software -components (include files, executable, library, ...) during building -process and runtime. - -The shell file prerequis.sh, embedded in the KERNEL source package, -provides a template for setting those variables. In this example, all the -softwares are supposed to be installed in the same root directory, -named here INSTALLROOT. - -Copy the prerequis.sh in a working directory and adjust the settings -to your own configuration. To get the shell prepared, just -execute the following command in the building shell: - -$ source prerequis.sh - -(we assume here a ksh or bash mode) - - -5. Installing the KERNEL component - ------------------------------- - -We use here the notation to specify the source directory -of the KERNEL component. The shell environment is supposed to have -been set (cf. 4). - -Installing the KERNEL from a source package needs three directories: - -- the source directory, denoted here by . - -- the build directory, denoted by in the following. This - directory can't be the same directory as . - -- the install directory, denoted by in the following. This - directory can't be the same directory as or - . - -The installing process is: - -STEP 1: preparing directories -create the and the directories. -$ mkdir -$ mkdir - -STEP 2: build configure script -go to directory and generate the "configure" script. -$ cd -$ ./build_configure - -If it doesn't work, check your system automake tools as specified in -section [2]. - -STEP 3: configure the building process -go to the build directory and execute the configuration process: -$ cd -$ /configure --prefix= - -Note that must be an absolute path. - -When the configure process is complete, check the status of -third-party softwares detection. You should have a status like: - ---------------------------------------------- -Summary ---------------------------------------------- - -Configure - cc : yes - boost : yes - lex_yacc : yes - python : yes - swig : yes - threads : yes - OpenGL : yes - qt : yes - vtk : yes - hdf5 : yes - med2 : yes - omniORB : yes - occ : yes - sip : yes - pyqt : yes - qwt : yes - doxygen : yes - graphviz : no - openpbs : no - lsf : no - -Default ORB : omniORB - ---------------------------------------------- - -If a software get a status "no", then it's not "seen" in the system: -- the software is not installed, or -- the shell environment is not set correctly. - -In this example, the software programs graphviz, openpbs and lsf are not -installed (optional for most usages). - - -STEP 4 : Building the binary files -Execute make in the directory: -$ make - - -STEP 5: Installing binary files, scripts and documentation -Execute install target in the directory: -$ make install - - -6. Installing the SALOME components - -------------------------------- - -Installing a component is done by following the same -instructions as given for the KERNEL, replacing KERNEL by - (build_configure, configure, make, make install). - -You just have to be aware of the dependencies between components: - -- MED depends on KERNEL -- GEOM depends on KERNEL -- SMESH depends on KERNEL, MED, GEOM -- VISU depends on KERNEL, MED -- SUPERV depends on KERNEL - -For example, installing the component SMESH needs the previous -installation of the KERNEL component, and then the GEOM and MED components. - -The building process uses the variables _ROOT_DIR to -localize the dependant components. The variables must be set to the -install path directory of the components (ex: -KERNEL_ROOT_DIR=). - -In the above example, the three variables KERNEL_ROOT_DIR, -GEOM_ROOT_DIR and MED_ROOT_DIR have to be set before configuring the -building process of the SMESH component (STEP 3). - - -7. Runtime - ------- - -To run the SALOME platform, the procedure is: -- set the shell environment to get acces to third-party softwares - -$ source prerequis.sh - -- define the SALOME configuration by setting the whole set of - variables _ROOT_DIR. Here, you just have to set the - kernel and the components you need. - -$ export KERNEL_ROOT_DIR= -$ export MED_ROOT_DIR= -$ ... - -- define the CORBA configuration file by setting the variable - OMNIORB_CONFIG. This variable must be set to a writable file - path. The file may be arbitrary chosen and doesn't need to exist - before running. We suggest: - -$ export OMNIORB_CONFIG=$HOME/.omniORB.cfg - -- run the SALOME platform by executing the script runSalome -$ $KERNEL_ROOT_DIR/bin/salome/runSalome - - -8. Suggestions and advices - ---------------------- - -For convenience or customization, we suggest the following organisation: - -- chose and create a root directory for the SALOME platform, say - . - -- install the third-party softwares in a sub-directory "prerequis" - -- install the SALOME components in a sub-directory "SALOME2" - -- make personnal copies of the files prerequis.sh and runSalome in - . - -$ cp /prerequis.sh /. -$ cp /bin/salome/runSalome /. - -Edit the file prerequis.sh and adjust it to your own configuration. - -- define the SALOME2 configuration -This step consists in setting the KERNEL_ROOT_DIR, the whole set of -variables _ROOT_DIR you need, and the OMNIORB_CONFIG -variable. -We suggest to create a shell file envSalome.sh containing those -settings. Then the configuration consists in loading envSalome.sh in -the runtime shell: - -$ source envSalome.sh - -- When installed with this file organisation, running SALOME is done - with the following shell commands: - -$ source /prerequis.sh -$ source /envSalome.sh -$ ./runSalome - - -# ================================================================= -# End of file diff --git a/README.FIRST.txt b/README.FIRST.txt new file mode 100644 index 000000000..4a727c643 --- /dev/null +++ b/README.FIRST.txt @@ -0,0 +1,50 @@ + +================================================================= +General information, for developpers and users +================================================================= +*html version of this document is produced with docutils*:: + + rest2html < doc.txt > doc.html + +This document corresponds to SALOME2 3.1. (alpha version) + ++-------------------------------------------+ +| **WORK in PROGRESS, INCOMPLETE DOCUMENT** | ++-------------------------------------------+ + +How to install SALOME +--------------------- + +See INSTALL_ for general information on required configuration and +prerequisites, compilation procedure, setting environment principles. + +.. _INSTALL: ./doc/INSTALL.html + +How to run SALOME on one or more computers, SALOME Application concept +---------------------------------------------------------------------- + +See SALOME_Application_ to define your own configuration of SALOME and run it +on one or several computers. This is the recommended way of configuration. + +.. _SALOME_Application: ./doc/SALOME_Application.html + + +Source code structuration and Unit Tests +---------------------------------------- + +See UnitTests_ for general information on code directories structure, +unit tests associated to the different kind of classes, and how to run +the unit tests. + +.. _UnitTests: ./doc/UnitTests.html + +End User documentation +---------------------- + +link to end user documentation. + + +Developper documentation +------------------------ + +How to generate the developper documentation. diff --git a/bin/VERSION b/bin/VERSION index 9f5dca975..21cff5ac0 100755 --- a/bin/VERSION +++ b/bin/VERSION @@ -1 +1 @@ -THIS IS SALOME - KERNEL VERSION: 2.2.0 +THIS IS SALOME - KERNEL VERSION: 3.1.0a diff --git a/bin/addToKillList.py b/bin/addToKillList.py new file mode 100755 index 000000000..7dad20eb1 --- /dev/null +++ b/bin/addToKillList.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import os, sys, pickle, string + +########## adds to the kill list of SALOME one more process ########## +def addToKillList(command_pid, command): + command=(command.split(" "))[0] + + my_port = 2809 + try: + file = open(os.environ["OMNIORB_CONFIG"], "r") + s = file.read() + while len(s): + l = string.split(s, ":") + if string.split(l[0], " ")[0] == "ORBInitRef" or string.split(l[0], " ")[0] == "InitRef" : + my_port = int(l[len(l)-1]) + pass + s = file.read() + pass + except: + pass + #print "myport = ", my_port + + filedict=os.getenv("HOME")+'/'+os.getenv('USER')+"_"+str(my_port)+'_SALOME_pidict' + try: + fpid=open(filedict, 'r') + process_ids=pickle.load(fpid) + fpid.close() + except: + process_ids=[{}] + pass + + already_in=0 + for process_id in process_ids: + print process_id + for pid, cmd in process_id.items(): + #print "see process %s : %s"% (pid, cmd[0]) + if pid == command_pid: + already_in=1 + pass + + if already_in == 0: + try: + process_ids.append({command_pid: [command]}) + fpid=open(filedict,'w') + pickle.dump(process_ids, fpid) + fpid.close() + except: + print "addToKillList: can not add command %s to the kill list"% filedict + pass + pass + +if __name__ == "__main__": + print sys.argv + addToKillList(sys.argv[1], sys.argv[2]) diff --git a/bin/appliskel/.bashrc b/bin/appliskel/.bashrc new file mode 100644 index 000000000..ab711e036 --- /dev/null +++ b/bin/appliskel/.bashrc @@ -0,0 +1,10 @@ +#!/bin/bash + +# If not running interactively, don't do anything: +[ -z "$PS1" ] && return + +# keep original settings (debian) +. ~/.bashrc + +# prefix prompt with naming server hostname and port +export PS1='[NS='${NSHOST}':'${NSPORT}']'${PS1} diff --git a/bin/appliskel/CatalogResources.xml b/bin/appliskel/CatalogResources.xml new file mode 100644 index 000000000..8caed2bfb --- /dev/null +++ b/bin/appliskel/CatalogResources.xml @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/bin/appliskel/README b/bin/appliskel/README new file mode 100644 index 000000000..264b879bc --- /dev/null +++ b/bin/appliskel/README @@ -0,0 +1,42 @@ +Set of scripts for a SALOME application +======================================= + +# - A SALOME application distributed on several computers needs APPLI +# directories on the same path ($APPLI) relative to $HOME directory +# of the user, on each computer. + +user scripts: +------------- + +runAppli : SALOME launch (idem runSalome but different name to avoid + confusion with ${KERNEL_ROOT_DIR}/bin/salome/runSalome + +runConsole : a python console in the current SALOME session environment + +runSession : a shell in SALOME environment, either interactive (without args) + or used to run a program (defined by given args) + +internal application scripts: +----------------------------- + +runRemote.sh : called from remote computer, via ssh, rsh... + used for instance to create container + +envd : sets SALOME application environment + sourced by other scripts + +The following files must be adapted to your environment and SALOME Application: +------------------------------------------------------------------------------- + +SalomeApp.xml - list of modules, options on server launch and resources... +CatalogResources.xml - configuration of machines used in SALOME application + (no need of modules list and path here) + +env.d directory must contain the necessary files to source, to define +the SALOME Application environment : + ( envd script source these files in alphanumeric order ) + +For instance, + atFirst.sh - general presets + envProducts.sh - prerequisite SALOME environment + envSalome.sh - list of MODULE_ROOT_DIR diff --git a/bin/appliskel/SalomeApp.xml b/bin/appliskel/SalomeApp.xml new file mode 100644 index 000000000..6897b7136 --- /dev/null +++ b/bin/appliskel/SalomeApp.xml @@ -0,0 +1,100 @@ + +
+ + + + + +
+
+ + + + + + + + + + + + + +
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+ + +
+ + +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
diff --git a/bin/appliskel/env.d/atFirst.sh b/bin/appliskel/env.d/atFirst.sh new file mode 100644 index 000000000..0c6715f75 --- /dev/null +++ b/bin/appliskel/env.d/atFirst.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +#------------------------------------------------ +# to be sourced first, used in following scripts +#------------------------------------------------ + +export LD_LIBRARY_PATH="." +export PATH="/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/prascle/bin:." +export PYTHONPATH="" + +export RAC=${HOME} +export PAKSAL=/opt +export PUB=${RAC}/public +export TARP=${RAC}/tarpublic +export PYPACKAGES=${PUB}/site_packages + +# ------------------------------------------------ +# ---- gdb 5.3 + +export PATH=${PAKSAL}/gdb53/bin:${PATH} +export LD_LIBRARY_PATH=${PAKSAL}/gdb53/lib:${LD_LIBRARY_PATH} + +# ------------------------------------------------ +# ---- ddd 3.3.7 + +export PATH=${PAKSAL}/ddd337/bin:${PATH} +export LD_LIBRARY_PATH=${PAKSAL}/ddd337/lib:${LD_LIBRARY_PATH} + +# ------------------------------------------------ +# --- Java 1.4 + +export JDKHOME=${PUB}/j2sdk_nb/j2sdk1.4.2 +export JAVAHOME=${PUB}/j2sdk_nb/j2sdk1.4.2 +export PATH=${JAVAHOME}/bin:${PATH} +export LD_LIBRARY_PATH=${JAVAHOME}/lib:${LD_LIBRARY_PATH} +export LD_LIBRARY_PATH=${JAVAHOME}/jre/lib/i386:${LD_LIBRARY_PATH} +export LD_LIBRARY_PATH=${JAVAHOME}/jre/lib/i386/client:${LD_LIBRARY_PATH} + +# ------------------------------------------------ +# --- gsl -1.4 + +export GSLHOME=${PAKSAL}/gsl-1.4 +export PATH=${GSLHOME}/bin:${PATH} +export LD_LIBRARY_PATH=${GSLHOME}/lib:${LD_LIBRARY_PATH} + +# ------------------------------------------------ +# --- fltk 1.1.4 + +export FLTKHOME=${PAKSAL}/fltk114 +export PATH=${FLTKHOME}/bin:${PATH} +export LD_LIBRARY_PATH=${FLTKHOME}/lib:${LD_LIBRARY_PATH} + +# ------------------------------------------------ +# --- gmsh 1.48 + +export GMSHHOME=${PAKSAL}/gmsh148 +export PATH=${GMSHHOME}/bin:${PATH} + +# ------------------------------------------------ +# ---- tkcvs, tkdiffb, cvs + +export PATH=${PAKSAL}/tkcvs7.2/bin:${PAKSAL}/cvs1.11.14/bin:${PATH} diff --git a/bin/appliskel/env.d/envProducts.sh b/bin/appliskel/env.d/envProducts.sh new file mode 100644 index 000000000..aa0570562 --- /dev/null +++ b/bin/appliskel/env.d/envProducts.sh @@ -0,0 +1,120 @@ +#!/bin/sh + +# ------------------------------------------------ +# ---- openpbs + +export OPENPBS=/optroot/openpbs2316 +export PATH=${OPENPBS}/bin:${PATH} +export LD_LIBRARY_PATH=${OPENPBS}/lib:${LD_LIBRARY_PATH} + +#------------------------------------------------------------------------------ + +export INSTALL_ROOT=/home/prascle/PAL_SALOME141 +#------ gcc ------ +export GCC_ROOT=/usr +export CXX=${GCC_ROOT}/bin/g++ +export CC=${GCC_ROOT}/bin/gcc +## +#------ boost ------ +export BOOSTDIR=${INSTALL_ROOT}/boost-1.30.2 +## + +#------ tcltk ------ +export TCLHOME=/usr + +#------ Python ------ +export PYTHONHOME=/usr +export PYTHONPATH=${PYPACKAGES}:${PYTHONPATH} +## +#------ Qt ------ +#export QTDIR=/usr/lib/qt-3.0.5 +export QTDIR=/usr/lib/qt3-gcc3.2 +export PATH=${PATH}:${QTDIR}/bin +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${QTDIR}/lib +## +#------ Sip ------ +export SIPDIR=/usr +export PYQTDIR=/usr +## +#------ PyQt ------ +export PYQT_SIPS=/usr/share/sip/qt +export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/lib/python2.2/site-packages +## +#------ Swig ------ +export SWIG_ROOT=${INSTALL_ROOT}/SWIG-1.3.17 +export PATH=${SWIG_ROOT}/bin:${PATH} +export LD_LIBRARY_PATH=${SWIG_ROOT}/lib:${LD_LIBRARY_PATH} +## +#------ OpenCascade ------ +export CASROOT=/opt/CAS52patch +export LD_LIBRARY_PATH=${CASROOT}/Linux/lib:${LD_LIBRARY_PATH} +export PATH=${CASROOT}/Linux/bin:${PATH} +# Variable for Foundation Classes : +export CSF_UnitsLexicon=${CASROOT}/src/UnitsAPI/Lexi_Expr.dat +export CSF_UnitsDefinition=${CASROOT}/src/UnitsAPI/Units.dat +# Variable for DataExchange : +export CSF_SHMessage=${CASROOT}/src/SHMessage +export CSF_XSMessage=${CASROOT}/src/XSMessage +# Variable for Font : +export CSF_MDTVFontDirectory=${CASROOT}/src/FontMFT +export CSF_MDTVTexturesDirectory=${CASROOT}/src/Textures +## +export CSF_LANGUAGE=us +export MMGT_CLEAR=1 +export CSF_EXCEPTION_PROMPT=1 +export CSF_StandardDefaults=${CASROOT}/src/StdResource +export CSF_PluginDefaults=${CASROOT}/src/StdResource +export CSF_XCAFDefaults=${CASROOT}/src/StdResource +export CSF_GraphicShr=${CASROOT}/Linux/lib/libTKOpenGl.so +export CSF_IGESDefaults=${CASROOT}/src/XSTEPResource +export CSF_STEPDefaults=${CASROOT}/src/XSTEPResource +## +#export TCLLIBPATH=$TCLHOME/lib +## +#------ Qwt ------ +export QWTHOME=${INSTALL_ROOT}/qwt-0.4.1 +export LD_LIBRARY_PATH=${QWTHOME}/lib:${LD_LIBRARY_PATH} +## +#------ Hdf ------ +export HDF5HOME=${INSTALL_ROOT}/hdf5-1.4.4 +export PATH=${HDF5HOME}/bin:$PATH +export LD_LIBRARY_PATH=${HDF5HOME}/lib:${LD_LIBRARY_PATH} +## +#------ Med ------ +export MED2HOME=/opt/med2.2.2 +export PATH=${MED2HOME}/bin:${PATH} +export LD_LIBRARY_PATH=${MED2HOME}/lib:${LD_LIBRARY_PATH} +## +#------ Vtk ------ +export VTKHOME=${INSTALL_ROOT}/VTK-4.2.2 +export PATH=${VTKHOME}/bin:${PATH} +export LD_LIBRARY_PATH=${VTKHOME}/lib/vtk:${LD_LIBRARY_PATH} +export PYTHONPATH=${VTKHOME}/lib/vtk:${VTKHOME}/lib/python2.2/site-packages/vtk_python:${PYTHONPATH} +## +#------ netgen ------ +export NETGENROOT=${INSTALL_ROOT}/netgen4.3 +export NETGEN_HOME=${INSTALL_ROOT}/netgen4.3 +## +#------ OmniORB ------ +export OMNIORBDIR=${INSTALL_ROOT}/omniORB-3.0.5 +export OMNIORB_CONFIG=${OMNIORBDIR}/.omniORB.cfg +export PYTHONPATH=${OMNIORBDIR}/lib/python:${OMNIORBDIR}/lib/i586_linux_2.0_glibc2.1:${PYTHONPATH} +export PATH=$OMNIORBDIR/bin/i586_linux_2.0_glibc2.1:$PATH +export LD_LIBRARY_PATH=$OMNIORBDIR/lib/i586_linux_2.0_glibc2.1:$LD_LIBRARY_PATH +## +#------ Numeric ------ +export PYTHONPATH=${INSTALL_ROOT}/Numeric-22.0/lib/python2.2/site-packages/Numeric:${PYTHONPATH} +## +#------ HappyDoc ------ +export PATH=${INSTALL_ROOT}/HappyDoc-r2_1/bin:${PATH} +export PYTHONPATH=${INSTALL_ROOT}/HappyDoc-r2_1/lib/python2.2/site-packages:${PYTHONPATH} +## +#------ Doxygen ------ +export PATH=${INSTALL_ROOT}/doxygen-1.3-rc2/bin:${PATH} +## +#------ Graphviz ------ +export PATH=${INSTALL_ROOT}/graphviz-1.9/bin:${PATH} +export LD_LIBRARY_PATH=${INSTALL_ROOT}/graphviz-1.9/lib/graphviz:${LD_LIBRARY_PATH} +## + +#------------------------------------------------------------------------------ diff --git a/bin/appliskel/env.d/envSalome.sh b/bin/appliskel/env.d/envSalome.sh new file mode 100644 index 000000000..9d765a072 --- /dev/null +++ b/bin/appliskel/env.d/envSalome.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +# --- example to adapt to your own configuration --- +# +# --- envSalome.sh gives a set of MODULE_ROOT_DIR, to source +# --- you must at least define and export KERNEL_ROOT_DIR + +REPINST=/home/prascle/SALOME2/Install + +export KERNEL_ROOT_DIR=${REPINST}/KERNEL_V301 + +export GUI_ROOT_DIR=${REPINST}/GUI_V301 +#export SalomeAppConfig=${GUI_ROOT_DIR}/share/salome/resources +export SalomeAppConfig=${HOME}/${APPLI} +export SUITRoot=${GUI_ROOT_DIR}/share/salome + +export GEOM_ROOT_DIR=${REPINST}/GEOM_V301 +export MED_ROOT_DIR=${REPINST}/MED_V301 +export SMESH_ROOT_DIR=${REPINST}/SMESH_V301 +export SUPERV_ROOT_DIR=${REPINST}/SUPERV_V301 +export VISU_ROOT_DIR=${REPINST}/VISU_V301 +export NETGENPLUGIN_ROOT_DIR=${REPINST}/NETGENPLUGIN_V301 +export COMPONENT_ROOT_DIR=${REPINST}/COMPONENT_V301 +export PYCALCULATOR_ROOT_DIR=${REPINST}/PYCALCULATOR_V301 +export PYHELLO_ROOT_DIR=${REPINST}/PYHELLO_V301 +export PYTIX_ROOT_DIR=${REPINST}/PYTIX_V301 + diff --git a/bin/appliskel/envd b/bin/appliskel/envd new file mode 100644 index 000000000..80261ada2 --- /dev/null +++ b/bin/appliskel/envd @@ -0,0 +1,3 @@ +#!/bin/bash + +for i in $1/env.d/*;do source ${i}; done diff --git a/bin/appliskel/runAppli b/bin/appliskel/runAppli new file mode 100755 index 000000000..39083ff01 --- /dev/null +++ b/bin/appliskel/runAppli @@ -0,0 +1,71 @@ +#!/bin/bash + +# --- retrieve APPLI path, relative to $HOME +# on sarge, "which" gives not allways the absolute path... + +comName=`which $0` +aa=${comName:0:1} +if test x$aa == x\/; then + mycom=${comName} +elif test x$aa == x\.; then + mycom=${PWD}/${comName:2} +else + mycom=${PWD}/${comName} +fi +APPLI=`echo ${HOME} \`dirname $mycom\` | awk ' { print substr($2,length($1)+2) } '` +#echo $APPLI +export APPLI + +# --- set the SALOME environment (prerequisites, MODULES_ROOT_DIR...) + +. ${HOME}/${APPLI}/envd ${HOME}/${APPLI} + +# --- define port for CORBA naming service + +searchFreePort() { + echo -n "Searching for a free port for naming service: " + export NSPORT=2810 + local limit=$NSPORT + let limit=limit+100 + while [ 1 ] + do + aRes=`netstat -ltn | grep -E :${NSPORT}` + if [ -z "$aRes" ]; then + echo ${NSPORT} - Ok + local myhost=`hostname` + export OMNIORB_CONFIG=${HOME}/${APPLI}/.omniORB_${myhost}_${NSPORT}.cfg + export NSPORT + export NSHOST=${myhost} + local initref="NameService=corbaname::"`hostname`":$NSPORT" + #echo "ORBInitRef $initref" > $OMNIORB_CONFIG + echo "InitRef = $initref" > $OMNIORB_CONFIG + export LAST_RUNNING_CONFIG=${HOME}/${APPLI}/.omniORB_${myhost}_last.cfg + rm ${LAST_RUNNING_CONFIG} + ln -s ${OMNIORB_CONFIG} ${LAST_RUNNING_CONFIG} + break + fi + echo -n "${NSPORT} " + if [[ $NSPORT -eq $limit ]] ; then + echo + echo "Can't find a free port to launch omniNames" + echo "Try to kill the running servers and then launch SALOME again." + exit + fi + let NSPORT=NSPORT+1 + done +} + +# --- run SALOME +# (default arguments defined in local salome.launch could be completed +# by arguments to this command) + +searchFreePort + +if [ $# -ne 0 ] ; then + ${KERNEL_ROOT_DIR}/bin/salome/envSalome.py python -i ${KERNEL_ROOT_DIR}/bin/salome/runSalome.py $* +else + ${KERNEL_ROOT_DIR}/bin/salome/envSalome.py python ${KERNEL_ROOT_DIR}/bin/salome/runSalome.py +fi + +rm ${OMNIORB_CONFIG} +rm ${LAST_RUNNING_CONFIG} diff --git a/bin/appliskel/runConsole b/bin/appliskel/runConsole new file mode 100755 index 000000000..e45f58611 --- /dev/null +++ b/bin/appliskel/runConsole @@ -0,0 +1,25 @@ +#!/bin/bash + +# --- retrieve APPLI path, relative to $HOME +# on sarge, "which" gives not allways the absolute path... + +comName=`which $0` +aa=${comName:0:1} +if test x$aa == x\/; then + mycom=${comName} +elif test x$aa == x\.; then + mycom=${PWD}/${comName:2} +else + mycom=${PWD}/${comName} +fi +APPLI=`echo ${HOME} \`dirname $mycom\` | awk ' { print substr($2,length($1)+2) } '` +#echo $APPLI +export APPLI + +# --- set the SALOME environment (prerequisites, MODULES_ROOT_DIR...) + +. ${HOME}/${APPLI}/envd ${HOME}/${APPLI} + +# --- open a Python interpreter with SALOME environment + +${KERNEL_ROOT_DIR}/bin/salome/envSalome.py python -i ${KERNEL_ROOT_DIR}/bin/salome/salomeConsole.py $* diff --git a/bin/appliskel/runParam b/bin/appliskel/runParam new file mode 100755 index 000000000..17bbd618b --- /dev/null +++ b/bin/appliskel/runParam @@ -0,0 +1,5 @@ +#!/bin/bash + +./runAppli --killall + +#./runSession killSalome.py diff --git a/bin/appliskel/runRemote.sh b/bin/appliskel/runRemote.sh new file mode 100755 index 000000000..d3297a6c5 --- /dev/null +++ b/bin/appliskel/runRemote.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# +# --- run command in SALOME environment from remote call, ssh or rsh +# - SALOME configuration is defined by : +# - list of MODULE_ROOT_DIR +# - prerequisite environment +# - specific configuration for a particular SALOME application +# - These elements of configuration are defined locally on each computer +# in the directory APPLI: +# - A SALOME application distributed on several computers needs APPLI +# directories on the same path ($APPLI) relative to $HOME directory +# of the user, on each computer. +# +# --- call example (from cli76cd to cli76ce): +# ssh cli76ce ${APPLI}/runRemote.sh cli76cd 2810 SALOME_Container myContainerName +# +# --- local arguments +# $0 : ${APPLI}/runRemote.sh: from arg name, rebuild and export $APPLI variable +# $1 : computer name for CORBA name service (where SALOME was launched) +# $2 : port for CORBA name service +# $3 and following : local command to execute, with args +# + +# --- retrieve APPLI path, relative to $HOME +# on sarge, "which" gives not allways the absolute path... + +comName=`which $0` +aa=${comName:0:1} +if test x$aa == x\/; then + mycom=${comName} +elif test x$aa == x\.; then + mycom=${PWD}/${comName:2} +else + mycom=${PWD}/${comName} +fi +APPLI=`echo ${HOME} \`dirname $mycom\` | awk ' { print substr($2,length($1)+2) } '` +#echo $APPLI +export APPLI + +# --- set the SALOME environment (prerequisites, MODULES_ROOT_DIR...) + +. ${HOME}/${APPLI}/envd ${HOME}/${APPLI} + +# --- set the OMNIORB_CONFIG file and environment relative to this run of SALOME + +export OMNIORB_CONFIG=${HOME}/${APPLI}/.omniORB_$1_$2.cfg +export NSHOST=$1 +export NSPORT=$2 +initref="NameService=corbaname::"$1":$2" +echo "ORBInitRef $initref" > $OMNIORB_CONFIG + +# --- execute the command in the SALOME environment + +shift 2 + +${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/bash --rcfile $HOME/$APPLI/.bashrc -c "$*" diff --git a/bin/appliskel/runSession b/bin/appliskel/runSession new file mode 100755 index 000000000..2ab579ce6 --- /dev/null +++ b/bin/appliskel/runSession @@ -0,0 +1,38 @@ +#!/bin/bash +# +# Useful shell to run executable progs or shells under Salome env +# Use it with args to run a program : runSession python -i myprog.py +# Use it without args to run an interactive shell under Salome env +# + +# --- retrieve APPLI path, relative to $HOME +# on sarge, "which" gives not allways the absolute path... + +comName=`which $0` +aa=${comName:0:1} +if test x$aa == x\/; then + mycom=${comName} +elif test x$aa == x\.; then + mycom=${PWD}/${comName:2} +else + mycom=${PWD}/${comName} +fi +APPLI=`echo ${HOME} \`dirname $mycom\` | awk ' { print substr($2,length($1)+2) } '` +echo $APPLI +export APPLI + +# --- set the SALOME environment (prerequisites, MODULES_ROOT_DIR...) + +. ${HOME}/${APPLI}/envd ${HOME}/${APPLI} + +myhost=`hostname` +export OMNIORB_CONFIG=${HOME}/${APPLI}/.omniORB_${myhost}_last.cfg + +# --- invoque shell with or without args + +if [ $# -ne 0 ] ; then + ${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/bash --rcfile ${HOME}/${APPLI}/.bashrc -c "$*" +else + + ${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/bash --rcfile ${HOME}/${APPLI}/.bashrc +fi diff --git a/bin/appliskel/runTests b/bin/appliskel/runTests new file mode 100755 index 000000000..487b4a302 --- /dev/null +++ b/bin/appliskel/runTests @@ -0,0 +1,70 @@ +#!/bin/bash + +# --- retrieve APPLI path, relative to $HOME +# on sarge, "which" gives not allways the absolute path... + +comName=`which $0` +aa=${comName:0:1} +if test x$aa == x\/; then + mycom=${comName} +elif test x$aa == x\.; then + mycom=${PWD}/${comName:2} +else + mycom=${PWD}/${comName} +fi +APPLI=`echo ${HOME} \`dirname $mycom\` | awk ' { print substr($2,length($1)+2) } '` +#echo $APPLI +export APPLI + +# --- set the SALOME environment (prerequisites, MODULES_ROOT_DIR...) + +. ${HOME}/${APPLI}/envd ${HOME}/${APPLI} + +# --- define port for CORBA naming service + +searchFreePort() { + echo -n "Searching for a free port for naming service: " + export NSPORT=2810 + local limit=$NSPORT + let limit=limit+100 + while [ 1 ] + do + aRes=`netstat -ltn | grep -E :${NSPORT}` + if [ -z "$aRes" ]; then + echo ${NSPORT} - Ok + local myhost=`hostname` + export OMNIORB_CONFIG=${HOME}/${APPLI}/.omniORB_${myhost}_${NSPORT}.cfg + export NSPORT + export NSHOST=${myhost} + local initref="NameService=corbaname::"`hostname`":$NSPORT" + #echo "ORBInitRef $initref" > $OMNIORB_CONFIG + echo "InitRef = $initref" > $OMNIORB_CONFIG + export LAST_RUNNING_CONFIG=${HOME}/${APPLI}/.omniORB_${myhost}_test.cfg + rm ${LAST_RUNNING_CONFIG} + ln -s ${OMNIORB_CONFIG} ${LAST_RUNNING_CONFIG} + break + fi + echo -n "${NSPORT} " + if [[ $NSPORT -eq $limit ]] ; then + echo + echo "Can't find a free port to launch omniNames" + echo "Try to kill the running servers and then launch SALOME again." + exit + fi + let NSPORT=NSPORT+1 + done +} + +# --- invoque shell with or without args + +searchFreePort + +if [ $# -ne 0 ] ; then + ${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/bash --rcfile ${HOME}/${APPLI}/.bashrc -c "$*" +else + + ${KERNEL_ROOT_DIR}/bin/salome/envSalome.py /bin/bash --rcfile ${HOME}/${APPLI}/.bashrc +fi + +rm ${OMNIORB_CONFIG} +rm ${LAST_RUNNING_CONFIG} diff --git a/bin/createAppli.sh b/bin/createAppli.sh new file mode 100755 index 000000000..c6c4de072 --- /dev/null +++ b/bin/createAppli.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +comName=`which $0` +rep=`dirname $comName` + +cp -r $rep/appliskel $1 +chmod +x $1/*.sh $1/run* $1/envd diff --git a/bin/killSalome.py b/bin/killSalome.py index 96e923980..7ed1d6372 100755 --- a/bin/killSalome.py +++ b/bin/killSalome.py @@ -5,7 +5,7 @@ from killSalomeWithPort import killMyPort def killAllPorts(): user = os.getenv('USER') - for file in os.listdir("/tmp"): + for file in os.listdir(os.getenv("HOME")): l = string.split(file, "_") if len(l) >= 4: if file[:len(user)] == user: diff --git a/bin/killSalomeWithPort.py b/bin/killSalomeWithPort.py index 7c8dcd2ed..e3fdea77e 100755 --- a/bin/killSalomeWithPort.py +++ b/bin/killSalomeWithPort.py @@ -3,7 +3,7 @@ import os, sys, pickle, signal, commands ########## kills all salome processes with the given port ########## def killMyPort(port): - filedict='/tmp/'+os.getenv('USER')+"_"+port+'_SALOME_pidict' + filedict=os.getenv("HOME")+'/'+os.getenv('USER')+"_"+port+'_SALOME_pidict' found = 0 try: fpid=open(filedict, 'r') @@ -13,7 +13,7 @@ def killMyPort(port): pass if found: - a = os.system("pid=`ps -eo pid,command | egrep \"[0-9] omniNames -start "+str(port)+"\" | sed -e \"s%[^0-9]*\([0-9]*\) .*%\\1%g\"`; kill -9 $pid") + a = os.system("pid=`ps -eo pid,command | egrep \"[0-9] omniNames -start "+str(port)+"\" | sed -e \"s%[^0-9]*\([0-9]*\) .*%\\1%g\"`; kill -9 $pid >& /dev/null") try: process_ids=pickle.load(fpid) fpid.close() @@ -31,9 +31,11 @@ def killMyPort(port): pass os.remove(filedict) pid = commands.getoutput("ps -eo pid,command | egrep \"[0-9] omniNames -start "+str(port)+"\" | sed -e \"s%[^0-9]*\([0-9]*\) .*%\\1%g\"") - while pid != "": - a = os.system("pid=`ps -eo pid,command | egrep \"[0-9] omniNames -start "+str(port)+"\" | sed -e \"s%[^0-9]*\([0-9]*\) .*%\\1%g\"`; kill -9 $pid") + a = "" + while pid != "" and len(a.split(" ")) < 2: + a = commands.getoutput("pid=`ps -eo pid,command | egrep \"[0-9] omniNames -start "+str(port)+"\" | sed -e \"s%[^0-9]*\([0-9]*\) .*%\\1%g\"`; kill -9 $pid") pid = commands.getoutput("ps -eo pid,command | egrep \"[0-9] omniNames -start "+str(port)+"\" | sed -e \"s%[^0-9]*\([0-9]*\) .*%\\1%g\"") + print pid if __name__ == "__main__": diff --git a/bin/launchConfigureParser.py b/bin/launchConfigureParser.py index 403e0299b..f1bd606db 100755 --- a/bin/launchConfigureParser.py +++ b/bin/launchConfigureParser.py @@ -1,20 +1,77 @@ -import os, glob, string, sys +import os, glob, string, sys, re import xml.sax +# names of tags in XML configuration file +doc_tag = "document" +sec_tag = "section" +par_tag = "parameter" + +# names of attributes in XML configuration file +nam_att = "name" +val_att = "value" + +# certain values in XML configuration file ("launch" section) +lanch_nam = "launch" +gui_nam = "gui" +splash_nam = "splash" +logger_nam = "logger" +xterm_nam = "xterm" +file_nam = "file" +portkill_nam = "portkill" +killall_nam = "killall" +modules_nam = "modules" +pyModules_nam = "pyModules" +embedded_nam = "embedded" +standalone_nam = "standalone" +containers_nam = "containers" +key_nam = "key" +interp_nam = "interp" + +# values in XML configuration file giving specific module parameters ( section) +# which are stored in opts with key _ (eg SMESH_plugins) +plugins_nam = "plugins" + +# values passed as arguments, NOT read from XML config file, but set from within this script +appname_nam = "appname" +port_nam = "port" +appname = "SalomeApp" + +# values of boolean type (must be '0' or '1'). +# xml_parser.boolValue() is used for correct setting +boolKeys = ( gui_nam, splash_nam, logger_nam, file_nam, xterm_nam, portkill_nam, killall_nam, interp_nam ) + +# values of list type +listKeys = ( containers_nam, embedded_nam, key_nam, modules_nam, standalone_nam, plugins_nam ) + +# return application version (uses GUI_ROOT_DIR (or KERNEL_ROOT_DIR in batch mode) +/bin/salome/VERSION) +def version(): + root_dir = os.environ.get( 'KERNEL_ROOT_DIR', '' ) # KERNEL_ROOT_DIR or "" if not found + root_dir = os.environ.get( 'GUI_ROOT_DIR', root_dir ) # GUI_ROOT_DIR or KERNEL_ROOT_DIR or "" if both not found + filename = root_dir+'/bin/salome/VERSION' + str = open( filename, "r" ).readline() # str = "THIS IS SALOME - SALOMEGUI VERSION: 3.0.0" + match = re.search( r':\s+([\d\.]+)\s*$', str ) + if match : + return match.group( 1 ) + return '' + # ----------------------------------------------------------------------------- ### xml reader for launch configuration file usage +section_to_skip = "" + class xml_parser: - def __init__(self, fileName): + def __init__(self, fileName, _opts ): + print "Processing ",fileName self.space = [] - self.opts = {} + self.opts = _opts + self.section = section_to_skip parser = xml.sax.make_parser() parser.setContentHandler(self) parser.parse(fileName) pass - def CorrectBoolean(self, str): + def boolValue( self, str ): if str in ("yes", "y", "1"): return 1 elif str in ("no", "n", "0"): @@ -24,56 +81,52 @@ class xml_parser: pass def startElement(self, name, attrs): - #print "startElement name=",name - #print "startElement attrs=",attrs.getNames() self.space.append(name) self.current = None - if self.space[:2] == ["Configuration-list","launchoptions"] and len(self.space) == 3: - self.current = name - elif self.space == ["Configuration-list","modules-list"]: - self.opts["modules"] = [] - elif self.space == ["Configuration-list","modules-list","module"] and "name" in attrs.getNames(): - for field in attrs.getNames(): - if field == "name": - self.currentModuleName = str(attrs.getValue("name")) - self.opts["modules"].append(self.currentModuleName) - else: - self.opts[str(attrs.getValue("name"))+"_"+str(field)] = self.CorrectBoolean(attrs.getValue(field)) - pass - pass - elif self.space == ["Configuration-list","modules-list","module","plugin"] and "name" in attrs.getNames(): - key = str(self.currentModuleName)+"_plugins" - if not self.opts.has_key(key): - self.opts[key]=[] - pass - self.opts[key].append(attrs.getValue("name")) - elif self.space == ["Configuration-list","embedded-list"]: - self.opts["embedded"] = [] + # if we are analyzing "section" element and its "name" attribute is + # either "launch" or module name -- set section_name + if self.space == [doc_tag, sec_tag] and nam_att in attrs.getNames(): + section_name = attrs.getValue( nam_att ) + if section_name == lanch_nam: + self.section = section_name # launch section + elif self.opts.has_key( modules_nam ) and \ + section_name in self.opts[ modules_nam ]: + self.section = section_name # section + else: + self.section = section_to_skip # any other section pass - elif self.space == ["Configuration-list","standalone-list"]: - self.opts["standalone"] = [] - pass - elif self.space == ["Configuration-list","containers-list"]: - self.opts["containers"] = [] + + # if we are analyzing "parameter" elements - children of either + # "section launch" or "section """ element, then store them + # in self.opts assiciative array (key = [_ + ] value of "name" attribute) + elif self.section != section_to_skip and \ + self.space == [doc_tag, sec_tag, par_tag] and \ + nam_att in attrs.getNames() and \ + val_att in attrs.getNames(): + nam = attrs.getValue( nam_att ) + val = attrs.getValue( val_att ) + if self.section == lanch_nam: # key for launch section + key = nam + else: # key for section + key = self.section + "_" + nam + if nam in boolKeys: + self.opts[key] = self.boolValue( val ) # assign boolean value: 0 or 1 + elif nam in listKeys: + self.opts[key] = val.split( ',' ) # assign list value: [] + else: + self.opts[key] = val; pass pass def endElement(self, name): p = self.space.pop() self.current = None + if self.section != section_to_skip and name == sec_tag: + self.section = section_to_skip pass def characters(self, content): - #print "Characters content:",content - if self.current: - self.opts[self.current] = self.CorrectBoolean(content) - elif self.space == ["Configuration-list","embedded-list", "embeddedserver"]: - self.opts["embedded"].append(content) - elif self.space == ["Configuration-list","standalone-list", "standaloneserver"]: - self.opts["standalone"].append(content) - elif self.space == ["Configuration-list","containers-list", "containertype"]: - self.opts["containers"].append(content) pass def processingInstruction(self, target, data): @@ -92,45 +145,62 @@ class xml_parser: # ----------------------------------------------------------------------------- -### searching for launch configuration file : $HOME/applipath()/salome.launch - -appname="salome" -import Utils_Identity -versnb=Utils_Identity.version() -dirname = os.path.join(os.environ["HOME"],Utils_Identity.getapplipath()) -filename=os.path.join(dirname,"salome.launch") - -if not os.path.exists(filename): - print "Launch configuration file does not exist. Create default:",filename - os.system("mkdir -p "+dirname) - os.system("cp -f "+os.environ["KERNEL_ROOT_DIR"]+"/bin/salome/salome.launch "+filename) - -### get options from launch configuration file - +### searching for launch configuration files +# the rule: +# - environment variable {'appname'+'Config'} (SalomeAppConfig) contains list of directories (';' as devider) +# - these directories contain 'appname'+'.xml' (SalomeApp.xml) configuration files +# - these files are analyzed beginning with the last one (last directory in the list) +# - if a key is found in next analyzed cofiguration file - it will be replaced +# - the last configuration file to be analyzed - ~/.'appname'+'rc' (~/SalomeApprc) (if it exists) +# - but anyway, if user specifies a certain option in a command line - it will replace the values +# - specified in configuration file(s) +# - once again the order of settings (next setting replaces the previous ones): +# - SalomeApp.xml files in directories specified by SalomeAppConfig env variable +# - .SalomeApprc file in user's catalogue +# - command line + +config_var = appname+'Config' +dirs = os.environ[config_var] +dirs = dirs.split( ';' ) +dirs.reverse() # reverse order, like in "path" variable - FILO-style processing + +_opts = {} # assiciative array of options to be filled + +# SalomeApp.xml files in directories specified by SalomeAppConfig env variable +for dir in dirs: + filename = dir+'/'+appname+'.xml' + try: + p = xml_parser(filename, _opts) + _opts = p.opts + except: + print 'Can not read launch configuration file ', filename + continue + +# SalomeApprc file in user's catalogue +filename = os.environ['HOME']+'/.'+appname+'rc.'+version() try: - p = xml_parser(filename) + p = xml_parser(filename, _opts) + _opts = p.opts except: print 'Can not read launch configuration file ', filename - filename = None - pass -if filename: - args = p.opts -else: - args = {} - pass -# --- args completion -for aKey in ("containers","embedded","key","modules","standalone"): - if not args.has_key(aKey): +args = _opts + +# --- setting default values of keys if they were NOT set in config files --- +for aKey in listKeys: + if not args.has_key( aKey ): args[aKey]=[] -for aKey in ("gui","logger","file","xterm","portkill","killall","interp"): - if not args.has_key(aKey): + +for aKey in boolKeys: + if not args.has_key( aKey ): args[aKey]=0 -if args["file"]: - afile=args["file"] - args["file"]=[afile] -args["appname"] = appname + +if args[file_nam]: + afile=args[file_nam] + args[file_nam]=[afile] + +args[appname_nam] = appname ### searching for my port @@ -140,7 +210,7 @@ try: s = file.read() while len(s): l = string.split(s, ":") - if string.split(l[0], " ")[0] == "ORBInitRef": + if string.split(l[0], " ")[0] == "ORBInitRef" or string.split(l[0], " ")[0] == "InitRef" : my_port = int(l[len(l)-1]) pass s = file.read() @@ -148,7 +218,7 @@ try: except: pass -args["port"] = my_port +args[port_nam] = my_port # ----------------------------------------------------------------------------- @@ -165,7 +235,7 @@ def options_parser(line): list = [] pass - print "source=",source + #print "source=",source result = {} i = 0 @@ -192,27 +262,27 @@ def options_parser(line): # ----------------------------------------------------------------------------- ### read command-line options : each arg given in command line supersedes arg from xml config file - +cmd_opts = {} try: - opts = options_parser(sys.argv[1:]) - print "opts=",opts + cmd_opts = options_parser(sys.argv[1:]) + #print "opts=",cmd_opts kernel_root_dir=os.environ["KERNEL_ROOT_DIR"] except: - opts["h"] = 1 + cmd_opts["h"] = 1 pass ### check all options are right opterror=0 -for opt in opts: +for opt in cmd_opts: if not opt in ("h","g","l","f","x","m","e","s","c","p","k","t","i"): print "command line error: -", opt opterror=1 if opterror == 1: - opts["h"] = 1 + cmd_opts["h"] = 1 -if opts.has_key("h"): +if cmd_opts.has_key("h"): print """USAGE: runSalome.py [options] [command line options] : --help or -h : print this help @@ -235,6 +305,7 @@ if opts.has_key("h"): --portkill or -p : kill the salome with current port --killall or -k : kill all salome sessions --interp=n or -i=n : number of additional xterm to open, with session environment + -z : display splash screen For each Salome module, the environment variable _ROOT_DIR must be set. The module name () must be uppercase. @@ -244,35 +315,37 @@ if opts.has_key("h"): pass ### apply command-line options to the arguments -for opt in opts: +for opt in cmd_opts: if opt == 'g': - args['gui'] = 1 + args[gui_nam] = 1 + elif opt == 'z': + args[splash_nam] = 1 elif opt == 'l': - args['logger'] = 1 + args[logger_nam] = 1 elif opt == 'f': - args['file'] = opts['f'] + args[file_nam] = cmd_opts['f'] elif opt == 'x': - args['xterm'] = 1 + args[xterm_nam] = 1 elif opt == 'i': - args['interp'] = opts['i'] + args[interp_nam] = cmd_opts['i'] elif opt == 'm': - args['modules'] = opts['m'] + args[modules_nam] = cmd_opts['m'] elif opt == 'e': - args['embedded'] = opts['e'] + args[embedded_nam] = cmd_opts['e'] elif opt == 's': - args['standalone'] = opts['s'] + args[standalone_nam] = cmd_opts['s'] elif opt == 'c': - args['containers'] = opts['c'] + args[containers_nam] = cmd_opts['c'] elif opt == 'p': - args['portkill'] = 1 + args[portkill_nam] = 1 elif opt == 'k': - args['killall'] = 1 + args[killall_nam] = 1 pass pass # 'terminal' must be processed in the end: to deny any 'gui' options -if 't' in opts: - args['gui'] = 0 +if 't' in cmd_opts: + args[gui_nam] = 0 pass -print "args=",args +#print "args=",args diff --git a/bin/orbmodule.py b/bin/orbmodule.py index 627a90987..fdc254472 100755 --- a/bin/orbmodule.py +++ b/bin/orbmodule.py @@ -47,7 +47,7 @@ class client: try: self.rootContext = obj._narrow(CosNaming.NamingContext) return - except CORBA.COMM_FAILURE: + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): self.rootContext = None print "Lancement du Naming Service", @@ -62,7 +62,7 @@ class client: obj = self.orb.resolve_initial_references("NameService") self.rootContext = obj._narrow(CosNaming.NamingContext) break - except (CORBA.COMM_FAILURE,CORBA.OBJECT_NOT_EXIST): + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): self.rootContext = None sys.stdout.write('+') sys.stdout.flush() @@ -77,15 +77,16 @@ class client: def showNScontext(self,context,dec=''): bl,bi=context.list(0) - ok,b=bi.next_one() - while(ok): - for s in b.binding_name : - print "%s%s.%s" %(dec,s.id,s.kind) - if s.kind == "dir": - obj=context.resolve([s]) - scontext = obj._narrow(CosNaming.NamingContext) - self.showNScontext(scontext,dec=dec+' ') + if bi is not None: ok,b=bi.next_one() + while(ok): + for s in b.binding_name : + print "%s%s.%s" %(dec,s.id,s.kind) + if s.kind == "dir": + obj=context.resolve([s]) + scontext = obj._narrow(CosNaming.NamingContext) + self.showNScontext(scontext,dec=dec+' ') + ok,b=bi.next_one() # -------------------------------------------------------------------------- @@ -112,7 +113,7 @@ class client: obj = None except CosNaming.NamingContext.CannotProceed, ex: obj = None - except CORBA.COMM_FAILURE, ex: + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): obj = None return obj @@ -155,7 +156,7 @@ class client: obj = None except CosNaming.NamingContext.CannotProceed, ex: obj = None - except CORBA.COMM_FAILURE, ex: + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): obj = None return obj diff --git a/bin/runNS.sh b/bin/runNS.sh index 76b7452bf..b5c155a6c 100755 --- a/bin/runNS.sh +++ b/bin/runNS.sh @@ -17,7 +17,7 @@ touch ${BaseDir}/logs/${Username}/dummy \rm -f ${BaseDir}/logs/${Username}/omninames* ${BaseDir}/logs/${Username}/dummy ${BaseDir}/logs/${Username}/*.log echo "Name Service... " -aSedCommand="s/ORBInitRef NameService=corbaname::`hostname`:\([[:digit:]]*\)/\1/" +aSedCommand="s/.*NameService=corbaname::`hostname`:\([[:digit:]]*\)/\1/" aPort=`sed -e"$aSedCommand" $OMNIORB_CONFIG` omniNames -start $aPort -logdir ${BaseDir}/logs/${Username} & diff --git a/bin/runSalome b/bin/runSalome index 7505e8b89..6e7efbc67 100755 --- a/bin/runSalome +++ b/bin/runSalome @@ -12,8 +12,13 @@ searchFreePort() { echo ${NSPORT} - Ok local myhost=`hostname` export OMNIORB_CONFIG=${HOME}/.omniORB_${myhost}_${NSPORT}.cfg - local initref="NameService=corbaname::"`hostname`":$NSPORT" - echo "ORBInitRef $initref" > $OMNIORB_CONFIG + local initref="NameService=corbaname::"`hostname`":$NSPORT" + export NSPORT + if [[ `python -c "import CORBA; print CORBA.ORB_ID"` == "omniORB4" ]]; then + echo "InitRef = $initref" > $OMNIORB_CONFIG + else + echo "ORBInitRef $initref" > $OMNIORB_CONFIG + fi break fi echo -n "${NSPORT} " @@ -29,7 +34,9 @@ searchFreePort() { searchFreePort -if [ $# -ne 0 ] ; then +if [[ "$*" == "-nothing" ]]; then + echo "port:$NSPORT" +elif [ $# -ne 0 ] ; then python -i ${KERNEL_ROOT_DIR}/bin/salome/runSalome.py $* else python ${KERNEL_ROOT_DIR}/bin/salome/runSalome.py diff --git a/bin/runSalome.py b/bin/runSalome.py index e423d97ba..0827efa50 100755 --- a/bin/runSalome.py +++ b/bin/runSalome.py @@ -5,6 +5,11 @@ import orbmodule process_id = {} +# salome_subdir variable is used for composing paths like $KERNEL_ROOT_DIR/share/salome/resources, etc. +# before moving to SUIT-based gui, instead of salome_subdir there was args['appname'] used. +# but after - 'appname' = "SalomeApp", so using it in making the subdirectory is an error. +salome_subdir = "salome" + # ----------------------------------------------------------------------------- def add_path(directory, variable_name): @@ -52,6 +57,7 @@ def get_config(): if args.has_key("modules"): modules_list += args["modules"] # KERNEL must be last in the list to locate it at the first place in PATH + modules_list[:0] = ["GUI"] modules_list[:0] = ["KERNEL"] modules_list.reverse() @@ -80,6 +86,10 @@ def get_config(): modules_list.remove("KERNEL") pass + while "GUI" in modules_list: + modules_list.remove("GUI") + pass + if "SUPERV" in modules_list and not 'superv' in args['standalone']: args['standalone'].append("superv") pass @@ -93,51 +103,40 @@ def set_env(args, modules_list, modules_root_dir): python_version="python%d.%d" % sys.version_info[0:2] modules_root_dir_list = [] + modules_list = modules_list[:] + ["GUI"] modules_list = modules_list[:] + ["KERNEL"] for module in modules_list : module_root_dir = modules_root_dir[module] modules_root_dir_list[:0] = [module_root_dir] - add_path(os.path.join(module_root_dir,"lib",args['appname']), + add_path(os.path.join(module_root_dir,"lib",salome_subdir), "LD_LIBRARY_PATH") - add_path(os.path.join(module_root_dir,"bin",args['appname']), + add_path(os.path.join(module_root_dir,"bin",salome_subdir), "PATH") if os.path.exists(module_root_dir + "/examples") : add_path(os.path.join(module_root_dir,"examples"), "PYTHONPATH") - add_path(os.path.join(module_root_dir,"bin",args['appname']), + add_path(os.path.join(module_root_dir,"bin",salome_subdir), "PYTHONPATH") add_path(os.path.join(module_root_dir,"lib", - python_version,"site-packages",args['appname']), + python_version,"site-packages",salome_subdir), "PYTHONPATH") - add_path(os.path.join(module_root_dir,"lib",args['appname']), + add_path(os.path.join(module_root_dir,"lib",salome_subdir), "PYTHONPATH") add_path(os.path.join(module_root_dir,"lib", - python_version,"site-packages",args['appname'], + python_version,"site-packages",salome_subdir, "shared_modules"), "PYTHONPATH") os.environ["SALOMEPATH"]=":".join(modules_root_dir_list) - # special path for logger lib if needeed + # set trace environment variable - os.environ["SALOME_trace"]="local" + if not os.environ.has_key("SALOME_trace"): + os.environ["SALOME_trace"]="local" if args['file']: - os.environ["SALOME_trace"]=args['file'][0] + os.environ["SALOME_trace"]="file:"+args['file'][0] if args['logger']: os.environ["SALOME_trace"]="with_logger" - locdir=os.environ['PWD'] - libtracedir=os.path.join(locdir,"libSalomeTrace") - libtrace = os.path.join(modules_root_dir["KERNEL"],"lib", - args['appname'], - "libSALOMELoggerClient.so.0.0.0") - libtraceln = os.path.join(libtracedir,"libSALOMELocalTrace.so") - aCommand = 'rm -rf ' + libtracedir + "; " - aCommand += 'mkdir ' + libtracedir + "; " - aCommand += 'ln -s ' + libtrace + " " + libtraceln + "; " - aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0; " - aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0.0.0; " - os.system(aCommand) - add_path(libtracedir, "LD_LIBRARY_PATH") # set environment for SMESH plugins @@ -157,22 +156,43 @@ def set_env(args, modules_list, modules_root_dir): os.environ["SALOME_"+plugin+"Resources"] \ = plugin_root+"/share/"+args["appname"]+"/resources" add_path(os.path.join(plugin_root,"lib",python_version, - "site-packages",args['appname']), + "site-packages",salome_subdir), "PYTHONPATH") - add_path(os.path.join(plugin_root,"lib",args['appname']), + add_path(os.path.join(plugin_root,"lib",salome_subdir), "PYTHONPATH") - add_path(os.path.join(plugin_root,"lib",args['appname']), + add_path(os.path.join(plugin_root,"lib",salome_subdir), "LD_LIBRARY_PATH") - add_path(os.path.join(plugin_root,"bin",args['appname']), + add_path(os.path.join(plugin_root,"bin",salome_subdir), "PYTHONPATH") - add_path(os.path.join(plugin_root,"bin",args['appname']), + add_path(os.path.join(plugin_root,"bin",salome_subdir), "PATH") pass pass # set environment for SUPERV module os.environ["ENABLE_MACRO_NODE"]="1" - + # set resources variables if not yet set + if os.getenv("GUI_ROOT_DIR"): + if not os.getenv("SUITRoot"): os.environ["SUITRoot"] = os.getenv("GUI_ROOT_DIR") + "/share/salome" + if not os.getenv("SalomeAppConfig"): os.environ["SalomeAppConfig"] = os.getenv("GUI_ROOT_DIR") + "/share/salome/resources" + pass + + os.environ["CSF_PluginDefaults"] \ + = os.path.join(modules_root_dir["KERNEL"],"share", + salome_subdir,"resources") + os.environ["CSF_SALOMEDS_ResourcesDefaults"] \ + = os.path.join(modules_root_dir["KERNEL"],"share", + salome_subdir,"resources") + + if "GEOM" in modules_list: + print "GEOM OCAF Resources" + os.environ["CSF_GEOMDS_ResourcesDefaults"] \ + = os.path.join(modules_root_dir["GEOM"],"share", + salome_subdir,"resources") + print "GEOM Shape Healing Resources" + os.environ["CSF_ShHealingDefaults"] \ + = os.path.join(modules_root_dir["GEOM"],"share", + salome_subdir,"resources") # ----------------------------------------------------------------------------- @@ -222,7 +242,7 @@ def kill_salome(args): # ----------------------------------------------------------------------------- # -# Définition des classes d'objets pour le lancement des Server CORBA +# Definition des classes d'objets pour le lancement des Server CORBA # class Server: @@ -248,7 +268,7 @@ class Server: + os.getenv("LD_LIBRARY_PATH")] myargs = myargs +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path command = myargs + self.CMD - # print "command = ", command + print "command = ", command pid = os.spawnvp(os.P_NOWAIT, command[0], command) process_id[pid]=self.CMD @@ -263,7 +283,7 @@ class InterpServer(Server): def run(self): global process_id command = self.CMD - print "command = ", command + #print "command = ", command pid = os.spawnvp(os.P_NOWAIT, command[0], command) process_id[pid]=self.CMD @@ -274,20 +294,22 @@ class CatalogServer(Server): self.args=args self.initArgs() self.SCMD1=['SALOME_ModuleCatalog_Server','-common'] - self.SCMD2=['-personal', - '${HOME}/Salome/resources/CatalogModulePersonnel.xml'] + self.SCMD2=[] + home_dir=os.getenv('HOME') + if home_dir is not None: + self.SCMD2=['-personal',os.path.join(home_dir,'Salome/resources/CatalogModulePersonnel.xml')] def setpath(self,modules_list,modules_root_dir): cata_path=[] list_modules = modules_list[:] list_modules.reverse() - for module in ["KERNEL"] + list_modules: + for module in ["KERNEL", "GUI"] + list_modules: module_root_dir=modules_root_dir[module] module_cata=module+"Catalog.xml" - print " ", module_cata + #print " ", module_cata cata_path.extend( glob.glob(os.path.join(module_root_dir, - "share",self.args['appname'], + "share",salome_subdir, "resources",module_cata))) self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2 @@ -341,31 +363,63 @@ class LoggerServer(Server): # --- -class SessionLoader(Server): +class SessionServer(Server): def __init__(self,args): self.args=args self.initArgs() - self.CMD=['SALOME_Session_Loader'] - if "cppContainer" in self.args['standalone'] \ - or "cppContainer" in self.args['embedded']: - self.CMD=self.CMD+['CPP'] - if "pyContainer" in self.args['standalone'] \ - or "pyContainer" in self.args['embedded']: - self.CMD=self.CMD+['PY'] - if "supervContainer" in self.args['containers'] \ - or "supervContainer" in self.args['standalone']: - self.CMD=self.CMD+['SUPERV'] + self.SCMD1=['SALOME_Session_Server'] + self.SCMD2=[] + if 'registry' in self.args['embedded']: + self.SCMD1+=['--with','Registry', + '(','--salome_session','theSession',')'] + if 'moduleCatalog' in self.args['embedded']: + self.SCMD1+=['--with','ModuleCatalog','(','-common'] + home_dir=os.getenv('HOME') + if home_dir is not None: + self.SCMD2+=['-personal',os.path.join(home_dir,'Salome/resources/CatalogModulePersonnel.xml')] + self.SCMD2+=[')'] + if 'study' in self.args['embedded']: + self.SCMD2+=['--with','SALOMEDS','(',')'] + if 'cppContainer' in self.args['embedded']: + self.SCMD2+=['--with','Container','(','FactoryServer',')'] + if 'SalomeAppEngine' in self.args['embedded']: + self.SCMD2+=['--with','SalomeAppEngine','(',')'] + + if 'cppContainer' in self.args['standalone'] or 'cppContainer' in self.args['embedded']: + self.SCMD2+=['CPP'] + if 'pyContainer' in self.args['standalone'] or 'pyContainer' in self.args['embedded']: + self.SCMD2+=['PY'] + if 'supervContainer' in self.args['containers'] or 'supervContainer' in self.args['standalone']: + self.SCMD2+=['SUPERV'] if self.args['gui']: - self.CMD=self.CMD+['GUI'] - print self.CMD + self.SCMD2+=['GUI'] + if self.args['splash']: + self.SCMD2+=['SPLASH'] + def setpath(self,modules_list,modules_root_dir): + cata_path=[] + list_modules = modules_list[:] + list_modules.reverse() + for module in ["KERNEL", "GUI"] + list_modules: + module_root_dir=modules_root_dir[module] + module_cata=module+"Catalog.xml" + #print " ", module_cata + cata_path.extend( + glob.glob(os.path.join(module_root_dir,"share", + salome_subdir,"resources", + module_cata))) + if 'moduleCatalog' in self.args['embedded']: + self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2 + else: + self.CMD=self.SCMD1 + self.SCMD2 + # --- -class SessionServer(Server): +class ContainerManagerServer(Server): def __init__(self,args): self.args=args self.initArgs() - self.SCMD1=['SALOME_Session_Server'] + self.SCMD1=['SALOME_ContainerManagerServer'] self.SCMD2=[] if 'registry' in self.args['embedded']: self.SCMD1+=['--with','Registry', @@ -373,20 +427,20 @@ class SessionServer(Server): if 'moduleCatalog' in self.args['embedded']: self.SCMD1+=['--with','ModuleCatalog','(','-common'] self.SCMD2+=['-personal', - '${HOME}/Salome/resources/CatalogModulePersonnel.xml',')'] + '${HOME}/Salome/resources/CatalogModulePersonnel.xml',')'] if 'study' in self.args['embedded']: self.SCMD2+=['--with','SALOMEDS','(',')'] if 'cppContainer' in self.args['embedded']: self.SCMD2+=['--with','Container','(','FactoryServer',')'] - + def setpath(self,modules_list,modules_root_dir): cata_path=[] list_modules = modules_list[:] list_modules.reverse() - for module in ["KERNEL"] + list_modules: + for module in ["KERNEL", "GUI"] + list_modules: module_root_dir=modules_root_dir[module] module_cata=module+"Catalog.xml" - print " ", module_cata + #print " ", module_cata cata_path.extend( glob.glob(os.path.join(module_root_dir,"share", self.args['appname'],"resources", @@ -396,19 +450,6 @@ class SessionServer(Server): else: self.CMD=self.SCMD1 + self.SCMD2 -## # arguments SALOME_Session_Server pour ddd -## comm_ddd="" -## for mot in self.CMD: -## if mot == "(": -## comm_ddd+='"(" ' -## elif mot == ")": -## comm_ddd+='")" ' -## else: -## comm_ddd+=mot+" " -## print comm_ddd - -# --- - class NotifyServer(Server): def __init__(self,args,modules_root_dir): self.args=args @@ -429,6 +470,7 @@ class NotifyServer(Server): def startGUI(): """Salome Session Graphic User Interface activation""" import SALOME + import SALOME_Session_idl session=clt.waitNS("/Kernel/Session",SALOME.Session) session.GetInterface() @@ -438,16 +480,8 @@ def startSalome(args, modules_list, modules_root_dir): """Launch all SALOME servers requested by args""" init_time = os.times() - # - # Lancement Session Loader - # - print "startSalome ", args - if args['gui']: - myServer=SessionLoader(args) - myServer.run() - # # Initialisation ORB et Naming Service # @@ -473,7 +507,7 @@ def startSalome(args, modules_list, modules_root_dir): # # Lancement Registry Server, - # attente de la disponibilité du Registry dans le Naming Service + # attente de la disponibilite du Registry dans le Naming Service # if 'registry' not in args['embedded']: @@ -483,7 +517,7 @@ def startSalome(args, modules_list, modules_root_dir): # # Lancement Catalog Server, - # attente de la disponibilité du Catalog Server dans le Naming Service + # attente de la disponibilite du Catalog Server dans le Naming Service # @@ -496,47 +530,24 @@ def startSalome(args, modules_list, modules_root_dir): # # Lancement SalomeDS Server, - # attente de la disponibilité du SalomeDS dans le Naming Service + # attente de la disponibilite du SalomeDS dans le Naming Service # - os.environ["CSF_PluginDefaults"] \ - = os.path.join(modules_root_dir["KERNEL"],"share", - args['appname'],"resources") - os.environ["CSF_SALOMEDS_ResourcesDefaults"] \ - = os.path.join(modules_root_dir["KERNEL"],"share", - args['appname'],"resources") - - if "GEOM" in modules_list: - print "GEOM OCAF Resources" - os.environ["CSF_GEOMDS_ResourcesDefaults"] \ - = os.path.join(modules_root_dir["GEOM"],"share", - args['appname'],"resources") - print "GEOM Shape Healing Resources" - os.environ["CSF_ShHealingDefaults"] \ - = os.path.join(modules_root_dir["GEOM"],"share", - args['appname'],"resources") - + #print "ARGS = ",args if 'study' not in args['embedded']: + print "RunStudy" myServer=SalomeDSServer(args) myServer.run() clt.waitNS("/myStudyManager") # - # Lancement Session Server - # - - mySessionServ = SessionServer(args) - mySessionServ.setpath(modules_list,modules_root_dir) - mySessionServ.run() - - #macomm2=['ddd'] - #pid = os.spawnvp(os.P_NOWAIT, macomm2[0], macomm2) - # - # Attente de la disponibilité du Session Server dans le Naming Service + # Lancement ContainerManagerServer # + + myCmServer = ContainerManagerServer(args) + myCmServer.setpath(modules_list,modules_root_dir) + myCmServer.run() - import SALOME - session=clt.waitNS("/Kernel/Session",SALOME.Session) from Utils_Identity import getShortHostName @@ -550,7 +561,7 @@ def startSalome(args, modules_list, modules_root_dir): # # Lancement Container C++ local, - # attente de la disponibilité du Container C++ local dans le Naming Service + # attente de la disponibilite du Container C++ local dans le Naming Service # if 'cppContainer' in args['standalone']: @@ -560,7 +571,7 @@ def startSalome(args, modules_list, modules_root_dir): # # Lancement Container Python local, - # attente de la disponibilité du Container Python local + # attente de la disponibilite du Container Python local # dans le Naming Service # @@ -571,7 +582,7 @@ def startSalome(args, modules_list, modules_root_dir): # # Lancement Container Supervision local, - # attente de la disponibilité du Container Supervision local + # attente de la disponibilite du Container Supervision local # dans le Naming Service # @@ -580,11 +591,30 @@ def startSalome(args, modules_list, modules_root_dir): myServer.run() clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer") + # + # Lancement Session Server + # + mySessionServ = SessionServer(args) + mySessionServ.setpath(modules_list,modules_root_dir) + mySessionServ.run() +##---------------- + + # Attente de la disponibilite du Session Server dans le Naming Service + # + + import SALOME + import SALOME_Session_idl + session=clt.waitNS("/Kernel/Session",SALOME.Session) + end_time = os.times() print print "Start SALOME, elapsed time : %5.1f seconds"% (end_time[4] - init_time[4]) + # ASV start GUI without Loader + #if args['gui']: + # session.GetInterface() + # # additionnal external python interpreters # @@ -631,9 +661,11 @@ def useSalome(args, modules_list, modules_root_dir): #print process_id - filedict = '/tmp/' + os.getenv('USER') + "_" + str(args['port']) \ - + '_' + args['appname'].upper() + '_pidict' - +# filedict = '/tmp/' + os.getenv('USER') + "_" + str(args['port']) \ +# + '_' + args['appname'].upper() + '_pidict' +# replaced args['appname'] by "SALOME" because in killSalome.py use of 'SALOME' in file name is hardcoded. + filedict = os.getenv("HOME") + '/' + os.getenv('USER') + "_" + str(args['port']) \ + + '_' + 'SALOME' + '_pidict' process_ids = [] try: fpid=open(filedict, 'r') diff --git a/bin/salome.launch b/bin/salome.launch index 92c5eab6d..1b5bbdd1b 100644 --- a/bin/salome.launch +++ b/bin/salome.launch @@ -2,7 +2,6 @@ yes no - no yes no diff --git a/bin/salomeConsole.py b/bin/salomeConsole.py index 03c0a5e51..5ce7cec64 100755 --- a/bin/salomeConsole.py +++ b/bin/salomeConsole.py @@ -66,7 +66,7 @@ class client(orbmodule.client): try: self.rootContext = obj._narrow(CosNaming.NamingContext) return - except CORBA.COMM_FAILURE: + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): print "It's not a valid naming service" self.rootContext = None raise diff --git a/configure.in.base b/configure.in.base index 687d5d093..81cde052a 100644 --- a/configure.in.base +++ b/configure.in.base @@ -212,8 +212,6 @@ WITH_BATCH=no test x$openpbs_ok = xyes || test x$lsf_ok = xyes && WITH_BATCH=yes AC_SUBST(WITH_BATCH) - - echo echo --------------------------------------------- echo testing LEX \& YACC @@ -287,6 +285,14 @@ echo CHECK_QT +echo +echo ---------------------------------------------- +echo testing CPPUNIT only required for unit testing +echo ---------------------------------------------- +echo + +CHECK_CPPUNIT + if test "X$WITHIHM" = "Xyes"; then echo echo --------------------------------------------- @@ -337,14 +343,6 @@ echo CHECK_HDF5 -echo -echo --------------------------------------------- -echo testing MED2 -echo --------------------------------------------- -echo - -CHECK_MED2 - echo echo --------------------------------------------- echo Testing OpenCascade @@ -368,7 +366,18 @@ echo --------------------------------------------- echo echo Configure -variables="cc_ok boost_ok lex_yacc_ok mpi_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok med2_ok omniORB_ok occ_ok sip_ok pyqt_ok qwt_ok doxygen_ok graphviz_ok openpbs_ok lsf_ok" +variables="cc_ok boost_ok lex_yacc_ok mpi_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok omniORB_ok occ_ok sip_ok pyqt_ok qwt_ok doxygen_ok graphviz_ok" + +for var in $variables +do + eval toto=\$$var + if test x$toto != "x"; then + printf " %10s : " `echo \$var | sed -e "s,_ok,,"` + eval echo \$$var + fi +done +echo "---Optional:" +variables="cppunit_ok openpbs_ok lsf_ok" for var in $variables do @@ -436,13 +445,14 @@ dnl directory mkdir -p bin/salome cd bin/salome -for i in $ROOT_SRCDIR/bin/* +for i in `find $ROOT_SRCDIR/bin` do - local_bin=`echo $i | sed -e "s,$ROOT_SRCDIR,.,"` + local_bin=`echo $i | sed -e "s,$ROOT_SRCDIR/bin,.,"` case "$local_bin" in *.in | *~) ;; - ./bin/CVS | ./bin/salome) ;; - *) $INSTALL $i .; echo $local_bin ;; + . | */CVS | */CVS/* | ./salome) ;; + ./appliskel |./appliskel/env.d) $INSTALL -d $local_bin ; echo $local_bin ;; + *) $INSTALL $i $local_bin; echo $local_bin ;; esac done cd $ROOT_BUILDDIR @@ -472,3 +482,4 @@ AC_OUTPUT_COMMANDS([ \ ]) ## do not delete this line + diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt new file mode 100644 index 000000000..dddcadb43 --- /dev/null +++ b/doc/INSTALL.txt @@ -0,0 +1,380 @@ + +================================================================= +Installation instructions, up to date for 3.0 version +================================================================= + +You'll find here generic instructions for installing the SALOME2 platform. + ++-------------------------------------------+ +| **WORK in PROGRESS, INCOMPLETE DOCUMENT** | ++-------------------------------------------+ + +Summary +------- + +`1. Quick Overview`_ + +`2. System configuration`_ + +`3. Third-party dependencies`_ + +`4. Preparing the shell environment`_ + +`5. Installing the KERNEL component`_ + +`6. Installing the SALOME components`_ + +`7. Runtime`_ + +`8. Suggestions and advices`_ + + +1. Quick Overview +----------------- + +First of all, you have to check (or install if needed) the dependant +software programs on your system. These programs are: + +- common development tools as gcc, automake, autoconf and libtools. +- third party softwares used in SALOME building or runtime process + (python, OCC, VTK, ...) + +Further details can be found in sections [2] and [3]. + +If the dependencies are installed on your system, then you have to set +your shell environment to get access to the software components +(cf. [4]. "Preparing the shell environment"). + +The next step is to install the KERNEL (cf. [5] "Installing KERNEL"): + +:: + +$ mkdir +$ mkdir +$ cd +$ ./build_configure +$ cd +$ /configure --prefix= +$ make +$ make install + +Then, the SALOME components GEOM, MED, VISU, ... can be installed +with a similar procedure (cf. [6]). + +Eventually, the platform can be run by executing the shell script +runSalome (cf. [7]). Here, somme additionnal variables have to be set +to describe the SALOME runtime configuration (_ROOT_DIR, +OMNIORB_CONFIG) + +The following provides you with specific instructions for each step. + + +2. System configuration +----------------------- + +SALOME is compiled and tested on differents platforms with native packages: +- Debian sarge +- Mandrake 10.1 +- ... + +If you have another platform, we suggest the following configuration +for building process: + +- gcc-3.3.x or 3.4.x +- automake-1.7 or more (only aclocal is used) +- autoconf-2.59 +- libtool-1.5.6 + +remarks: + +- This is the minimum level of automake, autoconf and libtool, if you need + to compile all the third party softwares (included OpenCascade 5.2.x). + +3. Third-party dependencies +--------------------------- + +The SALOME platform relies on a set of third-party softwares. The +current version depends on the following list +(versions given here are from Debian Sarge, except OpenCascade, VTK and MED, +which are not Debian packages): + +=================== =================================================== +CAS-5.2.4 OpenCascade (try binaries,a source patch is needed) +VTK-4.2.6 VTK 3D-viewer +PyQt-3.13 Python-Qt Wrapper +Python-2.3.5 Python interpreter +SWIG-1.3.24 SWIG library +boost-1_32_0 C++ library (only include templates are used) +hdf5-1.6.2 Files Database library +med-2.2.2 MED Data Format support for file records +omniORB-4.0.5 ORB used in SALOME +qt-x11-free-3.3.3 Qt library +qwt-4.2 Graph components for Qt +sip4-4.1.1 langage binding software +=================== =================================================== + +And, in order to build the documentation: + +=================== =================================================== +doxygen-1.4.2 +graphviz-2.2.1 +=================== =================================================== + + +Additionnal software may be installed for optional features: + +=================== =================================================== +netgen4.3 + patch +tix8.1.4 +openpbs-2.3.16 +lsf-??? +=================== =================================================== + + + +3.1 To Do +~~~~~~~~~ +- Instructions for installing these software programs can be found in a + special note doc/configuration_examples/install-prerequis. +- Installation shell scripts are also provided. + These scripts have to be adapted to your own configuration. + +- See doc/configuration_examples/* + +In the following, we assume that all the third-party softwares are +installed in the same root directory, named /prerequis. +Then, your file system should probably look like:: + + /prerequis/Python-2.2.2 + /prerequis/omniORB-3.0.5 + /prerequis/qt-x11-free-3.0.5 + ... + + +4. Preparing the shell environment +---------------------------------- + +Some variables have to be set to get acces to third-party software +components (include files, executable, library, ...) during building +process and runtime. + +The shell file prerequis.sh, embedded in the KERNEL source package, +provides a template for setting those variables. In this example, all the +softwares are supposed to be installed in the same root directory, +named here INSTALLROOT. + +Copy the prerequis.sh in a working directory and adjust the settings +to your own configuration. To get the shell prepared, just +execute the following command in the building shell: + +$ source prerequis.sh + +(we assume here a ksh or bash mode) + + +5. Installing the KERNEL component +---------------------------------- + +We use here the notation to specify the source directory +of the KERNEL component. The shell environment is supposed to have +been set (cf. 4). + +Installing the KERNEL from a source package needs three directories: + +- the source directory, denoted here by . + +- the build directory, denoted by in the following. This + directory can't be the same directory as . + +- the install directory, denoted by in the following. This + directory can't be the same directory as or + . + +The installing process is: + +STEP 1: + preparing directories + + create the and the directories:: + + $ mkdir + $ mkdir + +STEP 2: + build configure script + + go to directory and generate the "configure" script:: + + $ cd + $ ./build_configure + + If it doesn't work, check your system automake tools as specified in + section [2]. + +STEP 3: + configure the building process + go to the build directory and execute the configuration process:: + + $ cd + $ /configure --prefix= + + Note that must be an absolute path. + + When the configure process is complete, check the status of + third-party softwares detection. You should have a status like:: + + --------------------------------------------- + Summary + --------------------------------------------- + Configure + cc : yes + boost : yes + lex_yacc : yes + python : yes + swig : yes + threads : yes + OpenGL : yes + qt : yes + vtk : yes + hdf5 : yes + med2 : yes + omniORB : yes + occ : yes + sip : yes + pyqt : yes + qwt : yes + doxygen : yes + graphviz : no + openpbs : no + lsf : no + Default ORB : omniORB + ---------------------------------------------- + +If a software get a status "no", then it's not "seen" in the system: + +- the software is not installed, or +- the shell environment is not set correctly. + +In this example, the software programs graphviz, openpbs and lsf are not +installed (optional for most usages). + + +STEP 4 : + Building the binary files + + Execute make in the directory:: + + $ make + + +STEP 5: + Installing binary files, scripts and documentation + + Execute install target in the directory:: + + $ make install + + +6. Installing the SALOME components +----------------------------------- + +TInstalling a component is done by following the same +instructions as given for the KERNEL, replacing KERNEL by + (build_configure, configure, make, make install). + +You just have to be aware of the dependencies between components: + +- MED depends on KERNEL +- GEOM depends on KERNEL +- SMESH depends on KERNEL, MED, GEOM +- VISU depends on KERNEL, MED +- SUPERV depends on KERNEL + +For example, installing the component SMESH needs the previous +installation of the KERNEL component, and then the GEOM and MED components. + +The building process uses the variables _ROOT_DIR to +localize the dependant components. The variables must be set to the +install path directory of the components (ex: +KERNEL_ROOT_DIR=). + +In the above example, the three variables KERNEL_ROOT_DIR, +GEOM_ROOT_DIR and MED_ROOT_DIR have to be set before configuring the +building process of the SMESH component (STEP 3). + + +7. Runtime +---------- + +See SALOME_Application_ to define your own configuration of SALOME and run it +on one or several computers. This is the recommended way of configuration. + +.. _SALOME_Application: ./SALOME_Application.html + +The following explains the general principles. + +To run the SALOME platform, the procedure is: + +- set the shell environment to get acces to third-party softwares:: + + $ source prerequis.sh + +- define the SALOME configuration by setting the whole set of + variables _ROOT_DIR. Here, you just have to set the + kernel and the components you need:: + + $ export KERNEL_ROOT_DIR= + $ export MED_ROOT_DIR= + $ ... + +- define the CORBA configuration file by setting the variable + OMNIORB_CONFIG. This variable must be set to a writable file + path. The file may be arbitrary chosen and doesn't need to exist + before running. We suggest:: + + $ export OMNIORB_CONFIG=$HOME/.omniORB.cfg + +- run the SALOME platform by executing the script runSalome:: + + $KERNEL_ROOT_DIR/bin/salome/runSalome + + +8. Suggestions and advices +-------------------------- + +For convenience or customization, we suggest the following organisation: + +- chose and create a root directory for the SALOME platform, say + . + +- install the third-party softwares in a sub-directory "prerequis" + +- install the SALOME components in a sub-directory "SALOME2" + +- make personnal copies of the files prerequis.sh and runSalome in + :: + + $ cp /prerequis.sh /. + $ cp /bin/salome/runSalome /. + + Edit the file prerequis.sh and adjust it to your own configuration. + +- define the SALOME2 configuration + + This step consists in setting the KERNEL_ROOT_DIR, the whole set of + variables _ROOT_DIR you need, and the OMNIORB_CONFIG + variable. + + We suggest to create a shell file envSalome.sh containing those + settings. Then the configuration consists in loading envSalome.sh in + the runtime shell:: + + $ source envSalome.sh + +- When installed with this file organisation, running SALOME is done + with the following shell commands:: + + $ source /prerequis.sh + $ source /envSalome.sh + $ ./runSalome + diff --git a/doc/SALOME_Application.txt b/doc/SALOME_Application.txt new file mode 100644 index 000000000..1133e1e62 --- /dev/null +++ b/doc/SALOME_Application.txt @@ -0,0 +1,156 @@ + +====================================================================== +SALOME Application Concept. Configuration for one or more computers +====================================================================== + +*html version of this document is produced with docutils*:: + + rest2html < doc.txt > doc.html + +This document corresponds to SALOME2 3.1. (alpha version) + ++-------------------------------------------+ +| **WORK in PROGRESS, INCOMPLETE DOCUMENT** | ++-------------------------------------------+ + +The following explains how to configure your own application with your list of +modules, how to define and run this application on one or more computers. + +Summary +------- + +`1. General principles`_ + +`2. Application Directory`_ + +`2.1 Proposal for env.d scripts`_ + +`2.2 User run scripts`_ + +`2.3 SALOME internal run script`_ + +`2.4 Other configuration files`_ + +1. General principles +--------------------- + +A SALOME application is defined by a set of modules (GEOM, SMESH, ASTER...). + +A SALOME User can define several SALOME Applications. These applications are +runnable from the same user account. These applications may share the same +KERNEL and modules. Thus, the application configuration is independant of +KERNEL and must not be put in KERNEL_ROOT_DIR. + +Furthermore, prerequisites may not be the same on all the applications. + +A SALOME Session can run on a several computers. + +Binary modules and prerequisites are installed on the different computers. +There is no need to have all the modules on each computer (the minimum is +KERNEL). + +There is no need of standardization or centralised information on the details +of configuration on each computer (PATH, LD_LIBRARY_PATH, environment +variables) provided the application modules are version - compatible. Details +of configuration stay private to the computer, and are held by scripts on each +computer. + +There is no hierarchy between the computers (for example only one master +computer used to launch application). + +The SALOME user has an account on all the computers. Access between +account@computer is via rsh or ssh and must be configured for use without +password (key exchange for ssh). Account may be different on each +computer. + +2. Application Directory +------------------------ + +The script createAppli.sh in ${KERNEL_ROOT_DIR}/bin/salome creates an +application directory with the given path in parameter. ${APPLI} is a path +relative to ${HOME}. + +The directory is only a skeleton, the user has to edit several files to +configure his own application. + +Directory ${APPLI} must be created on each computer of the application. +The easiest way is to use the same relative path (to ${HOME}) on each computer. +(Sometimes it is not possible to use the same path everywhere, for instance +when ${HOME} is shared with NFS, so it is possible to define different path +following the computers). + +The ${APPLI} directory contains scripts for environment and runs. Environment +scripts must be configured (by the user) on each computer. All the environment +scripts are in the ${APPLI}/env.d directory. + +The script ${APPLI}/envd sources **all** the files in ${APPLI}/env.d in +alphanumeric order (after edition, think to remove backup files). the envd +script is used by run scripts. + +2.1 Proposal for env.d scripts +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Each user can define his own configuration for these scripts, following the +above rules. The following is only a proposal. + +atFirst.sh + Sets the computer configuration not directly related to SALOME, + like useful tools, default PATH. + +envProducts.sh + Sets the SALOME prerequisites. + +envSALOME.sh + Sets all the MODULE_ROOT_DIR that can be used in the SALOME application. + +2.2 User run scripts +~~~~~~~~~~~~~~~~~~~~ + +The SALOME user can use 4 scripts: + +runAppli + Launches a SALOME Session + (similar to ${KERNEL_ROOT_DIR}/bin/salome/runSalome but with a different + name to avoid confusions). + +runSession + Launches a shell script in the SALOME application environment, with access + to the current SALOME session (naming service), if any. + Without arguments, the script is interactive. With arguments, the script + executes the command in the SALOME application environment. + +runConsole + Gives a python console connected to the current SALOME Session. + It is also possible to use runSession, then python. + +runTests + Similar to runSession, used for unit testing. runSession tries to use an + already existing naming service definition from a running session (hostname + and port number), runTests defines a new configuration for naming service + (new port number). + +2.3 SALOME internal run script +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For remote calls, SALOME uses one script. + +runRemote.sh + This script is mainly used to launch containers. The first 2 arguments + define the hostname and port userd for naming service, the remaining + arguments define the command to execute. + +2.4 Other configuration files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +SalomeApp.xml + This file is similar to the default given in $GUI_ROOT_DIR + +CatalogRessources.xml + This files describes all the computer the application can use. The given + example is minimal and suppose ${APPLI} is the same relative path + to ${HOME}, on all the computers. A different directory can be set on a + particular computer with a line:: + + appliPath="my/specific/path/on/this/computer" + + + diff --git a/doc/UnitTests.txt b/doc/UnitTests.txt new file mode 100644 index 000000000..6b5808d19 --- /dev/null +++ b/doc/UnitTests.txt @@ -0,0 +1,157 @@ + +================================================================= +Source code structuration and Unit Tests +================================================================= + +You will find here general information on code directories structure, +unit tests associated to the different kind of classes, and how to run +the unit tests. + ++-------------------------------------------+ +| **WORK in PROGRESS, INCOMPLETE DOCUMENT** | ++-------------------------------------------+ + +1. SALOME KERNEL source code structuration +========================================== + +1.1 General structure of KERNEL_SRC +----------------------------------- + +KERNEL_SRC + Some README files and configuration tools for build + +KERNEL_SRC/adm_local + Part of the configuration files + +KERNEL_SRC/bin + Python and shell scripts used at run time. + +KERNEL_SRC/doc + Kit for end user documentation production: public interfaces, graphic, + Python, CORBA. Developper documentation. + +KERNEL_SRC/examples + To be removed. + +KERNEL_SRC/idl + All CORBA interfaces from KERNEL are regrouped here. + +KERNEL_SRC/resources + Configuration files for servers (examples). Icons for Graphic interface + (to be removed ?) + +KERNEL_SRC/salome_adm + Makefile includes and configuration files (M4 macros) + +KERNEL_SRC/src + The source code (C++ and Python) + + +1.2 Directory src: C++ and Python source code +--------------------------------------------- + +1.2.1 Basic services non related to CORBA +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Basics + A set of general purpose C++ services. + +SALOMELocalTrace + A multithread trace system that allows message tracing on standard error + or a file. + +CASCatch + Exceptions and signal handler. + +HDFPersist + A C++ interface to HDF. + +1.2.2 Basic CORBA services +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Logger + A CORBA server that collects the trace messages from differents CORBA + process. + +SALOMETraceCollector + A multithread trace system derived from SALOMELocalTrace, that sends messages + to Logger server via CORBA. + +Utils + A set of general purpose services related to CORBA, such as basic CORBA + exception system. + +NamingService + C++ and Python interfaces to name, store and retrieve CORBA objects + +GenericObj + A generic CORBA interface for CORBA objects, to count distributed references, + and to allow destruction by client. + +1.2.3 Miscellaneous CORBA servers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Registry + +ModuleCatalog + +DataTypeCatalog + +RessourcesCatalog + +ResourcesManager + +Notification + +NOTIFICATION_SWIG + +1.2.4 CORBA Containers for SALOME Modules +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Container + +TestContainer + +LifeCycleCORBA + +LifeCycleCORBA_SWIG + +1.2.5 STUDY server and related interfaces and tools +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +SALOMEDSClient + +TOOLSDS + +SALOMEDSImpl + +SALOMEDS + +2. Tools and principles used for Unit testing +============================================= + +**TO BE COMPLETED** + +Unit Testing rely on cppunit package for C++ testing, and on unittest module +for Python. See these products for general principles of unit testing. + +The cppunit package is optional. When the prerequisite is detected, the unit +tests are compiled. + +Unit Tests sources are in directories Test under the src/directories +containing the classes to test. + +Test are ordered following the order of directories given above. + +Tests can be run as a whole, or for a particular directory. In this case, only +a partial test is run (the classes to test, and the classes used, i.e. the +preceding test directories). + + +Today, only some tests are written as an example. There are not yet python +scripts in KERNEL_SRC, but it's a matter of days, there are working scripts +to test LifeCycleCORBA_SWIG interface. + + + + diff --git a/doc/salome/Parallelisme_dans_Salome.pdf b/doc/salome/Parallelisme_dans_Salome.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7729857795fbd5d0a0560f2cb82c89b7b36a511d GIT binary patch literal 175359 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∈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 z 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 literal 0 HcmV?d00001 diff --git a/doc/salome/Parallelisme_dans_Salome.ps b/doc/salome/Parallelisme_dans_Salome.ps new file mode 100644 index 000000000..8891de256 --- /dev/null +++ b/doc/salome/Parallelisme_dans_Salome.ps @@ -0,0 +1,15829 @@ +%!PS-Adobe-3.0 +%%Title: Microsoft Word - Parallelisme_dans_PAL.doc +%%Creator: Windows NT 4.0 +%%CreationDate: 11:3 7/10/2002 +%%Pages: (atend) +%%BoundingBox: 14 26 581 827 +%%LanguageLevel: 2 +%%DocumentNeededFonts: (atend) +%%DocumentSuppliedFonts: (atend) +%%EndComments +%%BeginExitServer: (0) +%%Resolution: 300 +(0) + +%%EndExitServer +%%BeginProlog + +%%BeginResource: procset NTPSOct95 +/NTPSOct95 100 dict dup begin/bd{bind def}bind def/ld{load def}bd/ed{exch def} +bd/a{currentpoint}bd/c/curveto ld/d/dup ld/e/eofill ld/f/fill ld/tr/translate +ld/gr/grestore ld/gs/gsave ld/j/setlinejoin ld/L/lineto ld/M/moveto ld/n +/newpath ld/cp/closepath ld/rm/rmoveto ld/sl/setlinewidth ld/sd/setdash ld/g +/setgray ld/r/setrgbcolor ld/s/stroke ld/t/show ld/aw/awidthshow ld/im +/imagemask ld/MS{moveto show}bd/SF{findfont exch scalefont setfont}bd/SM{cmtx +setmatrix}bd/MF{findfont exch makefont setfont}bd/CM{/cmtx matrix currentmatrix +def}bd/B{M exch dup 0 rlt exch 0 exch rlt neg 0 rlt}bd/CB{B cp eoclip}bd/EA{1 +index 0/G0 put 4 string 1 1 4 -1 roll{3 copy neg exch cvs dup 0 71 put cvn 3 -1 +roll exch put}for pop}bd/rlt/rlineto ld/L2?/languagelevel where{pop +languagelevel 2 ge}{false}ifelse def end def +%%EndResource +%%EndProlog +%%BeginSetup +[{0 +/languagelevel where{pop languagelevel 2 ge}{false}ifelse +{1 dict dup/JobTimeout 4 -1 roll put setuserparams} +{statusdict/setjobtimeout get exec}ifelse +}stopped cleartomark +[{300 +/languagelevel where{pop languagelevel 2 ge}{false}ifelse +{1 dict dup/WaitTimeout 4 -1 roll put setuserparams} +{statusdict/waittimeout 3 -1 roll put}ifelse +}stopped cleartomark +/#copies 1 def +[{ +%%BeginFeature: *OutputMode Standard + +<< + /HWResolution /Default /OutputDevice findresource /HWResolution get 1 get +>> setpagedevice +%%EndFeature +} stopped cleartomark +[{ +%%BeginFeature: *PageSize A4 +<< /PageSize [595 842] /ImagingBBox null + >> setpagedevice +%%EndFeature +} stopped cleartomark +[{ +%%BeginFeature: *TKCollate False + + << + /Collate false + >> setpagedevice +%%EndFeature +} stopped cleartomark +[{ +%%BeginFeature: *TKColor VividColor + + << + /DeviceRenderingInfo << + /Type 2 + /VirtualColorDevice << + /Type 3 + /ColorTransform /TekBlue + >> + >> + >> setpagedevice +%%EndFeature +} stopped cleartomark +[{ +%%BeginFeature: *TKCheckPrint False + +%%EndFeature +} stopped cleartomark +[{ +%%BeginFeature: *TKImageSmoothing False + + false /RRCustomProcs /ProcSet findresource /setforceinterpolate get exec +%%EndFeature +} stopped cleartomark +[{ +%%BeginFeature: *Option1 False + +%%EndFeature +} stopped cleartomark +[{ +%%BeginFeature: *Option2 None + +%%EndFeature +} stopped cleartomark +[{ +%%BeginFeature: *Option3 False + +%%EndFeature +} stopped cleartomark +%%EndSetup +NTPSOct95 begin +%%Page: 1 1 +NTPSOct95 /PageSV save put +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +%%IncludeFont: Times-Roman +[25 0 0 -25 0 0]/Times-Roman MF +gs +n +12 11 176 3326 CB +( )176 3349 MS +gr +1 j +1 setlinecap +72 sl +0.375 g +n +1134 250 M +1134 219 1107 194 1072 194 c +1038 194 1010 219 1010 250 c +1010 280 1038 305 1072 305 c +1107 305 1134 280 1134 250 c +cp +CM 0.195 0.176 scale +s +SM +71 sl +n +1345 249 M +1345 219 1317 194 1283 194 c +1248 194 1221 219 1221 249 c +1221 279 1248 304 1283 304 c +1317 304 1344 279 1345 249 c +cp +CM 0.195 0.176 scale +s +SM +n +153 28 1100 214 B +1 g +f +1 sl +n +155 30 1099 213 B +cp +s +71 sl +0.375 g +n +1240 246 M +1240 215 1212 190 1178 190 c +1143 190 1116 215 1116 246 c +1116 276 1143 301 1178 301 c +1212 301 1239 276 1240 246 c +cp +gs +1 g +e +gr +CM 0.195 0.176 scale +s +SM +n +1116 246 M +1237 246 L +CM 0.195 0.176 scale +s +SM +n +43 21 1220 254 B +1 g +f +1 sl +n +45 23 1219 253 B +cp +s +n +1281 238 M +1256 238 L +1210 183 L +1242 184 L +1279 238 L +1281 238 L +cp +gs +e +gr +s +n +1076 235 M +1100 235 L +1147 180 L +1115 181 L +1077 235 L +1076 235 L +cp +gs +e +gr +s +0.375 g +n +1108 200 M +1108 197 1104 195 1101 195 c +1097 195 1094 197 1094 200 c +1094 203 1097 206 1101 206 c +1104 206 1108 203 1108 200 c +cp +gs +e +gr +s +n +1260 200 M +1260 196 1256 194 1253 194 c +1249 194 1246 196 1246 200 c +1246 203 1249 206 1253 206 c +1256 206 1260 203 1260 200 c +cp +gs +e +gr +s +72 sl +n +1350 197 M +1350 302 L +CM 0.195 0.176 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )1364 318 MS +[67 0 0 -67 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[67 0 0 -67 0 0]/_Times-Roman MF +(D)568 403 MS (I)617 403 MS (R)637 403 MS (E)682 403 MS (C)723 403 MS (T)768 403 MS (I)809 403 MS (O)830 403 MS (N)878 403 MS ( )926 403 MS (D)943 403 MS (E)991 403 MS ( )1032 403 MS (L)1050 403 MS (\222)1089 403 MS (\311)1111 403 MS +(N)1152 403 MS (E)1200 403 MS (R)1241 403 MS (G)1286 403 MS (I)1335 403 MS (E)1355 403 MS ( )1396 403 MS (N)1413 403 MS (U)1461 403 MS (C)1509 403 MS (L)1555 403 MS (\311)1594 403 MS (A)1636 403 MS (I)1685 403 MS (R)1705 403 MS (E)1750 403 MS +( )1791 403 MS +[58 0 0 -58 0 0]/Times-Roman MF +LATENC /_Times-Roman /Times-Roman reencode +[58 0 0 -58 0 0]/_Times-Roman MF +(D)300 498 MS (\311)342 498 MS (P)377 498 MS (A)410 498 MS (R)451 498 MS (T)491 498 MS (E)526 498 MS (M)561 498 MS (E)614 498 MS (N)649 498 MS (T)692 498 MS ( )727 498 MS (M)742 498 MS (O)794 498 MS (D)836 498 MS (\311)878 498 MS +(L)914 498 MS (I)949 498 MS (S)968 498 MS (A)1001 498 MS (T)1043 498 MS (I)1079 498 MS (O)1098 498 MS (N)1140 498 MS ( )1182 498 MS (D)1197 498 MS (E)1239 498 MS ( )1274 498 MS (S)1289 498 MS (Y)1322 498 MS (S)1364 498 MS (T)1396 498 MS +(\310)1432 498 MS (M)1467 498 MS (E)1519 498 MS (S)1555 498 MS ( )1587 498 MS (E)1602 498 MS (T)1638 498 MS ( )1673 498 MS (S)1688 498 MS (T)1720 498 MS (R)1755 498 MS (U)1794 498 MS (C)1836 498 MS (T)1876 498 MS (U)1911 498 MS (R)1953 498 MS +(E)1992 498 MS (S)2028 498 MS +%%IncludeFont: Times-Bold +[58 0 0 -58 0 0]/Times-Bold MF +( )2060 498 MS +[58 0 0 -58 0 0]/_Times-Roman MF +(S)336 590 MS (E)368 590 MS (R)403 590 MS (V)442 590 MS (I)485 590 MS (C)504 590 MS (E)543 590 MS ( )578 590 MS (F)594 590 MS (L)626 590 MS (U)661 590 MS (I)703 590 MS (D)722 590 MS (E)765 590 MS (S)800 590 MS ( )832 590 MS +(N)847 590 MS (U)889 590 MS (M)931 590 MS (E)984 590 MS +(R)1019 590 MS (I)1058 590 MS (Q)1077 590 MS (U)1119 590 MS (E)1162 590 MS (S)1197 590 MS (,)1229 590 MS ( )1244 590 MS (M)1259 590 MS (O)1311 590 MS (D)1353 590 MS (E)1395 590 MS (L)1431 590 MS (I)1466 590 MS (S)1485 590 MS (A)1518 590 MS +(T)1560 590 MS (I)1595 590 MS (O)1615 590 MS (N)1657 590 MS +( )1699 590 MS (E)1714 590 MS (T)1749 590 MS ( )1784 590 MS (E)1800 590 MS (T)1835 590 MS (U)1870 590 MS (D)1913 590 MS (E)1955 590 MS (S)1991 590 MS +( )2023 590 MS +(L)414 657 MS (A)449 657 MS (B)491 657 MS (O)530 657 MS (R)572 657 MS (A)612 657 MS (T)653 657 MS (O)689 657 MS (I)731 657 MS (R)750 657 MS (E)789 657 MS ( )824 657 MS (D)839 657 MS (E)882 657 MS ( )917 657 MS (G)932 657 MS +(E)974 657 MS (N)1009 657 MS (I)1052 657 MS (E)1071 657 MS +( )1106 657 MS (L)1122 657 MS (O)1157 657 MS (G)1199 657 MS (I)1241 657 MS (C)1260 657 MS (I)1300 657 MS (E)1319 657 MS (L)1355 657 MS ( )1389 657 MS (E)1405 657 MS (T)1440 657 MS ( )1475 657 MS (D)1490 657 MS (E)1533 657 MS ( )1568 657 MS +(S)1583 657 MS (I)1615 657 MS (M)1634 657 MS (U)1686 657 MS +(L)1729 657 MS (A)1764 657 MS (T)1806 657 MS (I)1842 657 MS (O)1861 657 MS (N)1903 657 MS +( )1945 657 MS +( )1180 724 MS +/Adobe_WinNT_Driver_Gfx 175 dict dup begin + +%%BeginResource: file Adobe_WinNT_Utils 2.0 0 +/|/def load def/,/load load |/~/exch load def/?/ifelse load def/!/pop load def +/`/begin load def/^/index load def/@/dup load def/+/translate load def/$/roll +load def/U/userdict load def/-/rlineto load def/&/currentdict load def/:/gsave +load def/;/grestore load def/F/false load def/T/true load def/N/newpath load +def/E/end load def/Ac/arc load def/An/arcn load def/A/ashow load def/D +/awidthshow load def/C/closepath load def/O/eofill load def/I/lineto load def +/-C/rcurveto load def/-M/rmoveto load def/+S/scale load def/Ji/setfont load def +/Lc/setlinecap load def/Lj/setlinejoin load def/Lw/setlinewidth load def/S/show +load def/LH/showpage load def/K/stroke load def/W/widthshow load def/b{bind +def}bind def/DefIf_B{dup not{userdict/DefIf_save save put}if userdict +/DefIf_bool 2 index put}b/DefIf_El{if userdict/DefIf_bool get not dup{userdict +/DefIf_save get restore}if}b/DefIf_E{DefIf_El pop}b/self currentdict def +/reinitialize{[/TextInit/GraphInit/UtilsInit counttomark{dup where{self eq} +{false}ifelse{cvx exec}{pop}ifelse}repeat cleartomark}b/initialize{begin +userdict begin/ADO_mxRot exch def/TextInitialised? false def end reinitialize}b +/terminate{pop{currentdict self eq{exit}{end}ifelse}loop end}b/dsnap{dtransform +round exch round exch idtransform}b<04>cvn{}def/sg{setgray}b/sco{setrgbcolor}b +/sgco{{sg}{sco}ifelse}b/rp{4 2 roll M 1 index 0 rlt 0 exch rlt neg 0 rlt}b +%%EndResource + +%%BeginResource: file Adobe_WinNT_Utils_L1 2.0 0 +L2? not DefIf_B{/rf{newpath rp fill}b}DefIf_E +%%EndResource + +%%BeginResource: file Adobe_WinNT_Utils_L2 2.0 0 +L2? DefIf_B{/colspA/DeviceGray def/colspABC/DeviceRGB def/setAorABC{{colspA} +{colspABC}ifelse setcolorspace}b/rf/rectfill load def/UtilsInit{false +setglobal}b}DefIf_E +%%EndResource +end def +[1.000 0 0 1.000 0 0] Adobe_WinNT_Driver_Gfx dup /initialize get exec +Adobe_WinNT_Driver_Gfx begin + +%%BeginResource: file Adobe_WinNT_BW_Images 2.0 0 +/iw 0 def/ih 0 def/im_save 0 def/setupimageproc 0 def/polarity 0 def/smoothflag +0 def/mystring 0 def/bpc 0 def/setup1asciiproc{[currentfile mystring +/readhexstring cvx/pop cvx]cvx bind}b/setup1binaryproc{[currentfile mystring +/readstring cvx/pop cvx]cvx bind}b/setup2asciiproc{currentfile/ASCII85Decode +filter/RunLengthDecode filter}b/setup2binaryproc{currentfile/RunLengthDecode +filter}b/mycolorspace{colspABC}def/myimagedict{/myimagedict 10 dict def +myimagedict dup begin/ImageType 1 def/MultipleDataSource false def end}b +/imageprocarray[/setup1binaryproc/setup1asciiproc/setup2binaryproc +/setup2asciiproc]def/L2Polarity{{[1 0]}{[0 1]}ifelse}b/beginimage{/im_save save +def imageprocarray exch get/setupimageproc exch load def L2Polarity/polarity +exch def/smoothflag exch def translate/dx 2 index def/dy 1 index abs def scale +/mystring exch string def/bpc exch def/ih exch def/iw exch def}b/endimage +{im_save restore}b/1bitmaskimage{sgco myimagedict dup begin/Width iw def/Height +ih def/Decode polarity def/ImageMatrix[iw 0 0 ih 0 0]def/DataSource +setupimageproc def/BitsPerComponent 1 def/Interpolate smoothflag def end +imagemask}b/1bitcopyimage{sgco 0 0 1 dx div 1 dy div 1 2 index sub 1 2 index +sub L2?{4}{6}ifelse -2 roll pop pop rf 1bitmaskimage}b/1bitbwcopyimage{0 true 1 +true 1bitcopyimage}b +%%EndResource + +%%BeginResource: file Adobe_WinNT_BW_Images_L1 2.0 0 +L2? not DefIf_B{/setup2asciiproc{[/Level2ImagesError load aload pop true +FatalErrorIf}b/setup2binaryproc/setup2asciiproc load def/L2Polarity{}def +/1bitmaskimage{sgco iw ih polarity[iw 0 0 ih 0 0]setupimageproc imagemask}b} +DefIf_E +%%EndResource + +%%BeginResource: file Adobe_WinNT_Co_Images_L1 2.0 0 +L2? not DefIf_B{/isdefined{where dup{exch pop}if}b/ncolors 1 def/colorimage +where{pop true}{false}ifelse{/ncolors 0 statusdict begin/processcolors where +{pop pop processcolors}{/deviceinfo where{pop deviceinfo/Colors known{pop +{deviceinfo/Colors get}}if}if}ifelse end def ncolors 0 ne{/colorimage isdefined +/setcolortransfer isdefined/currentcolortransfer isdefined/currentcmykcolor +isdefined and and and not{/ncolors 0 def}if}if}if ncolors dup 1 ne exch dup 3 +ne exch 4 ne and and{/ncolors 0 def}if ncolors 1 eq DefIf_B{/expandbw +{expandfactor mul round cvi bwclut exch get 255 div}b/doclutimage{pop/bwclut +exch def/expandfactor 1 bpc{2 mul}repeat 1 sub def[/expandbw load/exec load dup +currenttransfer exch]cvx bind settransfer iw ih bpc[iw 0 0 ih 0 0] +setupimageproc image}b}DefIf_E ncolors dup 3 eq exch 4 eq or DefIf_B{/nullproc{ +{}}def/concatutil{/exec load 7 -1 roll/exec load}b/defsubclut{1 add getinterval +def}b/spconcattransfer{/Dclut exch def/Cclut exch def/Bclut exch def/Aclut exch +def/ncompute exch load def currentcolortransfer[{Aclut ncompute}concatutil]cvx[ +{Bclut ncompute}concatutil]cvx[{Cclut ncompute}concatutil]cvx[{Dclut ncompute} +concatutil]cvx setcolortransfer}b/setuprgbcluts{/bit3x rgbclut length 3 sub def +/bit1x bit3x 3 idiv def/rclut rgbclut def/gclut rclut 1 bit3x defsubclut/bclut +rclut 2 bit3x defsubclut}b}DefIf_E ncolors 3 eq DefIf_B{/3compute{exch bit3x +mul round cvi get 255 div}b/doclutimage{/rgbclut exch def pop setuprgbcluts +/3compute rclut gclut bclut dup spconcattransfer iw ih bpc[iw 0 0 ih 0 0] +[setupimageproc/exec load/dup load dup]cvx nullproc nullproc true 3 colorimage} +b}DefIf_E ncolors 4 eq DefIf_B{/ftoint{1 exch sub 255 mul round cvi}b/stuffclut +{cmykindex 3 -1 roll put}b/4compute{exch bit4x mul round cvi get 255 div}b +/invalidcolortable? true def/computecmykclut{setuprgbcluts/bit4x rgbclut length +3 idiv 4 mul 4 sub def/cmykclut bit4x 4 add string def/cclut cmykclut def/mclut +cclut 1 bit4x defsubclut/yclut cclut 2 bit4x defsubclut/kclut cclut 3 bit4x +defsubclut/cmykindex 0 def 0 1 bit1x{dup/cmykindex exch bit1x exch sub 4 mul +def 3 mul dup rclut exch get 255 div exch dup gclut exch get 255 div exch bclut +exch get 255 div setrgbcolor currentcmykcolor ftoint kclut stuffclut ftoint +yclut stuffclut ftoint mclut stuffclut ftoint cclut stuffclut}for}b/doclutimage +{/rgbclut exch def pop invalidcolortable?{computecmykclut}if/4compute cclut +mclut yclut kclut spconcattransfer iw ih bpc[iw 0 0 ih 0 0][setupimageproc/exec +load/dup load dup dup]cvx nullproc nullproc nullproc true 4 colorimage}b} +DefIf_E ncolors 0 eq DefIf_B{/lookupandstore{3 mul 3 getinterval putinterval +exch 3 add exch 3 copy}b/8lookup/lookupandstore load def/4lookup{/byte 1 index +def -4 bitshift lookupandstore byte 15 and lookupandstore}b/2lookup{/byte 1 +index def -6 bitshift lookupandstore byte -4 bitshift 3 and lookupandstore byte +-2 bitshift 3 and lookupandstore byte 3 and lookupandstore}b/1lookup{/byte exch +def -7 1 0{byte exch bitshift 1 and lookupandstore}bind for}b/colorexpand +{mystringexp 0 rgbclut 3 copy 7 -1 roll/mylookup load forall pop pop pop pop +pop}b/createexpandstr{/mystringexp exch mystring length mul string def}b +/doclutimage{/rgbclut exch def pop/mylookup bpc 8 eq{3 createexpandstr/8lookup} +{bpc 4 eq{6 createexpandstr/4lookup}{bpc 2 eq{12 createexpandstr/2lookup}{24 +createexpandstr/1lookup}ifelse}ifelse}ifelse load def iw ih 8[iw 0 0 ih 0 0] +[setupimageproc/exec load/colorexpand load/exec load]cvx false 3 colorimage}b} +DefIf_E/colorimage where{pop true}{false}ifelse DefIf_B{/do24image{iw ih 8[iw 0 +0 ih 0 0]setupimageproc false 3 colorimage}b}DefIf_El{/rgbtogray{/str exch def +/len str length def/smlen len 3 idiv def/rstr str def/gstr str 1 len 1 sub +getinterval def/bstr str 2 len 2 sub getinterval def str dup 0 1 smlen 1 sub +{dup 3 mul rstr 1 index get .3 mul gstr 2 index get .59 mul add bstr 3 -1 roll +get .11 mul add round cvi put dup}for pop 0 smlen getinterval}b/do24image{iw ih +8[iw 0 0 ih 0 0][setupimageproc/exec load/rgbtogray load/exec load]cvx bind +image}b}DefIf_E/doNimage{bpc 24 eq{do24image}{iw ih bpc[iw 0 0 ih 0 0] +setupimageproc image}ifelse}b}DefIf_E +%%EndResource + +%%BeginResource: file Adobe_WinNT_Co_Images_L2 2.0 0 +L2? DefIf_B{/doclutimage{/rgbclut exch def pop/hival 1 bpc{2 mul}repeat 1 sub +def[/Indexed colspABC hival rgbclut]setcolorspace myimagedict dup begin/Width +iw def/Height ih def/Decode[0 hival]def/ImageMatrix[iw 0 0 ih 0 0]def +/DataSource setupimageproc def/BitsPerComponent bpc def/Interpolate smoothflag +def end image}b/doNimage{bpc 24 eq{colspABC}{colspA}ifelse setcolorspace +myimagedict dup begin/Width iw def/Height ih def/Decode bpc 24 eq{[0 1 0 1 0 1] +}{[0 1]}ifelse def/ImageMatrix[iw 0 0 ih 0 0]def/DataSource setupimageproc def +/BitsPerComponent bpc 24 eq{8}{bpc}ifelse def/Interpolate smoothflag def end +image}b}DefIf_E +%%EndResource +end reinitialize +530 526 1 67 957 949 701 763 false true 3 beginimage +doNimage +^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;LoD\gfp&>#Qg]%8hoD\gdp&>#Ig]%8hoD\gcp&>$0g]%8hoD\jhJ+imB_qY1k_"7R,r."G?!5[Fi!5S4+!WITBrrD$4rrBk+rrN*`pAY-Ng]%8hoD\jj5PG*WnD!sC_"7R, +rZCk6!UtTorrBk+rrN*@pAY0gJ)(&(_"7R,rX\`&!Ven7rrBk+rrN*(pAY0g5MZ8=_".L*"8;`qr#a_o!5S1*!.aeC!WF1rrrBk*rr@TCrrN*0h#@Aio)Aa+J+imB#Mf=Z_".L+i.(J#!!h[Jjo)Ad\!.XbC!Ur>5rrA,YrrBk*rrVrq5PP0Yp`JMq!"]&.!5S1*!rN$_p\t9l+6*;#TDeci_"%F*!'g5X!W4%qrrBk)rrIX7p\t9n&**ZiL]%/P_"%F*J04Lb!"\,i!!iH%!5S.)!It^TrrLFJj8T+3r;Qc4nc&W?#P\6!c[k-V!/(4L!5S.)!Peg3rrIn+j8T+3r;Qc4nc&XJ"8Dfra+<=O!U#+5rrBk)rrMTip\t97 +J`Qh3_h7me!5S.)!Vc]irrL/kjSo7ua8Gr;_"%F*p]:-h!QT`OrrC+:rrBk)rrMlqp\t93J`Zn4r"&])!5S.)!VcZhrrM$Xjo5AV+8c'<_"%F*p]1'g!T3t>rrMmZqu6Z3nc&Xb!;HKon,VSM!9!_R!5S.)!r)bFq#:Ba!9O4\_>=03_"%F+quD6ArrVZiJ*-b2"8`#t_"%F+rW#1XrrVs(5Ni%Ir"&Z(!5S.)!r`0Aq#:Ej$pWqT!Uq3- +rrBk(rrE*1q#:Ej%Njm6!T63=rrBk(rrE*%q#:Ej#7p"t!5SF1!5S+(!It4GrrVs#&*Nrm_>4*2_!q@)^]F61!r*"UkPkO7q>UH1nG`OI!VlZrp]n_#rrM_Pq>UH1nG`OI!VlZrp]n_#rr@]HrrBk(rrMTiq#:Ej#N=qI!WE2rrrBk(rrMThq#:En#N4kH!W32trrBk(rrVrq5Pb<\r!2`UrrMm"q#:?0nG`Rb!'g;Z"8iDnJ*R%7p]pTo +!5S+(!rN$?q>UQp#P`f7rrW2t#PeUQp!W4&*rrW*X&,?/)_!h:(!!i?""9&?#+7&q.c2\CMrrBk'rrIWTq>UQr!<*MprrRoT+8Gj9_!h:(J-5TH!W`62li.$:!'g8Y!5S('!Pe^1rrR_##OMHmrVuqJq#:?0n,EII!.XhE!l.#*m/I.^!!2us +!.Y"J!5S('!oO&Cq>UNS5D/>&!r)`tr;QfsJ,]HJ_!h:)n,P]KrrV[3KC&U>p](QsrrN%Irr2u6n,EIY!$D%:!q7:_m/I.V!"]#-!Vh0DrrBk'rrVrq+8Ppi.(b+!5S('!r)a+q>UNo#Cu4A"8m*<5Q(N^^jl@`!5S('!rN$/q>UNo!!)Ed"8FPM5Q(N]JGoKJ_!h:)rW!K)rr`6#!.XG:"7Q9jJ,KUNSItR7j +"9&9#&,lM0rW"qUrrBk&rrV*Y&,H5,n:/:Drr`0!!$D1>!r`1Lr;Qc4mf*@X!"\o*!q:]tnG`Uc!!",>rrN#uqu6Z3mf*@X!!i?""8G+MJ+UQp&,8B[rr`0$huN`U!r`01qu6Z3mf*@d!!E&s"9&Q'5P"gVn-@kPrVlrs!'gA\!5S%&!rN$!q>UQr +"8j83rr_0i^^'iUNSIfo9A!Y,V@rVlro!'g>[!5S%&"8i-!5Pb<\ +i'2b`rr_.#!"]&.!VcZjrrBk&rr`#r!'g;Z"7RC_J+`gErWaMF+8u3?J,oEF!5S%&"8Dir+8Pp=p^b/)p&>0m"qL\urr3'!!!2oq!5S%&"8Dir+8Pp=p]p:Qp&>0a%LrJgrr3&t!!E&s!5S%&"7Q9j#PnB%quc^9p&>-0*WQ3=rrW)u+8Pp:_!_4)n,NFjq>UQp!Vd2urr[d8!!3&u!rN$?q>UH1mf*Ca!!!,srr`6$r"&K#!s!cM"9&6$ +2uk&rrrBk&rr`0!!!E&s"9&?!&,#r)!.FnQrr3*"!!#7ZrrBk&rr`0!!!E#r!Wi30pAY92!.4bWrr3)u!!%NErrBk&rr`6#!!E#r!Wi'$pAY,CrVup?rr3&t!!E#r!5S"%!WW3$q#:DG!!)`m"98u5!'gJ_!rN$'q#:?0mJd6rW%0C!.Y"J!rN$/q#:?0mJd9=!!%NEs8Duu#Pe<%rW%[!;ucqq#:JI!;lg=rVlof!VcTo_!V.(n,NG1qYpQbr;ZhIq>UQt!VcX:rVloV"8Dfq_!V.(p](:9qYpQRr;Zg>q>UQt"8Dj\rVllu#P\5u_!V.(p](:)qYpPGr;Zg&q>UNs+7KC2rrVrq&,6)(_!V.(p](:)qYp^!!WW-!"8`$#irK,;#QF`*j59nJp\t6/mJd:`!!!9$rs&B$&-)[F!W)g!^]FJN&,uS2_nZ6op\t6/mJd:`!!!,u +rs&5u5QCcQ!;c]u!!E7O&,uS2K7Eqdp\t6/mJd:`!!!,urrMThrr3&t!.XqH"o\K,rr=/?rrRh'"8;`p_!V.(p](9pqu6]T"9/<%rW#1\rrr<#&,lPNrr3&;!!i5t!5S"%"8i-!!W2lti!95\!Iu9irrqll&,ZDlrr3&8!$Cq7!5S"%!<2rtqu6]4&,lM/^^pAC"Q08%p]:?n!l+e#pAY-.m/R%bqu6Zs5Q1T_i!92["FpIon-Asm"2DVO +J+imB_!M+#!!#7^rrW0"J,TBJp]LKp"o\K%+5dD'rrO:X!;6?l_!M('^]4?VrVlot!;uitp]LKp"oJ?#+2AEdrrN<'!;6?l_!M('n,NG1rVlor!W;ruquQcr#k.fo++PI5s8Mutp&>$-m/I1W!!",>rrN$"r;Qfs!WE#ui;EW[5QCc]!!!&mrrBk$rr`#r!$D1>!Vccorr<&trr@TJ!<3!#n,NFjp&>$-m/I1_!!",>rrMm"qu6\IJ,]KH +!!!-#rr^%:!$Cn6!5Rt$"8Dir&,lM/n.5Er"Fu"%s8Mrs!$D4?"+U@OJ+`gA_".L*5Q(N`qu?^%rVlof&,ZA5^d%l!rW!&9!.Y"J!e:7Qo`"p,oD\jj5Q(N`qu?^!rVloV+8c'D^d%l!qu?u;!WE$"J,g,PrrBk+rrN*@r;Qls!!!&urrM%"qu6r[5QCc]!"[umrr3)`J,g\`rrBk+rrN*@r;Qls!!!&urrKnWqu6r[+92B=!'fB`rr3)@ +J,hh+rrBk+rrN*@r;Qlu!!!&urrKo"qu6r[+92B9!'fC+rr3)@J,hh+rrBk*rr=/VJ+Wa@_".L*&,ZA/huEb,rr3"LJ,B6Nn.5Q7!!%KNrr3,r#64aRo`"p,o)A]Fqu6cf!!%NJrrIY"qu6`m&-)V/!Ik@Rrr_`j!!2]k!5S1* +!/(1K"7Q9j5Q:Z_JGT9Ip^dE(!!.NZrr3)i!!!,mrrBk*rrBn4rr`#r!$D4?!.aqG!r*<*rVus]+9)9BJ,fQ[oD\g+o)A^+qu6cn!!",?rr@TGrs/<0rVurV!$D4?"+U@O+7oL4_".L+iQqH%"7Q9j&,uS/JGT9Np]p]s!8miArr3'#!!.T@rrBk*rrM/8r;Qlg!!!9'rr@TGrse`'GQ7d&!.Y%Kn,NFno)A^*o)AaLa8Gr>p](9rrr2tK +qYpQjrW!68huJ9,s1eU7&+]`#_".L+n]1S-"8Dir!WN*!JGT9Gq#16p&)[Herr[cO!$Ce3!5S1*!V+)*rr`0!!!3*!!.aqG#5A/u%hIS#rr;rt!'g&S!5S1*!Up3gs8E#trr@TGrsAH#!"T=M&-)\/rVuqJo)A^*o)Aac"8i*&^]4@as8RWGrsAH#!"T1I+92B=rW)Kg!5S1*!Vccors%B]!.Y%KJGT9Pp](:9!!#7`s7lQnnc&U)o)Aai +"8i*&huEaAs8RWGrrr/t!$;1@rr3)i!!!&irrBk)rrJ,B6On,`P"!.Y%Kr;HZr5OnaR_"%F*J:ILs#P\9!"98D:5PtH`n,r[p!WN*!r;HZr +J+rt+Z#s7cQo+926=&-)[F!!!Q/rr^%:!.Y"J!<=5:rrE&rrrBk(rrIWlrr3E)!<;fo!"],/!!3,trW!-ErVunJ!!3&u!Pf6@rrE#qrrBk(rrE*arr3<(!.XnH!!iQ(JGTs7cQo"8i*!i#hjr!W51ZrrBk)rrIX7qu6Zts8E!"#QO`#!!a&7&-"Th!!iE$!T5's +rrN%Iqu6Z3nc&W?J,B6N!<7QL!!E8Zr;Zpart#//!!!9$rrMU"qu6]lJ,B6G_"%F)!;c]s!<7TK!!#7]!!@`NL]78Q!"\u,!UpWsrrDijrrBk)rr<&qrrR`N_"ds5!WW1Trr)lt&,ZA-p^d9%!;ZKk!5S.)!!2rr!e>dYqZ$g[!!E9$KDtiM!"\u,!VcokrrBk)rr<)rrrTucnG<1iqu@!%s2"^6!!",UH1o)Aai!W)ft +^jkkO!!`Q&!$D7@_>O94!$D+UH1o)Aai"8`$!i'75=!!3]+!<2uui;EWU5PtH]rWE)u!!i?"!5S1*!WE2trrV+Crql`t+7KC3rrD!U!!#7\rrN*"rVlor&,H5*_".L+qucfq!oQrVufr!C/mHrrN*"rr2uWp\t6/o)Aag"8`$"i'782rW!"LhuWiW!;ucq!PgqsrrN*"rr2u9p\t6/o)Aag"8`$"i'782rW!"L^]FH7!;QNn!Wg)$qu6]r!WN*!KD5BG_".L+rWE#s"5lEDnGWCh56(fbrrDQf!!32:5PtH]rW3#u!/L=K!5S1*!WE2trr_1Ds7$!f!Xo&6rr2ufr;Zl65PtH]rWE0"!!i8u!5S1*!WE2trr^&$s7#pd +!.Y"J!9!eU!T63>rrr<&s8W'?p\t6/o)Aai"8`$"^d%kWquH]q!.b%K!c['>qu6it"98E!J+rsC_".L+rW2lq"2KEd_#465!WE&t!!<8k?m#:G!W32orrBk)rr<)rrr^&ds+(%J!!E6#!<2rt!s/1)+8c'@r!39%TD&9b_"%F)!W)ftJ:IUs!!!-#rrE&t!!<9"?k$-nc&W?J,B6K!;M'EIf9o)`rrN1M_t!$D.>%JYGQr]g;\+92B=!!",4rrBk(rs\AsJ,fP!!!!Q0quAt\!!")=!!)fnrs9eH!!iQ(n,NHrs.N_+8c*=++`t^!5S%&!;u`p"[Dbas8W)q!!#7^rs/)oO8lurs+BkA!5S"%!<2os!^8:Crr;iqr;Qig +s+gUR!WE>orrBk%rrE&s!!5=a5Q:]\!!!9%rrW)ta8Z)>r#bJ/!5S"%#P\9!Du`!#J,]HJJGfHJ+8Z!;j8T&ZpcnUPLquD68rrBk'rs8N&"98E#!&-Y:s82is!Vu`sKDY`;rrBk'rsS;r+92B9!!#7`s8;`oq>UMIqucBe!5S('$fD#7s8VQs!'gM`q"k$kJ,90H_#+H*rrBk'rrKn9rr32l56)f* +s7#mc!.XkF!oS;6mf*:&n,EE="9/<)i.$8!s8Tn3!!#7[rrW+;+7B./_!h:(!"])/#2oNs&-)Z[qZ$UUHqJ+Wa@&,cG-_!q@*rW"&>rrp4rVlut4oc](rrE*Aqu6]r+8Z!;_".L-rW2Kgrr3+O#QOhnr;cis"8Dir"9&6%r#>]drr3"L&,ZA-r#be8!5S1*"+UWl"9/<'huj#ZnGWCf!WN*$rVup#rVlro2urpW!T44[rrMmZqYpQ2o)Adl%tG2irri)ts8V$V!!!-"rrN0#!WE$"pb2gKrrMTkqu6]dJ,90F_"7R/rW"#?+9)9CquHcsi;N]V&,lM0J,fTJrrVuR#Q=Z'p]:9l +!T8J(rrBk+rri6"IK4lrrrW7Ns5!l+d9rVlrpi",ed!W2rprrBt4rrBk+rr`#rquHZp"+WW9_#=<65Q1Ta^]4@arVlo6+8l-=!;lcr&,H5*_"7R.p]LEpr;Ql75QAOu!;uj!huEaArVlnK5Q(N^!.XtI!WF2:rrBk+rr_a$p]LHo#2gU'J,fQMr;R)m!!",@s7?6jJ,K!5S4+"2Orp+8l-?p]p`r!!!Q-rs8N&!!iQ(a8Q,:rrM$grVlleq#:?0oD\p/s1f`SrrW*#q#16n&,cG5rVup#s8UFC!W2ltn.5Kt!9*_Q!5S4+",$Wh5Q(N_qucHf!!!Q,rs&N(!WVckqucir!Vd3(rrA,TrrBk,rri6)s+#Us +rrW0#i;N]V&,ZA3J,fTLoDeRfqu6]l#QF`(r]g2X!5S7,"8EE,JGT9H!Pn[7!"\u,#J^<>s5X.S#Q+N%r!36$!Vh0>rrBk,rr_aTs+'tGqu?^%qu6oZ!!%M"s7cirrrN$"rr3#gJ,'$D_"@X/i.(b,qYpPGr;Zg&qu6oZ!!#4cs6pQrrrN$"rr2uVp\t6/o`#$/s8N,rrr@TJ!!!9$rs/#n!$2CFn.5Er!WE3#rr@WErrBk,rr[iPrrMur +!5SO5!!iE$#P\9!#S6t)&,ZA-rW3#u!!Duq!5S7,!sAT&"8`#t_#=<749PK\!;ufr"!@R4&,ZA1rW3'!rWi2t!5S:-"TAZ+rWE#s!5SR6!Ik4KrrE&t!!>Icn/qQ-"o\Q&s83E%rrBk-rri*-s8E,srrBk6!!3+Nqu6ZqrW!%Ms55!rrrrB&s8VjYp\t6/p&>-p5QC]bqYpQRrW!$"J3Wr2rW!'#s55!qrr`B&s6tO4rrBk.rrrB%J,fEO +qYpcX!!!'"^`WIR#(Q[Ss8V"!qYpWts8Tn.rrBk.rrrB%s8W!%qYpcX!!!'"^^p>B#/C3=s8V"!qYpWts8RWCrrBk.rrr/us8W!%qYpcX!!!'"i",_b#/C3=s8V"!qYpWts8N,nrrBk.rrq=&s8W!%qYpcX!!!'"pQ,4O#2fI]J,eFKqYpWts8E&mrrBk.rrp2&s8W!%qYpcX!!!-$s2Y$:#4MTmJ,eFKqYpWts83,qrrBk.rrmq&s8W!% +qYpcX!!!-$s2Y$:#4MTm5QBX`qYpWts6tO3rrBk.rr<&urrN$&qYpcX!!!-$s2Y$:#4MTm+917@qYpTss5$-p\t9PJ,]HKr!3)u!oO&Crr3#WJ,Kj5P>$V_"[j/iVicWrWE#s!Pea7rrM%Bqu6iX!!*&g&,ZA.rW1sLrrBk/rrDZhrrN*$qYpT3"9&6#n/qW/#Q=\t!!%N<#Q+N&quak/rrBk*rrN*$qYpT3 +&,lM/n/qW/#PnDt!!#7Y#Q+N&qu_`HrrBk*rrN*"qYpT3+8u3?p^d?'#PnE!!!",9#Q+N&p](QkrrBk)rr<)rrrIX7rVlor"9&6)nc/Uh!$Ctr!3-!qu@!Es8Vus!<7R6r;Qct#P7rq_"n!1JGT9Hi",bc!Vcotrso#.!WVWh&-)\/!!%Ma ++8u3@rW!2prrBk1rr<)rrrMTor;Qfe&,cG;qu@9-rr<<(s8Duu5N!(Nrri6""96./rrBk2rrN*(qYpTk"8r0"i#hms#4MVBs8Tk8rr3*$!$C\8rVm#q!!E89p&>$-qYpTk&,Q;,p]:rrM$[r;Qfs!;uj/i",kfp](?p^]8la^]8lRJ+rX9!5SL3!W51WrrM$Yrr3"L#Q4T&quQ`q&F]r)s82it +s53kZp](rs%rm5QC]_&,cG.p]LHo#l"Z)s8Duus7#se!sAT$J+Wa@_#+-3nFuqequ@!%n,OR.rrMm"r;Qfq"9/<&!!%NHr;Zg&nc&U)qu6ZTp\t6mqu?^]r;Qfe#Q4T&quQfs"+UA9s8;ot+8u3>^\7[-_#+-3_tO-.!;lcsn.5Hs!WE-!rrdiP+9-lj!!#7^rrA\brrBk3rr@iJrrBk6!!!,urrM%"qu6Wrrr3,: +!$D71rVup_rVllTpAY-.qu6X,pAY-NrVup/qu6]T+8c'[!!2rr!Uq31rrq<\5QCX'n,EC'rVllmp&Fsj!.XnG +!WE,rrrMU2rr3/k!$D79+7K40_#=95oCi1arquinrrN*"qYpTc+9)9Dn,O"!n3?CA!5SR5!9a(U!;ufr!!iB#!WE2trrMU2rr3/s!!iP^J+*C;_#=95TD&9bq#16n5PkB\rWE#s!Uq31rri6"#QMU-rrBk5rr=/7rrDQf!;ZWqrWE#s!Uq31rri<$"93r?rrBk6rrN+KpAY6Q!!!&qrrN*$qYpTc+8u3A!!3*)mf*:&rr2urp&>-0!!!,s +rrN*$qYpTc+8u3A!!)p-mf*:&rr2uqp&>,E!!!Q*rrN*$qYpTc+8u3AJ,o?dmf*:&nc/Rg!$D%:!WE2trrMU2rVlu8!$FMorrBk*rrE&t!!#7ZrrN*"qYpTc+8u3AhuEb,mf*:&o)A^frVuqJq#:-P!!!8urr<&qrrM%BrVlrs!!hok!5S1*"2Fm:+8>d8!;c]ri'72?!rN$'mJd1%!rr,E!!#7Xrr@TGrrKo"rVlrs!!DWg!5S1*rVuqJp\t8EJ,B6H^jl=_!rN$!mJd1%oD\girW)]m!rN%Jqu6\IJ,TBKqu?`arrBk+rr`0!!!2io!r)a[qu6\IJ,TBKp](<]rrBk+rr`#r!!Duq!q61Squ6YH +r;Qlo!!%N:rrBk+rr_`j!!i8u!q613qu6Wrr;Qlg!!#7OrrBk+rr_0Z!"\i(!oRH.r;Qfs!W;s"i%P-Qmf*:&oD\p.!!",8rrTuT&,cG.rW2rs"2Xm8+7B./_"7R.J,fR6p\t;Fn-Amk!W3&trrWB&!"\Mt!5S4+rVuqJp\t;Gp]LHo!Vccqrri<+rr<;lrrBk,rrE&t!;?Eo#P\E!rrMTorVm#u&,uV3mf*:&o`#$k!!!&nrrN`/!W;ru +n-Apl"Sa)=J-56>!5S7,"8Dir"8DftrZD+>r;QfU%fQD1n3?r'!Ufsf_"@X/n,NFnp\tBo5Q:_5rVlqL*.Rtf"Q9=[^]$krW)Zl%hJ^?p]*PYs*t4N+92B=5Q:Z`!!hum!5S:-"8Dir!VZO(TE"rh!"],/!!iKFs8VS-P!!!8prr@TJ!!#7^rrBt8rrM$Xn,EC'p&>-0!!!Q#rrBk5!!%NIrr@iQrrVZiJ+3I<_"I^0J,fQko)A^ZrW!-'s8W(Jrt#).!q62> +nG`L(p&>,E!!#7YrrN*`rVllqrW!--s8W(JrZD+=!r)bFnG`L(p&G!k!.XeD!W51[s8E!&+92B=J,DP0rrW)u+7T:1_"Rd.rr)olrrMmZr;Qif!!*#u"8mZDJ,TBKrW!JurrBk.rr`#r!!2io!UtU9rrIWlrr3&tJ)L5(!<*mHis9G!J1(9rrBk.rr[cO!!Duq +!;Z9e!IP.LrrKt2nG`L(pAb*l!!hcg!W3K*rrM'UnG`L(pAY3qhuF#WrrN%Io`"si+8c'>nGIe+rrBk.rrWMq!"\l)!;uHg!VenVrrVun5OnaR_"[j3rX\Ju&,?/)q"+Ldpj`2@!rdWjnc&U)p\tB3+7K7Pq#:?ioD\g+q>UI[&+TZ"_"[j3^`VJ75PY6Yqt'gfJbfUK9j73-L_"[j2`ZMu,q#:Bo5P+mT&,H5+kOJ*B!5S@/"33WV+8Gj:rdXS?!WF2:rrM`enc&U)p\t?9^ApLnrrN%Io`"si5Pb<[q>Bd_!5S@/"7Q6iJ,'$Dq"+Ldpj`,>!rVtGo)A^*pAY3n!.XeD!;Z6d!;Q?h!ri*^o)A^*pAY0m!8[YUHlqqZ!5S=.!W2uSrrN$>o)A^*pAY0g"6KO_chdYBr"&Au!5S=.!Pf61rrDin +rrC+8rr<;prrBk.rrE*Aq#:?ioD\g[rr2uYqYpTZj7<3M_"[j1rW#1XrrDT\rrD$WrrD6YrrM`Mo)A^*p\t=.rrBk/rrN#up\t6RoD\e$pAY3li.(@u!5S@/!Vd3"rrD*OrrN*@pAY3n!'g)T!5S@/!Uq3*rrDfcrrN$^p&>$m5P+mT_"[j0^`Vh@!W7H? +rrIWloD\g+p\t6o+6ie*i;ETToD8If^`W1J!5SC0!rN$_l2LbHr;QceqYpTS&+ff$_"dp1quQQl!6=^2!71TC!:fpc!UpWkrrBk0rrMlsp\t66oD\fOr;QcmqYpTk:\4Sd_"dp1n,rFb!0?aO!2&o`!W;-PrrBk0rrMTkp\t48oD\e4o`#!jj.GuD!5SC0!T44XrrN*`o`"sk5P+mUn.50k!5SC0!T8J&rrN+Ko`"siJ+N[@n-AUc!5SC0 +!5S@/!W7H>rrDibrrMm"o`"p,q#:>Ep\t6moD\gbo)Aac"8)Tn_"dp0Ja!+6cgq):p]L0g!5SC0!!2<`!0?^N!W2ujrrBk1rrN*$l2Le`+7fF4rW2Zk!5SF1!Vcc]rrN$^nc&Rio`"p,q>UK2#O26hpj_i6!;Q3d!5SF1!It^FrrMV=nc&Uao`"p,q>UHq+6ie*i:-aIpj_u:!5SI2!r`1Lq#:?SoD\g,nG`OeJ+`gA_#"'3rW2cn!9`tR +!5n=+!W51TrrBk2rrN$"p\t66oD\gRnG`Oe&,#r&_#"'3r!2ur!9a"S!;Gs^!WE>srrBk2rrMm"l2LbHmf*7hp&>$-qYpTc&*a)oa6rs-JbB$C_#"'3i#h4`!0?RJ!5S:-!5SI2!Iu9WrrN*@mf*:Gp&>$-qYpQr5O/7Lr'0WL!9*VN!5SL3!rN%Jq#:?_o`"se5OSOOiV!3N_#+-4p]1'g!9a"S!Vh04rrDT^rrBk3rrM$Yl2LeRJ+!=: +nFce]_#+-4^]Wj$!9!8E!Vd3!rrBk3rrIWTl2Lb(m/I%jpAY-.qu6Zt&*a)oO6llH_tO*1_#+-4#G:;]!WEVrrrD*QrrBk4rrN*(l2Le^+70"-j7`KQ_#435r!2Kd!W51KrrDZarrBk4rrN$&l2LeZJ*d18nb2t__#435p]p'`!UtU*rrDifrrBk4rrMm*l2LbQli."`5PP0X_#435n.4d`!:fCT!W32srrBk4rrM%"l2LbTli."b"8Dfq +_#435^`Vh@!;GdY!.jnE!5SO4!!(CG!96!WF2)rrC+7rrBk5rr<&`rrN$>kl1YCq#:?0rVlluJ*R%7pcmX8!5SU6!r`1LlMgnSJ):2*_#F?8quD63rrD$6rrBk6rrMlpl2La=h>[Jjrr3#g!U9Ua&)I6c +_#F?7n,qtU!WG=GrrDN`rrBk6rrL.FlMgn_J)1,)_#F?7O,*$#!;tXP!5SU6!>!NArrDiLrrBh:s8W'?l2LbZh#@Ai"98E!+6ie*q:tuM^]XW:r#b2'!;YFM!5J^:s7egrrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjL +rrBjLrrBib~> +endimage +[67 0 0 -67 0 0]/Times-Roman MF +( )1658 1712 MS +[75 0 0 -75 0 0]/Times-Bold MF +(R)887 1808 MS (A)941 1808 MS (P)995 1808 MS (P)1041 1808 MS (O)1087 1808 MS (R)1145 1808 MS (T)1199 1808 MS ( )1249 1808 MS (D)1268 1808 MS (M)1322 1808 MS (2)1394 1808 MS (S)1431 1808 MS +[75 0 0 -75 0 0]/Times-Roman MF +( )1473 1808 MS +[50 0 0 -50 0 0]/Times-Bold MF +( )1180 1895 MS +(S)892 1977 MS (F)920 1977 MS (M)950 1977 MS (E)998 1977 MS (/)1031 1977 MS (L)1045 1977 MS (G)1078 1977 MS (L)1117 1977 MS (S)1150 1977 MS (/)1178 1977 MS (R)1192 1977 MS (T)1228 1977 MS (/)1261 1977 MS (0)1275 1977 MS (2)1300 1977 MS +(-)1325 1977 MS +(0)1342 1977 MS (0)1367 1977 MS (2)1392 1977 MS (/)1417 1977 MS +(A)1431 1977 MS +( )1467 1977 MS +( )1180 2060 MS +( )1180 2142 MS +( )1180 2225 MS +( )1180 2307 MS +[58 0 0 -58 0 0]/Times-Bold MF +LATENC /_Times-Bold /Times-Bold reencode +[58 0 0 -58 0 0]/_Times-Bold MF +(I)340 2425 MS (n)363 2425 MS (t)395 2425 MS (r)414 2425 MS (o)441 2425 MS (d)469 2425 MS (u)502 2425 MS (c)533 2425 MS (t)560 2425 MS (i)579 2425 MS (o)596 2425 MS (n)625 2425 MS ( )656 2425 MS (d)672 2425 MS (u)705 2425 MS ( )736 2425 MS +(p)751 2425 MS (a)783 2425 MS (r)812 2425 MS (a)838 2425 MS (l)867 2425 MS (l)884 2425 MS (\351)900 2425 MS (l)926 2425 MS (i)942 2425 MS (s)958 2425 MS (m)981 2425 MS (e)1029 2425 MS ( )1055 2425 MS (d)1070 2425 MS (a)1102 2425 MS (n)1132 2425 MS +(s)1163 2425 MS ( )1186 2425 MS (l)1201 2425 MS (\222)1218 2425 MS (a)1237 2425 MS (r)1266 2425 MS (c)1292 2425 MS (h)1319 2425 MS (i)1351 2425 MS (t)1367 2425 MS (e)1386 2425 MS (c)1412 2425 MS (t)1438 2425 MS (u)1458 2425 MS (r)1489 2425 MS (e)1515 2425 MS +( )1541 2425 MS (l)1556 2425 MS (o)1573 2425 MS (g)1601 2425 MS (i)1630 2425 MS (c)1646 2425 MS (i)1672 2425 MS (e)1688 2425 MS (l)1715 2425 MS (l)1731 2425 MS (e)1747 2425 MS ( )1773 2425 MS (d)1788 2425 MS (u)1821 2425 MS ( )1852 2425 MS (p)1867 2425 MS +(r)1899 2425 MS (o)1926 2425 MS (j)1955 2425 MS (e)1974 2425 MS (t)2000 2425 MS ( )2019 2425 MS +(P)987 2492 MS (A)1023 2492 MS (L)1065 2492 MS (/)1104 2492 MS (S)1120 2492 MS (A)1152 2492 MS (L)1194 2492 MS (O)1233 2492 MS (M)1278 2492 MS (E)1334 2492 MS +( )1373 2492 MS +n +1 1 160 2344 B +f +n +1 1 160 2344 B +f +n +2035 1 162 2344 B +f +n +1 1 2198 2344 B +f +n +1 1 2198 2344 B +f +n +1 183 160 2346 B +f +n +1 1 160 2530 B +f +n +1 1 160 2530 B +f +n +2035 1 162 2530 B +f +n +1 183 2198 2346 B +f +n +1 1 2198 2530 B +f +n +1 1 2198 2530 B +f +[50 0 0 -50 0 0]/Times-Bold MF +( )1180 2578 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1180 2635 MS +( )1180 2692 MS +( )1180 2750 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(B)1025 2807 MS (e)1058 2807 MS (r)1080 2807 MS (n)1097 2807 MS (a)1121 2807 MS (r)1143 2807 MS (d)1160 2807 MS ( )1185 2807 MS (S)1198 2807 MS (\351)1226 2807 MS (c)1248 2807 MS (h)1271 2807 MS (e)1295 2807 MS (r)1317 2807 MS +[50 0 0 -50 0 0]/Times-Bold MF +( )1334 2807 MS +( )1180 2866 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )1180 2947 MS +showpage +%%Page: 2 2 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +435 169 M +435 136 409 108 376 108 c +344 108 317 136 317 169 c +317 202 344 230 376 230 c +409 230 435 202 435 169 c +cp +CM 0.188 0.191 scale +s +SM +71 sl +n +635 169 M +635 136 609 108 576 108 c +544 108 517 136 517 169 c +517 202 543 230 576 230 c +609 230 635 202 635 169 c +cp +CM 0.188 0.191 scale +s +SM +n +144 31 403 131 B +1 g +f +1 sl +n +146 33 402 130 B +cp +s +71 sl +0.375 g +n +535 166 M +535 132 509 105 476 105 c +444 105 417 132 417 166 c +417 199 443 226 476 226 c +509 226 535 199 535 166 c +cp +gs +1 g +e +gr +CM 0.188 0.191 scale +s +SM +n +418 166 M +532 166 L +CM 0.188 0.191 scale +s +SM +n +40 24 517 174 B +1 g +f +1 sl +n +42 26 516 173 B +cp +s +n +574 157 M +551 157 L +507 97 L +537 99 L +573 157 L +574 157 L +cp +gs +e +gr +s +n +380 153 M +403 153 L +447 94 L +417 96 L +381 153 L +380 153 L +cp +gs +e +gr +s +0.375 g +n +410 116 M +410 112 407 110 403 110 c +399 110 397 112 397 116 c +397 120 399 123 403 123 c +407 123 410 120 410 116 c +cp +gs +e +gr +s +n +554 116 M +554 112 551 110 547 110 c +543 110 541 112 541 116 c +541 119 543 122 547 122 c +551 122 554 119 554 116 c +cp +gs +e +gr +s +72 sl +n +640 113 M +640 226 L +CM 0.188 0.191 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )653 244 MS +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[29 0 0 -29 0 0]/_Times-Roman MF +(C)192 287 MS (O)212 287 MS (M)232 287 MS (M)258 287 MS (I)284 287 MS (S)294 287 MS (S)310 287 MS (A)327 287 MS (R)347 287 MS (I)366 287 MS (A)377 287 MS (T)397 287 MS ( )415 287 MS (A)423 287 MS ( )443 287 MS (L)451 287 MS +(\222)469 287 MS (E)478 287 MS (N)496 287 MS (E)517 287 MS (R)535 287 MS (G)555 287 MS (I)575 287 MS (E)585 287 MS ( )603 287 MS (A)611 287 MS (T)631 287 MS (O)650 287 MS (M)670 287 MS (I)696 287 MS (Q)706 287 MS (U)726 287 MS +(E)747 287 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )765 287 MS +530 526 1 67 185 183 1996 92 false true 3 beginimage +doNimage +^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;L^]+;LoD\gfp&>#Qg]%8hoD\gdp&>#Ig]%8hoD\gcp&>$0g]%8hoD\jhJ+imB_qY1k_"7R,r."G?!5[Fi!5S4+!WITBrrD$4rrBk+rrN*`pAY-Ng]%8hoD\jj5PG*WnD!sC_"7R, +rZCk6!UtTorrBk+rrN*@pAY0gJ)(&(_"7R,rX\`&!Ven7rrBk+rrN*(pAY0g5MZ8=_".L*"8;`qr#a_o!5S1*!.aeC!WF1rrrBk*rr@TCrrN*0h#@Aio)Aa+J+imB#Mf=Z_".L+i.(J#!!h[Jjo)Ad\!.XbC!Ur>5rrA,YrrBk*rrVrq5PP0Yp`JMq!"]&.!5S1*!rN$_p\t9l+6*;#TDeci_"%F*!'g5X!W4%qrrBk)rrIX7p\t9n&**ZiL]%/P_"%F*J04Lb!"\,i!!iH%!5S.)!It^TrrLFJj8T+3r;Qc4nc&W?#P\6!c[k-V!/(4L!5S.)!Peg3rrIn+j8T+3r;Qc4nc&XJ"8Dfra+<=O!U#+5rrBk)rrMTip\t97 +J`Qh3_h7me!5S.)!Vc]irrL/kjSo7ua8Gr;_"%F*p]:-h!QT`OrrC+:rrBk)rrMlqp\t93J`Zn4r"&])!5S.)!VcZhrrM$Xjo5AV+8c'<_"%F*p]1'g!T3t>rrMmZqu6Z3nc&Xb!;HKon,VSM!9!_R!5S.)!r)bFq#:Ba!9O4\_>=03_"%F+quD6ArrVZiJ*-b2"8`#t_"%F+rW#1XrrVs(5Ni%Ir"&Z(!5S.)!r`0Aq#:Ej$pWqT!Uq3- +rrBk(rrE*1q#:Ej%Njm6!T63=rrBk(rrE*%q#:Ej#7p"t!5SF1!5S+(!It4GrrVs#&*Nrm_>4*2_!q@)^]F61!r*"UkPkO7q>UH1nG`OI!VlZrp]n_#rrM_Pq>UH1nG`OI!VlZrp]n_#rr@]HrrBk(rrMTiq#:Ej#N=qI!WE2rrrBk(rrMThq#:En#N4kH!W32trrBk(rrVrq5Pb<\r!2`UrrMm"q#:?0nG`Rb!'g;Z"8iDnJ*R%7p]pTo +!5S+(!rN$?q>UQp#P`f7rrW2t#PeUQp!W4&*rrW*X&,?/)_!h:(!!i?""9&?#+7&q.c2\CMrrBk'rrIWTq>UQr!<*MprrRoT+8Gj9_!h:(J-5TH!W`62li.$:!'g8Y!5S('!Pe^1rrR_##OMHmrVuqJq#:?0n,EII!.XhE!l.#*m/I.^!!2us +!.Y"J!5S('!oO&Cq>UNS5D/>&!r)`tr;QfsJ,]HJ_!h:)n,P]KrrV[3KC&U>p](QsrrN%Irr2u6n,EIY!$D%:!q7:_m/I.V!"]#-!Vh0DrrBk'rrVrq+8Ppi.(b+!5S('!r)a+q>UNo#Cu4A"8m*<5Q(N^^jl@`!5S('!rN$/q>UNo!!)Ed"8FPM5Q(N]JGoKJ_!h:)rW!K)rr`6#!.XG:"7Q9jJ,KUNSItR7j +"9&9#&,lM0rW"qUrrBk&rrV*Y&,H5,n:/:Drr`0!!$D1>!r`1Lr;Qc4mf*@X!"\o*!q:]tnG`Uc!!",>rrN#uqu6Z3mf*@X!!i?""8G+MJ+UQp&,8B[rr`0$huN`U!r`01qu6Z3mf*@d!!E&s"9&Q'5P"gVn-@kPrVlrs!'gA\!5S%&!rN$!q>UQr +"8j83rr_0i^^'iUNSIfo9A!Y,V@rVlro!'g>[!5S%&"8i-!5Pb<\ +i'2b`rr_.#!"]&.!VcZjrrBk&rr`#r!'g;Z"7RC_J+`gErWaMF+8u3?J,oEF!5S%&"8Dir+8Pp=p^b/)p&>0m"qL\urr3'!!!2oq!5S%&"8Dir+8Pp=p]p:Qp&>0a%LrJgrr3&t!!E&s!5S%&"7Q9j#PnB%quc^9p&>-0*WQ3=rrW)u+8Pp:_!_4)n,NFjq>UQp!Vd2urr[d8!!3&u!rN$?q>UH1mf*Ca!!!,srr`6$r"&K#!s!cM"9&6$ +2uk&rrrBk&rr`0!!!E&s"9&?!&,#r)!.FnQrr3*"!!#7ZrrBk&rr`0!!!E#r!Wi30pAY92!.4bWrr3)u!!%NErrBk&rr`6#!!E#r!Wi'$pAY,CrVup?rr3&t!!E#r!5S"%!WW3$q#:DG!!)`m"98u5!'gJ_!rN$'q#:?0mJd6rW%0C!.Y"J!rN$/q#:?0mJd9=!!%NEs8Duu#Pe<%rW%[!;ucqq#:JI!;lg=rVlof!VcTo_!V.(n,NG1qYpQbr;ZhIq>UQt!VcX:rVloV"8Dfq_!V.(p](:9qYpQRr;Zg>q>UQt"8Dj\rVllu#P\5u_!V.(p](:)qYpPGr;Zg&q>UNs+7KC2rrVrq&,6)(_!V.(p](:)qYp^!!WW-!"8`$#irK,;#QF`*j59nJp\t6/mJd:`!!!9$rs&B$&-)[F!W)g!^]FJN&,uS2_nZ6op\t6/mJd:`!!!,u +rs&5u5QCcQ!;c]u!!E7O&,uS2K7Eqdp\t6/mJd:`!!!,urrMThrr3&t!.XqH"o\K,rr=/?rrRh'"8;`p_!V.(p](9pqu6]T"9/<%rW#1\rrr<#&,lPNrr3&;!!i5t!5S"%"8i-!!W2lti!95\!Iu9irrqll&,ZDlrr3&8!$Cq7!5S"%!<2rtqu6]4&,lM/^^pAC"Q08%p]:?n!l+e#pAY-.m/R%bqu6Zs5Q1T_i!92["FpIon-Asm"2DVO +J+imB_!M+#!!#7^rrW0"J,TBJp]LKp"o\K%+5dD'rrO:X!;6?l_!M('^]4?VrVlot!;uitp]LKp"oJ?#+2AEdrrN<'!;6?l_!M('n,NG1rVlor!W;ruquQcr#k.fo++PI5s8Mutp&>$-m/I1W!!",>rrN$"r;Qfs!WE#ui;EW[5QCc]!!!&mrrBk$rr`#r!$D1>!Vccorr<&trr@TJ!<3!#n,NFjp&>$-m/I1_!!",>rrMm"qu6\IJ,]KH +!!!-#rr^%:!$Cn6!5Rt$"8Dir&,lM/n.5Er"Fu"%s8Mrs!$D4?"+U@OJ+`gA_".L*5Q(N`qu?^%rVlof&,ZA5^d%l!rW!&9!.Y"J!e:7Qo`"p,oD\jj5Q(N`qu?^!rVloV+8c'D^d%l!qu?u;!WE$"J,g,PrrBk+rrN*@r;Qls!!!&urrM%"qu6r[5QCc]!"[umrr3)`J,g\`rrBk+rrN*@r;Qls!!!&urrKnWqu6r[+92B=!'fB`rr3)@ +J,hh+rrBk+rrN*@r;Qlu!!!&urrKo"qu6r[+92B9!'fC+rr3)@J,hh+rrBk*rr=/VJ+Wa@_".L*&,ZA/huEb,rr3"LJ,B6Nn.5Q7!!%KNrr3,r#64aRo`"p,o)A]Fqu6cf!!%NJrrIY"qu6`m&-)V/!Ik@Rrr_`j!!2]k!5S1* +!/(1K"7Q9j5Q:Z_JGT9Ip^dE(!!.NZrr3)i!!!,mrrBk*rrBn4rr`#r!$D4?!.aqG!r*<*rVus]+9)9BJ,fQ[oD\g+o)A^+qu6cn!!",?rr@TGrs/<0rVurV!$D4?"+U@O+7oL4_".L+iQqH%"7Q9j&,uS/JGT9Np]p]s!8miArr3'#!!.T@rrBk*rrM/8r;Qlg!!!9'rr@TGrse`'GQ7d&!.Y%Kn,NFno)A^*o)AaLa8Gr>p](9rrr2tK +qYpQjrW!68huJ9,s1eU7&+]`#_".L+n]1S-"8Dir!WN*!JGT9Gq#16p&)[Herr[cO!$Ce3!5S1*!V+)*rr`0!!!3*!!.aqG#5A/u%hIS#rr;rt!'g&S!5S1*!Up3gs8E#trr@TGrsAH#!"T=M&-)\/rVuqJo)A^*o)Aac"8i*&^]4@as8RWGrsAH#!"T1I+92B=rW)Kg!5S1*!Vccors%B]!.Y%KJGT9Pp](:9!!#7`s7lQnnc&U)o)Aai +"8i*&huEaAs8RWGrrr/t!$;1@rr3)i!!!&irrBk)rrJ,B6On,`P"!.Y%Kr;HZr5OnaR_"%F*J:ILs#P\9!"98D:5PtH`n,r[p!WN*!r;HZr +J+rt+Z#s7cQo+926=&-)[F!!!Q/rr^%:!.Y"J!<=5:rrE&rrrBk(rrIWlrr3E)!<;fo!"],/!!3,trW!-ErVunJ!!3&u!Pf6@rrE#qrrBk(rrE*arr3<(!.XnH!!iQ(JGTs7cQo"8i*!i#hjr!W51ZrrBk)rrIX7qu6Zts8E!"#QO`#!!a&7&-"Th!!iE$!T5's +rrN%Iqu6Z3nc&W?J,B6N!<7QL!!E8Zr;Zpart#//!!!9$rrMU"qu6]lJ,B6G_"%F)!;c]s!<7TK!!#7]!!@`NL]78Q!"\u,!UpWsrrDijrrBk)rr<&qrrR`N_"ds5!WW1Trr)lt&,ZA-p^d9%!;ZKk!5S.)!!2rr!e>dYqZ$g[!!E9$KDtiM!"\u,!VcokrrBk)rr<)rrrTucnG<1iqu@!%s2"^6!!",UH1o)Aai!W)ft +^jkkO!!`Q&!$D7@_>O94!$D+UH1o)Aai"8`$!i'75=!!3]+!<2uui;EWU5PtH]rWE)u!!i?"!5S1*!WE2trrV+Crql`t+7KC3rrD!U!!#7\rrN*"rVlor&,H5*_".L+qucfq!oQrVufr!C/mHrrN*"rr2uWp\t6/o)Aag"8`$"i'782rW!"LhuWiW!;ucq!PgqsrrN*"rr2u9p\t6/o)Aag"8`$"i'782rW!"L^]FH7!;QNn!Wg)$qu6]r!WN*!KD5BG_".L+rWE#s"5lEDnGWCh56(fbrrDQf!!32:5PtH]rW3#u!/L=K!5S1*!WE2trr_1Ds7$!f!Xo&6rr2ufr;Zl65PtH]rWE0"!!i8u!5S1*!WE2trr^&$s7#pd +!.Y"J!9!eU!T63>rrr<&s8W'?p\t6/o)Aai"8`$"^d%kWquH]q!.b%K!c['>qu6it"98E!J+rsC_".L+rW2lq"2KEd_#465!WE&t!!<8k?m#:G!W32orrBk)rr<)rrr^&ds+(%J!!E6#!<2rt!s/1)+8c'@r!39%TD&9b_"%F)!W)ftJ:IUs!!!-#rrE&t!!<9"?k$-nc&W?J,B6K!;M'EIf9o)`rrN1M_t!$D.>%JYGQr]g;\+92B=!!",4rrBk(rs\AsJ,fP!!!!Q0quAt\!!")=!!)fnrs9eH!!iQ(n,NHrs.N_+8c*=++`t^!5S%&!;u`p"[Dbas8W)q!!#7^rs/)oO8lurs+BkA!5S"%!<2os!^8:Crr;iqr;Qig +s+gUR!WE>orrBk%rrE&s!!5=a5Q:]\!!!9%rrW)ta8Z)>r#bJ/!5S"%#P\9!Du`!#J,]HJJGfHJ+8Z!;j8T&ZpcnUPLquD68rrBk'rs8N&"98E#!&-Y:s82is!Vu`sKDY`;rrBk'rsS;r+92B9!!#7`s8;`oq>UMIqucBe!5S('$fD#7s8VQs!'gM`q"k$kJ,90H_#+H*rrBk'rrKn9rr32l56)f* +s7#mc!.XkF!oS;6mf*:&n,EE="9/<)i.$8!s8Tn3!!#7[rrW+;+7B./_!h:(!"])/#2oNs&-)Z[qZ$UUHqJ+Wa@&,cG-_!q@*rW"&>rrp4rVlut4oc](rrE*Aqu6]r+8Z!;_".L-rW2Kgrr3+O#QOhnr;cis"8Dir"9&6%r#>]drr3"L&,ZA-r#be8!5S1*"+UWl"9/<'huj#ZnGWCf!WN*$rVup#rVlro2urpW!T44[rrMmZqYpQ2o)Adl%tG2irri)ts8V$V!!!-"rrN0#!WE$"pb2gKrrMTkqu6]dJ,90F_"7R/rW"#?+9)9CquHcsi;N]V&,lM0J,fTJrrVuR#Q=Z'p]:9l +!T8J(rrBk+rri6"IK4lrrrW7Ns5!l+d9rVlrpi",ed!W2rprrBt4rrBk+rr`#rquHZp"+WW9_#=<65Q1Ta^]4@arVlo6+8l-=!;lcr&,H5*_"7R.p]LEpr;Ql75QAOu!;uj!huEaArVlnK5Q(N^!.XtI!WF2:rrBk+rr_a$p]LHo#2gU'J,fQMr;R)m!!",@s7?6jJ,K!5S4+"2Orp+8l-?p]p`r!!!Q-rs8N&!!iQ(a8Q,:rrM$grVlleq#:?0oD\p/s1f`SrrW*#q#16n&,cG5rVup#s8UFC!W2ltn.5Kt!9*_Q!5S4+",$Wh5Q(N_qucHf!!!Q,rs&N(!WVckqucir!Vd3(rrA,TrrBk,rri6)s+#Us +rrW0#i;N]V&,ZA3J,fTLoDeRfqu6]l#QF`(r]g2X!5S7,"8EE,JGT9H!Pn[7!"\u,#J^<>s5X.S#Q+N%r!36$!Vh0>rrBk,rr_aTs+'tGqu?^%qu6oZ!!%M"s7cirrrN$"rr3#gJ,'$D_"@X/i.(b,qYpPGr;Zg&qu6oZ!!#4cs6pQrrrN$"rr2uVp\t6/o`#$/s8N,rrr@TJ!!!9$rs/#n!$2CFn.5Er!WE3#rr@WErrBk,rr[iPrrMur +!5SO5!!iE$#P\9!#S6t)&,ZA-rW3#u!!Duq!5S7,!sAT&"8`#t_#=<749PK\!;ufr"!@R4&,ZA1rW3'!rWi2t!5S:-"TAZ+rWE#s!5SR6!Ik4KrrE&t!!>Icn/qQ-"o\Q&s83E%rrBk-rri*-s8E,srrBk6!!3+Nqu6ZqrW!%Ms55!rrrrB&s8VjYp\t6/p&>-p5QC]bqYpQRrW!$"J3Wr2rW!'#s55!qrr`B&s6tO4rrBk.rrrB%J,fEO +qYpcX!!!'"^`WIR#(Q[Ss8V"!qYpWts8Tn.rrBk.rrrB%s8W!%qYpcX!!!'"^^p>B#/C3=s8V"!qYpWts8RWCrrBk.rrr/us8W!%qYpcX!!!'"i",_b#/C3=s8V"!qYpWts8N,nrrBk.rrq=&s8W!%qYpcX!!!'"pQ,4O#2fI]J,eFKqYpWts8E&mrrBk.rrp2&s8W!%qYpcX!!!-$s2Y$:#4MTmJ,eFKqYpWts83,qrrBk.rrmq&s8W!% +qYpcX!!!-$s2Y$:#4MTm5QBX`qYpWts6tO3rrBk.rr<&urrN$&qYpcX!!!-$s2Y$:#4MTm+917@qYpTss5$-p\t9PJ,]HKr!3)u!oO&Crr3#WJ,Kj5P>$V_"[j/iVicWrWE#s!Pea7rrM%Bqu6iX!!*&g&,ZA.rW1sLrrBk/rrDZhrrN*$qYpT3"9&6#n/qW/#Q=\t!!%N<#Q+N&quak/rrBk*rrN*$qYpT3 +&,lM/n/qW/#PnDt!!#7Y#Q+N&qu_`HrrBk*rrN*"qYpT3+8u3?p^d?'#PnE!!!",9#Q+N&p](QkrrBk)rr<)rrrIX7rVlor"9&6)nc/Uh!$Ctr!3-!qu@!Es8Vus!<7R6r;Qct#P7rq_"n!1JGT9Hi",bc!Vcotrso#.!WVWh&-)\/!!%Ma ++8u3@rW!2prrBk1rr<)rrrMTor;Qfe&,cG;qu@9-rr<<(s8Duu5N!(Nrri6""96./rrBk2rrN*(qYpTk"8r0"i#hms#4MVBs8Tk8rr3*$!$C\8rVm#q!!E89p&>$-qYpTk&,Q;,p]:rrM$[r;Qfs!;uj/i",kfp](?p^]8la^]8lRJ+rX9!5SL3!W51WrrM$Yrr3"L#Q4T&quQ`q&F]r)s82it +s53kZp](rs%rm5QC]_&,cG.p]LHo#l"Z)s8Duus7#se!sAT$J+Wa@_#+-3nFuqequ@!%n,OR.rrMm"r;Qfq"9/<&!!%NHr;Zg&nc&U)qu6ZTp\t6mqu?^]r;Qfe#Q4T&quQfs"+UA9s8;ot+8u3>^\7[-_#+-3_tO-.!;lcsn.5Hs!WE-!rrdiP+9-lj!!#7^rrA\brrBk3rr@iJrrBk6!!!,urrM%"qu6Wrrr3,: +!$D71rVup_rVllTpAY-.qu6X,pAY-NrVup/qu6]T+8c'[!!2rr!Uq31rrq<\5QCX'n,EC'rVllmp&Fsj!.XnG +!WE,rrrMU2rr3/k!$D79+7K40_#=95oCi1arquinrrN*"qYpTc+9)9Dn,O"!n3?CA!5SR5!9a(U!;ufr!!iB#!WE2trrMU2rr3/s!!iP^J+*C;_#=95TD&9bq#16n5PkB\rWE#s!Uq31rri6"#QMU-rrBk5rr=/7rrDQf!;ZWqrWE#s!Uq31rri<$"93r?rrBk6rrN+KpAY6Q!!!&qrrN*$qYpTc+8u3A!!3*)mf*:&rr2urp&>-0!!!,s +rrN*$qYpTc+8u3A!!)p-mf*:&rr2uqp&>,E!!!Q*rrN*$qYpTc+8u3AJ,o?dmf*:&nc/Rg!$D%:!WE2trrMU2rVlu8!$FMorrBk*rrE&t!!#7ZrrN*"qYpTc+8u3AhuEb,mf*:&o)A^frVuqJq#:-P!!!8urr<&qrrM%BrVlrs!!hok!5S1*"2Fm:+8>d8!;c]ri'72?!rN$'mJd1%!rr,E!!#7Xrr@TGrrKo"rVlrs!!DWg!5S1*rVuqJp\t8EJ,B6H^jl=_!rN$!mJd1%oD\girW)]m!rN%Jqu6\IJ,TBKqu?`arrBk+rr`0!!!2io!r)a[qu6\IJ,TBKp](<]rrBk+rr`#r!!Duq!q61Squ6YH +r;Qlo!!%N:rrBk+rr_`j!!i8u!q613qu6Wrr;Qlg!!#7OrrBk+rr_0Z!"\i(!oRH.r;Qfs!W;s"i%P-Qmf*:&oD\p.!!",8rrTuT&,cG.rW2rs"2Xm8+7B./_"7R.J,fR6p\t;Fn-Amk!W3&trrWB&!"\Mt!5S4+rVuqJp\t;Gp]LHo!Vccqrri<+rr<;lrrBk,rrE&t!;?Eo#P\E!rrMTorVm#u&,uV3mf*:&o`#$k!!!&nrrN`/!W;ru +n-Apl"Sa)=J-56>!5S7,"8Dir"8DftrZD+>r;QfU%fQD1n3?r'!Ufsf_"@X/n,NFnp\tBo5Q:_5rVlqL*.Rtf"Q9=[^]$krW)Zl%hJ^?p]*PYs*t4N+92B=5Q:Z`!!hum!5S:-"8Dir!VZO(TE"rh!"],/!!iKFs8VS-P!!!8prr@TJ!!#7^rrBt8rrM$Xn,EC'p&>-0!!!Q#rrBk5!!%NIrr@iQrrVZiJ+3I<_"I^0J,fQko)A^ZrW!-'s8W(Jrt#).!q62> +nG`L(p&>,E!!#7YrrN*`rVllqrW!--s8W(JrZD+=!r)bFnG`L(p&G!k!.XeD!W51[s8E!&+92B=J,DP0rrW)u+7T:1_"Rd.rr)olrrMmZr;Qif!!*#u"8mZDJ,TBKrW!JurrBk.rr`#r!!2io!UtU9rrIWlrr3&tJ)L5(!<*mHis9G!J1(9rrBk.rr[cO!!Duq +!;Z9e!IP.LrrKt2nG`L(pAb*l!!hcg!W3K*rrM'UnG`L(pAY3qhuF#WrrN%Io`"si+8c'>nGIe+rrBk.rrWMq!"\l)!;uHg!VenVrrVun5OnaR_"[j3rX\Ju&,?/)q"+Ldpj`2@!rdWjnc&U)p\tB3+7K7Pq#:?ioD\g+q>UI[&+TZ"_"[j3^`VJ75PY6Yqt'gfJbfUK9j73-L_"[j2`ZMu,q#:Bo5P+mT&,H5+kOJ*B!5S@/"33WV+8Gj:rdXS?!WF2:rrM`enc&U)p\t?9^ApLnrrN%Io`"si5Pb<[q>Bd_!5S@/"7Q6iJ,'$Dq"+Ldpj`,>!rVtGo)A^*pAY3n!.XeD!;Z6d!;Q?h!ri*^o)A^*pAY0m!8[YUHlqqZ!5S=.!W2uSrrN$>o)A^*pAY0g"6KO_chdYBr"&Au!5S=.!Pf61rrDin +rrC+8rr<;prrBk.rrE*Aq#:?ioD\g[rr2uYqYpTZj7<3M_"[j1rW#1XrrDT\rrD$WrrD6YrrM`Mo)A^*p\t=.rrBk/rrN#up\t6RoD\e$pAY3li.(@u!5S@/!Vd3"rrD*OrrN*@pAY3n!'g)T!5S@/!Uq3*rrDfcrrN$^p&>$m5P+mT_"[j0^`Vh@!W7H? +rrIWloD\g+p\t6o+6ie*i;ETToD8If^`W1J!5SC0!rN$_l2LbHr;QceqYpTS&+ff$_"dp1quQQl!6=^2!71TC!:fpc!UpWkrrBk0rrMlsp\t66oD\fOr;QcmqYpTk:\4Sd_"dp1n,rFb!0?aO!2&o`!W;-PrrBk0rrMTkp\t48oD\e4o`#!jj.GuD!5SC0!T44XrrN*`o`"sk5P+mUn.50k!5SC0!T8J&rrN+Ko`"siJ+N[@n-AUc!5SC0 +!5S@/!W7H>rrDibrrMm"o`"p,q#:>Ep\t6moD\gbo)Aac"8)Tn_"dp0Ja!+6cgq):p]L0g!5SC0!!2<`!0?^N!W2ujrrBk1rrN*$l2Le`+7fF4rW2Zk!5SF1!Vcc]rrN$^nc&Rio`"p,q>UK2#O26hpj_i6!;Q3d!5SF1!It^FrrMV=nc&Uao`"p,q>UHq+6ie*i:-aIpj_u:!5SI2!r`1Lq#:?SoD\g,nG`OeJ+`gA_#"'3rW2cn!9`tR +!5n=+!W51TrrBk2rrN$"p\t66oD\gRnG`Oe&,#r&_#"'3r!2ur!9a"S!;Gs^!WE>srrBk2rrMm"l2LbHmf*7hp&>$-qYpTc&*a)oa6rs-JbB$C_#"'3i#h4`!0?RJ!5S:-!5SI2!Iu9WrrN*@mf*:Gp&>$-qYpQr5O/7Lr'0WL!9*VN!5SL3!rN%Jq#:?_o`"se5OSOOiV!3N_#+-4p]1'g!9a"S!Vh04rrDT^rrBk3rrM$Yl2LeRJ+!=: +nFce]_#+-4^]Wj$!9!8E!Vd3!rrBk3rrIWTl2Lb(m/I%jpAY-.qu6Zt&*a)oO6llH_tO*1_#+-4#G:;]!WEVrrrD*QrrBk4rrN*(l2Le^+70"-j7`KQ_#435r!2Kd!W51KrrDZarrBk4rrN$&l2LeZJ*d18nb2t__#435p]p'`!UtU*rrDifrrBk4rrMm*l2LbQli."`5PP0X_#435n.4d`!:fCT!W32srrBk4rrM%"l2LbTli."b"8Dfq +_#435^`Vh@!;GdY!.jnE!5SO4!!(CG!96!WF2)rrC+7rrBk5rr<&`rrN$>kl1YCq#:?0rVlluJ*R%7pcmX8!5SU6!r`1LlMgnSJ):2*_#F?8quD63rrD$6rrBk6rrMlpl2La=h>[Jjrr3#g!U9Ua&)I6c +_#F?7n,qtU!WG=GrrDN`rrBk6rrL.FlMgn_J)1,)_#F?7O,*$#!;tXP!5SU6!>!NArrDiLrrBh:s8W'?l2LbZh#@Ai"98E!+6ie*q:tuM^]XW:r#b2'!;YFM!5J^:s7egrrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjLrrBjL +rrBjLrrBib~> +endimage +[29 0 0 -29 0 0]/_Times-Roman MF +( )2181 275 MS +(D)1596 318 MS (I)1617 318 MS +(R)1627 318 MS (E)1646 318 MS (C)1664 318 MS (T)1683 318 MS (I)1701 318 MS (O)1711 318 MS (N)1731 318 MS ( )1752 318 MS (D)1759 318 MS (E)1780 318 MS (S)1799 318 MS ( )1815 318 MS (R)1822 318 MS (E)1841 318 MS (A)1860 318 MS (C)1881 318 MS +(T)1900 318 MS (E)1918 318 MS (U)1936 318 MS (R)1957 318 MS +(S)1976 318 MS ( )1992 318 MS (N)1999 318 MS (U)2020 318 MS (C)2042 318 MS (L)2062 318 MS (E)2079 318 MS (A)2097 318 MS (I)2117 318 MS (R)2128 318 MS (E)2147 318 MS (S)2165 318 MS +gs +n +13 33 2181 292 CB +( )2181 318 MS +gr +(D)1437 351 MS (E)1458 351 MS (P)1476 351 MS (A)1492 351 MS (R)1513 351 MS (T)1532 351 MS (E)1550 351 MS (M)1568 351 MS (E)1594 351 MS (N)1612 351 MS (T)1633 351 MS ( )1651 351 MS (D)1658 351 MS (E)1679 351 MS ( )1697 351 MS (M)1704 351 MS +(E)1730 351 MS (C)1748 351 MS (A)1768 351 MS (N)1788 351 MS +(I)1809 351 MS (Q)1819 351 MS (U)1839 351 MS (E)1860 351 MS ( )1879 351 MS (E)1886 351 MS (T)1904 351 MS ( )1922 351 MS (D)1929 351 MS (E)1950 351 MS ( )1968 351 MS (T)1975 351 MS (E)1993 351 MS (C)2011 351 MS (H)2031 351 MS (N)2051 351 MS +(O)2073 351 MS (L)2094 351 MS (O)2112 351 MS (G)2133 351 MS +(I)2153 351 MS (E)2163 351 MS +( )2181 351 MS +(S)1225 385 MS (E)1241 385 MS (R)1259 385 MS (V)1278 385 MS (I)1299 385 MS (C)1309 385 MS (E)1328 385 MS ( )1346 385 MS (S)1353 385 MS (I)1369 385 MS (M)1379 385 MS (U)1405 385 MS (L)1427 385 MS (A)1445 385 MS (T)1465 385 MS (I)1483 385 MS +(O)1493 385 MS (N)1513 385 MS ( )1535 385 MS (D)1542 385 MS +(E)1563 385 MS (S)1581 385 MS ( )1597 385 MS (S)1604 385 MS (Y)1620 385 MS (S)1641 385 MS (T)1657 385 MS (E)1675 385 MS (M)1693 385 MS (E)1719 385 MS (S)1737 385 MS ( )1753 385 MS (C)1761 385 MS (O)1781 385 MS (M)1801 385 MS (P)1827 385 MS +(L)1844 385 MS (E)1861 385 MS (X)1879 385 MS (E)1900 385 MS +(S)1918 385 MS ( )1934 385 MS (E)1941 385 MS (T)1959 385 MS ( )1977 385 MS (D)1984 385 MS (E)2005 385 MS ( )2023 385 MS (L)2031 385 MS (O)2049 385 MS (G)2070 385 MS (I)2090 385 MS (C)2100 385 MS (I)2119 385 MS (E)2129 385 MS (L)2147 385 MS +(S)2165 385 MS +gs +n +13 33 2181 359 CB +( )2181 385 MS +gr +gs +n +13 33 2181 392 CB +( )2181 418 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +( )176 474 MS +[33 0 0 -33 0 0]/Times-Roman MF +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3254 MS (e)262 3254 MS (s)277 3254 MS ( )289 3254 MS (i)298 3254 MS (n)307 3254 MS (f)324 3254 MS (o)335 3254 MS (r)351 3254 MS (m)363 3254 MS (a)388 3254 MS (t)403 3254 MS (i)412 3254 MS (o)422 3254 MS (n)439 3254 MS (s)456 3254 MS +( )468 3254 MS (c)477 3254 MS (o)492 3254 MS (n)508 3254 MS (t)524 3254 MS (e)534 3254 MS (n)549 3254 MS (u)565 3254 MS (e)582 3254 MS (s)597 3254 MS ( )610 3254 MS (d)618 3254 MS (a)634 3254 MS (n)650 3254 MS (s)667 3254 MS ( )679 3254 MS +(c)688 3254 MS (e)703 3254 MS ( )717 3254 MS (d)726 3254 MS (o)742 3254 MS (c)759 3254 MS (u)773 3254 MS (m)791 3254 MS (e)817 3254 MS (n)831 3254 MS (t)847 3254 MS ( )857 3254 MS (s)866 3254 MS (o)878 3254 MS (n)895 3254 MS (t)911 3254 MS +( )921 3254 MS (r)929 3254 MS (\351)941 3254 MS (s)956 3254 MS (e)968 3254 MS (r)982 3254 MS (v)994 3254 MS (\351)1011 3254 MS (e)1026 3254 MS (s)1041 3254 MS ( )1053 3254 MS (a)1061 3254 MS (u)1076 3254 MS (x)1093 3254 MS ( )1109 3254 MS (d)1118 3254 MS +(e)1135 3254 MS (s)1150 3254 MS (t)1162 3254 MS (i)1171 3254 MS (n)1181 3254 MS (a)1197 3254 MS (t)1212 3254 MS (a)1221 3254 MS (i)1236 3254 MS (r)1245 3254 MS (e)1257 3254 MS (s)1272 3254 MS ( )1284 3254 MS (n)1293 3254 MS (o)1309 3254 MS (m)1326 3254 MS +(m)1352 3254 MS (\351)1378 3254 MS (m)1393 3254 MS (e)1419 3254 MS (n)1433 3254 MS (t)1450 3254 MS ( )1459 3254 MS (d)1468 3254 MS (\351)1484 3254 MS (s)1499 3254 MS (i)1512 3254 MS (g)1521 3254 MS +(n)1538 3254 MS (\351)1555 3254 MS (s)1570 3254 MS ( )1582 3254 MS (e)1591 3254 MS (t)1605 3254 MS ( )1615 3254 MS (n)1623 3254 MS (e)1640 3254 MS ( )1654 3254 MS (p)1663 3254 MS (e)1680 3254 MS (u)1694 3254 MS (v)1711 3254 MS (e)1728 3254 MS (n)1743 3254 MS +(t)1759 3254 MS ( )1768 3254 MS (r)1776 3254 MS (e)1788 3254 MS (c)1803 3254 MS (e)1818 3254 MS (v)1832 3254 MS (o)1849 3254 MS (i)1865 3254 MS (r)1874 3254 MS ( )1886 3254 MS (a)1894 3254 MS (u)1909 3254 MS (c)1926 3254 MS (u)1940 3254 MS (n)1957 3254 MS +(e)1974 3254 MS ( )1988 3254 MS (d)1997 3254 MS (i)2013 3254 MS (f)2023 3254 MS (f)2034 3254 MS (u)2044 3254 MS (s)2062 3254 MS (i)2074 3254 MS (o)2084 3254 MS (n)2101 3254 MS +( )2117 3254 MS +(s)928 3292 MS (a)940 3292 MS (n)955 3292 MS (s)972 3292 MS ( )985 3292 MS (l)993 3292 MS (\222)1002 3292 MS (a)1013 3292 MS (u)1028 3292 MS (t)1045 3292 MS (o)1054 3292 MS (r)1071 3292 MS (i)1082 3292 MS (s)1092 3292 MS (a)1104 3292 MS (t)1119 3292 MS +(i)1128 3292 MS (o)1138 3292 MS (n)1154 3292 MS ( )1171 3292 MS (e)1180 3292 MS (x)1194 3292 MS (p)1211 3292 MS (r)1227 3292 MS (e)1239 3292 MS (s)1254 3292 MS (s)1267 3292 MS (e)1280 3292 MS ( )1294 3292 MS (d)1303 3292 MS (u)1319 3292 MS ( )1336 3292 MS +(D)1344 3292 MS (M)1368 3292 MS (2)1397 3292 MS (S)1414 3292 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3292 MS +[75 0 0 -75 0 0]/Times-Bold MF +(R)887 588 MS (A)941 588 MS (P)995 588 MS (P)1041 588 MS (O)1087 588 MS (R)1145 588 MS (T)1199 588 MS ( )1249 588 MS (D)1268 588 MS (M)1322 588 MS (2)1394 588 MS (S)1431 588 MS +[75 0 0 -75 0 0]/Times-Roman MF +( )1473 588 MS +n +5 5 158 487 B +f +n +5 5 158 487 B +f +n +2031 5 164 487 B +f +n +5 5 2196 487 B +f +n +5 5 2196 487 B +f +n +5 122 158 493 B +f +n +5 122 2196 493 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(R)176 661 MS (E)209 661 MS (F)240 661 MS (E)267 661 MS (R)298 661 MS (E)331 661 MS (N)362 661 MS (C)398 661 MS (E)431 661 MS (S)462 661 MS +( )490 661 MS +(:)618 661 MS +( )632 661 MS +(S)688 661 MS (F)716 661 MS (M)743 661 MS (E)787 661 MS (/)818 661 MS (L)832 661 MS (G)862 661 MS (L)899 661 MS (S)929 661 MS (/)957 661 MS (R)971 661 MS (T)1004 661 MS (/)1035 661 MS (0)1049 661 MS (2)1074 661 MS +(-)1099 661 MS +(0)1116 661 MS (0)1141 661 MS (2)1166 661 MS (/)1191 661 MS +(A)1205 661 MS +( )1240 661 MS +n +5 192 158 616 B +f +n +5 192 2196 616 B +f +[50 0 0 -50 0 0]/Times-Bold MF +(T)176 854 MS (I)209 854 MS (T)228 854 MS (R)261 854 MS (E)298 854 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )332 854 MS +(:)546 854 MS +( )560 854 MS +[50 0 0 -50 0 0]/Times-Bold MF +LATENC /_Times-Bold /Times-Bold reencode +[50 0 0 -50 0 0]/_Times-Bold MF +(I)688 855 MS (n)707 855 MS (t)735 855 MS (r)752 855 MS (o)773 855 MS (d)798 855 MS (u)826 855 MS (c)854 855 MS (t)876 855 MS (i)893 855 MS (o)907 855 MS (n)932 855 MS ( )960 855 MS (d)973 855 MS (u)1001 855 MS ( )1029 855 MS +(p)1042 855 MS (a)1070 855 MS (r)1095 855 MS (a)1116 855 MS (l)1141 855 MS (l)1155 855 MS (\351)1168 855 MS (l)1191 855 MS (i)1204 855 MS (s)1218 855 MS (m)1238 855 MS (e)1279 855 MS ( )1301 855 MS (d)1314 855 MS (a)1342 855 MS (n)1367 855 MS +(s)1395 855 MS ( )1414 855 MS (l)1427 855 MS (\222)1440 855 MS (a)1457 855 MS (r)1483 855 MS (c)1504 855 MS (h)1526 855 MS (i)1554 855 MS (t)1568 855 MS (e)1585 855 MS (c)1607 855 MS (t)1629 855 MS (u)1646 855 MS (r)1674 855 MS (e)1696 855 MS +( )1718 855 MS +(l)1731 855 MS (o)1744 855 MS (g)1769 855 MS (i)1794 855 MS (c)1808 855 MS (i)1830 855 MS (e)1844 855 MS (l)1867 855 MS (l)1881 855 MS (e)1894 855 MS ( )1916 855 MS (d)1929 855 MS (u)1957 855 MS ( )1985 855 MS (p)1998 855 MS (r)2026 855 MS +(o)2047 855 MS (j)2072 855 MS (e)2089 855 MS (t)2111 855 MS ( )2128 855 MS +(P)688 912 MS (A)718 912 MS (L)754 912 MS (/)787 912 MS (S)801 912 MS (A)829 912 MS (L)865 912 MS (O)898 912 MS (M)937 912 MS (E)985 912 MS +( )1018 912 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )688 969 MS +n +5 182 158 809 B +f +n +5 182 2196 809 B +f +[50 0 0 -50 0 0]/_Times-Bold MF +(A)176 1057 MS (U)212 1057 MS (T)248 1057 MS (E)281 1057 MS (U)314 1057 MS (R)350 1057 MS (S)386 1057 MS +( )414 1057 MS +(S)688 1057 MS (I)716 1057 MS (G)735 1057 MS (N)774 1057 MS (A)810 1057 MS (T)846 1057 MS (U)879 1057 MS (R)915 1057 MS (E)951 1057 MS (S)984 1057 MS +( )1012 1057 MS +(A)1165 1057 MS (U)1201 1057 MS (T)1237 1057 MS (E)1270 1057 MS (U)1303 1057 MS (R)1339 1057 MS (S)1375 1057 MS +( )1403 1057 MS +(S)1689 1057 MS (I)1717 1057 MS (G)1736 1057 MS (N)1775 1057 MS (A)1811 1057 MS (T)1847 1057 MS (U)1880 1057 MS (R)1916 1057 MS (E)1952 1057 MS (S)1985 1057 MS +( )2013 1057 MS +n +5 5 158 992 B +f +n +507 5 164 992 B +f +n +5 5 672 992 B +f +n +470 5 678 992 B +f +n +5 5 1149 992 B +f +n +517 5 1155 992 B +f +n +5 5 1673 992 B +f +n +516 5 1679 992 B +f +n +5 5 2196 992 B +f +n +5 78 158 998 B +f +n +2 78 672 998 B +f +n +2 78 1149 998 B +f +n +2 78 1673 998 B +f +n +5 78 2196 998 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(B)176 1133 MS (e)209 1133 MS (r)231 1133 MS (n)248 1133 MS (a)272 1133 MS (r)294 1133 MS (d)311 1133 MS ( )336 1133 MS (S)349 1133 MS (E)377 1133 MS (C)408 1133 MS (H)441 1133 MS (E)477 1133 MS (R)508 1133 MS +( )541 1133 MS +( )176 1199 MS +( )176 1264 MS +( )688 1133 MS +( )1165 1133 MS +( )1178 1133 MS +( )1689 1133 MS +n +5 2 158 1077 B +f +n +507 2 164 1077 B +f +n +2 2 672 1077 B +f +n +473 2 675 1077 B +f +n +2 2 1149 1077 B +f +n +520 2 1152 1077 B +f +n +2 2 1673 1077 B +f +n +519 2 1676 1077 B +f +n +5 2 2196 1077 B +f +n +5 200 158 1080 B +f +n +2 200 672 1080 B +f +n +2 200 1149 1080 B +f +n +2 200 1673 1080 B +f +n +5 200 2196 1080 B +f +[50 0 0 -50 0 0]/_Times-Bold MF +(R)176 1345 MS (E)212 1345 MS (S)245 1345 MS (U)273 1345 MS (M)309 1345 MS (E)357 1345 MS ( )390 1345 MS (:)403 1345 MS ( )420 1345 MS +( )433 1345 MS +[50 0 0 -50 0 0]/Times-Roman MF +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(C)176 1402 MS (e)209 1402 MS ( )231 1402 MS (r)247 1402 MS (a)264 1402 MS (p)286 1402 MS (p)311 1402 MS (o)336 1402 MS (r)362 1402 MS (t)378 1402 MS ( )393 1402 MS (a)409 1402 MS ( )431 1402 MS (p)447 1402 MS (o)472 1402 MS (u)498 1402 MS +(r)522 1402 MS ( )539 1402 MS (o)555 1402 MS (b)581 1402 MS (j)605 1402 MS (e)618 1402 MS (t)640 1402 MS ( )655 1402 MS (d)671 1402 MS (e)696 1402 MS ( )718 1402 MS (p)734 1402 MS (r)759 1402 MS (\351)776 1402 MS (s)798 1402 MS (e)817 1402 MS +(n)840 1402 MS (t)864 1402 MS (e)879 1402 MS (r)901 1402 MS ( )918 1402 MS (l)934 1402 MS (e)947 1402 MS (s)969 1402 MS ( )988 1402 MS (p)1004 1402 MS (r)1029 1402 MS (e)1046 1402 MS (m)1069 1402 MS (i)1108 1402 MS (e)1121 1402 MS (r)1143 1402 MS +(s)1160 1402 MS ( )1179 1402 MS (r)1196 1402 MS (\351)1213 1402 MS (s)1235 1402 MS (u)1254 1402 MS (l)1280 1402 MS (t)1292 1402 MS (a)1307 1402 MS (t)1329 1402 MS (s)1344 1402 MS ( )1363 1402 MS (c)1379 1402 MS (o)1401 1402 MS (n)1427 1402 MS (c)1451 1402 MS +(e)1473 1402 MS (r)1495 1402 MS (n)1512 1402 MS +gs +n +661 57 1536 1357 CB +(a)1536 1402 MS (n)1559 1402 MS (t)1583 1402 MS ( )1598 1402 MS (l)1615 1402 MS (a)1627 1402 MS ( )1650 1402 MS (p)1666 1402 MS (r)1691 1402 MS (i)1709 1402 MS (s)1722 1402 MS (e)1741 1402 MS ( )1763 1402 MS (e)1779 1402 MS (n)1802 1402 MS ( )1826 1402 MS +(c)1843 1402 MS (o)1865 1402 MS (m)1891 1402 MS (p)1928 1402 MS (t)1953 1402 MS (e)1968 1402 MS ( )1990 1402 MS (d)2006 1402 MS (e)2031 1402 MS ( )2053 1402 MS (c)2069 1402 MS (o)2091 1402 MS (d)2117 1402 MS (e)2142 1402 MS (s)2165 1402 MS ( )2185 1402 MS +gr +(p)176 1460 MS (a)201 1460 MS (r)223 1460 MS (a)240 1460 MS (l)263 1460 MS (l)276 1460 MS (\350)289 1460 MS (l)312 1460 MS (e)325 1460 MS (s)348 1460 MS ( )367 1460 MS (d)380 1460 MS (a)405 1460 MS (n)427 1460 MS (s)452 1460 MS ( )471 1460 MS +(l)485 1460 MS (\222)498 1460 MS (a)514 1460 MS (r)536 1460 MS (c)553 1460 MS (h)576 1460 MS (i)601 1460 MS (t)613 1460 MS (e)628 1460 MS (c)650 1460 MS (t)672 1460 MS (u)687 1460 MS (r)712 1460 MS (e)729 1460 MS ( )751 1460 MS (d)764 1460 MS +(e)789 1460 MS ( )811 1460 MS (l)824 1460 MS (a)836 1460 MS ( )858 1460 MS (p)871 1460 MS (l)897 1460 MS (a)909 1460 MS (t)931 1460 MS (e)946 1460 MS +(-)968 1460 MS +(f)986 1460 MS (o)1001 1460 MS (r)1027 1460 MS (m)1044 1460 MS (e)1082 1460 MS ( )1104 1460 MS (S)1117 1460 MS (A)1145 1460 MS (L)1181 1460 MS (O)1211 1460 MS (M)1247 1460 MS (E)1291 1460 MS (.)1322 1460 MS ( )1335 1460 MS +( )1348 1460 MS +gs +n +2021 57 176 1472 CB +(L)176 1517 MS (\222)206 1517 MS (\351)222 1517 MS (t)244 1517 MS (a)259 1517 MS (t)281 1517 MS ( )296 1517 MS (d)318 1517 MS (e)343 1517 MS ( )365 1517 MS (l)388 1517 MS (\222)400 1517 MS (a)417 1517 MS (r)439 1517 MS (t)456 1517 MS ( )471 1517 MS +(d)493 1517 MS (e)518 1517 MS ( )540 1517 MS (c)562 1517 MS (e)584 1517 MS ( )606 1517 MS (q)628 1517 MS (u)653 1517 MS (i)679 1517 MS ( )691 1517 MS (s)714 1517 MS (e)733 1517 MS ( )755 1517 MS (f)778 1517 MS (a)794 1517 MS (i)817 1517 MS +(t)829 1517 MS ( )844 1517 MS (d)866 1517 MS (a)891 1517 MS (n)914 1517 MS (s)939 1517 MS ( )958 1517 MS (l)981 1517 MS (e)994 1517 MS ( )1016 1517 MS (d)1038 1517 MS (o)1063 1517 MS (m)1090 1517 MS (a)1127 1517 MS (i)1150 1517 MS (n)1163 1517 MS +(e)1189 1517 MS ( )1211 1517 MS (e)1233 1517 MS (s)1255 1517 MS (t)1274 1517 MS ( )1289 1517 MS (p)1311 1517 MS (r)1336 1517 MS (\351)1353 1517 MS (s)1375 1517 MS (e)1394 1517 MS (n)1417 1517 MS (t)1441 1517 MS (\351)1456 1517 MS (.)1478 1517 MS ( )1491 1517 MS +(O)1513 1517 MS (n)1549 1517 MS ( )1573 1517 MS (i)1596 1517 MS (n)1609 1517 MS (t)1633 1517 MS (r)1648 1517 MS (o)1665 1517 MS (d)1691 1517 MS (u)1716 1517 MS (i)1741 1517 MS (t)1753 1517 MS ( )1768 1517 MS (e)1790 1517 MS (n)1812 1517 MS (s)1837 1517 MS +(u)1856 1517 MS (i)1882 1517 MS (t)1894 1517 MS (e)1909 1517 MS ( )1931 1517 MS (l)1954 1517 MS (a)1967 1517 MS ( )1989 1517 MS (m)2012 1517 MS (\351)2050 1517 MS (t)2072 1517 MS (h)2087 1517 MS (o)2111 1517 MS (d)2137 1517 MS (e)2162 1517 MS ( )2185 1517 MS +gr +(p)176 1575 MS (r)201 1575 MS (o)218 1575 MS (p)244 1575 MS (o)268 1575 MS (s)294 1575 MS (\351)313 1575 MS (e)335 1575 MS ( )357 1575 MS (d)386 1575 MS (a)411 1575 MS (n)433 1575 MS (s)457 1575 MS ( )477 1575 MS (c)506 1575 MS (e)528 1575 MS +(t)550 1575 MS (t)565 1575 MS (e)580 1575 MS ( )602 1575 MS (\351)631 1575 MS (t)652 1575 MS (u)667 1575 MS (d)692 1575 MS (e)717 1575 MS (.)739 1575 MS ( )752 1575 MS (L)781 1575 MS (e)811 1575 MS (s)833 1575 MS ( )852 1575 MS (p)881 1575 MS +(r)906 1575 MS (i)924 1575 MS (n)937 1575 MS (c)962 1575 MS (i)985 1575 MS (p)998 1575 MS (a)1023 1575 MS (u)1045 1575 MS (x)1071 1575 MS ( )1095 1575 MS (c)1124 1575 MS (o)1146 1575 MS (n)1172 1575 MS (c)1197 1575 MS (e)1219 1575 MS (p)1241 1575 MS +(t)1266 1575 MS (s)1281 1575 MS ( )1300 1575 MS (s)1329 1575 MS (o)1348 1575 MS (n)1374 1575 MS (t)1398 1575 MS ( )1413 1575 MS (d)1442 1575 MS (\351)1467 1575 MS (f)1490 1575 MS (i)1506 1575 MS (n)1519 1575 MS (i)1544 1575 MS (s)1557 1575 MS (,)1576 1575 MS +( )1590 1575 MS (p)1619 1575 MS (u)1644 1575 MS (i)1670 1575 MS (s)1683 1575 MS ( )1702 1575 MS +gs +n +465 57 1732 1530 CB +(i)1732 1575 MS (l)1746 1575 MS (l)1760 1575 MS (u)1773 1575 MS (s)1798 1575 MS (t)1817 1575 MS (r)1832 1575 MS (\351)1849 1575 MS (s)1871 1575 MS ( )1890 1575 MS (d)1919 1575 MS (a)1944 1575 MS (n)1967 1575 MS (s)1991 1575 MS ( )2011 1575 MS (u)2040 1575 MS +(n)2066 1575 MS ( )2090 1575 MS (c)2119 1575 MS (a)2141 1575 MS (s)2165 1575 MS ( )2185 1575 MS +gr +gs +n +2021 57 176 1587 CB +(d)176 1632 MS (\222)201 1632 MS (u)217 1632 MS (t)242 1632 MS (i)257 1632 MS (l)270 1632 MS (i)284 1632 MS (s)297 1632 MS (a)317 1632 MS (t)339 1632 MS (i)355 1632 MS (o)367 1632 MS (n)393 1632 MS ( )417 1632 MS (b)441 1632 MS (a)465 1632 MS +(s)487 1632 MS (\351)506 1632 MS ( )528 1632 MS (s)552 1632 MS (u)571 1632 MS (r)596 1632 MS ( )613 1632 MS (l)637 1632 MS (a)649 1632 MS ( )671 1632 MS (r)694 1632 MS (\351)711 1632 MS (s)734 1632 MS (o)753 1632 MS (l)779 1632 MS (u)791 1632 MS +(t)816 1632 MS (i)832 1632 MS (o)844 1632 MS (n)870 1632 MS ( )894 1632 MS (d)917 1632 MS (\222)943 1632 MS (u)959 1632 MS (n)985 1632 MS ( )1009 1632 MS (s)1032 1632 MS (y)1052 1632 MS (s)1076 1632 MS (t)1095 1632 MS (\350)1110 1632 MS (m)1133 1632 MS +(e)1171 1632 MS ( )1194 1632 MS (l)1218 1632 MS (i)1231 1632 MS (n)1244 1632 MS (\351)1269 1632 MS (a)1291 1632 MS (i)1314 1632 MS (r)1327 1632 MS (e)1344 1632 MS ( )1366 1632 MS (\340)1389 1632 MS ( )1411 1632 MS (l)1435 1632 MS (\222)1448 1632 MS (a)1465 1632 MS +(i)1488 1632 MS (d)1500 1632 MS (e)1526 1632 MS ( )1548 1632 MS (d)1571 1632 MS (e)1596 1632 MS ( )1618 1632 MS (l)1642 1632 MS (a)1655 1632 MS ( )1677 1632 MS (b)1701 1632 MS (i)1726 1632 MS (b)1739 1632 MS (l)1764 1632 MS (i)1778 1632 MS (o)1790 1632 MS +(t)1816 1632 MS (h)1831 1632 MS (\350)1855 1632 MS (q)1877 1632 MS (u)1902 1632 MS (e)1928 1632 MS ( )1950 1632 MS (N)1973 1632 MS (u)2009 1632 MS (m)2035 1632 MS (e)2073 1632 MS (r)2095 1632 MS (i)2113 1632 MS (c)2125 1632 MS (a)2148 1632 MS (l)2172 1632 MS +( )2185 1632 MS +gr +(P)176 1690 MS (l)205 1690 MS (a)217 1690 MS (t)239 1690 MS (o)254 1690 MS (n)280 1690 MS (.)304 1690 MS +( )317 1690 MS +gs +n +2021 57 176 1702 CB +(L)176 1747 MS (a)206 1747 MS ( )228 1747 MS (m)244 1747 MS (\351)282 1747 MS (t)304 1747 MS (h)319 1747 MS (o)343 1747 MS (d)369 1747 MS (e)394 1747 MS ( )416 1747 MS (i)432 1747 MS (d)444 1747 MS (\351)469 1747 MS (a)492 1747 MS (l)515 1747 MS +(e)528 1747 MS ( )550 1747 MS (p)565 1747 MS (o)590 1747 MS (u)616 1747 MS (r)641 1747 MS ( )658 1747 MS (c)673 1747 MS (o)695 1747 MS (u)721 1747 MS (p)746 1747 MS (l)771 1747 MS (e)783 1747 MS (r)805 1747 MS ( )822 1747 MS (d)837 1747 MS +(e)862 1747 MS (s)885 1747 MS ( )904 1747 MS (c)919 1747 MS (o)941 1747 MS (d)967 1747 MS (e)992 1747 MS (s)1014 1747 MS ( )1033 1747 MS (p)1048 1747 MS (a)1073 1747 MS (r)1095 1747 MS (a)1112 1747 MS (l)1135 1747 MS (l)1149 1747 MS (\350)1162 1747 MS +(l)1185 1747 MS (e)1199 1747 MS (s)1221 1747 MS ( )1240 1747 MS (d)1255 1747 MS (a)1280 1747 MS (n)1303 1747 MS (s)1328 1747 MS ( )1347 1747 MS (u)1362 1747 MS (n)1388 1747 MS ( )1412 1747 MS (e)1427 1747 MS (n)1450 1747 MS (v)1475 1747 MS (i)1500 1747 MS +(r)1513 1747 MS (o)1530 1747 MS (n)1556 1747 MS (n)1581 1747 MS (e)1605 1747 MS (m)1628 1747 MS (e)1666 1747 MS (n)1689 1747 MS (t)1713 1747 MS ( )1728 1747 MS (\340)1743 1747 MS ( )1765 1747 MS (a)1780 1747 MS (r)1802 1747 MS (c)1819 1747 MS (h)1842 1747 MS +(i)1867 1747 MS (t)1879 1747 MS (e)1894 1747 MS (c)1916 1747 MS (t)1938 1747 MS (u)1953 1747 MS (r)1978 1747 MS (e)1995 1747 MS ( )2017 1747 MS (r)2032 1747 MS (\351)2049 1747 MS (p)2071 1747 MS (a)2096 1747 MS (r)2118 1747 MS (t)2134 1747 MS (i)2149 1747 MS +(e)2162 1747 MS ( )2185 1747 MS +gr +(c)176 1805 MS (o)198 1805 MS (n)224 1805 MS (s)248 1805 MS (i)268 1805 MS (s)281 1805 MS (t)300 1805 MS (e)315 1805 MS (r)337 1805 MS (a)354 1805 MS ( )376 1805 MS (\340)389 1805 MS ( )411 1805 MS (u)424 1805 MS (t)448 1805 MS (i)463 1805 MS +(l)476 1805 MS (i)490 1805 MS (s)503 1805 MS (e)522 1805 MS (r)544 1805 MS ( )561 1805 MS (u)574 1805 MS (n)599 1805 MS ( )623 1805 MS (O)636 1805 MS (R)672 1805 MS (B)706 1805 MS ( )739 1805 MS (p)752 1805 MS (a)777 1805 MS +(r)799 1805 MS (a)816 1805 MS (l)839 1805 MS (l)852 1805 MS (\350)865 1805 MS (l)888 1805 MS (e)901 1805 MS ( )923 1805 MS (l)937 1805 MS (o)949 1805 MS (r)975 1805 MS (s)992 1805 MS (q)1011 1805 MS (u)1036 1805 MS (\222)1061 1805 MS (i)1078 1805 MS +(l)1092 1805 MS ( )1105 1805 MS (s)1118 1805 MS (e)1137 1805 MS (r)1159 1805 MS (a)1176 1805 MS ( )1199 1805 MS (d)1212 1805 MS (i)1237 1805 MS (s)1250 1805 MS (p)1269 1805 MS (o)1294 1805 MS (n)1320 1805 MS (i)1345 1805 MS (b)1358 1805 MS (l)1384 1805 MS +(e)1397 1805 MS (.)1419 1805 MS ( )1432 1805 MS +( )1445 1805 MS +gs +n +2021 57 176 1817 CB +(U)176 1862 MS (n)212 1862 MS (e)236 1862 MS ( )258 1862 MS (a)274 1862 MS (p)296 1862 MS (p)321 1862 MS (r)346 1862 MS (o)363 1862 MS (c)389 1862 MS (h)411 1862 MS (e)435 1862 MS ( )457 1862 MS (s)473 1862 MS (i)493 1862 MS (m)507 1862 MS +(p)545 1862 MS (l)571 1862 MS (e)584 1862 MS ( )606 1862 MS (c)622 1862 MS (o)644 1862 MS (n)670 1862 MS (s)695 1862 MS (i)715 1862 MS (s)728 1862 MS (t)747 1862 MS (e)762 1862 MS (r)784 1862 MS (a)801 1862 MS (i)824 1862 MS (t)836 1862 MS +( )851 1862 MS (\340)867 1862 MS ( )889 1862 MS (d)905 1862 MS (\351)930 1862 MS (l)952 1862 MS (\351)964 1862 MS (g)986 1862 MS (u)1011 1862 MS (e)1037 1862 MS (r)1059 1862 MS ( )1076 1862 MS (a)1092 1862 MS (u)1114 1862 MS ( )1139 1862 MS (p)1155 1862 MS +(r)1180 1862 MS (o)1197 1862 MS (c)1223 1862 MS (e)1245 1862 MS (s)1267 1862 MS (s)1286 1862 MS (u)1305 1862 MS (s)1330 1862 MS ( )1349 1862 MS (m)1366 1862 MS (a)1404 1862 MS (\356)1427 1862 MS (t)1439 1862 MS (r)1454 1862 MS (e)1471 1862 MS ( )1493 1862 MS +(l)1510 1862 MS (\222)1522 1862 MS (\351)1539 1862 MS (c)1561 1862 MS (h)1584 1862 MS (a)1608 1862 MS (n)1631 1862 MS (g)1655 1862 MS (e)1680 1862 MS ( )1702 1862 MS (d)1718 1862 MS (e)1743 1862 MS (s)1765 1862 MS ( )1784 1862 MS (d)1800 1862 MS (o)1825 1862 MS +(n)1851 1862 MS (n)1876 1862 MS (\351)1900 1862 MS (e)1923 1862 MS (s)1945 1862 MS ( )1964 1862 MS (p)1980 1862 MS (a)2005 1862 MS (r)2027 1862 MS (a)2044 1862 MS (l)2067 1862 MS (l)2080 1862 MS (\350)2093 1862 MS (l)2117 1862 MS (e)2130 1862 MS (s)2152 1862 MS +(.)2171 1862 MS ( )2185 1862 MS +gr +gs +n +2021 57 176 1875 CB +(L)176 1920 MS (\222)206 1920 MS (i)223 1920 MS (n)236 1920 MS (t)260 1920 MS (\351)275 1920 MS (g)297 1920 MS (r)322 1920 MS (a)339 1920 MS (t)361 1920 MS (i)377 1920 MS (o)389 1920 MS (n)415 1920 MS ( )439 1920 MS (d)454 1920 MS (\222)480 1920 MS +(u)496 1920 MS (n)521 1920 MS ( )546 1920 MS (c)561 1920 MS (o)583 1920 MS (m)610 1920 MS (p)647 1920 MS (o)672 1920 MS (s)698 1920 MS (a)717 1920 MS (n)739 1920 MS (t)763 1920 MS ( )778 1920 MS (p)793 1920 MS (a)818 1920 MS (r)840 1920 MS +(a)857 1920 MS (l)880 1920 MS (l)893 1920 MS (\350)906 1920 MS (l)929 1920 MS (e)942 1920 MS ( )964 1920 MS (d)979 1920 MS (a)1005 1920 MS (n)1028 1920 MS (s)1052 1920 MS ( )1071 1920 MS (l)1087 1920 MS (\222)1100 1920 MS (e)1117 1920 MS (n)1140 1920 MS +(v)1165 1920 MS (i)1190 1920 MS (r)1203 1920 MS (o)1220 1920 MS (n)1246 1920 MS (n)1271 1920 MS (e)1295 1920 MS (m)1318 1920 MS (e)1356 1920 MS (n)1379 1920 MS (t)1403 1920 MS ( )1418 1920 MS (S)1433 1920 MS (A)1461 1920 MS (L)1496 1920 MS (O)1526 1920 MS +(M)1563 1920 MS (E)1607 1920 MS ( )1638 1920 MS (s)1653 1920 MS (e)1672 1920 MS (r)1694 1920 MS (a)1711 1920 MS (i)1734 1920 MS (t)1746 1920 MS ( )1761 1920 MS (a)1776 1920 MS (i)1799 1920 MS (s)1812 1920 MS (\351)1832 1920 MS (.)1854 1920 MS ( )1867 1920 MS +(P)1882 1920 MS (a)1910 1920 MS (r)1932 1920 MS ( )1949 1920 MS (c)1964 1920 MS (o)1986 1920 MS (n)2012 1920 MS (t)2036 1920 MS (r)2051 1920 MS (e)2068 1920 MS (,)2089 1920 MS ( )2102 1920 MS (i)2117 1920 MS (l)2130 1920 MS ( )2143 1920 MS (y)2160 1920 MS +( )2185 1920 MS +gr +(a)176 1977 MS (u)198 1977 MS (r)223 1977 MS (a)240 1977 MS (i)263 1977 MS (t)275 1977 MS ( )290 1977 MS (u)303 1977 MS (n)328 1977 MS ( )352 1977 MS (p)365 1977 MS (r)390 1977 MS (o)406 1977 MS (b)432 1977 MS (l)457 1977 MS (\350)470 1977 MS +(m)493 1977 MS (e)531 1977 MS ( )553 1977 MS (d)566 1977 MS (e)591 1977 MS ( )613 1977 MS (p)626 1977 MS (e)651 1977 MS (r)673 1977 MS +(f)690 1977 MS (o)705 1977 MS (r)731 1977 MS (m)749 1977 MS (a)786 1977 MS (n)809 1977 MS (c)833 1977 MS (e)855 1977 MS ( )877 1977 MS (n)891 1977 MS (o)915 1977 MS (n)941 1977 MS ( )965 1977 MS (n)978 1977 MS (\351)1003 1977 MS (g)1025 1977 MS +(l)1051 1977 MS (i)1064 1977 MS (g)1077 1977 MS (e)1102 1977 MS (a)1125 1977 MS (b)1148 1977 MS (l)1173 1977 MS (e)1187 1977 MS ( )1209 1977 MS (d)1222 1977 MS (a)1247 1977 MS (n)1269 1977 MS (s)1293 1977 MS ( )1312 1977 MS (l)1326 1977 MS (\222)1339 1977 MS +(\351)1356 1977 MS (c)1378 1977 MS (h)1401 1977 MS (a)1425 1977 MS (n)1448 1977 MS (g)1472 1977 MS (e)1497 1977 MS ( )1519 1977 MS (d)1532 1977 MS (e)1557 1977 MS ( )1579 1977 MS (d)1592 1977 MS (o)1617 1977 MS (n)1643 1977 MS (n)1667 1977 MS (\351)1691 1977 MS +(e)1714 1977 MS (s)1736 1977 MS ( )1755 1977 MS (d)1768 1977 MS (i)1794 1977 MS (s)1807 1977 MS (t)1826 1977 MS (r)1841 1977 MS (i)1858 1977 MS (b)1871 1977 MS (u)1895 1977 MS (\351)1921 1977 MS (e)1943 1977 MS (s)1965 1977 MS (.)1984 1977 MS +( )1997 1977 MS +gs +n +2021 57 176 1990 CB +(L)176 2035 MS (a)206 2035 MS ( )228 2035 MS (m)258 2035 MS (\351)296 2035 MS (t)318 2035 MS (h)333 2035 MS (o)357 2035 MS (d)383 2035 MS (e)408 2035 MS ( )430 2035 MS (p)459 2035 MS (r)484 2035 MS (o)501 2035 MS (p)527 2035 MS (o)551 2035 MS +(s)577 2035 MS (\351)596 2035 MS (e)618 2035 MS ( )640 2035 MS (d)669 2035 MS (a)694 2035 MS (n)716 2035 MS (s)741 2035 MS ( )760 2035 MS (c)789 2035 MS (e)811 2035 MS ( )834 2035 MS (d)863 2035 MS (o)888 2035 MS (c)914 2035 MS (u)936 2035 MS +(m)962 2035 MS (e)999 2035 MS (n)1022 2035 MS (t)1046 2035 MS ( )1061 2035 MS (p)1090 2035 MS (e)1115 2035 MS (r)1137 2035 MS (m)1155 2035 MS (e)1193 2035 MS (t)1215 2035 MS ( )1230 2035 MS (d)1259 2035 MS (e)1284 2035 MS ( )1306 2035 MS (c)1335 2035 MS +(o)1357 2035 MS (n)1383 2035 MS (s)1407 2035 MS (e)1426 2035 MS (r)1448 2035 MS (v)1465 2035 MS (e)1489 2035 MS (r)1511 2035 MS ( )1528 2035 MS (u)1557 2035 MS (n)1583 2035 MS (e)1607 2035 MS ( )1630 2035 MS (b)1660 2035 MS (o)1684 2035 MS (n)1710 2035 MS +(n)1735 2035 MS (e)1759 2035 MS ( )1781 2035 MS (p)1810 2035 MS (e)1835 2035 MS (r)1857 2035 MS (f)1875 2035 MS (o)1890 2035 MS (r)1916 2035 MS (m)1934 2035 MS (a)1971 2035 MS (n)1994 2035 MS (c)2019 2035 MS (e)2041 2035 MS ( )2063 2035 MS (d)2092 2035 MS +(a)2117 2035 MS (n)2140 2035 MS (s)2165 2035 MS ( )2185 2035 MS +gr +gs +n +2021 57 176 2047 CB +(l)176 2092 MS (\222)189 2092 MS (\351)206 2092 MS (c)228 2092 MS (h)251 2092 MS (a)275 2092 MS (n)298 2092 MS (g)322 2092 MS (e)347 2092 MS ( )369 2092 MS (d)385 2092 MS (e)410 2092 MS (s)433 2092 MS ( )452 2092 MS (d)468 2092 MS (o)493 2092 MS +(n)519 2092 MS (n)544 2092 MS (\351)568 2092 MS (e)590 2092 MS (s)613 2092 MS (,)632 2092 MS ( )645 2092 MS (m)662 2092 MS (a)699 2092 MS (i)722 2092 MS (s)735 2092 MS ( )754 2092 MS (u)770 2092 MS (n)796 2092 MS (e)821 2092 MS ( )843 2092 MS +(p)859 2092 MS (a)884 2092 MS (r)906 2092 MS (t)923 2092 MS ( )938 2092 MS (i)954 2092 MS (m)967 2092 MS (p)1005 2092 MS (o)1030 2092 MS (r)1056 2092 MS (t)1073 2092 MS (a)1088 2092 MS (n)1110 2092 MS (t)1134 2092 MS (e)1149 2092 MS ( )1171 2092 MS +(d)1186 2092 MS (e)1211 2092 MS ( )1233 2092 MS (l)1250 2092 MS (a)1262 2092 MS ( )1284 2092 MS (g)1300 2092 MS (e)1325 2092 MS (s)1348 2092 MS (t)1367 2092 MS (i)1383 2092 MS (o)1395 2092 MS (n)1421 2092 MS ( )1445 2092 MS (d)1461 2092 MS (u)1486 2092 MS +( )1511 2092 MS (p)1527 2092 MS (a)1552 2092 MS (r)1574 2092 MS (a)1591 2092 MS (l)1614 2092 MS (l)1627 2092 MS (\351)1640 2092 MS (l)1663 2092 MS (i)1677 2092 MS (s)1690 2092 MS (m)1711 2092 MS (e)1749 2092 MS ( )1771 2092 MS (r)1787 2092 MS (e)1804 2092 MS +(s)1826 2092 MS (t)1845 2092 MS (e)1860 2092 MS ( )1882 2092 MS (\340)1898 2092 MS ( )1920 2092 MS (l)1937 2092 MS (a)1949 2092 MS ( )1971 2092 MS (c)1987 2092 MS (h)2010 2092 MS (a)2035 2092 MS (r)2057 2092 MS (g)2074 2092 MS (e)2099 2092 MS ( )2121 2092 MS +(d)2137 2092 MS (e)2162 2092 MS ( )2185 2092 MS +gr +(l)176 2150 MS (\222)189 2150 MS (u)206 2150 MS (t)231 2150 MS (i)246 2150 MS (l)259 2150 MS (i)273 2150 MS (s)286 2150 MS (a)306 2150 MS +(t)328 2150 MS (e)343 2150 MS (u)365 2150 MS (r)390 2150 MS ( )407 2150 MS (q)420 2150 MS (u)445 2150 MS (i)470 2150 MS ( )482 2150 MS (d)495 2150 MS (\351)520 2150 MS (s)542 2150 MS (i)562 2150 MS (r)575 2150 MS (e)592 2150 MS ( )614 2150 MS +(i)628 2150 MS (n)641 2150 MS (t)665 2150 MS (\351)680 2150 MS (g)702 2150 MS (r)727 2150 MS (e)744 2150 MS (r)766 2150 MS ( )783 2150 MS (s)796 2150 MS (o)815 2150 MS (n)841 2150 MS ( )865 2150 MS (c)878 2150 MS (o)899 2150 MS (d)925 2150 MS +(e)950 2150 MS ( )972 2150 MS (d)985 2150 MS (a)1010 2150 MS (n)1032 2150 MS (s)1056 2150 MS ( )1075 2150 MS (l)1089 2150 MS (a)1101 2150 MS ( )1123 2150 MS (p)1136 2150 MS (l)1162 2150 MS (a)1175 2150 MS (t)1198 2150 MS (e)1213 2150 MS +(-)1235 2150 MS +(f)1252 2150 MS (o)1267 2150 MS (r)1293 2150 MS (m)1310 2150 MS (e)1347 2150 MS ( )1369 2150 MS (S)1382 2150 MS (A)1410 2150 MS (L)1446 2150 MS (O)1476 2150 MS (M)1513 2150 MS (E)1557 2150 MS (.)1588 2150 MS +( )1601 2150 MS +gs +n +2021 57 176 2162 CB +(L)176 2207 MS (a)206 2207 MS ( )228 2207 MS (p)244 2207 MS (h)269 2207 MS (a)294 2207 MS (s)316 2207 MS (e)335 2207 MS ( )357 2207 MS (s)374 2207 MS (u)393 2207 MS (i)419 2207 MS (v)432 2207 MS (a)457 2207 MS (n)480 2207 MS (t)504 2207 MS +(e)519 2207 MS ( )541 2207 MS (c)557 2207 MS (o)579 2207 MS (n)605 2207 MS (s)629 2207 MS (i)649 2207 MS (s)661 2207 MS (t)680 2207 MS (e)695 2207 MS (r)717 2207 MS (a)734 2207 MS ( )756 2207 MS (\340)772 2207 MS ( )794 2207 MS (t)810 2207 MS +(r)825 2207 MS (a)842 2207 MS (i)864 2207 MS (t)876 2207 MS (e)891 2207 MS (r)913 2207 MS ( )930 2207 MS (u)946 2207 MS (n)971 2207 MS ( )995 2207 MS (c)1011 2207 MS (a)1033 2207 MS (s)1055 2207 MS ( )1074 2207 MS (r)1090 2207 MS (\351)1107 2207 MS +(a)1129 2207 MS (l)1152 2207 MS (i)1165 2207 MS (s)1178 2207 MS (t)1199 2207 MS (e)1214 2207 MS ( )1236 2207 MS (p)1252 2207 MS (o)1276 2207 MS (u)1302 2207 MS (r)1326 2207 MS ( )1343 2207 MS (l)1359 2207 MS (a)1371 2207 MS ( )1393 2207 MS (D)1409 2207 MS +(E)1445 2207 MS (N)1476 2207 MS (,)1512 2207 MS ( )1525 2207 MS (d)1541 2207 MS (e)1566 2207 MS ( )1588 2207 MS (c)1604 2207 MS (o)1626 2207 MS (u)1652 2207 MS (p)1677 2207 MS (l)1702 2207 MS (a)1714 2207 MS (g)1736 2207 MS (e)1762 2207 MS ( )1784 2207 MS +(d)1800 2207 MS (e)1825 2207 MS ( )1847 2207 MS (c)1863 2207 MS (o)1885 2207 MS (d)1911 2207 MS (e)1936 2207 MS (s)1958 2207 MS ( )1977 2207 MS (p)1993 2207 MS (a)2018 2207 MS (r)2040 2207 MS (a)2057 2207 MS (l)2080 2207 MS (l)2093 2207 MS (\350)2106 2207 MS +(l)2129 2207 MS (e)2142 2207 MS (s)2165 2207 MS ( )2185 2207 MS +gr +(q)176 2265 MS (u)201 2265 MS (i)227 2265 MS ( )239 2265 MS (\351)252 2265 MS (c)274 2265 MS (h)297 2265 MS (a)321 2265 MS (n)344 2265 MS (g)368 2265 MS (e)393 2265 MS (r)415 2265 MS (o)432 2265 MS (n)458 2265 MS (t)482 2265 MS ( )497 2265 MS +(d)510 2265 MS (e)535 2265 MS (s)557 2265 MS ( )576 2265 MS (m)589 2265 MS (a)626 2265 MS (i)649 2265 MS (l)663 2265 MS (l)677 2265 MS (a)690 2265 MS (g)712 2265 MS (e)737 2265 MS (s)760 2265 MS ( )779 2265 MS (e)792 2265 MS (t)814 2265 MS +( )829 2265 MS (d)842 2265 MS (e)867 2265 MS (s)889 2265 MS ( )908 2265 MS (c)921 2265 MS (h)943 2265 MS (a)967 2265 MS (m)990 2265 MS (p)1027 2265 MS (s)1053 2265 MS ( )1072 2265 MS (d)1085 2265 MS (i)1111 2265 MS (s)1124 2265 MS (t)1143 2265 MS +(r)1158 2265 MS (i)1175 2265 MS (b)1188 2265 MS (u)1212 2265 MS (\351)1237 2265 MS (s)1260 2265 MS ( )1279 2265 MS (s)1292 2265 MS (u)1311 2265 MS (r)1336 2265 MS ( )1353 2265 MS (d)1366 2265 MS (i)1392 2265 MS (f)1405 2265 MS (f)1421 2265 MS (\351)1437 2265 MS +(r)1459 2265 MS (e)1476 2265 MS (n)1499 2265 MS (t)1523 2265 MS (s)1538 2265 MS ( )1557 2265 MS (p)1570 2265 MS (r)1595 2265 MS (o)1611 2265 MS (c)1637 2265 MS (e)1659 2265 MS (s)1681 2265 MS (s)1700 2265 MS (e)1719 2265 MS (u)1741 2265 MS (r)1766 2265 MS +(s)1783 2265 MS (.)1802 2265 MS +( )1815 2265 MS +n +5 5 158 1281 B +f +n +507 5 164 1281 B +f +n +5 5 672 1281 B +f +n +470 5 678 1281 B +f +n +5 5 1149 1281 B +f +n +517 5 1155 1281 B +f +n +5 5 1673 1281 B +f +n +516 5 1679 1281 B +f +n +5 5 2196 1281 B +f +n +5 5 2196 1281 B +f +n +5 1049 158 1287 B +f +[50 0 0 -50 0 0]/Times-Bold MF +(M)176 2410 MS (O)224 2410 MS (T)263 2410 MS (S)296 2410 MS ( )324 2410 MS (C)337 2410 MS (L)373 2410 MS (E)406 2410 MS (S)439 2410 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )466 2410 MS +(:)546 2410 MS ( )560 2410 MS +( )573 2410 MS +(C)688 2410 MS (o)721 2410 MS (m)747 2410 MS (p)784 2410 MS (o)809 2410 MS (s)835 2410 MS (a)854 2410 MS (n)877 2410 MS (t)901 2410 MS (,)916 2410 MS ( )929 2410 MS (P)942 2410 MS (a)970 2410 MS (r)991 2410 MS (a)1008 2410 MS (l)1030 2410 MS +(l)1043 2410 MS (\351)1056 2410 MS (l)1079 2410 MS (i)1093 2410 MS (s)1106 2410 MS (m)1127 2410 MS (e)1165 2410 MS (,)1187 2410 MS ( )1200 2410 MS ( )1213 2410 MS (C)1226 2410 MS (O)1259 2410 MS (R)1295 2410 MS (B)1328 2410 MS (A)1362 2410 MS (,)1397 2410 MS +( )1410 2410 MS +%%IncludeFont: Times-Italic +[50 0 0 -50 0 0]/Times-Italic MF +(M)1423 2410 MS (P)1465 2410 MS (I)1495 2410 MS (,)1512 2410 MS ( )1524 2410 MS (N)1537 2410 MS (u)1570 2410 MS (m)1595 2410 MS (e)1631 2410 MS (r)1653 2410 MS (i)1672 2410 MS (c)1686 2410 MS (a)1709 2410 MS (l)1734 2410 MS ( )1748 2410 MS (P)1761 2410 MS +(l)1791 2410 MS (a)1805 2410 MS (t)1830 2410 MS (o)1844 2410 MS (n)1869 2410 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )1894 2410 MS +n +5 2 158 2337 B +f +n +507 2 164 2337 B +f +n +2 2 672 2337 B +f +n +1520 2 675 2337 B +f +n +2 2 2196 2337 B +f +n +2 2 2199 2337 B +f +n +5 82 158 2340 B +f +n +5 82 2196 2340 B +f +[50 0 0 -50 0 0]/Times-Bold MF +(A)176 2468 MS (F)212 2468 MS (F)242 2468 MS (A)272 2468 MS (I)309 2468 MS (R)328 2468 MS (E)364 2468 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )398 2468 MS +(:)546 2468 MS +( )560 2468 MS +(E)688 2468 MS (O)719 2468 MS (T)755 2468 MS (P)786 2468 MS (:)814 2468 MS ( )827 2468 MS (A)840 2468 MS ( )875 2468 MS +(\226)888 2468 MS +( )913 2468 MS (C)926 2468 MS ( )959 2468 MS +(\226)972 2468 MS +( )997 2468 MS (P)1010 2468 MS (A)1038 2468 MS (R)1073 2468 MS (A)1106 2468 MS ( )1141 2468 MS +(\226)1154 2468 MS +( )1179 2468 MS (0)1192 2468 MS (1)1217 2468 MS ( )1242 2468 MS +(-)1255 2468 MS +( )1272 2468 MS (0)1285 2468 MS (2)1310 2468 MS +( )1335 2468 MS +n +5 56 158 2423 B +f +n +5 56 2196 2423 B +f +[50 0 0 -50 0 0]/Times-Bold MF +LATENC /_Times-Bold /Times-Bold reencode +[50 0 0 -50 0 0]/_Times-Bold MF +(T)176 2525 MS (i)209 2525 MS (t)223 2525 MS (r)240 2525 MS (e)261 2525 MS ( )283 2525 MS (d)296 2525 MS (e)324 2525 MS ( )346 2525 MS (l)359 2525 MS (\222)372 2525 MS (a)389 2525 MS (f)414 2525 MS (f)431 2525 MS (a)447 2525 MS (i)472 2525 MS +(r)487 2525 MS (e)508 2525 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )531 2525 MS +(:)546 2525 MS +( )560 2525 MS +( )688 2525 MS +n +5 82 158 2480 B +f +n +5 82 2196 2480 B +f +( )176 2608 MS +( )338 2608 MS +( )604 2608 MS +(V)752 2608 MS (i)789 2608 MS (s)801 2608 MS (a)821 2608 MS +( )843 2608 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )919 2597 MS +( )1353 2597 MS +( )1803 2597 MS +n +5 82 158 2563 B +f +n +2 82 322 2563 B +f +n +2 82 588 2563 B +f +n +2 82 735 2563 B +f +n +2 82 902 2563 B +f +n +2 82 1337 2563 B +f +n +2 82 1787 2563 B +f +n +5 82 2196 2563 B +f +(A)176 2683 MS +( )202 2683 MS +(3)338 2683 MS (0)357 2683 MS (/)376 2683 MS (0)387 2683 MS (5)405 2683 MS (/)424 2683 MS (2)435 2683 MS (0)453 2683 MS (0)472 2683 MS (2)491 2683 MS +( )510 2683 MS +(3)644 2683 MS (0)663 2683 MS +( )682 2683 MS +(N)752 2683 MS (o)779 2683 MS (m)797 2683 MS +( )826 2683 MS +(M)919 2683 MS (.)953 2683 MS ( )962 2683 MS (T)972 2683 MS (a)995 2683 MS (j)1011 2683 MS (c)1022 2683 MS (h)1038 2683 MS (m)1057 2683 MS (a)1086 2683 MS (n)1103 2683 MS +( )1122 2683 MS +(C)1353 2683 MS (h)1378 2683 MS (.)1397 2683 MS ( )1407 2683 MS (C)1417 2683 MS (a)1441 2683 MS (l)1458 2683 MS (v)1469 2683 MS (i)1487 2683 MS (n)1497 2683 MS +( )1516 2683 MS +(E)1803 2683 MS (.)1826 2683 MS ( )1836 2683 MS (D)1846 2683 MS (o)1873 2683 MS (r)1891 2683 MS (l)1903 2683 MS (e)1914 2683 MS (t)1930 2683 MS +( )1941 2683 MS +n +5 2 158 2646 B +f +n +2 2 322 2646 B +f +n +2 2 588 2646 B +f +n +143 2 591 2646 B +f +n +2 2 735 2646 B +f +n +163 2 738 2646 B +f +n +2 2 902 2646 B +f +n +431 2 905 2646 B +f +n +2 2 1337 2646 B +f +n +446 2 1340 2646 B +f +n +2 2 1787 2646 B +f +n +405 2 1790 2646 B +f +n +5 2 2196 2646 B +f +n +5 46 158 2649 B +f +n +2 46 322 2649 B +f +n +2 46 588 2649 B +f +n +2 46 735 2649 B +f +n +2 46 902 2649 B +f +n +2 46 1337 2649 B +f +n +2 46 1787 2649 B +f +n +5 46 2196 2649 B +f +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +25 50 176 2696 CB +( )176 2741 MS +gr +gs +n +25 50 338 2696 CB +( )338 2741 MS +gr +gs +n +25 50 604 2696 CB +( )604 2741 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(D)752 2730 MS (a)779 2730 MS (t)796 2730 MS (e)807 2730 MS +( )824 2730 MS +( )919 2730 MS +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +25 50 1353 2696 CB +( )1353 2741 MS +gr +gs +n +25 50 1803 2696 CB +( )1803 2741 MS +gr +n +5 49 158 2696 B +f +n +2 49 322 2696 B +f +n +2 49 588 2696 B +f +n +2 49 735 2696 B +f +n +2 49 902 2696 B +f +n +2 49 1337 2696 B +f +n +2 49 1787 2696 B +f +n +5 49 2196 2696 B +f +[38 0 0 -38 0 0]/Times-Bold MF +(I)176 2784 MS (n)191 2784 MS (d)212 2784 MS (i)233 2784 MS (c)243 2784 MS (e)260 2784 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )277 2784 MS +[38 0 0 -38 0 0]/Times-Bold MF +(D)338 2784 MS (a)365 2784 MS (t)384 2784 MS (e)397 2784 MS +[29 0 0 -29 0 0]/Times-Roman MF +( )414 2784 MS +[29 0 0 -29 0 0]/Times-Bold MF +(N)604 2776 MS (b)625 2776 MS (.)641 2776 MS (P)648 2776 MS (a)666 2776 MS (g)680 2776 MS (e)695 2776 MS +[29 0 0 -29 0 0]/Times-Roman MF +( )708 2776 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )752 2783 MS +[38 0 0 -38 0 0]/Times-Bold MF +LATENC /_Times-Bold /Times-Bold reencode +[38 0 0 -38 0 0]/_Times-Bold MF +(V)919 2784 MS (\351)946 2784 MS (r)963 2784 MS (i)980 2784 MS (f)990 2784 MS (i)1003 2784 MS (c)1013 2784 MS (a)1030 2784 MS (t)1049 2784 MS (e)1061 2784 MS (u)1078 2784 MS (r)1099 2784 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1116 2784 MS +[38 0 0 -38 0 0]/_Times-Bold MF +(A)1353 2784 MS (u)1380 2784 MS (t)1401 2784 MS (r)1414 2784 MS (e)1431 2784 MS ( )1447 2784 MS (v)1457 2784 MS (i)1475 2784 MS (s)1486 2784 MS (a)1501 2784 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1520 2784 MS +[38 0 0 -38 0 0]/_Times-Bold MF +(A)1803 2784 MS (p)1830 2784 MS (p)1851 2784 MS (r)1872 2784 MS (o)1889 2784 MS (b)1907 2784 MS (a)1928 2784 MS (t)1947 2784 MS (e)1960 2784 MS (u)1977 2784 MS (r)1997 2784 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )2014 2784 MS +n +5 2 158 2746 B +f +n +157 2 164 2746 B +f +n +2 2 322 2746 B +f +n +262 2 325 2746 B +f +n +2 2 588 2746 B +f +n +143 2 591 2746 B +f +n +2 2 735 2746 B +f +n +163 2 738 2746 B +f +n +2 2 902 2746 B +f +n +431 2 905 2746 B +f +n +2 2 1337 2746 B +f +n +446 2 1340 2746 B +f +n +2 2 1787 2746 B +f +n +405 2 1790 2746 B +f +n +5 2 2196 2746 B +f +n +5 46 158 2749 B +f +n +5 5 158 2796 B +f +n +5 5 158 2796 B +f +n +157 5 164 2796 B +f +n +2 46 322 2749 B +f +n +5 5 322 2796 B +f +n +259 5 328 2796 B +f +n +2 46 588 2749 B +f +n +5 5 588 2796 B +f +n +140 5 594 2796 B +f +n +2 46 735 2749 B +f +n +5 5 735 2796 B +f +n +160 5 741 2796 B +f +n +2 46 902 2749 B +f +n +5 5 902 2796 B +f +n +428 5 908 2796 B +f +n +2 46 1337 2749 B +f +n +5 5 1337 2796 B +f +n +443 5 1343 2796 B +f +n +2 46 1787 2749 B +f +n +5 5 1787 2796 B +f +n +402 5 1793 2796 B +f +n +5 46 2196 2749 B +f +n +5 5 2196 2796 B +f +n +5 5 2196 2796 B +f +showpage +Adobe_WinNT_Driver_Gfx dup /terminate get exec +PageSV restore +%%Page: 3 3 +NTPSOct95 /PageSV save put +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +%%IncludeFont: Times-Roman +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +%%IncludeFont: Times-Bold +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(3)1868 400 MS +(/)1893 400 MS +(3)1907 400 MS (0)1932 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1957 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[58 0 0 -58 0 0]/Times-Roman MF +(L)235 560 MS (I)270 560 MS (S)289 560 MS (T)322 560 MS (E)358 560 MS ( )393 560 MS (D)408 560 MS (E)450 560 MS ( )485 560 MS (M)500 560 MS (O)552 560 MS (D)594 560 MS (I)636 560 MS (F)656 560 MS (I)688 560 MS (C)707 560 MS +(A)747 560 MS (T)789 560 MS (I)824 560 MS (O)843 560 MS (N)885 560 MS +( )927 560 MS +[50 0 0 -50 0 0]/Times-Roman MF +(I)250 663 MS (n)267 663 MS (d)291 663 MS (i)317 663 MS (c)330 663 MS (e)352 663 MS +gs +n +20 57 374 618 CB +( )374 663 MS +gr +(D)411 663 MS (a)447 663 MS (t)469 663 MS (e)484 663 MS +( )506 663 MS +(M)851 663 MS (o)895 663 MS (t)920 663 MS (i)935 663 MS (f)948 663 MS ( )963 663 MS (e)977 663 MS (t)999 663 MS ( )1014 663 MS (d)1027 663 MS (e)1052 663 MS (s)1074 663 MS (c)1093 663 MS (r)1115 663 MS (i)1132 663 MS (p)1144 663 MS +(t)1169 663 MS (i)1185 663 MS (o)1197 663 MS (n)1223 663 MS ( )1247 663 MS (d)1260 663 MS (e)1285 663 MS ( )1307 663 MS (l)1321 663 MS (a)1333 663 MS ( )1355 663 MS (m)1369 663 MS (o)1406 663 MS (d)1432 663 MS (i)1458 663 MS (f)1471 663 MS +(i)1488 663 MS (c)1501 663 MS (a)1524 663 MS (t)1546 663 MS (i)1561 663 MS (o)1573 663 MS (n)1599 663 MS +( )1623 663 MS +n +5 5 232 599 B +f +n +5 5 232 599 B +f +n +155 5 238 599 B +f +n +5 5 394 599 B +f +n +433 5 400 599 B +f +n +5 5 834 599 B +f +n +1488 5 840 599 B +f +n +5 5 2329 599 B +f +n +5 5 2329 599 B +f +n +5 78 232 605 B +f +n +2 78 394 605 B +f +n +2 78 834 605 B +f +n +5 78 2329 605 B +f +(A)250 760 MS +( )285 760 MS +(3)411 760 MS (0)436 760 MS ( )461 760 MS (m)474 760 MS (a)512 760 MS (i)535 760 MS ( )547 760 MS (2)560 760 MS (0)585 760 MS (0)610 760 MS (2)635 760 MS +( )660 760 MS +(D)851 760 MS (o)887 760 MS (c)913 760 MS (u)935 760 MS (m)960 760 MS (e)997 760 MS (n)1020 760 MS (t)1044 760 MS ( )1059 760 MS (i)1073 760 MS (n)1086 760 MS (i)1111 760 MS (t)1123 760 MS (i)1139 760 MS (a)1151 760 MS (l)1174 760 MS +( )1187 760 MS +n +5 5 232 684 B +f +n +155 5 238 684 B +f +n +5 5 394 684 B +f +n +433 5 400 684 B +f +n +5 5 834 684 B +f +n +1488 5 840 684 B +f +n +5 5 2329 684 B +f +n +5 82 232 690 B +f +n +2 82 394 690 B +f +n +2 82 834 690 B +f +n +5 82 2329 690 B +f +( )250 846 MS +( )411 846 MS +( )851 846 MS +n +5 2 232 773 B +f +n +155 2 238 773 B +f +n +2 2 394 773 B +f +n +436 2 397 773 B +f +n +2 2 834 773 B +f +n +1491 2 837 773 B +f +n +5 2 2329 773 B +f +n +5 81 232 776 B +f +n +2 81 394 776 B +f +n +2 81 834 776 B +f +n +5 81 2329 776 B +f +( )250 931 MS +( )411 931 MS +( )851 931 MS +n +5 2 232 858 B +f +n +155 2 238 858 B +f +n +2 2 394 858 B +f +n +436 2 397 858 B +f +n +2 2 834 858 B +f +n +1491 2 837 858 B +f +n +5 2 2329 858 B +f +n +5 82 232 861 B +f +n +2 82 394 861 B +f +n +2 82 834 861 B +f +n +5 82 2329 861 B +f +( )250 1017 MS +( )411 1017 MS +( )851 1017 MS +n +5 2 232 944 B +f +n +155 2 238 944 B +f +n +2 2 394 944 B +f +n +436 2 397 944 B +f +n +2 2 834 944 B +f +n +1491 2 837 944 B +f +n +5 2 2329 944 B +f +n +5 82 232 947 B +f +n +2 82 394 947 B +f +n +2 82 834 947 B +f +n +5 82 2329 947 B +f +( )250 1103 MS +( )411 1103 MS +( )851 1103 MS +n +5 2 232 1030 B +f +n +155 2 238 1030 B +f +n +2 2 394 1030 B +f +n +436 2 397 1030 B +f +n +2 2 834 1030 B +f +n +1491 2 837 1030 B +f +n +5 2 2329 1030 B +f +n +5 82 232 1033 B +f +n +5 5 232 1116 B +f +n +5 5 232 1116 B +f +n +155 5 238 1116 B +f +n +2 82 394 1033 B +f +n +5 5 394 1116 B +f +n +433 5 400 1116 B +f +n +2 82 834 1033 B +f +n +5 5 834 1116 B +f +n +1488 5 840 1116 B +f +n +5 82 2329 1033 B +f +n +5 5 2329 1116 B +f +n +5 5 2329 1116 B +f +%%IncludeFont: Palatino-Bold +[83 0 0 -83 0 0]/Palatino-Bold MF +( )1180 1200 MS +showpage +%%Page: 4 4 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(4)1868 400 MS +(/)1893 400 MS +(3)1907 400 MS (0)1932 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1957 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[58 0 0 -58 0 0]/Times-Bold MF +( )1180 561 MS +[42 0 0 -42 0 0]/Times-Bold MF +(1)235 637 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 637 MS +[42 0 0 -42 0 0]/Times-Bold MF +(I)335 637 MS (N)351 637 MS (T)381 637 MS (R)409 637 MS (O)439 637 MS (D)472 637 MS (U)502 637 MS (C)532 637 MS (T)562 637 MS (I)590 637 MS (O)606 637 MS (N)639 637 MS +(.)671 637 MS (.)682 637 MS (.)693 637 MS (.)704 637 MS (.)715 637 MS (.)726 637 MS (.)737 637 MS (.)748 637 MS (.)759 637 MS (.)770 637 MS (.)781 637 MS (.)792 637 MS (.)803 637 MS (.)814 637 MS (.)825 637 MS (.)836 637 MS +(.)847 637 MS (.)858 637 MS (.)869 637 MS (.)880 637 MS (.)891 637 MS (.)902 637 MS (.)913 637 MS (.)924 637 MS (.)935 637 MS (.)946 637 MS (.)957 637 MS (.)968 637 MS (.)979 637 MS (.)990 637 MS (.)1001 637 MS (.)1012 637 MS +(.)1023 637 MS (.)1034 637 MS (.)1045 637 MS (.)1056 637 MS (.)1067 637 MS (.)1078 637 MS (.)1089 637 MS (.)1100 637 MS (.)1111 637 MS (.)1122 637 MS (.)1133 637 MS (.)1144 637 MS (.)1155 637 MS (.)1166 637 MS (.)1177 637 MS (.)1188 637 MS +(.)1199 637 MS (.)1210 637 MS (.)1221 637 MS (.)1232 637 MS (.)1243 637 MS (.)1254 637 MS (.)1265 637 MS (.)1276 637 MS (.)1287 637 MS (.)1298 637 MS (.)1309 637 MS (.)1320 637 MS (.)1331 637 MS (.)1342 637 MS (.)1353 637 MS (.)1364 637 MS +(.)1375 637 MS (.)1386 637 MS (.)1397 637 MS (.)1408 637 MS (.)1419 637 MS (.)1430 637 MS (.)1441 637 MS (.)1452 637 MS (.)1463 637 MS (.)1474 637 MS (.)1485 637 MS (.)1496 637 MS (.)1507 637 MS (.)1518 637 MS (.)1529 637 MS (.)1540 637 MS +(.)1551 637 MS (.)1562 637 MS (.)1573 637 MS (.)1584 637 MS (.)1595 637 MS (.)1606 637 MS (.)1617 637 MS (.)1628 637 MS (.)1639 637 MS (.)1650 637 MS (.)1661 637 MS (.)1672 637 MS (.)1683 637 MS (.)1694 637 MS (.)1705 637 MS (.)1716 637 MS +(.)1727 637 MS (.)1738 637 MS (.)1749 637 MS (.)1760 637 MS (.)1771 637 MS (.)1782 637 MS (.)1793 637 MS (.)1804 637 MS (.)1815 637 MS (.)1826 637 MS (.)1837 637 MS (.)1848 637 MS (.)1859 637 MS (.)1870 637 MS (.)1881 637 MS (.)1892 637 MS +(.)1903 637 MS (.)1914 637 MS (.)1925 637 MS (.)1936 637 MS (.)1947 637 MS (.)1958 637 MS (.)1969 637 MS (.)1980 637 MS (.)1991 637 MS (.)2002 637 MS (.)2013 637 MS (.)2024 637 MS (.)2035 637 MS (.)2046 637 MS (.)2057 637 MS (.)2068 637 MS +(.)2079 637 MS (.)2090 637 MS +(5)2102 637 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 637 MS +[42 0 0 -42 0 0]/Times-Bold MF +(2)235 710 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 710 MS +[42 0 0 -42 0 0]/Times-Bold MF +LATENC /_Times-Bold /Times-Bold reencode +[42 0 0 -42 0 0]/_Times-Bold MF +(E)335 710 MS (T)363 710 MS (A)391 710 MS (T)421 710 MS ( )449 710 MS (D)460 710 MS (E)490 710 MS ( )517 710 MS (L)528 710 MS (\222)556 710 MS (A)570 710 MS (R)600 710 MS (T)630 710 MS ( )657 710 MS (D)668 710 MS (A)698 710 MS +(N)728 710 MS (S)758 710 MS ( )781 710 MS (L)792 710 MS +(E)820 710 MS ( )847 710 MS (D)858 710 MS (O)888 710 MS (M)920 710 MS (A)960 710 MS (I)990 710 MS (N)1006 710 MS (E)1036 710 MS +(.)1067 710 MS (.)1078 710 MS (.)1089 710 MS (.)1100 710 MS (.)1111 710 MS (.)1122 710 MS (.)1133 710 MS (.)1144 710 MS (.)1155 710 MS (.)1166 710 MS (.)1177 710 MS (.)1188 710 MS (.)1199 710 MS (.)1210 710 MS (.)1221 710 MS (.)1232 710 MS +(.)1243 710 MS (.)1254 710 MS (.)1265 710 MS (.)1276 710 MS (.)1287 710 MS (.)1298 710 MS (.)1309 710 MS (.)1320 710 MS (.)1331 710 MS (.)1342 710 MS (.)1353 710 MS (.)1364 710 MS (.)1375 710 MS (.)1386 710 MS (.)1397 710 MS (.)1408 710 MS +(.)1419 710 MS (.)1430 710 MS (.)1441 710 MS (.)1452 710 MS (.)1463 710 MS (.)1474 710 MS (.)1485 710 MS (.)1496 710 MS (.)1507 710 MS (.)1518 710 MS (.)1529 710 MS (.)1540 710 MS (.)1551 710 MS (.)1562 710 MS (.)1573 710 MS (.)1584 710 MS +(.)1595 710 MS (.)1606 710 MS (.)1617 710 MS (.)1628 710 MS (.)1639 710 MS (.)1650 710 MS (.)1661 710 MS (.)1672 710 MS (.)1683 710 MS (.)1694 710 MS (.)1705 710 MS (.)1716 710 MS (.)1727 710 MS (.)1738 710 MS (.)1749 710 MS (.)1760 710 MS +(.)1771 710 MS (.)1782 710 MS (.)1793 710 MS (.)1804 710 MS (.)1815 710 MS (.)1826 710 MS (.)1837 710 MS (.)1848 710 MS (.)1859 710 MS (.)1870 710 MS (.)1881 710 MS (.)1892 710 MS (.)1903 710 MS (.)1914 710 MS (.)1925 710 MS (.)1936 710 MS +(.)1947 710 MS (.)1958 710 MS (.)1969 710 MS (.)1980 710 MS (.)1991 710 MS (.)2002 710 MS (.)2013 710 MS (.)2024 710 MS (.)2035 710 MS (.)2046 710 MS (.)2057 710 MS (.)2068 710 MS (.)2079 710 MS (.)2090 710 MS +(6)2102 710 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 710 MS +[42 0 0 -42 0 0]/_Times-Bold MF +(3)235 783 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 783 MS +[42 0 0 -42 0 0]/_Times-Bold MF +(A)335 783 MS (P)365 783 MS (P)390 783 MS (R)415 783 MS (O)445 783 MS (C)478 783 MS (H)508 783 MS (E)541 783 MS ( )569 783 MS (D)580 783 MS (E)610 783 MS (V)638 783 MS (E)668 783 MS (L)696 783 MS (O)723 783 MS (P)756 783 MS +(P)781 783 MS (E)806 783 MS (E)834 783 MS ( )862 783 MS +(D)873 783 MS (A)903 783 MS (N)933 783 MS (S)963 783 MS ( )986 783 MS (C)997 783 MS (E)1027 783 MS (T)1054 783 MS (T)1082 783 MS (E)1110 783 MS ( )1137 783 MS (E)1148 783 MS (T)1176 783 MS (U)1204 783 MS (D)1234 783 MS (E)1264 783 MS +(.)1298 783 MS (.)1309 783 MS (.)1320 783 MS (.)1331 783 MS (.)1342 783 MS (.)1353 783 MS (.)1364 783 MS (.)1375 783 MS (.)1386 783 MS (.)1397 783 MS (.)1408 783 MS (.)1419 783 MS (.)1430 783 MS (.)1441 783 MS (.)1452 783 MS (.)1463 783 MS +(.)1474 783 MS (.)1485 783 MS (.)1496 783 MS (.)1507 783 MS (.)1518 783 MS (.)1529 783 MS (.)1540 783 MS (.)1551 783 MS (.)1562 783 MS (.)1573 783 MS (.)1584 783 MS (.)1595 783 MS (.)1606 783 MS (.)1617 783 MS (.)1628 783 MS (.)1639 783 MS +(.)1650 783 MS (.)1661 783 MS (.)1672 783 MS (.)1683 783 MS (.)1694 783 MS (.)1705 783 MS (.)1716 783 MS (.)1727 783 MS (.)1738 783 MS (.)1749 783 MS (.)1760 783 MS (.)1771 783 MS (.)1782 783 MS (.)1793 783 MS (.)1804 783 MS (.)1815 783 MS +(.)1826 783 MS (.)1837 783 MS (.)1848 783 MS (.)1859 783 MS (.)1870 783 MS (.)1881 783 MS (.)1892 783 MS (.)1903 783 MS (.)1914 783 MS (.)1925 783 MS (.)1936 783 MS (.)1947 783 MS (.)1958 783 MS (.)1969 783 MS (.)1980 783 MS (.)1991 783 MS +(.)2002 783 MS (.)2013 783 MS (.)2024 783 MS (.)2035 783 MS (.)2046 783 MS (.)2057 783 MS (.)2068 783 MS (.)2079 783 MS (.)2090 783 MS +(7)2102 783 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 783 MS +[42 0 0 -42 0 0]/_Times-Bold MF +(4)235 856 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 856 MS +[42 0 0 -42 0 0]/_Times-Bold MF +(D)335 856 MS (E)365 856 MS (F)393 856 MS (I)418 856 MS (N)434 856 MS (I)464 856 MS (T)480 856 MS (I)508 856 MS (O)524 856 MS (N)557 856 MS (S)587 856 MS +(.)616 856 MS (.)627 856 MS (.)638 856 MS (.)649 856 MS (.)660 856 MS (.)671 856 MS (.)682 856 MS (.)693 856 MS (.)704 856 MS (.)715 856 MS (.)726 856 MS (.)737 856 MS (.)748 856 MS (.)759 856 MS (.)770 856 MS (.)781 856 MS +(.)792 856 MS (.)803 856 MS (.)814 856 MS (.)825 856 MS (.)836 856 MS (.)847 856 MS (.)858 856 MS (.)869 856 MS (.)880 856 MS (.)891 856 MS (.)902 856 MS (.)913 856 MS (.)924 856 MS (.)935 856 MS (.)946 856 MS (.)957 856 MS +(.)968 856 MS (.)979 856 MS (.)990 856 MS (.)1001 856 MS (.)1012 856 MS (.)1023 856 MS (.)1034 856 MS (.)1045 856 MS (.)1056 856 MS (.)1067 856 MS (.)1078 856 MS (.)1089 856 MS (.)1100 856 MS (.)1111 856 MS (.)1122 856 MS (.)1133 856 MS +(.)1144 856 MS (.)1155 856 MS (.)1166 856 MS (.)1177 856 MS (.)1188 856 MS (.)1199 856 MS (.)1210 856 MS (.)1221 856 MS (.)1232 856 MS (.)1243 856 MS (.)1254 856 MS (.)1265 856 MS (.)1276 856 MS (.)1287 856 MS (.)1298 856 MS (.)1309 856 MS +(.)1320 856 MS (.)1331 856 MS (.)1342 856 MS (.)1353 856 MS (.)1364 856 MS (.)1375 856 MS (.)1386 856 MS (.)1397 856 MS (.)1408 856 MS (.)1419 856 MS (.)1430 856 MS (.)1441 856 MS (.)1452 856 MS (.)1463 856 MS (.)1474 856 MS (.)1485 856 MS +(.)1496 856 MS (.)1507 856 MS (.)1518 856 MS (.)1529 856 MS (.)1540 856 MS (.)1551 856 MS (.)1562 856 MS (.)1573 856 MS (.)1584 856 MS (.)1595 856 MS (.)1606 856 MS (.)1617 856 MS (.)1628 856 MS (.)1639 856 MS (.)1650 856 MS (.)1661 856 MS +(.)1672 856 MS (.)1683 856 MS (.)1694 856 MS (.)1705 856 MS (.)1716 856 MS (.)1727 856 MS (.)1738 856 MS (.)1749 856 MS (.)1760 856 MS (.)1771 856 MS (.)1782 856 MS (.)1793 856 MS (.)1804 856 MS (.)1815 856 MS (.)1826 856 MS (.)1837 856 MS +(.)1848 856 MS (.)1859 856 MS (.)1870 856 MS (.)1881 856 MS (.)1892 856 MS (.)1903 856 MS (.)1914 856 MS (.)1925 856 MS (.)1936 856 MS (.)1947 856 MS (.)1958 856 MS (.)1969 856 MS (.)1980 856 MS (.)1991 856 MS (.)2002 856 MS (.)2013 856 MS +(.)2024 856 MS (.)2035 856 MS (.)2046 856 MS (.)2057 856 MS (.)2068 856 MS (.)2079 856 MS (.)2090 856 MS +(9)2102 856 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 856 MS +[42 0 0 -42 0 0]/_Times-Bold MF +(5)235 929 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 929 MS +[42 0 0 -42 0 0]/_Times-Bold MF +(L)335 929 MS (\222)363 929 MS (O)377 929 MS (B)409 929 MS (J)438 929 MS (E)458 929 MS (T)486 929 MS ( )514 929 MS (P)525 929 MS (A)550 929 MS (R)580 929 MS (A)610 929 MS (L)640 929 MS (L)668 929 MS (E)696 929 MS (L)724 929 MS +(E)751 929 MS ( )779 929 MS (G)789 929 MS (E)822 929 MS +(N)850 929 MS (E)880 929 MS (R)908 929 MS (I)938 929 MS (Q)953 929 MS (U)987 929 MS (E)1016 929 MS +(.)1045 929 MS (.)1056 929 MS (.)1067 929 MS (.)1078 929 MS (.)1089 929 MS (.)1100 929 MS (.)1111 929 MS (.)1122 929 MS (.)1133 929 MS (.)1144 929 MS (.)1155 929 MS (.)1166 929 MS (.)1177 929 MS (.)1188 929 MS (.)1199 929 MS (.)1210 929 MS +(.)1221 929 MS (.)1232 929 MS (.)1243 929 MS (.)1254 929 MS (.)1265 929 MS (.)1276 929 MS (.)1287 929 MS (.)1298 929 MS (.)1309 929 MS (.)1320 929 MS (.)1331 929 MS (.)1342 929 MS (.)1353 929 MS (.)1364 929 MS (.)1375 929 MS (.)1386 929 MS +(.)1397 929 MS (.)1408 929 MS (.)1419 929 MS (.)1430 929 MS (.)1441 929 MS (.)1452 929 MS (.)1463 929 MS (.)1474 929 MS (.)1485 929 MS (.)1496 929 MS (.)1507 929 MS (.)1518 929 MS (.)1529 929 MS (.)1540 929 MS (.)1551 929 MS (.)1562 929 MS +(.)1573 929 MS (.)1584 929 MS (.)1595 929 MS (.)1606 929 MS (.)1617 929 MS (.)1628 929 MS (.)1639 929 MS (.)1650 929 MS (.)1661 929 MS (.)1672 929 MS (.)1683 929 MS (.)1694 929 MS (.)1705 929 MS (.)1716 929 MS (.)1727 929 MS (.)1738 929 MS +(.)1749 929 MS (.)1760 929 MS (.)1771 929 MS (.)1782 929 MS (.)1793 929 MS (.)1804 929 MS (.)1815 929 MS (.)1826 929 MS (.)1837 929 MS (.)1848 929 MS (.)1859 929 MS (.)1870 929 MS (.)1881 929 MS (.)1892 929 MS (.)1903 929 MS (.)1914 929 MS +(.)1925 929 MS (.)1936 929 MS (.)1947 929 MS (.)1958 929 MS (.)1969 929 MS (.)1980 929 MS (.)1991 929 MS (.)2002 929 MS (.)2013 929 MS (.)2024 929 MS (.)2035 929 MS (.)2046 929 MS (.)2057 929 MS (.)2068 929 MS +(1)2081 929 MS (0)2102 929 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 929 MS +[42 0 0 -42 0 0]/Times-Roman MF +(5)285 1001 MS (.)306 1001 MS (1)317 1001 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )337 1001 MS +[42 0 0 -42 0 0]/Times-Roman MF +(D)435 1001 MS +[33 0 0 -33 0 0]/Times-Roman MF +(E)465 1001 MS (F)485 1001 MS (I)503 1001 MS (N)514 1001 MS (I)538 1001 MS (T)549 1001 MS (I)570 1001 MS (O)581 1001 MS (N)605 1001 MS ( )629 1001 MS (D)637 1001 MS (E)662 1001 MS ( )682 1001 MS (L)690 1001 MS +[42 0 0 -42 0 0]/Times-Roman MF +LATENC /_Times-Roman /Times-Roman reencode +[42 0 0 -42 0 0]/_Times-Roman MF +(\222)710 1001 MS +[33 0 0 -33 0 0]/Times-Roman MF +(I)724 1001 MS (N)735 1001 MS (T)759 1001 MS (E)780 1001 MS (R)800 1001 MS (F)823 1001 MS (A)842 1001 MS (C)865 1001 MS (E)887 1001 MS ( )908 1001 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(C)916 1001 MS (O)944 1001 MS (R)974 1001 MS (B)1002 1001 MS (A)1029 1001 MS +(.)1067 1001 MS (.)1078 1001 MS (.)1089 1001 MS (.)1100 1001 MS (.)1111 1001 MS (.)1122 1001 MS (.)1133 1001 MS (.)1144 1001 MS (.)1155 1001 MS (.)1166 1001 MS (.)1177 1001 MS (.)1188 1001 MS (.)1199 1001 MS (.)1210 1001 MS (.)1221 1001 MS (.)1232 1001 MS +(.)1243 1001 MS (.)1254 1001 MS (.)1265 1001 MS (.)1276 1001 MS (.)1287 1001 MS (.)1298 1001 MS (.)1309 1001 MS (.)1320 1001 MS (.)1331 1001 MS (.)1342 1001 MS (.)1353 1001 MS (.)1364 1001 MS (.)1375 1001 MS (.)1386 1001 MS (.)1397 1001 MS (.)1408 1001 MS +(.)1419 1001 MS (.)1430 1001 MS (.)1441 1001 MS (.)1452 1001 MS (.)1463 1001 MS (.)1474 1001 MS (.)1485 1001 MS (.)1496 1001 MS (.)1507 1001 MS (.)1518 1001 MS (.)1529 1001 MS (.)1540 1001 MS (.)1551 1001 MS (.)1562 1001 MS (.)1573 1001 MS (.)1584 1001 MS +(.)1595 1001 MS (.)1606 1001 MS (.)1617 1001 MS (.)1628 1001 MS (.)1639 1001 MS (.)1650 1001 MS (.)1661 1001 MS (.)1672 1001 MS (.)1683 1001 MS (.)1694 1001 MS (.)1705 1001 MS (.)1716 1001 MS (.)1727 1001 MS (.)1738 1001 MS (.)1749 1001 MS (.)1760 1001 MS +(.)1771 1001 MS (.)1782 1001 MS (.)1793 1001 MS (.)1804 1001 MS (.)1815 1001 MS (.)1826 1001 MS (.)1837 1001 MS (.)1848 1001 MS (.)1859 1001 MS (.)1870 1001 MS (.)1881 1001 MS (.)1892 1001 MS (.)1903 1001 MS (.)1914 1001 MS (.)1925 1001 MS (.)1936 1001 MS +(.)1947 1001 MS (.)1958 1001 MS (.)1969 1001 MS (.)1980 1001 MS (.)1991 1001 MS (.)2002 1001 MS (.)2013 1001 MS (.)2024 1001 MS (.)2035 1001 MS (.)2046 1001 MS (.)2057 1001 MS (.)2068 1001 MS +(1)2081 1001 MS (0)2102 1001 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1001 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(5)285 1049 MS (.)306 1049 MS (2)317 1049 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )337 1049 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(D)435 1049 MS +[33 0 0 -33 0 0]/Times-Roman MF +(E)465 1049 MS (F)485 1049 MS (I)503 1049 MS (N)514 1049 MS (I)538 1049 MS (T)549 1049 MS (I)570 1049 MS (O)581 1049 MS (N)605 1049 MS ( )629 1049 MS (D)637 1049 MS (E)662 1049 MS ( )682 1049 MS (L)690 1049 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(\222)710 1049 MS +[33 0 0 -33 0 0]/Times-Roman MF +(I)724 1049 MS (M)736 1049 MS (P)765 1049 MS (L)784 1049 MS (E)804 1049 MS (M)825 1049 MS (E)854 1049 MS (N)874 1049 MS (T)898 1049 MS (A)920 1049 MS (T)943 1049 MS (I)964 1049 MS (O)975 1049 MS +(N)999 1049 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(.)1023 1049 MS (.)1034 1049 MS (.)1045 1049 MS (.)1056 1049 MS (.)1067 1049 MS (.)1078 1049 MS (.)1089 1049 MS (.)1100 1049 MS (.)1111 1049 MS (.)1122 1049 MS (.)1133 1049 MS (.)1144 1049 MS (.)1155 1049 MS (.)1166 1049 MS (.)1177 1049 MS (.)1188 1049 MS +(.)1199 1049 MS (.)1210 1049 MS (.)1221 1049 MS (.)1232 1049 MS (.)1243 1049 MS (.)1254 1049 MS (.)1265 1049 MS (.)1276 1049 MS (.)1287 1049 MS (.)1298 1049 MS (.)1309 1049 MS (.)1320 1049 MS (.)1331 1049 MS (.)1342 1049 MS (.)1353 1049 MS (.)1364 1049 MS +(.)1375 1049 MS (.)1386 1049 MS (.)1397 1049 MS (.)1408 1049 MS (.)1419 1049 MS (.)1430 1049 MS (.)1441 1049 MS (.)1452 1049 MS (.)1463 1049 MS (.)1474 1049 MS (.)1485 1049 MS (.)1496 1049 MS (.)1507 1049 MS (.)1518 1049 MS (.)1529 1049 MS (.)1540 1049 MS +(.)1551 1049 MS (.)1562 1049 MS (.)1573 1049 MS (.)1584 1049 MS (.)1595 1049 MS (.)1606 1049 MS (.)1617 1049 MS (.)1628 1049 MS (.)1639 1049 MS (.)1650 1049 MS (.)1661 1049 MS (.)1672 1049 MS (.)1683 1049 MS (.)1694 1049 MS (.)1705 1049 MS (.)1716 1049 MS +(.)1727 1049 MS (.)1738 1049 MS (.)1749 1049 MS (.)1760 1049 MS (.)1771 1049 MS (.)1782 1049 MS (.)1793 1049 MS (.)1804 1049 MS (.)1815 1049 MS (.)1826 1049 MS (.)1837 1049 MS (.)1848 1049 MS (.)1859 1049 MS (.)1870 1049 MS (.)1881 1049 MS (.)1892 1049 MS +(.)1903 1049 MS (.)1914 1049 MS (.)1925 1049 MS (.)1936 1049 MS (.)1947 1049 MS (.)1958 1049 MS (.)1969 1049 MS (.)1980 1049 MS (.)1991 1049 MS (.)2002 1049 MS (.)2013 1049 MS (.)2024 1049 MS (.)2035 1049 MS (.)2046 1049 MS (.)2057 1049 MS (.)2068 1049 MS +(1)2081 1049 MS (1)2102 1049 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1049 MS +[42 0 0 -42 0 0]/Times-Bold MF +(6)235 1123 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 1123 MS +[42 0 0 -42 0 0]/Times-Bold MF +(L)335 1123 MS (E)363 1123 MS ( )391 1123 MS (C)402 1123 MS (O)431 1123 MS (N)464 1123 MS (T)494 1123 MS (A)522 1123 MS (I)552 1123 MS (N)568 1123 MS (E)598 1123 MS (R)626 1123 MS ( )656 1123 MS (P)667 1123 MS (A)692 1123 MS (R)722 1123 MS +(A)752 1123 MS (L)782 1123 MS (L)810 1123 MS (E)838 1123 MS +(L)866 1123 MS (E)894 1123 MS +(.)924 1123 MS (.)935 1123 MS (.)946 1123 MS (.)957 1123 MS (.)968 1123 MS (.)979 1123 MS (.)990 1123 MS (.)1001 1123 MS (.)1012 1123 MS (.)1023 1123 MS (.)1034 1123 MS (.)1045 1123 MS (.)1056 1123 MS (.)1067 1123 MS (.)1078 1123 MS (.)1089 1123 MS +(.)1100 1123 MS (.)1111 1123 MS (.)1122 1123 MS (.)1133 1123 MS (.)1144 1123 MS (.)1155 1123 MS (.)1166 1123 MS (.)1177 1123 MS (.)1188 1123 MS (.)1199 1123 MS (.)1210 1123 MS (.)1221 1123 MS (.)1232 1123 MS (.)1243 1123 MS (.)1254 1123 MS (.)1265 1123 MS +(.)1276 1123 MS (.)1287 1123 MS (.)1298 1123 MS (.)1309 1123 MS (.)1320 1123 MS (.)1331 1123 MS (.)1342 1123 MS (.)1353 1123 MS (.)1364 1123 MS (.)1375 1123 MS (.)1386 1123 MS (.)1397 1123 MS (.)1408 1123 MS (.)1419 1123 MS (.)1430 1123 MS (.)1441 1123 MS +(.)1452 1123 MS (.)1463 1123 MS (.)1474 1123 MS (.)1485 1123 MS (.)1496 1123 MS (.)1507 1123 MS (.)1518 1123 MS (.)1529 1123 MS (.)1540 1123 MS (.)1551 1123 MS (.)1562 1123 MS (.)1573 1123 MS (.)1584 1123 MS (.)1595 1123 MS (.)1606 1123 MS (.)1617 1123 MS +(.)1628 1123 MS (.)1639 1123 MS (.)1650 1123 MS (.)1661 1123 MS (.)1672 1123 MS (.)1683 1123 MS (.)1694 1123 MS (.)1705 1123 MS (.)1716 1123 MS (.)1727 1123 MS (.)1738 1123 MS (.)1749 1123 MS (.)1760 1123 MS (.)1771 1123 MS (.)1782 1123 MS (.)1793 1123 MS +(.)1804 1123 MS (.)1815 1123 MS (.)1826 1123 MS (.)1837 1123 MS (.)1848 1123 MS (.)1859 1123 MS (.)1870 1123 MS (.)1881 1123 MS (.)1892 1123 MS (.)1903 1123 MS (.)1914 1123 MS (.)1925 1123 MS (.)1936 1123 MS (.)1947 1123 MS (.)1958 1123 MS (.)1969 1123 MS +(.)1980 1123 MS (.)1991 1123 MS (.)2002 1123 MS (.)2013 1123 MS (.)2024 1123 MS (.)2035 1123 MS (.)2046 1123 MS (.)2057 1123 MS (.)2068 1123 MS +(1)2081 1123 MS (2)2102 1123 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1123 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(6)285 1195 MS (.)306 1195 MS (1)317 1195 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )337 1195 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(D)435 1195 MS +[33 0 0 -33 0 0]/Times-Roman MF +(E)465 1195 MS (F)485 1195 MS (I)503 1195 MS (N)514 1195 MS (I)538 1195 MS (T)549 1195 MS (I)570 1195 MS (O)581 1195 MS (N)605 1195 MS ( )629 1195 MS (D)637 1195 MS (E)662 1195 MS ( )682 1195 MS (L)690 1195 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(\222)710 1195 MS +[33 0 0 -33 0 0]/Times-Roman MF +(I)724 1195 MS (N)735 1195 MS (T)759 1195 MS (E)780 1195 MS (R)800 1195 MS (F)823 1195 MS (A)842 1195 MS (C)865 1195 MS (E)887 1195 MS ( )908 1195 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(C)916 1195 MS (O)944 1195 MS (R)974 1195 MS (B)1002 1195 MS (A)1029 1195 MS +(.)1067 1195 MS (.)1078 1195 MS (.)1089 1195 MS (.)1100 1195 MS (.)1111 1195 MS (.)1122 1195 MS (.)1133 1195 MS (.)1144 1195 MS (.)1155 1195 MS (.)1166 1195 MS (.)1177 1195 MS (.)1188 1195 MS (.)1199 1195 MS (.)1210 1195 MS (.)1221 1195 MS (.)1232 1195 MS +(.)1243 1195 MS (.)1254 1195 MS (.)1265 1195 MS (.)1276 1195 MS (.)1287 1195 MS (.)1298 1195 MS (.)1309 1195 MS (.)1320 1195 MS (.)1331 1195 MS (.)1342 1195 MS (.)1353 1195 MS (.)1364 1195 MS (.)1375 1195 MS (.)1386 1195 MS (.)1397 1195 MS (.)1408 1195 MS +(.)1419 1195 MS (.)1430 1195 MS (.)1441 1195 MS (.)1452 1195 MS (.)1463 1195 MS (.)1474 1195 MS (.)1485 1195 MS (.)1496 1195 MS (.)1507 1195 MS (.)1518 1195 MS (.)1529 1195 MS (.)1540 1195 MS (.)1551 1195 MS (.)1562 1195 MS (.)1573 1195 MS (.)1584 1195 MS +(.)1595 1195 MS (.)1606 1195 MS (.)1617 1195 MS (.)1628 1195 MS (.)1639 1195 MS (.)1650 1195 MS (.)1661 1195 MS (.)1672 1195 MS (.)1683 1195 MS (.)1694 1195 MS (.)1705 1195 MS (.)1716 1195 MS (.)1727 1195 MS (.)1738 1195 MS (.)1749 1195 MS (.)1760 1195 MS +(.)1771 1195 MS (.)1782 1195 MS (.)1793 1195 MS (.)1804 1195 MS (.)1815 1195 MS (.)1826 1195 MS (.)1837 1195 MS (.)1848 1195 MS (.)1859 1195 MS (.)1870 1195 MS (.)1881 1195 MS (.)1892 1195 MS (.)1903 1195 MS (.)1914 1195 MS (.)1925 1195 MS (.)1936 1195 MS +(.)1947 1195 MS (.)1958 1195 MS (.)1969 1195 MS (.)1980 1195 MS (.)1991 1195 MS (.)2002 1195 MS (.)2013 1195 MS (.)2024 1195 MS (.)2035 1195 MS (.)2046 1195 MS (.)2057 1195 MS (.)2068 1195 MS +(1)2081 1195 MS (2)2102 1195 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1195 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(6)285 1243 MS (.)306 1243 MS (2)317 1243 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )337 1243 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(D)435 1243 MS +[33 0 0 -33 0 0]/Times-Roman MF +(E)465 1243 MS (F)485 1243 MS (I)503 1243 MS (N)514 1243 MS (I)538 1243 MS (T)549 1243 MS (I)570 1243 MS (O)581 1243 MS (N)605 1243 MS ( )629 1243 MS (D)637 1243 MS (E)662 1243 MS ( )682 1243 MS (L)690 1243 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(\222)710 1243 MS +[33 0 0 -33 0 0]/Times-Roman MF +(I)724 1243 MS (M)736 1243 MS (P)765 1243 MS (L)784 1243 MS (E)804 1243 MS (M)825 1243 MS (E)854 1243 MS (N)874 1243 MS (T)898 1243 MS (A)920 1243 MS (T)943 1243 MS (I)964 1243 MS (O)975 1243 MS (N)999 1243 MS +[42 0 0 -42 0 0]/_Times-Roman MF +(.)1023 1243 MS (.)1034 1243 MS (.)1045 1243 MS (.)1056 1243 MS (.)1067 1243 MS (.)1078 1243 MS (.)1089 1243 MS (.)1100 1243 MS (.)1111 1243 MS (.)1122 1243 MS (.)1133 1243 MS (.)1144 1243 MS (.)1155 1243 MS (.)1166 1243 MS (.)1177 1243 MS (.)1188 1243 MS +(.)1199 1243 MS (.)1210 1243 MS (.)1221 1243 MS (.)1232 1243 MS (.)1243 1243 MS (.)1254 1243 MS (.)1265 1243 MS (.)1276 1243 MS (.)1287 1243 MS (.)1298 1243 MS (.)1309 1243 MS (.)1320 1243 MS (.)1331 1243 MS (.)1342 1243 MS (.)1353 1243 MS (.)1364 1243 MS +(.)1375 1243 MS (.)1386 1243 MS (.)1397 1243 MS (.)1408 1243 MS (.)1419 1243 MS (.)1430 1243 MS (.)1441 1243 MS (.)1452 1243 MS (.)1463 1243 MS (.)1474 1243 MS (.)1485 1243 MS (.)1496 1243 MS (.)1507 1243 MS (.)1518 1243 MS (.)1529 1243 MS (.)1540 1243 MS +(.)1551 1243 MS (.)1562 1243 MS (.)1573 1243 MS (.)1584 1243 MS (.)1595 1243 MS (.)1606 1243 MS (.)1617 1243 MS (.)1628 1243 MS (.)1639 1243 MS (.)1650 1243 MS (.)1661 1243 MS (.)1672 1243 MS (.)1683 1243 MS (.)1694 1243 MS (.)1705 1243 MS (.)1716 1243 MS +(.)1727 1243 MS (.)1738 1243 MS (.)1749 1243 MS (.)1760 1243 MS (.)1771 1243 MS (.)1782 1243 MS (.)1793 1243 MS (.)1804 1243 MS (.)1815 1243 MS (.)1826 1243 MS (.)1837 1243 MS (.)1848 1243 MS (.)1859 1243 MS (.)1870 1243 MS (.)1881 1243 MS (.)1892 1243 MS +(.)1903 1243 MS (.)1914 1243 MS (.)1925 1243 MS (.)1936 1243 MS (.)1947 1243 MS (.)1958 1243 MS (.)1969 1243 MS (.)1980 1243 MS (.)1991 1243 MS (.)2002 1243 MS (.)2013 1243 MS (.)2024 1243 MS (.)2035 1243 MS (.)2046 1243 MS (.)2057 1243 MS (.)2068 1243 MS +(1)2081 1243 MS (3)2102 1243 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1243 MS +[42 0 0 -42 0 0]/Times-Bold MF +(7)235 1317 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 1317 MS +[42 0 0 -42 0 0]/Times-Bold MF +(L)335 1317 MS (E)363 1317 MS ( )391 1317 MS (C)402 1317 MS (O)431 1317 MS (M)464 1317 MS (P)504 1317 MS (O)529 1317 MS (S)562 1317 MS (A)585 1317 MS (N)615 1317 MS (T)645 1317 MS ( )672 1317 MS (P)683 1317 MS (A)708 1317 MS (R)738 1317 MS +(A)768 1317 MS (L)798 1317 MS (L)826 1317 MS (E)854 1317 MS +(L)882 1317 MS (E)910 1317 MS +(.)946 1317 MS (.)957 1317 MS (.)968 1317 MS (.)979 1317 MS (.)990 1317 MS (.)1001 1317 MS (.)1012 1317 MS (.)1023 1317 MS (.)1034 1317 MS (.)1045 1317 MS (.)1056 1317 MS (.)1067 1317 MS (.)1078 1317 MS (.)1089 1317 MS (.)1100 1317 MS (.)1111 1317 MS +(.)1122 1317 MS (.)1133 1317 MS (.)1144 1317 MS (.)1155 1317 MS (.)1166 1317 MS (.)1177 1317 MS (.)1188 1317 MS (.)1199 1317 MS (.)1210 1317 MS (.)1221 1317 MS (.)1232 1317 MS (.)1243 1317 MS (.)1254 1317 MS (.)1265 1317 MS (.)1276 1317 MS (.)1287 1317 MS +(.)1298 1317 MS (.)1309 1317 MS (.)1320 1317 MS (.)1331 1317 MS (.)1342 1317 MS (.)1353 1317 MS (.)1364 1317 MS (.)1375 1317 MS (.)1386 1317 MS (.)1397 1317 MS (.)1408 1317 MS (.)1419 1317 MS (.)1430 1317 MS (.)1441 1317 MS (.)1452 1317 MS (.)1463 1317 MS +(.)1474 1317 MS (.)1485 1317 MS (.)1496 1317 MS (.)1507 1317 MS (.)1518 1317 MS (.)1529 1317 MS (.)1540 1317 MS (.)1551 1317 MS (.)1562 1317 MS (.)1573 1317 MS (.)1584 1317 MS (.)1595 1317 MS (.)1606 1317 MS (.)1617 1317 MS (.)1628 1317 MS (.)1639 1317 MS +(.)1650 1317 MS (.)1661 1317 MS (.)1672 1317 MS (.)1683 1317 MS (.)1694 1317 MS (.)1705 1317 MS (.)1716 1317 MS (.)1727 1317 MS (.)1738 1317 MS (.)1749 1317 MS (.)1760 1317 MS (.)1771 1317 MS (.)1782 1317 MS (.)1793 1317 MS (.)1804 1317 MS (.)1815 1317 MS +(.)1826 1317 MS (.)1837 1317 MS (.)1848 1317 MS (.)1859 1317 MS (.)1870 1317 MS (.)1881 1317 MS (.)1892 1317 MS (.)1903 1317 MS (.)1914 1317 MS (.)1925 1317 MS (.)1936 1317 MS (.)1947 1317 MS (.)1958 1317 MS (.)1969 1317 MS (.)1980 1317 MS (.)1991 1317 MS +(.)2002 1317 MS (.)2013 1317 MS (.)2024 1317 MS (.)2035 1317 MS (.)2046 1317 MS (.)2057 1317 MS (.)2068 1317 MS +(1)2081 1317 MS (4)2102 1317 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1317 MS +[42 0 0 -42 0 0]/Times-Bold MF +(8)235 1390 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 1390 MS +[42 0 0 -42 0 0]/Times-Bold MF +(L)335 1390 MS (A)363 1390 MS ( )393 1390 MS (D)404 1390 MS (O)434 1390 MS (N)467 1390 MS (N)497 1390 MS (E)527 1390 MS (E)555 1390 MS ( )582 1390 MS (P)593 1390 MS (A)618 1390 MS (R)648 1390 MS (A)678 1390 MS (L)708 1390 MS (L)736 1390 MS +(E)764 1390 MS (L)792 1390 MS (E)820 1390 MS +(.)847 1390 MS (.)858 1390 MS (.)869 1390 MS (.)880 1390 MS (.)891 1390 MS (.)902 1390 MS (.)913 1390 MS (.)924 1390 MS (.)935 1390 MS (.)946 1390 MS (.)957 1390 MS (.)968 1390 MS (.)979 1390 MS (.)990 1390 MS (.)1001 1390 MS (.)1012 1390 MS +(.)1023 1390 MS (.)1034 1390 MS (.)1045 1390 MS (.)1056 1390 MS (.)1067 1390 MS (.)1078 1390 MS (.)1089 1390 MS (.)1100 1390 MS (.)1111 1390 MS (.)1122 1390 MS (.)1133 1390 MS (.)1144 1390 MS (.)1155 1390 MS (.)1166 1390 MS (.)1177 1390 MS (.)1188 1390 MS +(.)1199 1390 MS (.)1210 1390 MS (.)1221 1390 MS (.)1232 1390 MS (.)1243 1390 MS (.)1254 1390 MS (.)1265 1390 MS (.)1276 1390 MS (.)1287 1390 MS (.)1298 1390 MS (.)1309 1390 MS (.)1320 1390 MS (.)1331 1390 MS (.)1342 1390 MS (.)1353 1390 MS (.)1364 1390 MS +(.)1375 1390 MS (.)1386 1390 MS (.)1397 1390 MS (.)1408 1390 MS (.)1419 1390 MS (.)1430 1390 MS (.)1441 1390 MS (.)1452 1390 MS (.)1463 1390 MS (.)1474 1390 MS (.)1485 1390 MS (.)1496 1390 MS (.)1507 1390 MS (.)1518 1390 MS (.)1529 1390 MS (.)1540 1390 MS +(.)1551 1390 MS (.)1562 1390 MS (.)1573 1390 MS (.)1584 1390 MS (.)1595 1390 MS (.)1606 1390 MS (.)1617 1390 MS (.)1628 1390 MS (.)1639 1390 MS (.)1650 1390 MS (.)1661 1390 MS (.)1672 1390 MS (.)1683 1390 MS (.)1694 1390 MS (.)1705 1390 MS (.)1716 1390 MS +(.)1727 1390 MS (.)1738 1390 MS (.)1749 1390 MS (.)1760 1390 MS (.)1771 1390 MS (.)1782 1390 MS (.)1793 1390 MS (.)1804 1390 MS (.)1815 1390 MS (.)1826 1390 MS (.)1837 1390 MS (.)1848 1390 MS (.)1859 1390 MS (.)1870 1390 MS (.)1881 1390 MS (.)1892 1390 MS +(.)1903 1390 MS (.)1914 1390 MS (.)1925 1390 MS (.)1936 1390 MS (.)1947 1390 MS (.)1958 1390 MS (.)1969 1390 MS (.)1980 1390 MS (.)1991 1390 MS (.)2002 1390 MS (.)2013 1390 MS (.)2024 1390 MS (.)2035 1390 MS (.)2046 1390 MS (.)2057 1390 MS (.)2068 1390 MS +(1)2081 1390 MS (5)2102 1390 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1390 MS +[42 0 0 -42 0 0]/Times-Bold MF +(9)235 1462 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )256 1462 MS +[42 0 0 -42 0 0]/Times-Bold MF +LATENC /_Times-Bold /Times-Bold reencode +[42 0 0 -42 0 0]/_Times-Bold MF +(C)335 1462 MS (A)365 1462 MS (S)395 1462 MS ( )418 1462 MS (D)429 1462 MS (\222)459 1462 MS (U)473 1462 MS (T)503 1462 MS (I)531 1462 MS (L)547 1462 MS (I)575 1462 MS (S)591 1462 MS (A)614 1462 MS (T)644 1462 MS (I)672 1462 MS (O)688 1462 MS +(N)721 1462 MS +(.)759 1462 MS (.)770 1462 MS (.)781 1462 MS (.)792 1462 MS (.)803 1462 MS (.)814 1462 MS (.)825 1462 MS (.)836 1462 MS (.)847 1462 MS (.)858 1462 MS (.)869 1462 MS (.)880 1462 MS (.)891 1462 MS (.)902 1462 MS (.)913 1462 MS (.)924 1462 MS +(.)935 1462 MS (.)946 1462 MS (.)957 1462 MS (.)968 1462 MS (.)979 1462 MS (.)990 1462 MS (.)1001 1462 MS (.)1012 1462 MS (.)1023 1462 MS (.)1034 1462 MS (.)1045 1462 MS (.)1056 1462 MS (.)1067 1462 MS (.)1078 1462 MS (.)1089 1462 MS (.)1100 1462 MS +(.)1111 1462 MS (.)1122 1462 MS (.)1133 1462 MS (.)1144 1462 MS (.)1155 1462 MS (.)1166 1462 MS (.)1177 1462 MS (.)1188 1462 MS (.)1199 1462 MS (.)1210 1462 MS (.)1221 1462 MS (.)1232 1462 MS (.)1243 1462 MS (.)1254 1462 MS (.)1265 1462 MS (.)1276 1462 MS +(.)1287 1462 MS (.)1298 1462 MS (.)1309 1462 MS (.)1320 1462 MS (.)1331 1462 MS (.)1342 1462 MS (.)1353 1462 MS (.)1364 1462 MS (.)1375 1462 MS (.)1386 1462 MS (.)1397 1462 MS (.)1408 1462 MS (.)1419 1462 MS (.)1430 1462 MS (.)1441 1462 MS (.)1452 1462 MS +(.)1463 1462 MS (.)1474 1462 MS (.)1485 1462 MS (.)1496 1462 MS (.)1507 1462 MS (.)1518 1462 MS (.)1529 1462 MS (.)1540 1462 MS (.)1551 1462 MS (.)1562 1462 MS (.)1573 1462 MS (.)1584 1462 MS (.)1595 1462 MS (.)1606 1462 MS (.)1617 1462 MS (.)1628 1462 MS +(.)1639 1462 MS (.)1650 1462 MS (.)1661 1462 MS (.)1672 1462 MS (.)1683 1462 MS (.)1694 1462 MS (.)1705 1462 MS (.)1716 1462 MS (.)1727 1462 MS (.)1738 1462 MS (.)1749 1462 MS (.)1760 1462 MS (.)1771 1462 MS (.)1782 1462 MS (.)1793 1462 MS (.)1804 1462 MS +(.)1815 1462 MS (.)1826 1462 MS (.)1837 1462 MS (.)1848 1462 MS (.)1859 1462 MS (.)1870 1462 MS (.)1881 1462 MS (.)1892 1462 MS (.)1903 1462 MS (.)1914 1462 MS (.)1925 1462 MS (.)1936 1462 MS (.)1947 1462 MS (.)1958 1462 MS (.)1969 1462 MS (.)1980 1462 MS +(.)1991 1462 MS (.)2002 1462 MS (.)2013 1462 MS (.)2024 1462 MS (.)2035 1462 MS (.)2046 1462 MS (.)2057 1462 MS (.)2068 1462 MS +(1)2081 1462 MS (6)2102 1462 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1462 MS +[42 0 0 -42 0 0]/Times-Roman MF +(9)285 1534 MS (.)306 1534 MS (1)317 1534 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )337 1534 MS +[42 0 0 -42 0 0]/Times-Roman MF +(L)435 1534 MS +[33 0 0 -33 0 0]/Times-Roman MF +(E)460 1534 MS ( )480 1534 MS (C)488 1534 MS (O)510 1534 MS (M)535 1534 MS (P)565 1534 MS (O)583 1534 MS (S)607 1534 MS (A)626 1534 MS (N)649 1534 MS (T)673 1534 MS ( )694 1534 MS (E)702 1534 MS (T)722 1534 MS ( )743 1534 MS (L)751 1534 MS +(A)772 1534 MS ( )796 1534 MS (D)804 1534 MS (O)828 1534 MS +(N)852 1534 MS (N)876 1534 MS (E)900 1534 MS (E)921 1534 MS ( )941 1534 MS (V)950 1534 MS (E)974 1534 MS (C)994 1534 MS (T)1016 1534 MS (E)1037 1534 MS (U)1058 1534 MS (R)1081 1534 MS ( )1103 1534 MS (P)1112 1534 MS (A)1131 1534 MS (R)1154 1534 MS +(A)1177 1534 MS (L)1200 1534 MS (L)1221 1534 MS (E)1241 1534 MS +(L)1262 1534 MS (E)1282 1534 MS +[42 0 0 -42 0 0]/Times-Roman MF +(.)1309 1534 MS (.)1320 1534 MS (.)1331 1534 MS (.)1342 1534 MS (.)1353 1534 MS (.)1364 1534 MS (.)1375 1534 MS (.)1386 1534 MS (.)1397 1534 MS (.)1408 1534 MS (.)1419 1534 MS (.)1430 1534 MS (.)1441 1534 MS (.)1452 1534 MS (.)1463 1534 MS (.)1474 1534 MS +(.)1485 1534 MS (.)1496 1534 MS (.)1507 1534 MS (.)1518 1534 MS (.)1529 1534 MS (.)1540 1534 MS (.)1551 1534 MS (.)1562 1534 MS (.)1573 1534 MS (.)1584 1534 MS (.)1595 1534 MS (.)1606 1534 MS (.)1617 1534 MS (.)1628 1534 MS (.)1639 1534 MS (.)1650 1534 MS +(.)1661 1534 MS (.)1672 1534 MS (.)1683 1534 MS (.)1694 1534 MS (.)1705 1534 MS (.)1716 1534 MS (.)1727 1534 MS (.)1738 1534 MS (.)1749 1534 MS (.)1760 1534 MS (.)1771 1534 MS (.)1782 1534 MS (.)1793 1534 MS (.)1804 1534 MS (.)1815 1534 MS (.)1826 1534 MS +(.)1837 1534 MS (.)1848 1534 MS (.)1859 1534 MS (.)1870 1534 MS (.)1881 1534 MS (.)1892 1534 MS (.)1903 1534 MS (.)1914 1534 MS (.)1925 1534 MS (.)1936 1534 MS (.)1947 1534 MS (.)1958 1534 MS (.)1969 1534 MS (.)1980 1534 MS (.)1991 1534 MS (.)2002 1534 MS +(.)2013 1534 MS (.)2024 1534 MS (.)2035 1534 MS (.)2046 1534 MS (.)2057 1534 MS (.)2068 1534 MS +(1)2081 1534 MS (7)2102 1534 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1534 MS +%%IncludeFont: Times-Italic +[42 0 0 -42 0 0]/Times-Italic MF +(9)335 1582 MS (.)356 1582 MS (1)367 1582 MS (.)387 1582 MS (1)398 1582 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )418 1582 MS +[42 0 0 -42 0 0]/Times-Italic MF +LATENC /_Times-Italic /Times-Italic reencode +[42 0 0 -42 0 0]/_Times-Italic MF +(D)485 1582 MS (\351)515 1582 MS (f)534 1582 MS (i)546 1582 MS (n)558 1582 MS (i)578 1582 MS (t)590 1582 MS (i)601 1582 MS (o)613 1582 MS (n)634 1582 MS ( )654 1582 MS (d)665 1582 MS (e)686 1582 MS ( )704 1582 MS (l)715 1582 MS (\222)727 1582 MS +(i)740 1582 MS (n)752 1582 MS (t)773 1582 MS (e)784 1582 MS (r)803 1582 MS (f)819 1582 MS (a)831 1582 MS (c)851 1582 MS (e)870 1582 MS ( )888 1582 MS (C)899 1582 MS (O)927 1582 MS (R)956 1582 MS +(B)982 1582 MS (A)1007 1582 MS +(.)1034 1582 MS (.)1045 1582 MS (.)1056 1582 MS (.)1067 1582 MS (.)1078 1582 MS (.)1089 1582 MS (.)1100 1582 MS (.)1111 1582 MS (.)1122 1582 MS (.)1133 1582 MS (.)1144 1582 MS (.)1155 1582 MS (.)1166 1582 MS (.)1177 1582 MS (.)1188 1582 MS (.)1199 1582 MS +(.)1210 1582 MS (.)1221 1582 MS (.)1232 1582 MS (.)1243 1582 MS (.)1254 1582 MS (.)1265 1582 MS (.)1276 1582 MS (.)1287 1582 MS (.)1298 1582 MS (.)1309 1582 MS (.)1320 1582 MS (.)1331 1582 MS (.)1342 1582 MS (.)1353 1582 MS (.)1364 1582 MS (.)1375 1582 MS +(.)1386 1582 MS (.)1397 1582 MS (.)1408 1582 MS (.)1419 1582 MS (.)1430 1582 MS (.)1441 1582 MS (.)1452 1582 MS (.)1463 1582 MS (.)1474 1582 MS (.)1485 1582 MS (.)1496 1582 MS (.)1507 1582 MS (.)1518 1582 MS (.)1529 1582 MS (.)1540 1582 MS (.)1551 1582 MS +(.)1562 1582 MS (.)1573 1582 MS (.)1584 1582 MS (.)1595 1582 MS (.)1606 1582 MS (.)1617 1582 MS (.)1628 1582 MS (.)1639 1582 MS (.)1650 1582 MS (.)1661 1582 MS (.)1672 1582 MS (.)1683 1582 MS (.)1694 1582 MS (.)1705 1582 MS (.)1716 1582 MS (.)1727 1582 MS +(.)1738 1582 MS (.)1749 1582 MS (.)1760 1582 MS (.)1771 1582 MS (.)1782 1582 MS (.)1793 1582 MS (.)1804 1582 MS (.)1815 1582 MS (.)1826 1582 MS (.)1837 1582 MS (.)1848 1582 MS (.)1859 1582 MS (.)1870 1582 MS (.)1881 1582 MS (.)1892 1582 MS (.)1903 1582 MS +(.)1914 1582 MS (.)1925 1582 MS (.)1936 1582 MS (.)1947 1582 MS (.)1958 1582 MS (.)1969 1582 MS (.)1980 1582 MS (.)1991 1582 MS (.)2002 1582 MS (.)2013 1582 MS (.)2024 1582 MS (.)2035 1582 MS (.)2046 1582 MS (.)2057 1582 MS (.)2068 1582 MS +(1)2081 1582 MS (7)2102 1582 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1582 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(9)335 1630 MS (.)356 1630 MS (1)367 1630 MS (.)387 1630 MS (2)398 1630 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )418 1630 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(D)485 1630 MS (\351)515 1630 MS (f)534 1630 MS (i)546 1630 MS (n)558 1630 MS (i)578 1630 MS (t)590 1630 MS (i)601 1630 MS (o)613 1630 MS (n)634 1630 MS ( )654 1630 MS (d)665 1630 MS (e)686 1630 MS ( )704 1630 MS (l)715 1630 MS (\222)727 1630 MS +(i)740 1630 MS (m)752 1630 MS (p)782 1630 MS (l)803 1630 MS (\351)814 1630 MS (m)833 1630 MS (e)863 1630 MS (n)881 1630 MS (t)902 1630 MS (a)914 1630 MS (t)934 1630 MS (i)946 1630 MS (o)958 1630 MS (n)979 1630 MS +(.)1001 1630 MS (.)1012 1630 MS (.)1023 1630 MS (.)1034 1630 MS (.)1045 1630 MS (.)1056 1630 MS (.)1067 1630 MS (.)1078 1630 MS (.)1089 1630 MS (.)1100 1630 MS (.)1111 1630 MS (.)1122 1630 MS (.)1133 1630 MS (.)1144 1630 MS (.)1155 1630 MS (.)1166 1630 MS +(.)1177 1630 MS (.)1188 1630 MS (.)1199 1630 MS (.)1210 1630 MS (.)1221 1630 MS (.)1232 1630 MS (.)1243 1630 MS (.)1254 1630 MS (.)1265 1630 MS (.)1276 1630 MS (.)1287 1630 MS (.)1298 1630 MS (.)1309 1630 MS (.)1320 1630 MS (.)1331 1630 MS (.)1342 1630 MS +(.)1353 1630 MS (.)1364 1630 MS (.)1375 1630 MS (.)1386 1630 MS (.)1397 1630 MS (.)1408 1630 MS (.)1419 1630 MS (.)1430 1630 MS (.)1441 1630 MS (.)1452 1630 MS (.)1463 1630 MS (.)1474 1630 MS (.)1485 1630 MS (.)1496 1630 MS (.)1507 1630 MS (.)1518 1630 MS +(.)1529 1630 MS (.)1540 1630 MS (.)1551 1630 MS (.)1562 1630 MS (.)1573 1630 MS (.)1584 1630 MS (.)1595 1630 MS (.)1606 1630 MS (.)1617 1630 MS (.)1628 1630 MS (.)1639 1630 MS (.)1650 1630 MS (.)1661 1630 MS (.)1672 1630 MS (.)1683 1630 MS (.)1694 1630 MS +(.)1705 1630 MS (.)1716 1630 MS (.)1727 1630 MS (.)1738 1630 MS (.)1749 1630 MS (.)1760 1630 MS (.)1771 1630 MS (.)1782 1630 MS (.)1793 1630 MS (.)1804 1630 MS (.)1815 1630 MS (.)1826 1630 MS (.)1837 1630 MS (.)1848 1630 MS (.)1859 1630 MS (.)1870 1630 MS +(.)1881 1630 MS (.)1892 1630 MS (.)1903 1630 MS (.)1914 1630 MS (.)1925 1630 MS (.)1936 1630 MS (.)1947 1630 MS (.)1958 1630 MS (.)1969 1630 MS (.)1980 1630 MS (.)1991 1630 MS (.)2002 1630 MS (.)2013 1630 MS (.)2024 1630 MS (.)2035 1630 MS (.)2046 1630 MS +(.)2057 1630 MS (.)2068 1630 MS +(1)2081 1630 MS (9)2102 1630 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1630 MS +[42 0 0 -42 0 0]/Times-Roman MF +(9)285 1678 MS (.)306 1678 MS (2)317 1678 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )337 1678 MS +[42 0 0 -42 0 0]/Times-Roman MF +(L)435 1678 MS +[33 0 0 -33 0 0]/Times-Roman MF +(E)460 1678 MS ( )480 1678 MS (C)488 1678 MS (O)510 1678 MS (M)535 1678 MS (P)565 1678 MS (O)583 1678 MS (S)607 1678 MS (A)626 1678 MS (N)649 1678 MS (T)673 1678 MS ( )694 1678 MS (E)702 1678 MS (T)722 1678 MS ( )743 1678 MS (L)751 1678 MS +(A)772 1678 MS ( )796 1678 MS (D)804 1678 MS (O)828 1678 MS +(N)852 1678 MS (N)876 1678 MS (E)900 1678 MS (E)921 1678 MS ( )941 1678 MS (M)950 1678 MS (A)980 1678 MS (T)1003 1678 MS (R)1024 1678 MS (I)1046 1678 MS (C)1057 1678 MS (E)1079 1678 MS ( )1099 1678 MS (P)1108 1678 MS (A)1127 1678 MS (R)1150 1678 MS +(A)1173 1678 MS (L)1197 1678 MS (L)1217 1678 MS (E)1237 1678 MS +(L)1258 1678 MS (E)1278 1678 MS +[42 0 0 -42 0 0]/Times-Roman MF +(.)1309 1678 MS (.)1320 1678 MS (.)1331 1678 MS (.)1342 1678 MS (.)1353 1678 MS (.)1364 1678 MS (.)1375 1678 MS (.)1386 1678 MS (.)1397 1678 MS (.)1408 1678 MS (.)1419 1678 MS (.)1430 1678 MS (.)1441 1678 MS (.)1452 1678 MS (.)1463 1678 MS (.)1474 1678 MS +(.)1485 1678 MS (.)1496 1678 MS (.)1507 1678 MS (.)1518 1678 MS (.)1529 1678 MS (.)1540 1678 MS (.)1551 1678 MS (.)1562 1678 MS (.)1573 1678 MS (.)1584 1678 MS (.)1595 1678 MS (.)1606 1678 MS (.)1617 1678 MS (.)1628 1678 MS (.)1639 1678 MS (.)1650 1678 MS +(.)1661 1678 MS (.)1672 1678 MS (.)1683 1678 MS (.)1694 1678 MS (.)1705 1678 MS (.)1716 1678 MS (.)1727 1678 MS (.)1738 1678 MS (.)1749 1678 MS (.)1760 1678 MS (.)1771 1678 MS (.)1782 1678 MS (.)1793 1678 MS (.)1804 1678 MS (.)1815 1678 MS (.)1826 1678 MS +(.)1837 1678 MS (.)1848 1678 MS (.)1859 1678 MS (.)1870 1678 MS (.)1881 1678 MS (.)1892 1678 MS (.)1903 1678 MS (.)1914 1678 MS (.)1925 1678 MS (.)1936 1678 MS (.)1947 1678 MS (.)1958 1678 MS (.)1969 1678 MS (.)1980 1678 MS (.)1991 1678 MS (.)2002 1678 MS +(.)2013 1678 MS (.)2024 1678 MS (.)2035 1678 MS (.)2046 1678 MS (.)2057 1678 MS (.)2068 1678 MS +(2)2081 1678 MS (1)2102 1678 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1678 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(9)335 1726 MS (.)356 1726 MS (2)367 1726 MS (.)387 1726 MS (1)398 1726 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )418 1726 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(D)485 1726 MS (\351)515 1726 MS (f)534 1726 MS (i)546 1726 MS (n)558 1726 MS (i)578 1726 MS (t)590 1726 MS (i)601 1726 MS (o)613 1726 MS (n)634 1726 MS ( )654 1726 MS (d)665 1726 MS (e)686 1726 MS ( )704 1726 MS (l)715 1726 MS (\222)727 1726 MS +(i)740 1726 MS (n)752 1726 MS (t)773 1726 MS (e)784 1726 MS (r)803 1726 MS (f)819 1726 MS (a)831 1726 MS (c)851 1726 MS (e)870 1726 MS ( )888 1726 MS (C)899 1726 MS (O)927 1726 MS (R)956 1726 MS (B)982 1726 MS (A)1007 1726 MS +(.)1034 1726 MS (.)1045 1726 MS (.)1056 1726 MS (.)1067 1726 MS (.)1078 1726 MS (.)1089 1726 MS (.)1100 1726 MS (.)1111 1726 MS (.)1122 1726 MS (.)1133 1726 MS (.)1144 1726 MS (.)1155 1726 MS (.)1166 1726 MS (.)1177 1726 MS (.)1188 1726 MS (.)1199 1726 MS +(.)1210 1726 MS (.)1221 1726 MS (.)1232 1726 MS (.)1243 1726 MS (.)1254 1726 MS (.)1265 1726 MS (.)1276 1726 MS (.)1287 1726 MS (.)1298 1726 MS (.)1309 1726 MS (.)1320 1726 MS (.)1331 1726 MS (.)1342 1726 MS (.)1353 1726 MS (.)1364 1726 MS (.)1375 1726 MS +(.)1386 1726 MS (.)1397 1726 MS (.)1408 1726 MS (.)1419 1726 MS (.)1430 1726 MS (.)1441 1726 MS (.)1452 1726 MS (.)1463 1726 MS (.)1474 1726 MS (.)1485 1726 MS (.)1496 1726 MS (.)1507 1726 MS (.)1518 1726 MS (.)1529 1726 MS (.)1540 1726 MS (.)1551 1726 MS +(.)1562 1726 MS (.)1573 1726 MS (.)1584 1726 MS (.)1595 1726 MS (.)1606 1726 MS (.)1617 1726 MS (.)1628 1726 MS (.)1639 1726 MS (.)1650 1726 MS (.)1661 1726 MS (.)1672 1726 MS (.)1683 1726 MS (.)1694 1726 MS (.)1705 1726 MS (.)1716 1726 MS (.)1727 1726 MS +(.)1738 1726 MS (.)1749 1726 MS (.)1760 1726 MS (.)1771 1726 MS (.)1782 1726 MS (.)1793 1726 MS (.)1804 1726 MS (.)1815 1726 MS (.)1826 1726 MS (.)1837 1726 MS (.)1848 1726 MS (.)1859 1726 MS (.)1870 1726 MS (.)1881 1726 MS (.)1892 1726 MS (.)1903 1726 MS +(.)1914 1726 MS (.)1925 1726 MS (.)1936 1726 MS (.)1947 1726 MS (.)1958 1726 MS (.)1969 1726 MS (.)1980 1726 MS (.)1991 1726 MS (.)2002 1726 MS (.)2013 1726 MS (.)2024 1726 MS (.)2035 1726 MS (.)2046 1726 MS (.)2057 1726 MS (.)2068 1726 MS +(2)2081 1726 MS (1)2102 1726 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1726 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(9)335 1774 MS (.)356 1774 MS (2)367 1774 MS (.)387 1774 MS (2)398 1774 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )418 1774 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(D)485 1774 MS (\351)515 1774 MS (f)534 1774 MS (i)546 1774 MS (n)558 1774 MS (i)578 1774 MS (t)590 1774 MS (i)601 1774 MS (o)613 1774 MS (n)634 1774 MS ( )654 1774 MS (d)665 1774 MS (e)686 1774 MS ( )704 1774 MS (l)715 1774 MS (\222)727 1774 MS +(i)740 1774 MS (m)752 1774 MS (p)782 1774 MS (l)803 1774 MS (\351)814 1774 MS (m)833 1774 MS (e)863 1774 MS (n)881 1774 MS (t)902 1774 MS (a)914 1774 MS (t)934 1774 MS (i)946 1774 MS (o)958 1774 MS (n)979 1774 MS +(.)1001 1774 MS (.)1012 1774 MS (.)1023 1774 MS (.)1034 1774 MS (.)1045 1774 MS (.)1056 1774 MS (.)1067 1774 MS (.)1078 1774 MS (.)1089 1774 MS (.)1100 1774 MS (.)1111 1774 MS (.)1122 1774 MS (.)1133 1774 MS (.)1144 1774 MS (.)1155 1774 MS (.)1166 1774 MS +(.)1177 1774 MS (.)1188 1774 MS (.)1199 1774 MS (.)1210 1774 MS (.)1221 1774 MS (.)1232 1774 MS (.)1243 1774 MS (.)1254 1774 MS (.)1265 1774 MS (.)1276 1774 MS (.)1287 1774 MS (.)1298 1774 MS (.)1309 1774 MS (.)1320 1774 MS (.)1331 1774 MS (.)1342 1774 MS +(.)1353 1774 MS (.)1364 1774 MS (.)1375 1774 MS (.)1386 1774 MS (.)1397 1774 MS (.)1408 1774 MS (.)1419 1774 MS (.)1430 1774 MS (.)1441 1774 MS (.)1452 1774 MS (.)1463 1774 MS (.)1474 1774 MS (.)1485 1774 MS (.)1496 1774 MS (.)1507 1774 MS (.)1518 1774 MS +(.)1529 1774 MS (.)1540 1774 MS (.)1551 1774 MS (.)1562 1774 MS (.)1573 1774 MS (.)1584 1774 MS (.)1595 1774 MS (.)1606 1774 MS (.)1617 1774 MS (.)1628 1774 MS (.)1639 1774 MS (.)1650 1774 MS (.)1661 1774 MS (.)1672 1774 MS (.)1683 1774 MS (.)1694 1774 MS +(.)1705 1774 MS (.)1716 1774 MS (.)1727 1774 MS (.)1738 1774 MS (.)1749 1774 MS (.)1760 1774 MS (.)1771 1774 MS (.)1782 1774 MS (.)1793 1774 MS (.)1804 1774 MS (.)1815 1774 MS (.)1826 1774 MS (.)1837 1774 MS (.)1848 1774 MS (.)1859 1774 MS (.)1870 1774 MS +(.)1881 1774 MS (.)1892 1774 MS (.)1903 1774 MS (.)1914 1774 MS (.)1925 1774 MS (.)1936 1774 MS (.)1947 1774 MS (.)1958 1774 MS (.)1969 1774 MS (.)1980 1774 MS (.)1991 1774 MS (.)2002 1774 MS (.)2013 1774 MS (.)2024 1774 MS (.)2035 1774 MS (.)2046 1774 MS +(.)2057 1774 MS (.)2068 1774 MS +(2)2081 1774 MS (3)2102 1774 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1774 MS +[42 0 0 -42 0 0]/Times-Roman MF +(9)285 1822 MS (.)306 1822 MS (3)317 1822 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )337 1822 MS +[42 0 0 -42 0 0]/Times-Roman MF +(L)435 1822 MS +[33 0 0 -33 0 0]/Times-Roman MF +(E)460 1822 MS ( )480 1822 MS (C)488 1822 MS (O)510 1822 MS (M)535 1822 MS (P)565 1822 MS (O)583 1822 MS (S)607 1822 MS (A)626 1822 MS (N)649 1822 MS (T)673 1822 MS ( )694 1822 MS (S)703 1822 MS (O)721 1822 MS (L)745 1822 MS (V)766 1822 MS +(E)789 1822 MS (U)810 1822 MS (R)834 1822 MS +( )856 1822 MS (E)864 1822 MS (T)884 1822 MS ( )905 1822 MS (L)913 1822 MS (A)934 1822 MS ( )958 1822 MS (D)966 1822 MS (O)990 1822 MS (N)1014 1822 MS (N)1038 1822 MS (E)1062 1822 MS (E)1083 1822 MS ( )1103 1822 MS (V)1112 1822 MS (E)1136 1822 MS +(C)1156 1822 MS (T)1178 1822 MS (E)1199 1822 MS (U)1220 1822 MS +(R)1243 1822 MS ( )1265 1822 MS (R)1273 1822 MS (E)1296 1822 MS (S)1316 1822 MS (U)1335 1822 MS (L)1359 1822 MS (T)1379 1822 MS (A)1400 1822 MS (T)1423 1822 MS ( )1444 1822 MS (P)1453 1822 MS (A)1472 1822 MS (R)1495 1822 MS (A)1518 1822 MS (L)1541 1822 MS +(L)1562 1822 MS (E)1582 1822 MS (L)1602 1822 MS (E)1623 1822 MS +[42 0 0 -42 0 0]/Times-Roman MF +(.)1650 1822 MS (.)1661 1822 MS (.)1672 1822 MS (.)1683 1822 MS (.)1694 1822 MS (.)1705 1822 MS (.)1716 1822 MS (.)1727 1822 MS (.)1738 1822 MS (.)1749 1822 MS (.)1760 1822 MS (.)1771 1822 MS (.)1782 1822 MS (.)1793 1822 MS (.)1804 1822 MS (.)1815 1822 MS +(.)1826 1822 MS (.)1837 1822 MS (.)1848 1822 MS (.)1859 1822 MS (.)1870 1822 MS (.)1881 1822 MS (.)1892 1822 MS (.)1903 1822 MS (.)1914 1822 MS (.)1925 1822 MS (.)1936 1822 MS (.)1947 1822 MS (.)1958 1822 MS (.)1969 1822 MS (.)1980 1822 MS (.)1991 1822 MS +(.)2002 1822 MS (.)2013 1822 MS (.)2024 1822 MS (.)2035 1822 MS (.)2046 1822 MS (.)2057 1822 MS (.)2068 1822 MS +(2)2081 1822 MS (5)2102 1822 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1822 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(9)335 1870 MS (.)356 1870 MS (3)367 1870 MS (.)387 1870 MS (1)398 1870 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )418 1870 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(D)485 1870 MS (\351)515 1870 MS (f)534 1870 MS (i)546 1870 MS (n)558 1870 MS (i)578 1870 MS (t)590 1870 MS (i)601 1870 MS (o)613 1870 MS (n)634 1870 MS ( )654 1870 MS (d)665 1870 MS (e)686 1870 MS ( )704 1870 MS (l)715 1870 MS (\222)727 1870 MS +(i)740 1870 MS (n)752 1870 MS (t)773 1870 MS (e)784 1870 MS (r)803 1870 MS (f)819 1870 MS (a)831 1870 MS (c)851 1870 MS (e)870 1870 MS ( )888 1870 MS (C)899 1870 MS (O)927 1870 MS (R)956 1870 MS (B)982 1870 MS (A)1007 1870 MS +(.)1034 1870 MS (.)1045 1870 MS (.)1056 1870 MS (.)1067 1870 MS (.)1078 1870 MS (.)1089 1870 MS (.)1100 1870 MS (.)1111 1870 MS (.)1122 1870 MS (.)1133 1870 MS (.)1144 1870 MS (.)1155 1870 MS (.)1166 1870 MS (.)1177 1870 MS (.)1188 1870 MS (.)1199 1870 MS +(.)1210 1870 MS (.)1221 1870 MS (.)1232 1870 MS (.)1243 1870 MS (.)1254 1870 MS (.)1265 1870 MS (.)1276 1870 MS (.)1287 1870 MS (.)1298 1870 MS (.)1309 1870 MS (.)1320 1870 MS (.)1331 1870 MS (.)1342 1870 MS (.)1353 1870 MS (.)1364 1870 MS (.)1375 1870 MS +(.)1386 1870 MS (.)1397 1870 MS (.)1408 1870 MS (.)1419 1870 MS (.)1430 1870 MS (.)1441 1870 MS (.)1452 1870 MS (.)1463 1870 MS (.)1474 1870 MS (.)1485 1870 MS (.)1496 1870 MS (.)1507 1870 MS (.)1518 1870 MS (.)1529 1870 MS (.)1540 1870 MS (.)1551 1870 MS +(.)1562 1870 MS (.)1573 1870 MS (.)1584 1870 MS (.)1595 1870 MS (.)1606 1870 MS (.)1617 1870 MS (.)1628 1870 MS (.)1639 1870 MS (.)1650 1870 MS (.)1661 1870 MS (.)1672 1870 MS (.)1683 1870 MS (.)1694 1870 MS (.)1705 1870 MS (.)1716 1870 MS (.)1727 1870 MS +(.)1738 1870 MS (.)1749 1870 MS (.)1760 1870 MS (.)1771 1870 MS (.)1782 1870 MS (.)1793 1870 MS (.)1804 1870 MS (.)1815 1870 MS (.)1826 1870 MS (.)1837 1870 MS (.)1848 1870 MS (.)1859 1870 MS (.)1870 1870 MS (.)1881 1870 MS (.)1892 1870 MS (.)1903 1870 MS +(.)1914 1870 MS (.)1925 1870 MS (.)1936 1870 MS (.)1947 1870 MS (.)1958 1870 MS (.)1969 1870 MS (.)1980 1870 MS (.)1991 1870 MS (.)2002 1870 MS (.)2013 1870 MS (.)2024 1870 MS (.)2035 1870 MS (.)2046 1870 MS (.)2057 1870 MS (.)2068 1870 MS +(2)2081 1870 MS (5)2102 1870 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1870 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(9)335 1918 MS (.)356 1918 MS (3)367 1918 MS (.)387 1918 MS (2)398 1918 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )418 1918 MS +[42 0 0 -42 0 0]/_Times-Italic MF +(D)485 1918 MS (\351)515 1918 MS (f)534 1918 MS (i)546 1918 MS (n)558 1918 MS (i)578 1918 MS (t)590 1918 MS (i)601 1918 MS (o)613 1918 MS (n)634 1918 MS ( )654 1918 MS (d)665 1918 MS (e)686 1918 MS ( )704 1918 MS (l)715 1918 MS (\222)727 1918 MS +(i)740 1918 MS (m)752 1918 MS (p)782 1918 MS (l)803 1918 MS (\351)814 1918 MS (m)833 1918 MS (e)863 1918 MS (n)881 1918 MS (t)902 1918 MS (a)914 1918 MS (t)934 1918 MS (i)946 1918 MS (o)958 1918 MS (n)979 1918 MS +(.)1001 1918 MS (.)1012 1918 MS (.)1023 1918 MS (.)1034 1918 MS (.)1045 1918 MS (.)1056 1918 MS (.)1067 1918 MS (.)1078 1918 MS (.)1089 1918 MS (.)1100 1918 MS (.)1111 1918 MS (.)1122 1918 MS (.)1133 1918 MS (.)1144 1918 MS (.)1155 1918 MS (.)1166 1918 MS +(.)1177 1918 MS (.)1188 1918 MS (.)1199 1918 MS (.)1210 1918 MS (.)1221 1918 MS (.)1232 1918 MS (.)1243 1918 MS (.)1254 1918 MS (.)1265 1918 MS (.)1276 1918 MS (.)1287 1918 MS (.)1298 1918 MS (.)1309 1918 MS (.)1320 1918 MS (.)1331 1918 MS (.)1342 1918 MS +(.)1353 1918 MS (.)1364 1918 MS (.)1375 1918 MS (.)1386 1918 MS (.)1397 1918 MS (.)1408 1918 MS (.)1419 1918 MS (.)1430 1918 MS (.)1441 1918 MS (.)1452 1918 MS (.)1463 1918 MS (.)1474 1918 MS (.)1485 1918 MS (.)1496 1918 MS (.)1507 1918 MS (.)1518 1918 MS +(.)1529 1918 MS (.)1540 1918 MS (.)1551 1918 MS (.)1562 1918 MS (.)1573 1918 MS (.)1584 1918 MS (.)1595 1918 MS (.)1606 1918 MS (.)1617 1918 MS (.)1628 1918 MS (.)1639 1918 MS (.)1650 1918 MS (.)1661 1918 MS (.)1672 1918 MS (.)1683 1918 MS (.)1694 1918 MS +(.)1705 1918 MS (.)1716 1918 MS (.)1727 1918 MS (.)1738 1918 MS (.)1749 1918 MS (.)1760 1918 MS (.)1771 1918 MS (.)1782 1918 MS (.)1793 1918 MS (.)1804 1918 MS (.)1815 1918 MS (.)1826 1918 MS (.)1837 1918 MS (.)1848 1918 MS (.)1859 1918 MS (.)1870 1918 MS +(.)1881 1918 MS (.)1892 1918 MS (.)1903 1918 MS (.)1914 1918 MS (.)1925 1918 MS (.)1936 1918 MS (.)1947 1918 MS (.)1958 1918 MS (.)1969 1918 MS (.)1980 1918 MS (.)1991 1918 MS (.)2002 1918 MS (.)2013 1918 MS (.)2024 1918 MS (.)2035 1918 MS (.)2046 1918 MS +(.)2057 1918 MS (.)2068 1918 MS +(2)2081 1918 MS (6)2102 1918 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1918 MS +[42 0 0 -42 0 0]/Times-Roman MF +(9)285 1966 MS (.)306 1966 MS (4)317 1966 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )337 1966 MS +[42 0 0 -42 0 0]/Times-Roman MF +(C)435 1966 MS +[33 0 0 -33 0 0]/Times-Roman MF +(A)463 1966 MS (S)486 1966 MS ( )505 1966 MS (T)513 1966 MS (E)534 1966 MS (S)554 1966 MS (T)572 1966 MS +[42 0 0 -42 0 0]/Times-Roman MF +(.)594 1966 MS (.)605 1966 MS (.)616 1966 MS (.)627 1966 MS (.)638 1966 MS (.)649 1966 MS (.)660 1966 MS (.)671 1966 MS (.)682 1966 MS (.)693 1966 MS (.)704 1966 MS (.)715 1966 MS (.)726 1966 MS (.)737 1966 MS (.)748 1966 MS (.)759 1966 MS +(.)770 1966 MS (.)781 1966 MS (.)792 1966 MS (.)803 1966 MS (.)814 1966 MS (.)825 1966 MS (.)836 1966 MS (.)847 1966 MS (.)858 1966 MS (.)869 1966 MS (.)880 1966 MS (.)891 1966 MS (.)902 1966 MS (.)913 1966 MS (.)924 1966 MS (.)935 1966 MS +(.)946 1966 MS (.)957 1966 MS (.)968 1966 MS (.)979 1966 MS (.)990 1966 MS (.)1001 1966 MS (.)1012 1966 MS (.)1023 1966 MS (.)1034 1966 MS (.)1045 1966 MS (.)1056 1966 MS (.)1067 1966 MS (.)1078 1966 MS (.)1089 1966 MS (.)1100 1966 MS (.)1111 1966 MS +(.)1122 1966 MS (.)1133 1966 MS (.)1144 1966 MS (.)1155 1966 MS (.)1166 1966 MS (.)1177 1966 MS (.)1188 1966 MS (.)1199 1966 MS (.)1210 1966 MS (.)1221 1966 MS (.)1232 1966 MS (.)1243 1966 MS (.)1254 1966 MS (.)1265 1966 MS (.)1276 1966 MS (.)1287 1966 MS +(.)1298 1966 MS (.)1309 1966 MS (.)1320 1966 MS (.)1331 1966 MS (.)1342 1966 MS (.)1353 1966 MS (.)1364 1966 MS (.)1375 1966 MS (.)1386 1966 MS (.)1397 1966 MS (.)1408 1966 MS (.)1419 1966 MS (.)1430 1966 MS (.)1441 1966 MS (.)1452 1966 MS (.)1463 1966 MS +(.)1474 1966 MS (.)1485 1966 MS (.)1496 1966 MS (.)1507 1966 MS (.)1518 1966 MS (.)1529 1966 MS (.)1540 1966 MS (.)1551 1966 MS (.)1562 1966 MS (.)1573 1966 MS (.)1584 1966 MS (.)1595 1966 MS (.)1606 1966 MS (.)1617 1966 MS (.)1628 1966 MS (.)1639 1966 MS +(.)1650 1966 MS (.)1661 1966 MS (.)1672 1966 MS (.)1683 1966 MS (.)1694 1966 MS (.)1705 1966 MS (.)1716 1966 MS (.)1727 1966 MS (.)1738 1966 MS (.)1749 1966 MS (.)1760 1966 MS (.)1771 1966 MS (.)1782 1966 MS (.)1793 1966 MS (.)1804 1966 MS (.)1815 1966 MS +(.)1826 1966 MS (.)1837 1966 MS (.)1848 1966 MS (.)1859 1966 MS (.)1870 1966 MS (.)1881 1966 MS (.)1892 1966 MS (.)1903 1966 MS (.)1914 1966 MS (.)1925 1966 MS (.)1936 1966 MS (.)1947 1966 MS (.)1958 1966 MS (.)1969 1966 MS (.)1980 1966 MS (.)1991 1966 MS +(.)2002 1966 MS (.)2013 1966 MS (.)2024 1966 MS (.)2035 1966 MS (.)2046 1966 MS (.)2057 1966 MS (.)2068 1966 MS +(2)2081 1966 MS (8)2102 1966 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 1966 MS +[42 0 0 -42 0 0]/Times-Bold MF +(1)235 2039 MS (0)256 2039 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )277 2039 MS +[42 0 0 -42 0 0]/Times-Bold MF +(C)335 2039 MS (O)365 2039 MS (N)398 2039 MS (C)428 2039 MS (L)458 2039 MS (U)486 2039 MS (S)516 2039 MS (I)539 2039 MS (O)555 2039 MS (N)588 2039 MS +(.)627 2039 MS (.)638 2039 MS (.)649 2039 MS (.)660 2039 MS (.)671 2039 MS (.)682 2039 MS (.)693 2039 MS (.)704 2039 MS (.)715 2039 MS (.)726 2039 MS (.)737 2039 MS (.)748 2039 MS (.)759 2039 MS (.)770 2039 MS (.)781 2039 MS (.)792 2039 MS +(.)803 2039 MS (.)814 2039 MS (.)825 2039 MS (.)836 2039 MS (.)847 2039 MS (.)858 2039 MS (.)869 2039 MS (.)880 2039 MS (.)891 2039 MS (.)902 2039 MS (.)913 2039 MS (.)924 2039 MS (.)935 2039 MS (.)946 2039 MS (.)957 2039 MS (.)968 2039 MS +(.)979 2039 MS (.)990 2039 MS (.)1001 2039 MS (.)1012 2039 MS (.)1023 2039 MS (.)1034 2039 MS (.)1045 2039 MS (.)1056 2039 MS (.)1067 2039 MS (.)1078 2039 MS (.)1089 2039 MS (.)1100 2039 MS (.)1111 2039 MS (.)1122 2039 MS (.)1133 2039 MS (.)1144 2039 MS +(.)1155 2039 MS (.)1166 2039 MS (.)1177 2039 MS (.)1188 2039 MS (.)1199 2039 MS (.)1210 2039 MS (.)1221 2039 MS (.)1232 2039 MS (.)1243 2039 MS (.)1254 2039 MS (.)1265 2039 MS (.)1276 2039 MS (.)1287 2039 MS (.)1298 2039 MS (.)1309 2039 MS (.)1320 2039 MS +(.)1331 2039 MS (.)1342 2039 MS (.)1353 2039 MS (.)1364 2039 MS (.)1375 2039 MS (.)1386 2039 MS (.)1397 2039 MS (.)1408 2039 MS (.)1419 2039 MS (.)1430 2039 MS (.)1441 2039 MS (.)1452 2039 MS (.)1463 2039 MS (.)1474 2039 MS (.)1485 2039 MS (.)1496 2039 MS +(.)1507 2039 MS (.)1518 2039 MS (.)1529 2039 MS (.)1540 2039 MS (.)1551 2039 MS (.)1562 2039 MS (.)1573 2039 MS (.)1584 2039 MS (.)1595 2039 MS (.)1606 2039 MS (.)1617 2039 MS (.)1628 2039 MS (.)1639 2039 MS (.)1650 2039 MS (.)1661 2039 MS (.)1672 2039 MS +(.)1683 2039 MS (.)1694 2039 MS (.)1705 2039 MS (.)1716 2039 MS (.)1727 2039 MS (.)1738 2039 MS (.)1749 2039 MS (.)1760 2039 MS (.)1771 2039 MS (.)1782 2039 MS (.)1793 2039 MS (.)1804 2039 MS (.)1815 2039 MS (.)1826 2039 MS (.)1837 2039 MS (.)1848 2039 MS +(.)1859 2039 MS (.)1870 2039 MS (.)1881 2039 MS (.)1892 2039 MS (.)1903 2039 MS (.)1914 2039 MS (.)1925 2039 MS (.)1936 2039 MS (.)1947 2039 MS (.)1958 2039 MS (.)1969 2039 MS (.)1980 2039 MS (.)1991 2039 MS (.)2002 2039 MS (.)2013 2039 MS (.)2024 2039 MS +(.)2035 2039 MS (.)2046 2039 MS (.)2057 2039 MS (.)2068 2039 MS +(2)2081 2039 MS (9)2102 2039 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 2039 MS +[42 0 0 -42 0 0]/Times-Bold MF +(1)235 2112 MS (1)256 2112 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )277 2112 MS +[42 0 0 -42 0 0]/Times-Bold MF +(R)335 2112 MS (E)365 2112 MS (F)393 2112 MS (E)418 2112 MS (R)446 2112 MS (E)476 2112 MS (N)504 2112 MS (C)534 2112 MS (E)564 2112 MS (S)592 2112 MS +(.)616 2112 MS (.)627 2112 MS (.)638 2112 MS (.)649 2112 MS (.)660 2112 MS (.)671 2112 MS (.)682 2112 MS (.)693 2112 MS (.)704 2112 MS (.)715 2112 MS (.)726 2112 MS (.)737 2112 MS (.)748 2112 MS (.)759 2112 MS (.)770 2112 MS (.)781 2112 MS +(.)792 2112 MS (.)803 2112 MS (.)814 2112 MS (.)825 2112 MS (.)836 2112 MS (.)847 2112 MS (.)858 2112 MS (.)869 2112 MS (.)880 2112 MS (.)891 2112 MS (.)902 2112 MS (.)913 2112 MS (.)924 2112 MS (.)935 2112 MS (.)946 2112 MS (.)957 2112 MS +(.)968 2112 MS (.)979 2112 MS (.)990 2112 MS (.)1001 2112 MS (.)1012 2112 MS (.)1023 2112 MS (.)1034 2112 MS (.)1045 2112 MS (.)1056 2112 MS (.)1067 2112 MS (.)1078 2112 MS (.)1089 2112 MS (.)1100 2112 MS (.)1111 2112 MS (.)1122 2112 MS (.)1133 2112 MS +(.)1144 2112 MS (.)1155 2112 MS (.)1166 2112 MS (.)1177 2112 MS (.)1188 2112 MS (.)1199 2112 MS (.)1210 2112 MS (.)1221 2112 MS (.)1232 2112 MS (.)1243 2112 MS (.)1254 2112 MS (.)1265 2112 MS (.)1276 2112 MS (.)1287 2112 MS (.)1298 2112 MS (.)1309 2112 MS +(.)1320 2112 MS (.)1331 2112 MS (.)1342 2112 MS (.)1353 2112 MS (.)1364 2112 MS (.)1375 2112 MS (.)1386 2112 MS (.)1397 2112 MS (.)1408 2112 MS (.)1419 2112 MS (.)1430 2112 MS (.)1441 2112 MS (.)1452 2112 MS (.)1463 2112 MS (.)1474 2112 MS (.)1485 2112 MS +(.)1496 2112 MS (.)1507 2112 MS (.)1518 2112 MS (.)1529 2112 MS (.)1540 2112 MS (.)1551 2112 MS (.)1562 2112 MS (.)1573 2112 MS (.)1584 2112 MS (.)1595 2112 MS (.)1606 2112 MS (.)1617 2112 MS (.)1628 2112 MS (.)1639 2112 MS (.)1650 2112 MS (.)1661 2112 MS +(.)1672 2112 MS (.)1683 2112 MS (.)1694 2112 MS (.)1705 2112 MS (.)1716 2112 MS (.)1727 2112 MS (.)1738 2112 MS (.)1749 2112 MS (.)1760 2112 MS (.)1771 2112 MS (.)1782 2112 MS (.)1793 2112 MS (.)1804 2112 MS (.)1815 2112 MS (.)1826 2112 MS (.)1837 2112 MS +(.)1848 2112 MS (.)1859 2112 MS (.)1870 2112 MS (.)1881 2112 MS (.)1892 2112 MS (.)1903 2112 MS (.)1914 2112 MS (.)1925 2112 MS (.)1936 2112 MS (.)1947 2112 MS (.)1958 2112 MS (.)1969 2112 MS (.)1980 2112 MS (.)1991 2112 MS (.)2002 2112 MS (.)2013 2112 MS +(.)2024 2112 MS (.)2035 2112 MS (.)2046 2112 MS (.)2057 2112 MS (.)2068 2112 MS +(3)2081 2112 MS (0)2102 2112 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )2123 2112 MS +%%IncludeFont: Helvetica-Bold +[67 0 0 -67 0 0]/Helvetica-Bold MF +( )235 2232 MS +%%IncludeFont: Palatino-Roman +[75 0 0 -75 0 0]/Palatino-Roman MF +( )235 2333 MS +showpage +%%Page: 5 5 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(5)1868 400 MS +(/)1893 400 MS +(3)1907 400 MS (0)1932 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1957 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(1)310 592 MS +( )347 592 MS +(I)400 592 MS (n)419 592 MS (t)460 592 MS (r)482 592 MS (o)508 592 MS (d)549 592 MS (u)590 592 MS (c)631 592 MS (t)668 592 MS (i)689 592 MS (o)708 592 MS (n)749 592 MS +( )790 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )348 667 MS +( )348 724 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 782 MS (a)378 782 MS ( )400 782 MS (D)444 782 MS (i)481 782 MS (r)493 782 MS (e)510 782 MS (c)532 782 MS (t)554 782 MS (i)570 782 MS (o)582 782 MS (n)608 782 MS ( )632 782 MS (d)676 782 MS (e)701 782 MS ( )723 782 MS +(l)768 782 MS (\222)781 782 MS (E)797 782 MS (n)829 782 MS (e)853 782 MS (r)875 782 MS (g)892 782 MS (i)918 782 MS (e)930 782 MS ( )952 782 MS (N)996 782 MS (u)1032 782 MS (c)1057 782 MS (l)1080 782 MS (\351)1093 782 MS (a)1116 782 MS +(i)1139 782 MS (r)1151 782 MS (e)1168 782 MS ( )1190 782 MS (\()1234 782 MS (D)1251 782 MS (E)1287 782 MS (N)1318 782 MS (\))1354 782 MS (,)1371 782 MS ( )1384 782 MS (d)1428 782 MS (a)1453 782 MS (n)1475 782 MS (s)1499 782 MS ( )1518 782 MS +(l)1563 782 MS (e)1575 782 MS ( )1597 782 MS (c)1641 782 MS (a)1663 782 MS (d)1685 782 MS (r)1710 782 MS (e)1727 782 MS ( )1749 782 MS (d)1793 782 MS (e)1818 782 MS ( )1840 782 MS (s)1884 782 MS (a)1903 782 MS ( )1925 782 MS (m)1970 782 MS +(i)2009 782 MS (s)2022 782 MS (s)2041 782 MS (i)2061 782 MS (o)2073 782 MS (n)2100 782 MS ( )2125 782 MS +(\351)235 839 MS (l)258 839 MS (e)270 839 MS (c)292 839 MS (t)314 839 MS (r)329 839 MS (o)346 839 MS (n)372 839 MS (u)396 839 MS (c)421 839 MS (l)444 839 MS (\351)456 839 MS (a)478 839 MS (i)501 839 MS (r)514 839 MS (e)531 839 MS +(,)553 839 MS ( )566 839 MS (a)579 839 MS ( )602 839 MS (l)616 839 MS (a)629 839 MS (n)652 839 MS (c)676 839 MS (\351)698 839 MS ( )721 839 MS (l)735 839 MS (a)748 839 MS ( )770 839 MS (c)783 839 MS (o)805 839 MS (n)831 839 MS +(s)856 839 MS (t)875 839 MS (r)890 839 MS (u)907 839 MS (c)932 839 MS (t)953 839 MS (i)968 839 MS (o)980 839 MS (n)1006 839 MS ( )1031 839 MS (d)1044 839 MS (\222)1069 839 MS (u)1085 839 MS (n)1111 839 MS ( )1136 839 MS (e)1149 839 MS +(n)1172 839 MS (v)1197 839 MS (i)1222 839 MS (r)1235 839 MS (o)1253 839 MS (n)1279 839 MS (n)1303 839 MS (e)1327 839 MS (m)1350 839 MS (e)1388 839 MS (n)1411 839 MS (t)1435 839 MS ( )1450 839 MS (d)1463 839 MS (e)1488 839 MS ( )1510 839 MS +(s)1524 839 MS (i)1544 839 MS (m)1557 839 MS (u)1595 839 MS (l)1621 839 MS (a)1634 839 MS (t)1656 839 MS (i)1672 839 MS (o)1684 839 MS (n)1710 839 MS ( )1735 839 MS (b)1749 839 MS (a)1773 839 MS (s)1795 839 MS (\351)1815 839 MS ( )1837 839 MS +(s)1851 839 MS (u)1870 839 MS (r)1895 839 MS ( )1912 839 MS (u)1925 839 MS (n)1951 839 MS (e)1975 839 MS ( )1997 839 MS (p)2010 839 MS (l)2036 839 MS (a)2049 839 MS (t)2071 839 MS (e)2086 839 MS +(-)2108 839 MS +(f)235 897 MS (o)250 897 MS (r)276 897 MS (m)294 897 MS (e)331 897 MS ( )353 897 MS (d)387 897 MS (\222)413 897 MS (a)429 897 MS (c)451 897 MS (c)473 897 MS (u)495 897 MS (e)520 897 MS (i)543 897 MS (l)557 897 MS ( )570 897 MS +(d)604 897 MS (e)629 897 MS ( )651 897 MS (c)685 897 MS (o)707 897 MS (m)734 897 MS (p)771 897 MS (o)796 897 MS (s)822 897 MS (a)841 897 MS (n)863 897 MS (t)887 897 MS (s)902 897 MS ( )921 897 MS (l)956 897 MS (o)968 897 MS +(g)994 897 MS (i)1020 897 MS (c)1032 897 MS (i)1055 897 MS (e)1068 897 MS (l)1091 897 MS (s)1104 897 MS ( )1123 897 MS ([)1157 897 MS (7)1174 897 MS (])1199 897 MS (,)1216 897 MS ( )1229 897 MS (a)1263 897 MS (v)1285 897 MS (e)1309 897 MS +(c)1331 897 MS ( )1353 897 MS (u)1387 897 MS (n)1413 897 MS ( )1437 897 MS (m)1472 897 MS (o)1509 897 MS (d)1535 897 MS (\350)1560 897 MS (l)1583 897 MS (e)1596 897 MS ( )1618 897 MS (c)1652 897 MS (o)1674 897 MS (m)1700 897 MS (m)1738 897 MS +(u)1776 897 MS (n)1802 897 MS ( )1826 897 MS (d)1860 897 MS (e)1885 897 MS +(s)1907 897 MS ( )1926 897 MS (d)1960 897 MS (o)1985 897 MS (n)2011 897 MS (n)2036 897 MS (\351)2060 897 MS (e)2082 897 MS (s)2105 897 MS ( )2125 897 MS +(\351)235 954 MS (c)257 954 MS (h)279 954 MS (a)304 954 MS (n)327 954 MS (g)351 954 MS (\351)376 954 MS (e)398 954 MS (s)420 954 MS +( )439 954 MS +(:)452 954 MS ( )466 954 MS (c)482 954 MS (\222)504 954 MS (e)521 954 MS (s)543 954 MS (t)562 954 MS ( )577 954 MS (l)594 954 MS (e)606 954 MS ( )628 954 MS (p)644 954 MS (r)669 954 MS (o)686 954 MS (j)712 954 MS (e)724 954 MS +(t)746 954 MS ( )761 954 MS (S)777 954 MS (A)805 954 MS (L)840 954 MS (O)871 954 MS (M)907 954 MS (E)951 954 MS ( )982 954 MS ([)998 954 MS (1)1015 954 MS (])1040 954 MS (.)1057 954 MS ( )1070 954 MS (L)1086 954 MS (e)1116 954 MS +(s)1138 954 MS ( )1157 954 MS (n)1173 954 MS (o)1197 954 MS (u)1223 954 MS (v)1248 954 MS (e)1272 954 MS (l)1295 954 MS (l)1309 954 MS (e)1322 954 MS (s)1345 954 MS ( )1364 954 MS (a)1380 954 MS (p)1402 954 MS (p)1427 954 MS (l)1453 954 MS +(i)1466 954 MS (c)1479 954 MS (a)1502 954 MS (t)1524 954 MS (i)1540 954 MS (o)1552 954 MS (n)1578 954 MS (s)1602 954 MS ( )1621 954 MS (d)1637 954 MS (o)1662 954 MS (i)1689 954 MS (v)1702 954 MS (e)1726 954 MS (n)1749 954 MS (t)1773 954 MS +( )1788 954 MS (p)1804 954 MS (o)1829 954 MS (u)1855 954 MS (v)1880 954 MS (o)1903 954 MS (i)1929 954 MS (r)1941 954 MS ( )1958 954 MS (s)1974 954 MS (i)1994 954 MS (m)2008 954 MS (u)2046 954 MS (l)2072 954 MS (e)2085 954 MS (r)2107 954 MS +( )2125 954 MS +(p)235 1012 MS (l)261 1012 MS (u)273 1012 MS (s)298 1012 MS ( )317 1012 MS (f)343 1012 MS (i)360 1012 MS (n)373 1012 MS (e)398 1012 MS (m)421 1012 MS (e)459 1012 MS (n)482 1012 MS (t)506 1012 MS ( )521 1012 MS (d)546 1012 MS (e)571 1012 MS +(s)593 1012 MS ( )612 1012 MS (p)637 1012 MS (h)662 1012 MS (\351)686 1012 MS (n)709 1012 MS (o)733 1012 MS (m)760 1012 MS (\350)797 1012 MS (n)820 1012 MS (e)844 1012 MS (s)867 1012 MS ( )886 1012 MS (p)911 1012 MS (l)937 1012 MS (u)950 1012 MS +(s)975 1012 MS ( )994 1012 MS (c)1019 1012 MS (o)1041 1012 MS (m)1068 1012 MS (p)1105 1012 MS (l)1131 1012 MS (e)1144 1012 MS (x)1167 1012 MS (e)1191 1012 MS (s)1214 1012 MS ( )1233 1012 MS (e)1258 1012 MS (n)1280 1012 MS ( )1304 1012 MS (t)1329 1012 MS +(a)1344 1012 MS (i)1367 1012 MS (l)1380 1012 MS (l)1394 1012 MS (e)1407 1012 MS ( )1429 1012 MS (e)1454 1012 MS (t)1476 1012 MS ( )1491 1012 MS (e)1516 1012 MS (n)1538 1012 MS ( )1562 1012 MS (c)1587 1012 MS (o)1609 1012 MS (u)1635 1012 MS (p)1660 1012 MS +(l)1686 1012 MS (a)1698 1012 MS (g)1720 1012 MS (e)1745 1012 MS (s)1767 1012 MS ( )1786 1012 MS (p)1811 1012 MS (h)1837 1012 MS (y)1862 1012 MS (s)1886 1012 MS (i)1906 1012 MS (q)1919 1012 MS (u)1944 1012 MS (e)1970 1012 MS (s)1992 1012 MS (.)2011 1012 MS +( )2024 1012 MS (C)2049 1012 MS (e)2082 1012 MS (s)2105 1012 MS ( )2125 1012 MS +(a)235 1069 MS (p)257 1069 MS (p)282 1069 MS (l)308 1069 MS (i)321 1069 MS (c)334 1069 MS (a)356 1069 MS (t)378 1069 MS (i)394 1069 MS (o)406 1069 MS (n)432 1069 MS (s)457 1069 MS ( )476 1069 MS (d)499 1069 MS (o)524 1069 MS (i)550 1069 MS +(v)563 1069 MS (e)588 1069 MS (n)611 1069 MS (t)635 1069 MS ( )650 1069 MS (a)673 1069 MS (u)695 1069 MS (s)720 1069 MS (s)739 1069 MS (i)759 1069 MS ( )771 1069 MS (t)794 1069 MS (i)810 1069 MS (r)822 1069 MS (e)839 1069 MS (r)861 1069 MS +( )878 1069 MS (l)902 1069 MS (e)914 1069 MS ( )936 1069 MS (m)960 1069 MS (e)998 1069 MS (i)1021 1069 MS (l)1035 1069 MS (l)1049 1069 MS (e)1062 1069 MS (u)1084 1069 MS (r)1109 1069 MS ( )1126 1069 MS (p)1149 1069 MS (a)1174 1069 MS (r)1196 1069 MS +(t)1213 1069 MS (i)1228 1069 MS ( )1241 1069 MS (d)1264 1069 MS (e)1289 1069 MS (s)1311 1069 MS ( )1330 1069 MS (p)1353 1069 MS (e)1378 1069 MS (r)1400 1069 MS (f)1418 1069 MS (o)1433 1069 MS (r)1459 1069 MS (m)1476 1069 MS (a)1514 1069 MS (n)1537 1069 MS +(c)1561 1069 MS (e)1583 1069 MS (s)1605 1069 MS ( )1624 1069 MS (d)1647 1069 MS (e)1672 1069 MS +(s)1695 1069 MS ( )1714 1069 MS (m)1738 1069 MS (a)1776 1069 MS (c)1798 1069 MS (h)1821 1069 MS (i)1846 1069 MS (n)1859 1069 MS (e)1884 1069 MS (s)1907 1069 MS ( )1926 1069 MS (a)1949 1069 MS (c)1971 1069 MS (t)1993 1069 MS (u)2008 1069 MS (e)2033 1069 MS +(l)2056 1069 MS (l)2069 1069 MS (e)2082 1069 MS (s)2105 1069 MS ( )2125 1069 MS +(\()235 1127 MS (c)252 1127 MS (a)274 1127 MS (l)297 1127 MS (c)309 1127 MS (u)331 1127 MS (l)357 1127 MS (a)370 1127 MS (t)392 1127 MS (e)407 1127 MS (u)429 1127 MS (r)454 1127 MS ( )471 1127 MS (m)488 1127 MS (a)525 1127 MS (s)548 1127 MS +(s)567 1127 MS (i)587 1127 MS (v)600 1127 MS (e)625 1127 MS (m)648 1127 MS (e)686 1127 MS (n)709 1127 MS (t)733 1127 MS ( )748 1127 MS (p)764 1127 MS (a)789 1127 MS (r)811 1127 MS (a)828 1127 MS (l)851 1127 MS (l)864 1127 MS (\350)877 1127 MS +(l)901 1127 MS (e)914 1127 MS (,)936 1127 MS ( )949 1127 MS (c)965 1127 MS (l)988 1127 MS (u)1001 1127 MS (s)1026 1127 MS (t)1045 1127 MS (e)1060 1127 MS (r)1082 1127 MS ( )1099 1127 MS (d)1115 1127 MS (e)1140 1127 MS ( )1162 1127 MS (P)1178 1127 MS +(C)1206 1127 MS (,)1239 1127 MS ( )1252 1127 MS (e)1268 1127 MS (t)1290 1127 MS (c)1305 1127 MS (.)1327 1127 MS (\))1340 1127 MS (.)1356 1127 MS ( )1369 1127 MS (L)1385 1127 MS (\222)1415 1127 MS (i)1432 1127 MS (n)1445 1127 MS (t)1469 1127 MS (\351)1484 1127 MS +(g)1506 1127 MS (r)1531 1127 MS (a)1548 1127 MS (t)1570 1127 MS (i)1585 1127 MS (o)1597 1127 MS (n)1623 1127 MS ( )1648 1127 MS (d)1664 1127 MS (e)1689 1127 MS (s)1711 1127 MS ( )1731 1127 MS (c)1747 1127 MS (o)1769 1127 MS (d)1795 1127 MS (e)1820 1127 MS +(s)1842 1127 MS ( )1861 1127 MS (d)1877 1127 MS (e)1902 1127 MS ( )1924 1127 MS (c)1941 1127 MS (a)1963 1127 MS (l)1986 1127 MS (c)1999 1127 MS (u)2021 1127 MS (l)2047 1127 MS ( )2060 1127 MS (d)2076 1127 MS (e)2102 1127 MS ( )2125 1127 MS +(l)235 1184 MS (a)248 1184 MS ( )270 1184 MS (D)291 1184 MS (E)327 1184 MS (N)358 1184 MS (,)394 1184 MS ( )407 1184 MS (d)428 1184 MS (o)453 1184 MS (n)479 1184 MS (t)503 1184 MS ( )518 1184 MS (c)539 1184 MS (e)561 1184 MS (r)583 1184 MS +(t)599 1184 MS (a)614 1184 MS (i)636 1184 MS (n)649 1184 MS (s)673 1184 MS ( )692 1184 MS (s)713 1184 MS (o)732 1184 MS (n)758 1184 MS (t)782 1184 MS ( )797 1184 MS (p)818 1184 MS (a)843 1184 MS (r)865 1184 MS (a)882 1184 MS (l)905 1184 MS +(l)918 1184 MS (\350)931 1184 MS (l)954 1184 MS (e)967 1184 MS (s)990 1184 MS (,)1009 1184 MS ( )1022 1184 MS (d)1043 1184 MS (a)1068 1184 MS (n)1090 1184 MS (s)1115 1184 MS ( )1134 1184 MS (l)1156 1184 MS (\222)1169 1184 MS (e)1185 1184 MS (n)1208 1184 MS +(v)1233 1184 MS (i)1258 1184 MS (r)1271 1184 MS (o)1288 1184 MS (n)1314 1184 MS (n)1339 1184 MS (e)1363 1184 MS (m)1386 1184 MS (e)1424 1184 MS (n)1447 1184 MS (t)1471 1184 MS ( )1486 1184 MS (S)1507 1184 MS (A)1535 1184 MS (L)1570 1184 MS (O)1600 1184 MS +(M)1637 1184 MS (E)1681 1184 MS ( )1712 1184 MS (e)1733 1184 MS (x)1755 1184 MS (i)1780 1184 MS (g)1793 1184 MS (e)1818 1184 MS ( )1840 1184 MS (l)1862 1184 MS (a)1875 1184 MS ( )1897 1184 MS (p)1918 1184 MS (o)1943 1184 MS (s)1969 1184 MS (s)1988 1184 MS +(i)2008 1184 MS (b)2021 1184 MS (i)2047 1184 MS (l)2060 1184 MS (i)2074 1184 MS (t)2086 1184 MS (\351)2102 1184 MS ( )2125 1184 MS +(d)235 1242 MS (\222)260 1242 MS (i)277 1242 MS (n)290 1242 MS (t)314 1242 MS (r)329 1242 MS (o)346 1242 MS (d)372 1242 MS (u)397 1242 MS (i)422 1242 MS (r)434 1242 MS (e)451 1242 MS ( )473 1242 MS (d)486 1242 MS (a)511 1242 MS (n)533 1242 MS +(s)558 1242 MS ( )577 1242 MS (c)590 1242 MS (e)612 1242 MS (t)634 1242 MS (t)649 1242 MS (e)664 1242 MS ( )685 1242 MS (p)698 1242 MS (l)723 1242 MS (a)735 1242 MS (t)757 1242 MS (e)772 1242 MS +(-)794 1242 MS +(f)812 1242 MS (o)827 1242 MS (r)853 1242 MS (m)870 1242 MS (e)907 1242 MS ( )929 1242 MS (l)943 1242 MS (a)956 1242 MS ( )978 1242 MS (n)991 1242 MS (o)1015 1242 MS (t)1041 1242 MS (i)1056 1242 MS (o)1068 1242 MS (n)1094 1242 MS ( )1118 1242 MS +(d)1131 1242 MS (e)1156 1242 MS ( )1178 1242 MS (c)1191 1242 MS (o)1213 1242 MS (m)1239 1242 MS +(p)1277 1242 MS (o)1302 1242 MS (s)1328 1242 MS (a)1347 1242 MS (n)1370 1242 MS (t)1394 1242 MS (s)1409 1242 MS ( )1428 1242 MS (p)1441 1242 MS (a)1466 1242 MS (r)1488 1242 MS (a)1505 1242 MS (l)1527 1242 MS (l)1540 1242 MS (\350)1553 1242 MS (l)1576 1242 MS +(e)1589 1242 MS (s)1612 1242 MS (.)1631 1242 MS +( )1644 1242 MS +( )348 1299 MS +( )361 1299 MS +(D)348 1357 MS (a)384 1357 MS (n)406 1357 MS (s)431 1357 MS ( )450 1357 MS (S)489 1357 MS (A)517 1357 MS (L)553 1357 MS (O)583 1357 MS (M)619 1357 MS (E)663 1357 MS ( )694 1357 MS (c)733 1357 MS (e)755 1357 MS ( )777 1357 MS (c)816 1357 MS +(o)838 1357 MS (m)865 1357 MS (p)902 1357 MS (o)927 1357 MS (s)953 1357 MS (a)972 1357 MS (n)994 1357 MS (t)1018 1357 MS ( )1033 1357 MS (p)1072 1357 MS (a)1097 1357 MS (r)1119 1357 MS (a)1136 1357 MS (l)1159 1357 MS (l)1172 1357 MS (\350)1185 1357 MS +(l)1208 1357 MS (e)1221 1357 MS ( )1243 1357 MS (d)1282 1357 MS (e)1307 1357 MS (v)1330 1357 MS (r)1354 1357 MS (a)1371 1357 MS ( )1393 1357 MS (p)1432 1357 MS (o)1457 1357 MS (u)1483 1357 MS (v)1508 1357 MS (o)1532 1357 MS (i)1558 1357 MS (r)1570 1357 MS +( )1587 1357 MS (i)1627 1357 MS (n)1640 1357 MS (t)1664 1357 MS (e)1679 1357 MS (r)1701 1357 MS (a)1718 1357 MS (g)1740 1357 MS (i)1766 1357 MS (r)1778 1357 MS ( )1795 1357 MS (a)1834 1357 MS (v)1856 1357 MS (e)1880 1357 MS (c)1902 1357 MS ( )1924 1357 MS +(d)1963 1357 MS (\222)1989 1357 MS (a)2005 1357 MS (u)2027 1357 MS (t)2052 1357 MS (r)2067 1357 MS (e)2084 1357 MS (s)2106 1357 MS ( )2125 1357 MS +(c)235 1414 MS (o)257 1414 MS (m)283 1414 MS (p)320 1414 MS (o)345 1414 MS (s)371 1414 MS (a)390 1414 MS (n)413 1414 MS (t)437 1414 MS (s)452 1414 MS ( )471 1414 MS (q)485 1414 MS (u)510 1414 MS (\222)535 1414 MS (i)552 1414 MS (l)566 1414 MS +(s)579 1414 MS ( )598 1414 MS (s)613 1414 MS (o)632 1414 MS (i)659 1414 MS (e)671 1414 MS (n)694 1414 MS (t)718 1414 MS ( )733 1414 MS (s)747 1414 MS (\351)766 1414 MS (q)788 1414 MS (u)813 1414 MS (e)838 1414 MS (n)861 1414 MS (t)885 1414 MS +(i)901 1414 MS (e)913 1414 MS (l)936 1414 MS (s)949 1414 MS ( )969 1414 MS (o)983 1414 MS (u)1009 1414 MS ( )1034 1414 MS (p)1048 1414 MS (a)1073 1414 MS (r)1095 1414 MS (a)1112 1414 MS (l)1135 1414 MS (l)1148 1414 MS (\350)1161 1414 MS (l)1184 1414 MS +(e)1197 1414 MS (s)1219 1414 MS (,)1238 1414 MS ( )1252 1414 MS (c)1266 1414 MS (o)1288 1414 MS +(-)1314 1414 MS +(l)1331 1414 MS (o)1343 1414 MS (c)1369 1414 MS (a)1391 1414 MS (l)1414 1414 MS (i)1427 1414 MS (s)1440 1414 MS (\351)1460 1414 MS (s)1482 1414 MS ( )1502 1414 MS (o)1516 1414 MS (u)1542 1414 MS ( )1567 1414 MS (d)1581 1414 MS (i)1607 1414 MS (s)1619 1414 MS +(t)1638 1414 MS (a)1653 1414 MS (n)1675 1414 MS (t)1699 1414 MS (s)1714 1414 MS (,)1733 1414 MS ( )1746 1414 MS (t)1760 1414 MS (o)1774 1414 MS (u)1800 1414 MS (t)1824 1414 MS ( )1839 1414 MS (e)1853 1414 MS (n)1875 1414 MS ( )1899 1414 MS (o)1913 1414 MS +(p)1939 1414 MS (t)1964 1414 MS (i)1979 1414 MS (m)1992 1414 MS (i)2030 1414 MS (s)2043 1414 MS (a)2063 1414 MS (n)2086 1414 MS (t)2110 1414 MS ( )2125 1414 MS +(l)235 1472 MS (e)248 1472 MS (s)271 1472 MS ( )290 1472 MS (c)316 1472 MS (o)338 1472 MS (m)365 1472 MS (m)403 1472 MS (u)441 1472 MS (n)467 1472 MS (i)492 1472 MS (c)505 1472 MS (a)527 1472 MS (t)549 1472 MS (i)565 1472 MS (o)577 1472 MS +(n)603 1472 MS (s)627 1472 MS ( )647 1472 MS (e)673 1472 MS (t)695 1472 MS ( )710 1472 MS (l)737 1472 MS (\222)750 1472 MS (a)766 1472 MS (l)789 1472 MS (l)803 1472 MS (o)815 1472 MS (c)841 1472 MS (a)863 1472 MS (t)885 1472 MS (i)901 1472 MS +(o)913 1472 MS (n)939 1472 MS ( )963 1472 MS (m)990 1472 MS (\351)1028 1472 MS (m)1051 1472 MS (o)1088 1472 MS (i)1115 1472 MS (r)1128 1472 MS (e)1145 1472 MS (.)1167 1472 MS ( )1180 1472 MS (S)1206 1472 MS (i)1235 1472 MS ( )1249 1472 MS (l)1276 1472 MS +(\222)1289 1472 MS (i)1306 1472 MS (n)1319 1472 MS (t)1343 1472 MS (\351)1358 1472 MS (g)1380 1472 MS (r)1405 1472 MS (a)1422 1472 MS (t)1444 1472 MS (i)1460 1472 MS (o)1472 1472 MS (n)1498 1472 MS ( )1522 1472 MS (d)1548 1472 MS (e)1573 1472 MS ( )1596 1472 MS +(c)1622 1472 MS (o)1644 1472 MS (m)1671 1472 MS (p)1708 1472 MS (o)1733 1472 MS (s)1759 1472 MS (a)1778 1472 MS (n)1800 1472 MS (t)1824 1472 MS (s)1839 1472 MS ( )1858 1472 MS (p)1884 1472 MS (a)1909 1472 MS (r)1931 1472 MS (a)1948 1472 MS (l)1971 1472 MS +(l)1985 1472 MS (\350)1998 1472 MS (l)2021 1472 MS (e)2034 1472 MS (s)2056 1472 MS ( )2076 1472 MS (\340)2102 1472 MS ( )2125 1472 MS +(m)235 1529 MS (\351)273 1529 MS (m)296 1529 MS (o)333 1529 MS (i)360 1529 MS (r)372 1529 MS (e)390 1529 MS ( )412 1529 MS (p)431 1529 MS (a)456 1529 MS (r)478 1529 MS (t)495 1529 MS (a)510 1529 MS (g)532 1529 MS (\351)557 1529 MS (e)579 1529 MS +( )601 1529 MS (\()620 1529 MS (u)637 1529 MS (t)661 1529 MS (i)676 1529 MS (l)689 1529 MS (i)703 1529 MS (s)716 1529 MS (a)735 1529 MS (n)758 1529 MS (t)782 1529 MS ( )797 1529 MS (p)816 1529 MS (a)841 1529 MS (r)863 1529 MS ( )880 1529 MS +(e)899 1529 MS (x)921 1529 MS (e)945 1529 MS (m)968 1529 MS (p)1006 1529 MS (l)1032 1529 MS (e)1045 1529 MS ( )1067 1529 MS (O)1086 1529 MS (p)1122 1529 MS (e)1147 1529 MS (n)1170 1529 MS (M)1194 1529 MS (P)1239 1529 MS (\))1267 1529 MS (,)1284 1529 MS +( )1297 1529 MS (n)1316 1529 MS (e)1340 1529 MS ( )1362 1529 MS (p)1381 1529 MS (o)1406 1529 MS (s)1432 1529 MS (e)1451 1529 MS ( )1473 1529 MS (p)1492 1529 MS (a)1517 1529 MS (s)1539 1529 MS ( )1558 1529 MS (d)1577 1529 MS (e)1602 1529 MS ( )1624 1529 MS +(p)1643 1529 MS (r)1668 1529 MS (o)1684 1529 MS (b)1710 1529 MS (l)1735 1529 MS (\350)1747 1529 MS (m)1770 1529 MS (e)1808 1529 MS ( )1830 1529 MS (s)1849 1529 MS (p)1868 1529 MS (\351)1894 1529 MS (c)1916 1529 MS (i)1939 1529 MS (f)1952 1529 MS (i)1969 1529 MS +(q)1982 1529 MS (u)2007 1529 MS (e)2032 1529 MS ( )2054 1529 MS (d)2073 1529 MS (u)2099 1529 MS ( )2125 1529 MS +(f)235 1586 MS (a)251 1586 MS (i)274 1586 MS (t)286 1586 MS ( )301 1586 MS (d)315 1586 MS (e)340 1586 MS ( )362 1586 MS (l)377 1586 MS (a)389 1586 MS ( )411 1586 MS (l)426 1586 MS (o)438 1586 MS (c)464 1586 MS (a)487 1586 MS (l)510 1586 MS +(i)523 1586 MS (s)536 1586 MS (a)556 1586 MS (t)578 1586 MS (i)594 1586 MS (o)606 1586 MS (n)632 1586 MS ( )656 1586 MS (d)670 1586 MS (u)695 1586 MS ( )720 1586 MS (p)734 1586 MS (a)759 1586 MS (r)781 1586 MS (a)798 1586 MS (l)821 1586 MS +(l)834 1586 MS (\351)847 1586 MS (l)870 1586 MS (i)884 1586 MS (s)897 1586 MS (m)917 1586 MS (e)955 1586 MS ( )977 1586 MS (d)991 1586 MS (a)1017 1586 MS (n)1040 1586 MS (s)1064 1586 MS ( )1083 1586 MS (d)1097 1586 MS (e)1122 1586 MS (s)1145 1586 MS +( )1164 1586 MS (r)1178 1586 MS (\351)1195 1586 MS (g)1217 1586 MS (i)1243 1586 MS (o)1256 1586 MS (n)1282 1586 MS (s)1306 1586 MS ( )1325 1586 MS (b)1339 1586 MS (i)1364 1586 MS (e)1377 1586 MS (n)1400 1586 MS ( )1424 1586 MS (c)1438 1586 MS (i)1461 1586 MS +(r)1474 1586 MS (c)1491 1586 MS (o)1513 1586 MS (n)1539 1586 MS (s)1563 1586 MS (c)1583 1586 MS (r)1605 1586 MS (i)1623 1586 MS (t)1635 1586 MS (e)1650 1586 MS (s)1672 1586 MS ( )1691 1586 MS (i)1706 1586 MS (n)1719 1586 MS (t)1743 1586 MS (e)1758 1586 MS +(r)1780 1586 MS (n)1797 1586 MS (e)1821 1586 MS (s)1844 1586 MS ( )1863 1586 MS (a)1877 1586 MS (u)1899 1586 MS (x)1925 1586 MS ( )1949 1586 MS (s)1963 1586 MS (e)1982 1586 MS (r)2004 1586 MS (v)2022 1586 MS (i)2047 1586 MS (c)2060 1586 MS (e)2082 1586 MS +(s)2105 1586 MS ( )2125 1586 MS +(d)235 1644 MS (u)260 1644 MS ( )285 1644 MS (c)302 1644 MS (o)324 1644 MS (m)350 1644 MS (p)387 1644 MS (o)412 1644 MS (s)438 1644 MS (a)457 1644 MS (n)480 1644 MS (t)504 1644 MS (,)519 1644 MS ( )532 1644 MS (i)549 1644 MS (l)562 1644 MS +( )575 1644 MS (n)593 1644 MS (\222)618 1644 MS (e)634 1644 MS (n)657 1644 MS ( )681 1644 MS (v)699 1644 MS (a)723 1644 MS ( )745 1644 MS (p)762 1644 MS (a)787 1644 MS (s)810 1644 MS ( )829 1644 MS (d)846 1644 MS (e)871 1644 MS ( )893 1644 MS +(m)911 1644 MS (\352)949 1644 MS (m)972 1644 MS (e)1010 1644 MS ( )1032 1644 MS (p)1049 1644 MS (o)1074 1644 MS (u)1100 1644 MS (r)1125 1644 MS ( )1142 1644 MS (l)1160 1644 MS (e)1172 1644 MS (s)1195 1644 MS ( )1214 1644 MS (c)1231 1644 MS +(o)1254 1644 MS (m)1280 1644 MS (p)1317 1644 MS (o)1342 1644 MS (s)1368 1644 MS (a)1387 1644 MS (n)1410 1644 MS (t)1434 1644 MS (s)1449 1644 MS ( )1468 1644 MS (p)1485 1644 MS (a)1510 1644 MS (r)1532 1644 MS (a)1549 1644 MS (l)1572 1644 MS (l)1585 1644 MS +(\350)1598 1644 MS (l)1621 1644 MS (e)1634 1644 MS (s)1656 1644 MS ( )1676 1644 MS (\340)1693 1644 MS ( )1715 1644 MS (m)1733 1644 MS (\351)1771 1644 MS (m)1794 1644 MS (o)1831 1644 MS (i)1858 1644 MS (r)1870 1644 MS (e)1887 1644 MS ( )1910 1644 MS (d)1927 1644 MS +(i)1953 1644 MS (s)1966 1644 MS (t)1985 1644 MS (r)2000 1644 MS (i)2017 1644 MS (b)2030 1644 MS (u)2054 1644 MS (\351)2080 1644 MS (e)2102 1644 MS ( )2125 1644 MS +(\()235 1701 MS (u)252 1701 MS (t)277 1701 MS (i)292 1701 MS (l)305 1701 MS (i)318 1701 MS (s)331 1701 MS (a)351 1701 MS (n)374 1701 MS (t)398 1701 MS ( )413 1701 MS (p)426 1701 MS (a)451 1701 MS (r)473 1701 MS ( )490 1701 MS (e)503 1701 MS +(x)525 1701 MS (e)549 1701 MS (m)572 1701 MS (p)609 1701 MS (l)635 1701 MS (e)648 1701 MS ( )670 1701 MS (M)683 1701 MS (P)727 1701 MS (I)755 1701 MS (\))772 1701 MS (.)789 1701 MS +( )802 1701 MS +( )348 1759 MS +(L)348 1816 MS (a)378 1816 MS ( )400 1816 MS (c)421 1816 MS (o)443 1816 MS (u)469 1816 MS (c)494 1816 MS (h)516 1816 MS (e)540 1816 MS ( )562 1816 MS (l)584 1816 MS (o)596 1816 MS (g)622 1816 MS (i)648 1816 MS (c)661 1816 MS (i)684 1816 MS +(e)697 1816 MS (l)720 1816 MS (l)734 1816 MS (e)747 1816 MS ( )769 1816 MS (d)790 1816 MS (e)815 1816 MS ( )837 1816 MS (c)858 1816 MS (o)880 1816 MS (m)907 1816 MS (m)945 1816 MS (u)983 1816 MS (n)1009 1816 MS (i)1034 1816 MS (c)1047 1816 MS +(a)1069 1816 MS (t)1091 1816 MS (i)1107 1816 MS (o)1119 1816 MS (n)1145 1816 MS ( )1169 1816 MS (e)1190 1816 MS (n)1213 1816 MS (t)1237 1816 MS (r)1252 1816 MS (e)1269 1816 MS ( )1291 1816 MS (c)1312 1816 MS (o)1334 1816 MS (m)1359 1816 MS (p)1397 1816 MS +(o)1422 1816 MS (s)1448 1816 MS (a)1467 1816 MS (n)1490 1816 MS (t)1514 1816 MS (s)1529 1816 MS ( )1548 1816 MS (c)1569 1816 MS (h)1591 1816 MS (o)1615 1816 MS (i)1642 1816 MS (s)1654 1816 MS (i)1674 1816 MS (e)1687 1816 MS ( )1709 1816 MS (d)1730 1816 MS +(a)1755 1816 MS (n)1778 1816 MS (s)1803 1816 MS ( )1822 1816 MS (S)1843 1816 MS (A)1872 1816 MS (L)1907 1816 MS (O)1937 1816 MS (M)1974 1816 MS (E)2018 1816 MS ( )2049 1816 MS (e)2070 1816 MS (s)2092 1816 MS (t)2111 1816 MS ( )2125 1816 MS +(C)235 1874 MS (O)268 1874 MS (R)304 1874 MS (B)337 1874 MS (A)371 1874 MS ( )406 1874 MS ([)420 1874 MS (2)437 1874 MS (])462 1874 MS (,)479 1874 MS ( )492 1874 MS ([)506 1874 MS (3)523 1874 MS (])548 1874 MS (.)565 1874 MS ( )578 1874 MS +(M)592 1874 MS (a)636 1874 MS (l)659 1874 MS (h)672 1874 MS (e)696 1874 MS (u)718 1874 MS (r)743 1874 MS (e)760 1874 MS (u)782 1874 MS (s)807 1874 MS (e)827 1874 MS (m)850 1874 MS (e)888 1874 MS (n)911 1874 MS (t)935 1874 MS (,)950 1874 MS +( )963 1874 MS (l)977 1874 MS (a)989 1874 MS ( )1012 1874 MS (n)1027 1874 MS (o)1051 1874 MS (r)1077 1874 MS (m)1094 1874 MS (e)1131 1874 MS ( )1154 1874 MS (C)1168 1874 MS (O)1201 1874 MS (R)1238 1874 MS (B)1271 1874 MS (A)1305 1874 MS ( )1340 1874 MS +(a)1354 1874 MS (c)1376 1874 MS (t)1398 1874 MS (u)1413 1874 MS (e)1438 1874 MS (l)1461 1874 MS (l)1474 1874 MS (e)1487 1874 MS ( )1510 1874 MS (\()1524 1874 MS (V)1541 1874 MS (2)1577 1874 MS (\))1602 1874 MS (,)1619 1874 MS ( )1632 1874 MS (n)1646 1874 MS +(e)1670 1874 MS ( )1692 1874 MS (p)1706 1874 MS (r)1731 1874 MS (e)1748 1874 MS (n)1771 1874 MS (d)1795 1874 MS ( )1820 1874 MS (p)1834 1874 MS (a)1859 1874 MS (s)1882 1874 MS ( )1901 1874 MS (e)1915 1874 MS (n)1938 1874 MS ( )1963 1874 MS (c)1977 1874 MS +(o)1999 1874 MS (m)2026 1874 MS (p)2063 1874 MS (t)2088 1874 MS (e)2103 1874 MS ( )2125 1874 MS +(l)235 1931 MS (e)248 1931 MS ( )270 1931 MS (p)298 1931 MS (a)323 1931 MS (r)345 1931 MS (a)362 1931 MS (l)385 1931 MS (l)399 1931 MS (\351)412 1931 MS (l)435 1931 MS (i)449 1931 MS (s)462 1931 MS (m)482 1931 MS (e)520 1931 MS ( )542 1931 MS +(\340)571 1931 MS ( )593 1931 MS (m)622 1931 MS +(\351)660 1931 MS (m)683 1931 MS (o)720 1931 MS (i)747 1931 MS (r)759 1931 MS (e)776 1931 MS ( )798 1931 MS (d)826 1931 MS (i)852 1931 MS (s)865 1931 MS (t)884 1931 MS (r)899 1931 MS (i)917 1931 MS (b)930 1931 MS (u)954 1931 MS (\351)979 1931 MS +(e)1002 1931 MS (.)1024 1931 MS ( )1037 1931 MS (I)1065 1931 MS (l)1083 1931 MS ( )1095 1931 MS (e)1123 1931 MS (s)1145 1931 MS (t)1164 1931 MS ( )1179 1931 MS (d)1207 1931 MS (o)1232 1931 MS (n)1257 1931 MS (c)1281 1931 MS ( )1303 1931 MS (n)1332 1931 MS +(\351)1356 1931 MS (c)1379 1931 MS (e)1401 1931 MS (s)1423 1931 MS (s)1443 1931 MS (a)1462 1931 MS (i)1485 1931 MS (r)1497 1931 MS (e)1515 1931 MS ( )1537 1931 MS (d)1565 1931 MS (e)1590 1931 MS ( )1612 1931 MS (r)1640 1931 MS (\351)1657 1931 MS (u)1679 1931 MS +(s)1704 1931 MS (s)1724 1931 MS (i)1744 1931 MS (r)1756 1931 MS ( )1773 1931 MS (l)1802 1931 MS (\222)1815 1931 MS (i)1833 1931 MS (n)1846 1931 MS (t)1870 1931 MS (\351)1885 1931 MS (g)1907 1931 MS (r)1932 1931 MS (a)1949 1931 MS (t)1971 1931 MS (i)1986 1931 MS +(o)1998 1931 MS (n)2024 1931 MS ( )2048 1931 MS (d)2076 1931 MS (e)2102 1931 MS ( )2125 1931 MS +(c)235 1989 MS (o)257 1989 MS (m)283 1989 MS (p)320 1989 MS (o)345 1989 MS (s)371 1989 MS (a)390 1989 MS (n)413 1989 MS (t)437 1989 MS (s)452 1989 MS ( )471 1989 MS (p)499 1989 MS (a)524 1989 MS (r)546 1989 MS (a)563 1989 MS (l)586 1989 MS +(l)599 1989 MS (\350)612 1989 MS (l)635 1989 MS (e)648 1989 MS (s)671 1989 MS ( )690 1989 MS (\340)719 1989 MS ( )741 1989 MS (m)770 1989 MS (\351)808 1989 MS (m)831 1989 MS (o)868 1989 MS (i)895 1989 MS (r)908 1989 MS (e)925 1989 MS ( )947 1989 MS +(d)975 1989 MS (i)1001 1989 MS (s)1014 1989 MS (t)1033 1989 MS (r)1048 1989 MS (i)1066 1989 MS (b)1079 1989 MS (u)1103 1989 MS (\351)1128 1989 MS (e)1150 1989 MS ( )1173 1989 MS (d)1201 1989 MS (a)1226 1989 MS (n)1249 1989 MS (s)1273 1989 MS ( )1293 1989 MS +(S)1321 1989 MS (A)1350 1989 MS (L)1385 1989 MS (O)1415 1989 MS (M)1452 1989 MS (E)1496 1989 MS ( )1527 1989 MS (e)1555 1989 MS (n)1578 1989 MS ( )1602 1989 MS (u)1630 1989 MS (t)1655 1989 MS (i)1671 1989 MS (l)1684 1989 MS (i)1698 1989 MS (s)1711 1989 MS +(a)1731 1989 MS (n)1754 1989 MS (t)1778 1989 MS ( )1793 1989 MS (u)1821 1989 MS (n)1846 1989 MS ( )1870 1989 MS (l)1899 1989 MS (o)1911 1989 MS (g)1937 1989 MS (i)1963 1989 MS (c)1976 1989 MS (i)1999 1989 MS (e)2012 1989 MS (l)2035 1989 MS ( )2048 1989 MS +(d)2077 1989 MS (e)2102 1989 MS ( )2125 1989 MS +(\253)235 2046 MS +( )259 2046 MS +(m)273 2046 MS (i)311 2046 MS (d)324 2046 MS (d)349 2046 MS (l)375 2046 MS (e)388 2046 MS (w)410 2046 MS (a)447 2046 MS (r)469 2046 MS (e)486 2046 MS +( )508 2046 MS +(\273)521 2046 MS ( )545 2046 MS (C)558 2046 MS (O)591 2046 MS (R)627 2046 MS (B)661 2046 MS (A)695 2046 MS ( )730 2046 MS (\()743 2046 MS (O)760 2046 MS (R)796 2046 MS (B)829 2046 MS (\))862 2046 MS ( )879 2046 MS (s)892 2046 MS (\351)911 2046 MS +(q)933 2046 MS (u)958 2046 MS (e)983 2046 MS (n)1006 2046 MS (t)1030 2046 MS (i)1045 2046 MS (e)1058 2046 MS (l)1081 2046 MS (.)1093 2046 MS ( )1106 2046 MS +( )1119 2046 MS +( )348 2104 MS +(O)348 2161 MS (n)384 2161 MS ( )408 2161 MS (s)423 2161 MS (e)442 2161 MS ( )464 2161 MS (p)478 2161 MS (r)503 2161 MS (o)520 2161 MS (p)546 2161 MS (o)570 2161 MS (s)596 2161 MS (e)615 2161 MS ( )637 2161 MS (d)651 2161 MS (e)676 2161 MS +( )698 2161 MS (p)712 2161 MS (r)737 2161 MS (\351)754 2161 MS (s)776 2161 MS (e)795 2161 MS (n)818 2161 MS (t)842 2161 MS (e)857 2161 MS (r)879 2161 MS ( )896 2161 MS (d)910 2161 MS (\222)935 2161 MS (a)951 2161 MS (b)973 2161 MS (o)997 2161 MS +(r)1023 2161 MS (d)1040 2161 MS ( )1065 2161 MS (l)1080 2161 MS (\222)1092 2161 MS (\351)1109 2161 MS (t)1131 2161 MS (a)1146 2161 MS (t)1168 2161 MS ( )1182 2161 MS (d)1196 2161 MS (e)1221 2161 MS ( )1243 2161 MS (l)1258 2161 MS (\222)1270 2161 MS (a)1286 2161 MS +(r)1308 2161 MS (t)1325 2161 MS ( )1340 2161 MS (d)1354 2161 MS (e)1379 2161 MS ( )1401 2161 MS (c)1415 2161 MS (e)1437 2161 MS ( )1459 2161 MS (q)1473 2161 MS (u)1498 2161 MS (i)1524 2161 MS ( )1536 2161 MS (s)1551 2161 MS +(e)1570 2161 MS ( )1592 2161 MS (f)1607 2161 MS (a)1623 2161 MS (i)1646 2161 MS (t)1658 2161 MS ( )1673 2161 MS (d)1687 2161 MS (a)1712 2161 MS (n)1735 2161 MS (s)1759 2161 MS ( )1778 2161 MS (l)1793 2161 MS (e)1806 2161 MS ( )1828 2161 MS (d)1842 2161 MS +(o)1867 2161 MS (m)1894 2161 MS (a)1931 2161 MS (i)1954 2161 MS (n)1967 2161 MS (e)1992 2161 MS (,)2014 2161 MS ( )2027 2161 MS (p)2041 2161 MS (u)2066 2161 MS (i)2092 2161 MS (s)2105 2161 MS ( )2125 2161 MS +(d)235 2219 MS (\222)260 2219 MS (i)277 2219 MS (n)290 2219 MS (t)314 2219 MS (r)329 2219 MS (o)346 2219 MS (d)372 2219 MS (u)397 2219 MS (i)422 2219 MS (r)434 2219 MS (e)451 2219 MS ( )473 2219 MS (l)487 2219 MS (a)500 2219 MS ( )522 2219 MS +(m)536 2219 MS (\351)574 2219 MS (t)596 2219 MS (h)611 2219 MS (o)635 2219 MS (d)661 2219 MS (e)686 2219 MS ( )708 2219 MS (u)721 2219 MS (t)746 2219 MS (i)761 2219 MS (l)774 2219 MS (i)788 2219 MS (s)801 2219 MS (\351)820 2219 MS (e)843 2219 MS +( )865 2219 MS (d)878 2219 MS (a)903 2219 MS (n)926 2219 MS (s)950 2219 MS ( )969 2219 MS (c)982 2219 MS (e)1005 2219 MS (t)1027 2219 MS (t)1041 2219 MS (e)1056 2219 MS ( )1078 2219 MS (\351)1091 2219 MS (t)1113 2219 MS (u)1128 2219 MS (d)1153 2219 MS +(e)1178 2219 MS (.)1199 2219 MS ( )1212 2219 MS (L)1225 2219 MS (e)1255 2219 MS (s)1277 2219 MS ( )1296 2219 MS (p)1309 2219 MS (r)1334 2219 MS (i)1352 2219 MS (n)1365 2219 MS (c)1389 2219 MS (i)1412 2219 MS (p)1425 2219 MS (a)1450 2219 MS (u)1472 2219 MS +(x)1498 2219 MS ( )1523 2219 MS (c)1536 2219 MS (o)1558 2219 MS (n)1584 2219 MS (c)1608 2219 MS (e)1630 2219 MS (p)1652 2219 MS (t)1677 2219 MS (s)1692 2219 MS ( )1711 2219 MS (s)1724 2219 MS (o)1743 2219 MS (n)1769 2219 MS (t)1793 2219 MS ( )1808 2219 MS +(d)1821 2219 MS (\351)1846 2219 MS (f)1869 2219 MS (i)1885 2219 MS (n)1898 2219 MS (i)1923 2219 MS (s)1936 2219 MS ( )1956 2219 MS (d)1969 2219 MS (a)1994 2219 MS (n)2017 2219 MS (s)2042 2219 MS ( )2061 2219 MS (u)2074 2219 MS (n)2100 2219 MS ( )2125 2219 MS +(p)235 2276 MS (r)260 2276 MS (e)277 2276 MS (m)300 2276 MS (i)338 2276 MS (e)351 2276 MS (r)373 2276 MS ( )390 2276 MS (t)414 2276 MS (e)429 2276 MS (m)451 2276 MS (p)488 2276 MS (s)514 2276 MS (,)533 2276 MS ( )546 2276 MS (p)570 2276 MS +(u)595 2276 MS (i)621 2276 MS (s)633 2276 MS ( )652 2276 MS (o)676 2276 MS (n)702 2276 MS ( )726 2276 MS (p)750 2276 MS (r)775 2276 MS (\351)792 2276 MS (s)814 2276 MS (e)833 2276 MS (n)856 2276 MS (t)880 2276 MS (e)895 2276 MS ( )917 2276 MS +(u)941 2276 MS (n)966 2276 MS ( )990 2276 MS (c)1014 2276 MS (a)1036 2276 MS (s)1058 2276 MS ( )1077 2276 MS (d)1101 2276 MS (\222)1127 2276 MS (u)1143 2276 MS (t)1168 2276 MS (i)1184 2276 MS (l)1197 2276 MS (i)1210 2276 MS (s)1223 2276 MS (a)1244 2276 MS +(t)1266 2276 MS (i)1281 2276 MS (o)1293 2276 MS (n)1319 2276 MS ( )1343 2276 MS (b)1368 2276 MS (a)1392 2276 MS (s)1414 2276 MS (\351)1434 2276 MS ( )1456 2276 MS (s)1480 2276 MS (u)1499 2276 MS (r)1524 2276 MS ( )1541 2276 MS (l)1566 2276 MS (a)1578 2276 MS +( )1600 2276 MS (r)1624 2276 MS (\351)1641 2276 MS (s)1663 2276 MS (o)1682 2276 MS (l)1709 2276 MS (u)1721 2276 MS (t)1746 2276 MS (i)1762 2276 MS (o)1774 2276 MS (n)1800 2276 MS ( )1824 2276 MS (d)1848 2276 MS (\222)1873 2276 MS (u)1889 2276 MS (n)1915 2276 MS +( )1939 2276 MS (s)1963 2276 MS (y)1983 2276 MS (s)2007 2276 MS (t)2026 2276 MS (\350)2041 2276 MS (m)2064 2276 MS (e)2102 2276 MS ( )2125 2276 MS +(l)235 2334 MS (i)249 2334 MS (n)262 2334 MS (\351)287 2334 MS (a)309 2334 MS (i)332 2334 MS (r)345 2334 MS (e)362 2334 MS ( )384 2334 MS (\340)397 2334 MS ( )419 2334 MS (l)433 2334 MS (\222)446 2334 MS (a)462 2334 MS (i)485 2334 MS (d)498 2334 MS +(e)523 2334 MS ( )545 2334 MS (d)558 2334 MS (e)583 2334 MS ( )605 2334 MS (l)619 2334 MS (a)631 2334 MS ( )653 2334 MS (b)667 2334 MS (i)692 2334 MS (b)705 2334 MS (l)730 2334 MS (i)744 2334 MS (o)756 2334 MS (t)782 2334 MS (h)797 2334 MS +(\350)821 2334 MS (q)843 2334 MS (u)868 2334 MS (e)894 2334 MS ( )916 2334 MS (N)929 2334 MS (u)965 2334 MS (m)991 2334 MS (e)1028 2334 MS (r)1050 2334 MS +(i)1068 2334 MS (c)1081 2334 MS (a)1103 2334 MS (l)1126 2334 MS ( )1139 2334 MS (P)1152 2334 MS (l)1181 2334 MS (a)1193 2334 MS (t)1215 2334 MS (o)1230 2334 MS (n)1255 2334 MS ( )1279 2334 MS ([)1292 2334 MS (8)1309 2334 MS (])1334 2334 MS (.)1351 2334 MS +( )1364 2334 MS +showpage +%%Page: 6 6 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(6)1868 400 MS +(/)1893 400 MS +(3)1907 400 MS (0)1932 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1957 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(2)310 592 MS +( )347 592 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(E)400 592 MS (t)445 592 MS (a)465 592 MS (t)502 592 MS ( )524 592 MS (d)543 592 MS (e)584 592 MS ( )621 592 MS (l)639 592 MS (\222)658 592 MS (a)677 592 MS (r)714 592 MS (t)740 592 MS ( )762 592 MS (d)780 592 MS (a)821 592 MS +(n)858 592 MS (s)899 592 MS ( )936 592 MS (l)954 592 MS (e)973 592 MS ( )1010 592 MS (d)1029 592 MS (o)1069 592 MS (m)1110 592 MS (a)1170 592 MS (i)1206 592 MS (n)1225 592 MS (e)1266 592 MS +( )1303 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )348 667 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 724 MS (\222)378 724 MS +( )394 724 MS +(\253)408 724 MS +( )432 724 MS +(O)445 724 MS (b)481 724 MS (j)506 724 MS (e)519 724 MS (c)542 724 MS (t)564 724 MS ( )579 724 MS (M)597 724 MS (a)641 724 MS (n)663 724 MS (a)687 724 MS (g)709 724 MS (e)735 724 MS (m)758 724 MS (e)796 724 MS (n)819 724 MS +(t)843 724 MS ( )858 724 MS (G)876 724 MS (r)912 724 MS (o)929 724 MS (u)955 724 MS (p)980 724 MS +( )1004 724 MS +(\273)1017 724 MS ( )1041 724 MS (\()1059 724 MS (O)1076 724 MS (M)1112 724 MS (G)1156 724 MS (\))1192 724 MS ( )1209 724 MS (d)1227 724 MS (\351)1252 724 MS (f)1275 724 MS (i)1291 724 MS (n)1304 724 MS (i)1330 724 MS (t)1342 724 MS ( )1358 724 MS +(e)1376 724 MS (t)1398 724 MS ( )1413 724 MS (s)1431 724 MS (p)1450 724 MS (\351)1475 724 MS (c)1497 724 MS (i)1520 724 MS (f)1533 724 MS (i)1550 724 MS (e)1563 724 MS ( )1585 724 MS (a)1603 724 MS (c)1626 724 MS (t)1648 724 MS (u)1663 724 MS +(e)1688 724 MS (l)1711 724 MS (l)1724 724 MS (e)1737 724 MS (m)1760 724 MS (e)1798 724 MS (n)1821 724 MS (t)1845 724 MS ( )1860 724 MS (l)1879 724 MS (a)1891 724 MS ( )1913 724 MS (n)1932 724 MS (o)1956 724 MS (t)1982 724 MS (i)1997 724 MS +(o)2009 724 MS (n)2035 724 MS ( )2059 724 MS (d)2077 724 MS (e)2102 724 MS ( )2125 724 MS +(C)235 782 MS (O)268 782 MS (R)304 782 MS (B)337 782 MS (A)371 782 MS ( )406 782 MS (p)429 782 MS (a)454 782 MS (r)476 782 MS (a)493 782 MS (l)516 782 MS (l)530 782 MS (\350)543 782 MS (l)566 782 MS (e)579 782 MS ( )601 782 MS +([)624 782 MS (4)641 782 MS (,)666 782 MS (9)679 782 MS (])704 782 MS (.)721 782 MS ( )733 782 MS (A)756 782 MS (i)792 782 MS (n)805 782 MS (s)830 782 MS (i)850 782 MS (,)862 782 MS ( )875 782 MS (d)898 782 MS (a)923 782 MS +(n)946 782 MS (s)970 782 MS ( )989 782 MS (l)1013 782 MS (e)1026 782 MS ( )1048 782 MS (f)1072 782 MS (u)1087 782 MS (t)1112 782 MS (u)1127 782 MS (r)1152 782 MS (,)1169 782 MS ( )1182 782 MS (l)1205 782 MS (a)1217 782 MS ( )1240 782 MS +(p)1263 782 MS (l)1288 782 MS (a)1301 782 MS (t)1323 782 MS (e)1338 782 MS +(-)1360 782 MS +(f)1377 782 MS (o)1392 782 MS (r)1418 782 MS (m)1436 782 MS (e)1473 782 MS ( )1495 782 MS (S)1518 782 MS (A)1546 782 MS (L)1582 782 MS (O)1612 782 MS (M)1648 782 MS (E)1692 782 MS ( )1723 782 MS (b)1746 782 MS (\351)1771 782 MS (n)1794 782 MS +(\351)1818 782 MS (f)1841 782 MS (i)1857 782 MS (c)1870 782 MS (i)1893 782 MS (e)1906 782 MS (r)1928 782 MS (a)1945 782 MS ( )1967 782 MS (d)1990 782 MS (e)2015 782 MS ( )2037 782 MS (c)2060 782 MS (e)2082 782 MS (s)2105 782 MS ( )2125 782 MS +(n)235 839 MS (o)259 839 MS (u)285 839 MS (v)310 839 MS (e)334 839 MS (l)357 839 MS (l)371 839 MS (e)384 839 MS (s)407 839 MS ( )426 839 MS (f)465 839 MS (o)480 839 MS (n)506 839 MS (c)530 839 MS (t)552 839 MS (i)568 839 MS +(o)580 839 MS (n)606 839 MS (n)631 839 MS (a)655 839 MS (l)678 839 MS (i)692 839 MS (t)704 839 MS (\351)719 839 MS (s)742 839 MS ( )761 839 MS (q)799 839 MS (u)824 839 MS (i)850 839 MS ( )863 839 MS (p)901 839 MS (e)926 839 MS +(r)948 839 MS (m)966 839 MS (e)1004 839 MS (t)1026 839 MS (t)1040 839 MS (r)1055 839 MS +(o)1071 839 MS (n)1097 839 MS (t)1121 839 MS ( )1136 839 MS (d)1174 839 MS (e)1199 839 MS ( )1221 839 MS (s)1258 839 MS (i)1278 839 MS (m)1291 839 MS (p)1329 839 MS (l)1355 839 MS (i)1369 839 MS (f)1383 839 MS (i)1400 839 MS (e)1413 839 MS +(r)1435 839 MS ( )1452 839 MS (g)1490 839 MS (r)1515 839 MS (a)1532 839 MS (n)1554 839 MS (d)1578 839 MS (e)1603 839 MS (m)1626 839 MS (e)1664 839 MS (n)1687 839 MS (t)1711 839 MS ( )1726 839 MS (l)1765 839 MS (\222)1778 839 MS (i)1795 839 MS +(n)1808 839 MS (t)1832 839 MS (r)1847 839 MS (o)1864 839 MS (d)1890 839 MS (u)1915 839 MS (c)1940 839 MS (t)1961 839 MS (i)1976 839 MS (o)1988 839 MS (n)2014 839 MS ( )2038 839 MS (d)2076 839 MS (e)2102 839 MS ( )2125 839 MS +(c)235 897 MS (o)257 897 MS (m)283 897 MS (p)320 897 MS (o)345 897 MS (s)371 897 MS (a)390 897 MS (n)413 897 MS (t)437 897 MS (s)452 897 MS ( )471 897 MS (p)498 897 MS (a)523 897 MS (r)545 897 MS (a)562 897 MS (l)585 897 MS +(l)598 897 MS (\350)611 897 MS (l)634 897 MS (e)647 897 MS (s)670 897 MS ( )689 897 MS (q)716 897 MS (u)741 897 MS (i)767 897 MS ( )779 897 MS (n)807 897 MS (e)832 897 MS ( )854 897 MS (d)881 897 MS (e)906 897 MS (v)929 897 MS +(r)953 897 MS (a)970 897 MS (i)993 897 MS (t)1005 897 MS ( )1020 897 MS (p)1047 897 MS (a)1072 897 MS (s)1094 897 MS ( )1113 897 MS (p)1140 897 MS (o)1165 897 MS (s)1191 897 MS (e)1210 897 MS (r)1232 897 MS ( )1249 897 MS (p)1276 897 MS +(l)1302 897 MS (u)1314 897 MS (s)1339 897 MS ( )1358 897 MS (d)1385 897 MS (e)1410 897 MS ( )1432 897 MS (p)1459 897 MS (r)1484 897 MS (o)1501 897 MS (b)1527 897 MS (l)1552 897 MS (\350)1565 897 MS (m)1588 897 MS (e)1626 897 MS ( )1648 897 MS +(q)1675 897 MS (u)1700 897 MS (e)1725 897 MS ( )1747 897 MS (l)1775 897 MS (\222)1788 897 MS (i)1806 897 MS (n)1819 897 MS (t)1843 897 MS (r)1858 897 MS (o)1875 897 MS (d)1901 897 MS (u)1926 897 MS (c)1951 897 MS (t)1972 897 MS (i)1987 897 MS +(o)1999 897 MS (n)2025 897 MS ( )2049 897 MS (d)2076 897 MS (e)2102 897 MS ( )2125 897 MS +(c)235 954 MS (o)257 954 MS (m)283 954 MS (p)320 954 MS (o)345 954 MS (s)371 954 MS (a)390 954 MS (n)413 954 MS (t)437 954 MS (s)452 954 MS ( )471 954 MS (s)485 954 MS (\351)504 954 MS (q)526 954 MS (u)551 954 MS (e)576 954 MS +(n)599 954 MS (t)623 954 MS (i)639 954 MS (e)651 954 MS (l)674 954 MS (s)687 954 MS (,)706 954 MS ( )719 954 MS (p)733 954 MS (u)758 954 MS (i)784 954 MS (s)797 954 MS (q)816 954 MS (u)841 954 MS (e)867 954 MS ( )889 954 MS +(l)904 954 MS (a)917 954 MS ( )939 954 MS (g)953 954 MS (e)978 954 MS (s)1001 954 MS (t)1020 954 MS (i)1035 954 MS (o)1047 954 MS (n)1073 954 MS ( )1098 954 MS (d)1112 954 MS (u)1137 954 MS ( )1162 954 MS (p)1176 954 MS (a)1201 954 MS +(r)1223 954 MS (a)1241 954 MS (l)1264 954 MS (l)1277 954 MS (\351)1290 954 MS (l)1313 954 MS (i)1327 954 MS (s)1340 954 MS (m)1360 954 MS (e)1398 954 MS ( )1421 954 MS (\()1435 954 MS (n)1452 954 MS (o)1476 954 MS (t)1502 954 MS (a)1517 954 MS +(m)1539 954 MS (m)1577 954 MS (e)1615 954 MS (n)1638 954 MS (t)1662 954 MS ( )1677 954 MS (l)1692 954 MS (\222)1705 954 MS (\351)1721 954 MS (c)1743 954 MS (h)1766 954 MS (a)1791 954 MS (n)1814 954 MS (g)1838 954 MS (e)1863 954 MS ( )1885 954 MS +(d)1899 954 MS (e)1924 954 MS ( )1946 954 MS (d)1960 954 MS (o)1985 954 MS (n)2011 954 MS (n)2036 954 MS (\351)2060 954 MS (e)2083 954 MS (s)2105 954 MS ( )2125 954 MS +(d)235 1012 MS (i)261 1012 MS (s)273 1012 MS (t)292 1012 MS (r)307 1012 MS (i)325 1012 MS (b)338 1012 MS (u)362 1012 MS (\351)387 1012 MS (e)409 1012 MS (\))431 1012 MS ( )448 1012 MS (s)471 1012 MS (e)490 1012 MS (r)512 1012 MS (a)529 1012 MS +( )551 1012 MS (i)574 1012 MS (n)587 1012 MS (c)612 1012 MS (l)635 1012 MS (u)648 1012 MS (s)673 1012 MS (e)693 1012 MS ( )715 1012 MS (d)737 1012 MS (a)762 1012 MS (n)785 1012 MS (s)809 1012 MS ( )829 1012 MS (l)852 1012 MS (e)865 1012 MS +( )887 1012 MS (m)910 1012 MS (i)949 1012 MS (d)962 1012 MS (d)987 1012 MS (l)1013 1012 MS (e)1026 1012 MS (w)1048 1012 MS (a)1084 1012 MS (r)1106 1012 MS (e)1123 1012 MS ( )1146 1012 MS (e)1168 1012 MS (t)1190 1012 MS ( )1205 1012 MS (n)1227 1012 MS +(o)1252 1012 MS (n)1278 1012 MS ( )1302 1012 MS (p)1324 1012 MS (l)1350 1012 MS (u)1362 1012 MS (s)1388 1012 MS ( )1407 1012 MS (d)1429 1012 MS (a)1454 1012 MS (n)1477 1012 MS (s)1502 1012 MS ( )1521 1012 MS (l)1544 1012 MS (e)1557 1012 MS ( )1579 1012 MS +(c)1602 1012 MS (o)1624 1012 MS (m)1650 1012 MS (p)1687 1012 MS (o)1712 1012 MS (s)1738 1012 MS (a)1757 1012 MS (n)1780 1012 MS (t)1804 1012 MS ( )1819 1012 MS (\()1841 1012 MS (p)1858 1012 MS (o)1883 1012 MS (u)1909 1012 MS (r)1934 1012 MS ( )1951 1012 MS +(p)1973 1012 MS (l)1998 1012 MS (u)2010 1012 MS (s)2035 1012 MS ( )2055 1012 MS (d)2077 1012 MS (e)2102 1012 MS ( )2125 1012 MS +(d)235 1069 MS (\351)260 1069 MS (t)282 1069 MS (a)297 1069 MS (i)319 1069 MS (l)332 1069 MS (s)345 1069 MS ( )365 1069 MS (o)387 1069 MS (n)413 1069 MS ( )437 1069 MS (p)459 1069 MS (e)484 1069 MS (u)506 1069 MS (t)531 1069 MS ( )546 1069 MS +(s)568 1069 MS (e)587 1069 MS ( )609 1069 MS (r)631 1069 MS (\351)648 1069 MS (f)671 1069 MS (\351)686 1069 MS (r)708 1069 MS (e)725 1069 MS (r)747 1069 MS ( )764 1069 MS (a)786 1069 MS (u)808 1069 MS ( )833 1069 MS (d)855 1069 MS (o)880 1069 MS +(c)906 1069 MS (u)928 1069 MS (m)954 1069 MS (e)992 1069 MS (n)1015 1069 MS (t)1039 1069 MS ( )1054 1069 MS ([)1076 1069 MS (9)1093 1069 MS (])1118 1069 MS (\))1135 1069 MS (.)1151 1069 MS ( )1164 1069 MS (D)1186 1069 MS (e)1222 1069 MS ( )1244 1069 MS +(p)1266 1069 MS (l)1292 1069 MS (u)1304 1069 MS (s)1329 1069 MS (,)1348 1069 MS ( )1361 1069 MS (d)1383 1069 MS (e)1408 1069 MS (s)1431 1069 MS ( )1450 1069 MS (e)1472 1069 MS (f)1495 1069 MS (f)1511 1069 MS (o)1526 1069 MS (r)1552 1069 MS (t)1569 1069 MS +(s)1584 1069 MS ( )1603 1069 MS (s)1625 1069 MS (o)1644 1069 MS (n)1670 1069 MS (t)1694 1069 MS ( )1709 1069 MS (d)1731 1069 MS (\351)1756 1069 MS (j)1779 1069 MS (\340)1791 1069 MS ( )1813 1069 MS (e)1836 1069 MS (n)1859 1069 MS (t)1883 1069 MS (r)1898 1069 MS +(e)1915 1069 MS (p)1937 1069 MS (r)1962 1069 MS (i)1979 1069 MS (s)1991 1069 MS ( )2010 1069 MS (p)2032 1069 MS (o)2057 1069 MS (u)2083 1069 MS (r)2108 1069 MS ( )2125 1069 MS +(f)235 1127 MS (o)250 1127 MS (u)276 1127 MS (r)301 1127 MS (n)318 1127 MS (i)343 1127 MS (r)356 1127 MS ( )373 1127 MS (u)410 1127 MS (n)436 1127 MS (e)460 1127 MS ( )482 1127 MS (p)519 1127 MS (r)544 1127 MS (e)561 1127 MS (m)584 1127 MS +(i)623 1127 MS (\350)636 1127 MS (r)658 1127 MS (e)675 1127 MS ( )697 1127 MS (i)735 1127 MS (m)749 1127 MS (p)787 1127 MS (l)813 1127 MS (\351)826 1127 MS (m)849 1127 MS (e)887 1127 MS (n)910 1127 MS (t)934 1127 MS (a)949 1127 MS (t)971 1127 MS +(i)986 1127 MS (o)998 1127 MS (n)1024 1127 MS ( )1048 1127 MS (d)1085 1127 MS (e)1111 1127 MS ( )1133 1127 MS (C)1170 1127 MS (O)1203 1127 MS (R)1240 1127 MS (B)1273 1127 MS (A)1307 1127 MS ( )1342 1127 MS (p)1379 1127 MS (a)1404 1127 MS (r)1426 1127 MS +(a)1443 1127 MS (l)1466 1127 MS (l)1480 1127 MS (\350)1493 1127 MS (l)1516 1127 MS (e)1529 1127 MS +( )1551 1127 MS +(:)1564 1127 MS ( )1578 1127 MS (P)1615 1127 MS (a)1643 1127 MS (C)1665 1127 MS (O)1698 1127 MS ( )1734 1127 MS ([)1771 1127 MS (5)1788 1127 MS (])1813 1127 MS (,)1830 1127 MS ( )1843 1127 MS (P)1880 1127 MS (a)1908 1127 MS (r)1930 1127 MS (D)1947 1127 MS +(i)1984 1127 MS (s)1996 1127 MS ( )2016 1127 MS ([)2053 1127 MS (6)2070 1127 MS (])2095 1127 MS (.)2112 1127 MS ( )2125 1127 MS +(M)235 1184 MS (a)279 1184 MS (l)302 1184 MS (h)315 1184 MS (e)340 1184 MS (u)362 1184 MS (r)387 1184 MS (e)404 1184 MS (u)426 1184 MS (s)451 1184 MS (e)470 1184 MS (m)493 1184 MS (e)531 1184 MS (n)554 1184 MS (t)578 1184 MS (,)593 1184 MS +( )606 1184 MS (c)619 1184 MS (e)641 1184 MS (s)663 1184 MS ( )682 1184 MS (p)695 1184 MS (r)720 1184 MS (o)737 1184 MS (j)764 1184 MS (e)776 1184 MS (t)798 1184 MS (s)813 1184 MS ( )832 1184 MS (n)846 1184 MS +(e)870 1184 MS ( )892 1184 MS (s)905 1184 MS (o)924 1184 MS (n)950 1184 MS (t)974 1184 MS ( )989 1184 MS (e)1002 1184 MS (n)1025 1184 MS (c)1049 1184 MS (o)1071 1184 MS (r)1097 1184 MS (e)1114 1184 MS ( )1136 1184 MS (q)1149 1184 MS (u)1174 1184 MS +(\222)1199 1184 MS (\340)1215 1184 MS ( )1237 1184 MS (l)1251 1184 MS (\222)1264 1184 MS (\351)1281 1184 MS (t)1303 1184 MS (a)1318 1184 MS (t)1340 1184 MS ( )1355 1184 MS (d)1368 1184 MS (e)1393 1184 MS ( )1415 1184 MS (r)1428 1184 MS (e)1445 1184 MS (c)1467 1184 MS +(h)1489 1184 MS (e)1513 1184 MS (r)1535 1184 MS (c)1552 1184 MS (h)1575 1184 MS (e)1599 1184 MS ( )1621 1184 MS (e)1634 1184 MS (t)1656 1184 MS ( )1671 1184 MS (n)1684 1184 MS (e)1709 1184 MS ( )1731 1184 MS (s)1744 1184 MS (o)1763 1184 MS (n)1789 1184 MS +(t)1813 1184 MS ( )1828 1184 MS (p)1841 1184 MS (a)1866 1184 MS (s)1888 1184 MS ( )1908 1184 MS (u)1921 1184 MS (t)1946 1184 MS (i)1961 1184 MS (l)1974 1184 MS (i)1988 1184 MS (s)2001 1184 MS (a)2021 1184 MS (b)2044 1184 MS (l)2069 1184 MS (e)2082 1184 MS +(s)2105 1184 MS ( )2125 1184 MS +(t)235 1242 MS (e)250 1242 MS (l)272 1242 MS (s)284 1242 MS ( )303 1242 MS (q)316 1242 MS (u)341 1242 MS (e)366 1242 MS (l)389 1242 MS (s)402 1242 MS ( )421 1242 MS (d)434 1242 MS (a)459 1242 MS (n)482 1242 MS (s)507 1242 MS ( )526 1242 MS +(S)539 1242 MS (A)568 1242 MS (L)603 1242 MS (O)633 1242 MS (M)670 1242 MS (E)714 1242 MS (.)745 1242 MS ( )758 1242 MS (I)771 1242 MS (l)788 1242 MS (s)800 1242 MS ( )819 1242 MS (s)832 1242 MS (\222)852 1242 MS (a)868 1242 MS (p)890 1242 MS +(p)915 1242 MS (u)940 1242 MS (i)966 1242 MS (e)979 1242 MS (n)1002 1242 MS (t)1026 1242 MS ( )1041 1242 MS (s)1054 1242 MS (u)1073 1242 MS (r)1098 1242 MS ( )1115 1242 MS (u)1128 1242 MS (n)1153 1242 MS ( )1177 1242 MS (I)1190 1242 MS (D)1207 1242 MS +(L)1243 1242 MS ( )1273 1242 MS (\351)1286 1242 MS (t)1308 1242 MS (e)1323 1242 MS (n)1345 1242 MS (d)1369 1242 MS (u)1394 1242 MS ( )1419 1242 MS (d)1432 1242 MS (e)1457 1242 MS ( )1479 1242 MS (C)1492 1242 MS (O)1525 1242 MS (R)1561 1242 MS (B)1594 1242 MS +(A)1628 1242 MS (,)1663 1242 MS ( )1676 1242 MS (e)1689 1242 MS (t)1711 1242 MS ( )1726 1242 MS (d)1739 1242 MS (o)1763 1242 MS (n)1789 1242 MS (c)1813 1242 MS ( )1835 1242 MS (i)1849 1242 MS (m)1862 1242 MS (p)1900 1242 MS (o)1925 1242 MS (s)1951 1242 MS +(e)1970 1242 MS (n)1992 1242 MS (t)2016 1242 MS ( )2031 1242 MS (t)2044 1242 MS (r)2059 1242 MS (o)2075 1242 MS (p)2101 1242 MS ( )2125 1242 MS +(d)235 1299 MS (e)260 1299 MS ( )282 1299 MS (c)306 1299 MS (o)328 1299 MS (n)354 1299 MS (t)378 1299 MS (r)393 1299 MS (a)410 1299 MS (i)432 1299 MS (n)445 1299 MS (t)469 1299 MS (e)484 1299 MS (s)506 1299 MS ( )525 1299 MS (s)549 1299 MS +(u)568 1299 MS (r)593 1299 MS ( )610 1299 MS (l)635 1299 MS (e)648 1299 MS (u)670 1299 MS (r)695 1299 MS ( )712 1299 MS (u)736 1299 MS (t)761 1299 MS (i)776 1299 MS (l)789 1299 MS (i)803 1299 MS (s)816 1299 MS (a)836 1299 MS (t)858 1299 MS +(i)873 1299 MS (o)885 1299 MS (n)911 1299 MS (.)935 1299 MS ( )948 1299 MS (E)972 1299 MS (n)1003 1299 MS (f)1028 1299 MS (i)1045 1299 MS (n)1058 1299 MS ( )1083 1299 MS (l)1108 1299 MS (a)1121 1299 MS ( )1143 1299 MS (v)1168 1299 MS (e)1192 1299 MS +(r)1214 1299 MS (s)1231 1299 MS (i)1251 1299 MS (o)1263 1299 MS (n)1290 1299 MS ( )1314 1299 MS (d)1338 1299 MS (e)1363 1299 MS ( )1385 1299 MS (P)1409 1299 MS (a)1437 1299 MS (C)1459 1299 MS (O)1493 1299 MS ( )1529 1299 MS (t)1553 1299 MS (e)1568 1299 MS +(s)1590 1299 MS (t)1609 1299 MS (\351)1624 1299 MS (e)1646 1299 MS ( )1668 1299 MS (a)1692 1299 MS (u)1714 1299 MS ( )1739 1299 MS (L)1763 1299 MS (G)1793 1299 MS (L)1829 1299 MS (S)1859 1299 MS ( )1887 1299 MS (a)1911 1299 MS ( )1933 1299 MS (p)1957 1299 MS +(r)1982 1299 MS (\351)1999 1299 MS (s)2021 1299 MS (e)2040 1299 MS (n)2063 1299 MS (t)2087 1299 MS (\351)2102 1299 MS ( )2125 1299 MS +(q)235 1357 MS (u)260 1357 MS (e)285 1357 MS (l)308 1357 MS (q)320 1357 MS (u)345 1357 MS (e)370 1357 MS (s)393 1357 MS ( )412 1357 MS (p)425 1357 MS (r)450 1357 MS (o)467 1357 MS (b)493 1357 MS +(l)518 1357 MS (\350)531 1357 MS (m)554 1357 MS (e)592 1357 MS (s)614 1357 MS ( )634 1357 MS (d)647 1357 MS (\222)672 1357 MS (u)688 1357 MS (t)713 1357 MS (i)729 1357 MS (l)742 1357 MS (i)756 1357 MS (s)769 1357 MS (a)789 1357 MS (t)811 1357 MS +(i)826 1357 MS (o)838 1357 MS (n)864 1357 MS +( )888 1357 MS +(\()901 1357 MS (b)919 1357 MS (u)943 1357 MS (g)968 1357 MS (,)993 1357 MS ( )1006 1357 MS (f)1020 1357 MS (o)1035 1357 MS (n)1061 1357 MS (c)1085 1357 MS (t)1107 1357 MS (i)1123 1357 MS (o)1135 1357 MS (n)1161 1357 MS (n)1186 1357 MS (a)1210 1357 MS +(l)1233 1357 MS (i)1247 1357 MS (t)1259 1357 MS (\351)1274 1357 MS ( )1296 1357 MS (m)1310 1357 MS (a)1348 1357 MS (n)1371 1357 MS (q)1395 1357 MS (u)1420 1357 MS (a)1446 1357 MS (n)1469 1357 MS (t)1493 1357 MS (e)1508 1357 MS (\))1530 1357 MS ( )1547 1357 MS +(q)1560 1357 MS (u)1585 1357 MS (i)1611 1357 MS ( )1623 1357 MS (o)1636 1357 MS (n)1662 1357 MS (t)1686 1357 MS ( )1701 1357 MS (e)1714 1357 MS (m)1737 1357 MS (p)1774 1357 MS (\352)1800 1357 MS (c)1822 1357 MS (h)1845 1357 MS (\351)1869 1357 MS ( )1891 1357 MS +(d)1904 1357 MS (\222)1930 1357 MS (e)1946 1357 MS (f)1969 1357 MS (f)1986 1357 MS (e)2002 1357 MS (c)2024 1357 MS (t)2046 1357 MS (u)2061 1357 MS (e)2086 1357 MS (r)2108 1357 MS ( )2125 1357 MS +(u)235 1414 MS (n)260 1414 MS ( )284 1414 MS (e)323 1414 MS (x)346 1414 MS (e)370 1414 MS (r)392 1414 MS (c)409 1414 MS (i)432 1414 MS (c)445 1414 MS (e)467 1414 MS ( )489 1414 MS (c)528 1414 MS (o)550 1414 MS (m)577 1414 MS (p)614 1414 MS +(l)640 1414 MS (e)653 1414 MS (t)675 1414 MS ( )690 1414 MS (d)729 1414 MS (a)754 1414 MS (n)776 1414 MS (s)800 1414 MS ( )819 1414 MS (l)859 1414 MS (e)871 1414 MS ( )893 1414 MS (c)932 1414 MS (a)954 1414 MS (d)976 1414 MS (r)1001 1414 MS +(e)1018 1414 MS ( )1040 1414 MS (d)1079 1414 MS (e)1104 1414 MS ( )1126 1414 MS (S)1165 1414 MS (A)1193 1414 MS (L)1229 1414 MS (O)1259 1414 MS (M)1295 1414 MS (E)1339 1414 MS (.)1370 1414 MS ( )1383 1414 MS (A)1422 1414 MS (u)1457 1414 MS (j)1483 1414 MS +(o)1495 1414 MS (u)1521 1414 MS (r)1546 1414 MS (d)1563 1414 MS (\222)1588 1414 MS (h)1605 1414 MS (u)1629 1414 MS (i)1655 1414 MS (,)1667 1414 MS ( )1680 1414 MS (i)1720 1414 MS (l)1734 1414 MS ( )1746 1414 MS (n)1786 1414 MS (\222)1811 1414 MS (e)1827 1414 MS +(x)1850 1414 MS (i)1875 1414 MS (s)1888 1414 MS (t)1907 1414 MS (e)1922 1414 MS ( )1944 1414 MS (a)1983 1414 MS (u)2005 1414 MS (c)2030 1414 MS (u)2052 1414 MS (n)2077 1414 MS (e)2102 1414 MS ( )2125 1414 MS +(i)235 1472 MS (m)249 1472 MS (p)287 1472 MS (l)313 1472 MS (\351)326 1472 MS (m)349 1472 MS (e)387 1472 MS (n)410 1472 MS (t)434 1472 MS (a)449 1472 MS (t)471 1472 MS (i)486 1472 MS (o)498 1472 MS (n)524 1472 MS ( )548 1472 MS (s)567 1472 MS +(t)586 1472 MS (a)601 1472 MS (b)623 1472 MS (l)648 1472 MS (e)661 1472 MS ( )683 1472 MS (d)702 1472 MS (u)727 1472 MS ( )752 1472 MS (C)772 1472 MS (O)805 1472 MS (R)841 1472 MS (B)875 1472 MS (A)909 1472 MS ( )944 1472 MS (p)963 1472 MS +(a)988 1472 MS (r)1010 1472 MS (a)1027 1472 MS (l)1050 1472 MS (l)1063 1472 MS (\350)1076 1472 MS (l)1100 1472 MS (e)1113 1472 MS ( )1135 1472 MS (q)1154 1472 MS (u)1179 1472 MS (i)1205 1472 MS ( )1218 1472 MS (r)1237 1472 MS (e)1254 1472 MS (s)1276 1472 MS +(t)1295 1472 MS (e)1310 1472 MS ( )1332 1472 MS (e)1351 1472 MS (n)1373 1472 MS (c)1397 1472 MS (o)1419 1472 MS (r)1445 1472 MS (e)1462 1472 MS ( )1484 1472 MS (\340)1503 1472 MS ( )1525 1472 MS (l)1545 1472 MS (\222)1558 1472 MS (\351)1574 1472 MS (t)1596 1472 MS +(a)1611 1472 MS (t)1633 1472 MS ( )1648 1472 MS (d)1667 1472 MS (e)1692 1472 MS ( )1714 1472 MS (s)1733 1472 MS (p)1752 1472 MS (\351)1777 1472 MS (c)1799 1472 MS (i)1822 1472 MS (f)1835 1472 MS (i)1851 1472 MS (c)1864 1472 MS (a)1887 1472 MS (t)1909 1472 MS +(i)1924 1472 MS (o)1936 1472 MS (n)1962 1472 MS +( )1986 1472 MS +(;)2000 1472 MS ( )2013 1472 MS (d)2032 1472 MS (\222)2057 1472 MS (o)2073 1472 MS (\371)2099 1472 MS ( )2125 1472 MS +(l)235 1529 MS (\222)248 1529 MS (i)265 1529 MS (m)279 1529 MS (p)317 1529 MS (o)342 1529 MS (r)368 1529 MS (t)385 1529 MS +(a)400 1529 MS (n)422 1529 MS (c)446 1529 MS (e)468 1529 MS ( )490 1529 MS (d)503 1529 MS (e)528 1529 MS (s)550 1529 MS ( )569 1529 MS (t)582 1529 MS (r)597 1529 MS (a)614 1529 MS (v)636 1529 MS (a)660 1529 MS (u)682 1529 MS (x)707 1529 MS +( )731 1529 MS (\340)744 1529 MS ( )766 1529 MS (r)779 1529 MS (\351)796 1529 MS (a)818 1529 MS (l)841 1529 MS (i)854 1529 MS (s)867 1529 MS (e)887 1529 MS (r)909 1529 MS ( )926 1529 MS (d)939 1529 MS (a)964 1529 MS (n)986 1529 MS (s)1010 1529 MS +( )1029 1529 MS (c)1042 1529 MS (e)1064 1529 MS ( )1086 1529 MS (d)1099 1529 MS (o)1124 1529 MS (m)1151 1529 MS (a)1188 1529 MS (i)1211 1529 MS (n)1224 1529 MS (e)1250 1529 MS (.)1272 1529 MS +( )1285 1529 MS +( )348 1586 MS +(L)348 1644 MS (e)378 1644 MS ( )400 1644 MS (l)425 1644 MS (a)438 1644 MS (b)461 1644 MS (o)485 1644 MS (r)511 1644 MS (a)528 1644 MS (t)550 1644 MS (o)564 1644 MS (i)590 1644 MS (r)602 1644 MS (e)619 1644 MS ( )641 1644 MS (d)665 1644 MS +(e)690 1644 MS ( )712 1644 MS (l)737 1644 MS (\222)750 1644 MS (I)766 1644 MS (R)783 1644 MS (I)816 1644 MS (S)833 1644 MS (A)862 1644 MS ( )897 1644 MS (s)921 1644 MS (i)941 1644 MS (t)953 1644 MS (u)968 1644 MS (\351)993 1644 MS ( )1015 1644 MS +(\340)1039 1644 MS ( )1061 1644 MS (R)1086 1644 MS (e)1119 1644 MS (n)1142 1644 MS (n)1167 1644 MS (e)1191 1644 MS (s)1213 1644 MS ( )1232 1644 MS (t)1256 1644 MS (r)1271 1644 MS (a)1288 1644 MS (v)1310 1644 MS (a)1334 1644 MS (i)1357 1644 MS (l)1371 1644 MS +(l)1385 1644 MS (e)1398 1644 MS ( )1420 1644 MS (s)1444 1644 MS (u)1463 1644 MS (r)1488 1644 MS ( )1505 1644 MS (d)1529 1644 MS (i)1555 1644 MS (f)1569 1644 MS (f)1585 1644 MS (\351)1601 1644 MS (r)1623 1644 MS (e)1640 1644 MS (n)1663 1644 MS (t)1687 1644 MS +(s)1702 1644 MS ( )1721 1644 MS (p)1745 1644 MS (r)1770 1644 MS (o)1787 1644 MS (j)1813 1644 MS (e)1825 1644 MS (t)1847 1644 MS (s)1862 1644 MS ( )1881 1644 MS +(c)1905 1644 MS (o)1927 1644 MS (n)1953 1644 MS (c)1977 1644 MS (e)1999 1644 MS (r)2021 1644 MS (n)2039 1644 MS (a)2063 1644 MS (n)2086 1644 MS (t)2110 1644 MS ( )2125 1644 MS +(l)235 1701 MS (\222)248 1701 MS (u)265 1701 MS (t)290 1701 MS (i)305 1701 MS (l)318 1701 MS (i)332 1701 MS (s)345 1701 MS (a)365 1701 MS (t)387 1701 MS (i)403 1701 MS (o)415 1701 MS (n)441 1701 MS ( )465 1701 MS (d)487 1701 MS (e)512 1701 MS +( )534 1701 MS (C)556 1701 MS (O)589 1701 MS (R)625 1701 MS (B)658 1701 MS (A)692 1701 MS ( )727 1701 MS (p)749 1701 MS (o)774 1701 MS (u)800 1701 MS (r)825 1701 MS ( )842 1701 MS (l)865 1701 MS (e)877 1701 MS ( )899 1701 MS (c)921 1701 MS +(a)943 1701 MS (l)966 1701 MS (c)979 1701 MS (u)1001 1701 MS (l)1027 1701 MS ( )1040 1701 MS (h)1063 1701 MS (a)1087 1701 MS (u)1109 1701 MS (t)1134 1701 MS (e)1149 1701 MS +(-)1171 1701 MS +(p)1188 1701 MS (e)1213 1701 MS (r)1235 1701 MS (f)1251 1701 MS (o)1266 1701 MS (r)1292 1701 MS (m)1310 1701 MS (a)1347 1701 MS (n)1370 1701 MS (c)1395 1701 MS (e)1417 1701 MS (.)1439 1701 MS ( )1452 1701 MS (T)1474 1701 MS (o)1505 1701 MS (u)1531 1701 MS +(t)1555 1701 MS ( )1569 1701 MS (d)1591 1701 MS (\222)1616 1701 MS (a)1632 1701 MS (b)1654 1701 MS (o)1678 1701 MS (r)1704 1701 MS (d)1721 1701 MS ( )1746 1701 MS (i)1768 1701 MS (l)1781 1701 MS ( )1794 1701 MS (a)1816 1701 MS ( )1838 1701 MS (e)1860 1701 MS +(n)1883 1701 MS (t)1907 1701 MS (r)1922 1701 MS (e)1939 1701 MS (p)1961 1701 MS (r)1986 1701 MS (i)2003 1701 MS (s)2016 1701 MS ( )2035 1701 MS (d)2057 1701 MS (e)2082 1701 MS (s)2105 1701 MS ( )2125 1701 MS +(\351)235 1759 MS (t)257 1759 MS (u)272 1759 MS (d)297 1759 MS (e)322 1759 MS (s)344 1759 MS ( )363 1759 MS (s)377 1759 MS (u)396 1759 MS (r)421 1759 MS ( )438 1759 MS (u)452 1759 MS (n)477 1759 MS (e)501 1759 MS ( )523 1759 MS (i)538 1759 MS +(m)552 1759 MS (p)590 1759 MS (l)616 1759 MS (\351)629 1759 MS (m)652 1759 MS (e)690 1759 MS (n)713 1759 MS (t)737 1759 MS (a)752 1759 MS (t)774 1759 MS (i)789 1759 MS (o)801 1759 MS (n)827 1759 MS ( )851 1759 MS (p)865 1759 MS (o)890 1759 MS +(r)916 1759 MS (t)933 1759 MS (a)948 1759 MS (b)970 1759 MS +(l)995 1759 MS (e)1007 1759 MS ( )1029 1759 MS (d)1043 1759 MS (u)1068 1759 MS ( )1093 1759 MS (c)1107 1759 MS (o)1129 1759 MS (n)1155 1759 MS (c)1179 1759 MS (e)1202 1759 MS (p)1224 1759 MS (t)1250 1759 MS ( )1265 1759 MS (d)1279 1759 MS (\222)1304 1759 MS +(o)1320 1759 MS (b)1346 1759 MS (j)1370 1759 MS (e)1383 1759 MS (t)1405 1759 MS ( )1420 1759 MS (C)1434 1759 MS (O)1467 1759 MS (R)1503 1759 MS (B)1536 1759 MS (A)1570 1759 MS ( )1605 1759 MS (p)1619 1759 MS (a)1644 1759 MS (r)1666 1759 MS (a)1683 1759 MS +(l)1706 1759 MS (l)1720 1759 MS (\350)1733 1759 MS (l)1756 1759 MS (e)1769 1759 MS ( )1791 1759 MS (\()1805 1759 MS (P)1822 1759 MS (a)1850 1759 MS (C)1872 1759 MS (O)1905 1759 MS (+)1941 1759 MS (+)1970 1759 MS (\))1998 1759 MS ( )2015 1759 MS ([)2029 1759 MS +(1)2046 1759 MS (1)2071 1759 MS (])2096 1759 MS (.)2113 1759 MS ( )2125 1759 MS +(D)235 1816 MS (a)271 1816 MS (n)293 1816 MS (s)318 1816 MS ( )337 1816 MS (c)350 1816 MS (e)372 1816 MS ( )394 1816 MS (d)407 1816 MS (e)432 1816 MS (r)454 1816 MS (n)471 1816 MS (i)496 1816 MS (e)509 1816 MS (r)531 1816 MS (,)548 1816 MS +( )561 1816 MS (i)575 1816 MS (l)588 1816 MS ( )600 1816 MS (n)614 1816 MS (\222)639 1816 MS (y)656 1816 MS ( )680 1816 MS (a)693 1816 MS ( )715 1816 MS (p)728 1816 MS (l)754 1816 MS (u)766 1816 MS (s)792 1816 MS ( )811 1816 MS (b)824 1816 MS +(e)849 1816 MS (s)871 1816 MS (o)890 1816 MS (i)917 1816 MS (n)930 1816 MS ( )954 1816 MS (d)967 1816 MS (e)992 1816 MS ( )1014 1816 MS (m)1028 1816 MS (o)1065 1816 MS (d)1091 1816 MS (i)1117 1816 MS (f)1130 1816 MS (i)1147 1816 MS (e)1160 1816 MS +(r)1182 1816 MS ( )1199 1816 MS (l)1213 1816 MS (a)1225 1816 MS ( )1248 1816 MS (s)1261 1816 MS (y)1281 1816 MS (n)1305 1816 MS (t)1329 1816 MS (a)1344 1816 MS (x)1366 1816 MS (e)1390 1816 MS ( )1412 1816 MS (d)1425 1816 MS (u)1450 1816 MS ( )1475 1816 MS +(l)1489 1816 MS (a)1502 1816 MS (n)1525 1816 MS (g)1549 1816 MS (a)1574 1816 MS (g)1596 1816 MS (e)1621 1816 MS ( )1643 1816 MS (I)1656 1816 MS (D)1673 1816 MS (L)1709 1816 MS (.)1739 1816 MS ( )1752 1816 MS (L)1765 1816 MS (e)1795 1816 MS (s)1817 1816 MS +( )1836 1816 MS (s)1849 1816 MS (p)1868 1816 MS (\351)1893 1816 MS (c)1916 1816 MS (i)1939 1816 MS (f)1952 1816 MS (i)1969 1816 MS (c)1982 1816 MS (a)2004 1816 MS (t)2026 1816 MS (i)2042 1816 MS (o)2054 1816 MS (n)2080 1816 MS (s)2105 1816 MS ( )2125 1816 MS +(d)235 1874 MS (e)260 1874 MS ( )282 1874 MS (d)302 1874 MS (i)328 1874 MS (s)341 1874 MS (t)360 1874 MS (r)375 1874 MS (i)392 1874 MS (b)405 1874 MS (u)429 1874 MS (t)454 1874 MS (i)470 1874 MS (o)482 1874 MS (n)508 1874 MS (s)532 1874 MS +( )551 1874 MS (s)572 1874 MS (o)591 1874 MS (n)617 1874 MS (t)641 1874 MS ( )656 1874 MS (i)676 1874 MS (n)689 1874 MS (c)714 1874 MS (l)737 1874 MS (u)749 1874 MS (s)775 1874 MS (e)794 1874 MS (s)817 1874 MS ( )836 1874 MS (d)856 1874 MS +(a)881 1874 MS (n)904 1874 MS (s)928 1874 MS ( )947 1874 MS (u)967 1874 MS (n)993 1874 MS ( )1017 1874 MS (f)1038 1874 MS (i)1055 1874 MS (c)1068 1874 MS (h)1091 1874 MS (i)1116 1874 MS (e)1129 1874 MS (r)1151 1874 MS ( )1168 1874 MS (X)1188 1874 MS +(M)1225 1874 MS (L)1269 1874 MS (.)1299 1874 MS ( )1312 1874 MS (U)1332 1874 MS (n)1369 1874 MS ( )1393 1874 MS (p)1413 1874 MS (r)1438 1874 MS (o)1455 1874 MS (t)1480 1874 MS (o)1494 1874 MS (t)1519 1874 MS (y)1534 1874 MS (p)1557 1874 MS (e)1582 1874 MS +( )1604 1874 MS (e)1624 1874 MS (s)1647 1874 MS (t)1666 1874 MS ( )1681 1874 MS (e)1701 1874 MS (n)1723 1874 MS ( )1747 1874 MS (c)1767 1874 MS (o)1789 1874 MS (u)1815 1874 MS (r)1840 1874 MS (s)1857 1874 MS ( )1876 1874 MS (d)1896 1874 MS (e)1921 1874 MS +( )1943 1874 MS (m)1964 1874 MS (i)2002 1874 MS (s)2015 1874 MS (e)2035 1874 MS ( )2057 1874 MS (e)2077 1874 MS (n)2100 1874 MS ( )2125 1874 MS +(o)235 1931 MS (e)261 1931 MS (u)283 1931 MS (v)308 1931 MS (r)332 1931 MS (e)349 1931 MS (.)371 1931 MS ( )384 1931 MS (C)400 1931 MS (e)433 1931 MS ( )455 1931 MS (l)472 1931 MS (a)484 1931 MS (b)507 1931 MS (o)531 1931 MS (r)557 1931 MS +(a)574 1931 MS (t)596 1931 MS +(o)610 1931 MS (i)636 1931 MS (r)648 1931 MS (e)665 1931 MS ( )687 1931 MS (a)703 1931 MS ( )725 1931 MS (r)741 1931 MS (\351)758 1931 MS (c)780 1931 MS (e)802 1931 MS (m)825 1931 MS (m)864 1931 MS (e)902 1931 MS (n)925 1931 MS (t)949 1931 MS +( )964 1931 MS (u)980 1931 MS (t)1004 1931 MS (i)1019 1931 MS (l)1032 1931 MS (i)1046 1931 MS (s)1059 1931 MS (\351)1079 1931 MS ( )1101 1931 MS (c)1117 1931 MS (e)1139 1931 MS (t)1161 1931 MS (t)1176 1931 MS (e)1191 1931 MS ( )1213 1931 MS (i)1229 1931 MS +(m)1242 1931 MS (p)1280 1931 MS (l)1306 1931 MS (\351)1319 1931 MS (m)1342 1931 MS (e)1380 1931 MS (n)1403 1931 MS (t)1427 1931 MS (a)1442 1931 MS (t)1464 1931 MS (i)1479 1931 MS (o)1491 1931 MS (n)1517 1931 MS ( )1541 1931 MS (p)1557 1931 MS (o)1582 1931 MS +(u)1608 1931 MS (r)1633 1931 MS ( )1650 1931 MS (e)1666 1931 MS (x)1688 1931 MS (p)1712 1931 MS (\351)1737 1931 MS (r)1759 1931 MS (i)1777 1931 MS (m)1790 1931 MS (e)1828 1931 MS (n)1851 1931 MS (t)1875 1931 MS (e)1890 1931 MS (r)1912 1931 MS ( )1929 1931 MS +(l)1946 1931 MS (e)1958 1931 MS ( )1980 1931 MS (r)1996 1931 MS (\351)2013 1931 MS (s)2035 1931 MS (e)2055 1931 MS (a)2077 1931 MS (u)2099 1931 MS ( )2125 1931 MS +(V)235 1989 MS (T)271 1989 MS (H)302 1989 MS (D)338 1989 MS ( )374 1989 MS (\()390 1989 MS (1)407 1989 MS ( )432 1989 MS (G)448 1989 MS (b)484 1989 MS (/)508 1989 MS (s)523 1989 MS ( )542 1989 MS (e)558 1989 MS (n)581 1989 MS (t)605 1989 MS +(r)620 1989 MS (e)637 1989 MS ( )659 1989 MS (p)675 1989 MS (l)701 1989 MS (u)713 1989 MS (s)738 1989 MS (i)758 1989 MS (e)771 1989 MS (u)793 1989 MS (r)818 1989 MS (s)836 1989 MS ( )855 1989 MS (g)871 1989 MS (r)896 1989 MS (a)913 1989 MS +(p)935 1989 MS (p)960 1989 MS (e)985 1989 MS (s)1007 1989 MS ( )1027 1989 MS (d)1043 1989 MS (e)1068 1989 MS ( )1090 1989 MS (l)1107 1989 MS (')1120 1989 MS (I)1129 1989 MS (N)1146 1989 MS (R)1182 1989 MS (I)1215 1989 MS (A)1233 1989 MS (\))1268 1989 MS +(.)1285 1989 MS ( )1298 1989 MS (I)1314 1989 MS (l)1332 1989 MS ( )1344 1989 MS (a)1361 1989 MS ( )1383 1989 MS (r)1399 1989 MS (\351)1416 1989 MS (u)1438 1989 MS (s)1463 1989 MS (s)1483 1989 MS (i)1503 1989 MS ( )1516 1989 MS (\340)1532 1989 MS ( )1554 1989 MS +(o)1570 1989 MS (b)1596 1989 MS (t)1620 1989 MS (e)1635 1989 MS (n)1657 1989 MS (i)1682 1989 MS (r)1695 1989 MS ( )1712 1989 MS (u)1728 1989 MS (n)1754 1989 MS ( )1778 1989 MS (d)1794 1989 MS (\351)1820 1989 MS (b)1843 1989 MS (i)1868 1989 MS (t)1880 1989 MS +( )1895 1989 MS (e)1911 1989 MS (n)1934 1989 MS (t)1958 1989 MS (r)1973 1989 MS (e)1990 1989 MS ( )2012 1989 MS (d)2028 1989 MS (e)2053 1989 MS (u)2075 1989 MS (x)2100 1989 MS ( )2125 1989 MS +(c)235 2046 MS (o)257 2046 MS (l)283 2046 MS (l)296 2046 MS (e)309 2046 MS (c)331 2046 MS (t)353 2046 MS (i)369 2046 MS (o)381 2046 MS (n)407 2046 MS (s)432 2046 MS ( )451 2046 MS (d)469 2046 MS (e)494 2046 MS ( )516 2046 MS (l)535 2046 MS +(')548 2046 MS (o)556 2046 MS (r)582 2046 MS (d)599 2046 MS (r)624 2046 MS (e)641 2046 MS ( )663 2046 MS (d)681 2046 MS (e)706 2046 MS ( )729 2046 MS (8)747 2046 MS (0)772 2046 MS (0)797 2046 MS ( )822 2046 MS (M)840 2046 MS (b)885 2046 MS +(i)910 2046 MS (t)922 2046 MS (/)937 2046 MS (s)951 2046 MS ( )971 2046 MS (s)989 2046 MS (u)1008 2046 MS (r)1033 2046 MS ( )1050 2046 MS (d)1068 2046 MS (e)1093 2046 MS (u)1115 2046 MS (x)1141 2046 MS ( )1166 2046 MS (g)1184 2046 MS (r)1209 2046 MS +(a)1226 2046 MS (p)1248 2046 MS (p)1273 2046 MS (e)1298 2046 MS (s)1320 2046 MS ( )1339 2046 MS (d)1357 2046 MS (i)1383 2046 MS (s)1396 2046 MS (t)1415 2046 MS (a)1430 2046 MS (n)1452 2046 MS (t)1476 2046 MS (e)1491 2046 MS (s)1513 2046 MS ( )1532 2046 MS +(d)1550 2046 MS (e)1575 2046 MS ( )1598 2046 MS (1)1616 2046 MS (0)1641 2046 MS (0)1666 2046 MS (0)1691 2046 MS ( )1716 2046 MS (k)1734 2046 MS (m)1760 2046 MS (.)1797 2046 MS ( )1811 2046 MS (I)1829 2046 MS (l)1847 2046 MS ( )1859 2046 MS (a)1878 2046 MS +( )1900 2046 MS (\351)1918 2046 MS (g)1940 2046 MS (a)1965 2046 MS (l)1988 2046 MS (e)2001 2046 MS (m)2024 2046 MS (e)2062 2046 MS (n)2085 2046 MS (t)2109 2046 MS +( )2125 2046 MS +(l)235 2104 MS (a)248 2104 MS (n)271 2104 MS (c)295 2104 MS (\351)317 2104 MS ( )340 2104 MS (u)369 2104 MS (n)395 2104 MS ( )419 2104 MS (n)449 2104 MS (o)473 2104 MS (u)499 2104 MS (v)524 2104 MS (e)548 2104 MS (a)571 2104 MS (u)593 2104 MS +( )618 2104 MS (p)647 2104 MS (r)672 2104 MS (o)689 2104 MS (j)715 2104 MS (e)728 2104 MS (t)750 2104 MS ( )765 2104 MS (s)794 2104 MS (u)813 2104 MS (r)838 2104 MS ( )855 2104 MS (l)885 2104 MS (a)897 2104 MS ( )920 2104 MS (r)949 2104 MS +(\351)966 2104 MS (a)988 2104 MS (l)1011 2104 MS (i)1025 2104 MS (s)1038 2104 MS (a)1057 2104 MS (t)1079 2104 MS (i)1095 2104 MS (o)1107 2104 MS (n)1133 2104 MS ( )1157 2104 MS (d)1186 2104 MS (\222)1212 2104 MS (u)1228 2104 MS (n)1254 2104 MS (e)1278 2104 MS +( )1301 2104 MS (p)1330 2104 MS (l)1356 2104 MS (a)1369 2104 MS (t)1391 2104 MS (e)1406 2104 MS +(-)1428 2104 MS +(f)1445 2104 MS (o)1460 2104 MS (r)1486 2104 MS (m)1504 2104 MS (e)1541 2104 MS ( )1563 2104 MS (d)1592 2104 MS (')1618 2104 MS (o)1626 2104 MS (b)1652 2104 MS (j)1677 2104 MS (e)1690 2104 MS (t)1712 2104 MS (s)1727 2104 MS ( )1746 2104 MS (d)1775 2104 MS +(i)1801 2104 MS (s)1814 2104 MS (t)1833 2104 MS (r)1848 2104 MS (i)1866 2104 MS (b)1879 2104 MS (u)1903 2104 MS (\351)1928 2104 MS (s)1950 2104 MS ( )1970 2104 MS (h)2000 2104 MS (a)2024 2104 MS (u)2046 2104 MS (t)2071 2104 MS (e)2086 2104 MS +(-)2108 2104 MS +(p)235 2161 MS (e)260 2161 MS (r)282 2161 MS (f)299 2161 MS (o)314 2161 MS (r)340 2161 MS (m)358 2161 MS (a)395 2161 MS (n)418 2161 MS (c)442 2161 MS (e)465 2161 MS (.)487 2161 MS ( )500 2161 MS (I)517 2161 MS (l)535 2161 MS ( )547 2161 MS +(s)565 2161 MS (')585 2161 MS (a)593 2161 MS (g)615 2161 MS (i)641 2161 MS (t)653 2161 MS ( )668 2161 MS (d)685 2161 MS (u)710 2161 MS ( )735 2161 MS (p)752 2161 MS (r)777 2161 MS (o)794 2161 MS (j)821 2161 MS (e)833 2161 MS (t)855 2161 MS +( )870 2161 MS (P)887 2161 MS (a)915 2161 MS (d)937 2161 MS (i)963 2161 MS (c)975 2161 MS (o)997 2161 MS ( )1023 2161 MS ([)1040 2161 MS (1)1057 2161 MS (1)1082 2161 MS (])1107 2161 MS (.)1124 2161 MS ( )1137 2161 MS (L)1154 2161 MS (')1184 2161 MS +(o)1192 2161 MS (b)1218 2161 MS (j)1243 2161 MS (e)1257 2161 MS (c)1279 2161 MS (t)1301 2161 MS (i)1316 2161 MS (f)1329 2161 MS ( )1345 2161 MS (e)1362 2161 MS (s)1385 2161 MS (t)1404 2161 MS ( )1419 2161 MS (d)1436 2161 MS (e)1461 2161 MS ( )1483 2161 MS +(p)1500 2161 MS (e)1525 2161 MS (r)1547 2161 MS (m)1565 2161 MS (e)1602 2161 MS (t)1624 2161 MS (t)1639 2161 MS (r)1654 2161 MS (e)1671 2161 MS ( )1693 2161 MS (d)1710 2161 MS (')1735 2161 MS (u)1743 2161 MS (t)1768 2161 MS (i)1783 2161 MS (l)1796 2161 MS +(i)1810 2161 MS (s)1823 2161 MS (e)1842 2161 MS (r)1864 2161 MS ( )1881 2161 MS (d)1898 2161 MS (e)1924 2161 MS ( )1946 2161 MS (m)1964 2161 MS (a)2002 2161 MS (n)2025 2161 MS (i)2050 2161 MS (\350)2063 2161 MS (r)2085 2161 MS (e)2102 2161 MS ( )2125 2161 MS +(t)235 2219 MS (r)250 2219 MS (a)267 2219 MS (n)289 2219 MS (s)313 2219 MS (p)332 2219 MS (a)357 2219 MS (r)379 2219 MS (e)396 2219 MS (n)418 2219 MS (t)442 2219 MS (e)457 2219 MS ( )479 2219 MS (d)501 2219 MS (e)526 2219 MS (s)548 2219 MS +( )567 2219 MS (r)589 2219 MS (\351)606 2219 MS (s)629 2219 MS (e)648 2219 MS (a)670 2219 MS (u)692 2219 MS (x)718 2219 MS ( )742 2219 MS (d)764 2219 MS (')790 2219 MS (i)799 2219 MS (n)812 2219 MS (t)836 2219 MS (e)851 2219 MS (r)873 2219 MS +(c)890 2219 MS (o)912 2219 MS (n)938 2219 MS (n)963 2219 MS (e)987 2219 MS (x)1010 2219 MS (i)1035 2219 MS (o)1047 2219 MS (n)1074 2219 MS ( )1098 2219 MS (\()1120 2219 MS (M)1137 2219 MS (y)1182 2219 MS (r)1206 2219 MS (i)1224 2219 MS (n)1238 2219 MS +(e)1262 2219 MS (t)1284 2219 MS (,)1299 2219 MS ( )1312 2219 MS (V)1334 2219 MS (I)1370 2219 MS (A)1387 2219 MS (,)1422 2219 MS ( )1435 2219 MS (S)1457 2219 MS (C)1485 2219 MS (I)1518 2219 MS (,)1535 2219 MS ( )1548 2219 MS (r)1570 2219 MS (\351)1587 2219 MS +(s)1609 2219 MS (e)1628 2219 MS (a)1650 2219 MS (u)1672 2219 MS (x)1697 2219 MS ( )1722 2219 MS (d)1744 2219 MS (a)1769 2219 MS +(n)1792 2219 MS (s)1816 2219 MS ( )1835 2219 MS (l)1858 2219 MS (e)1871 2219 MS (s)1894 2219 MS ( )1913 2219 MS (m)1936 2219 MS (a)1974 2219 MS (c)1996 2219 MS (h)2019 2219 MS (i)2044 2219 MS (n)2057 2219 MS (e)2082 2219 MS (s)2105 2219 MS ( )2125 2219 MS +(p)235 2276 MS (a)260 2276 MS (r)282 2276 MS (a)299 2276 MS (l)322 2276 MS (l)335 2276 MS (\350)348 2276 MS (l)371 2276 MS (e)384 2276 MS (s)407 2276 MS (\))426 2276 MS ( )443 2276 MS (a)465 2276 MS (u)487 2276 MS ( )512 2276 MS (t)534 2276 MS +(r)549 2276 MS (a)566 2276 MS (v)588 2276 MS (e)612 2276 MS (r)634 2276 MS (s)651 2276 MS ( )670 2276 MS (d)692 2276 MS (e)717 2276 MS ( )739 2276 MS (m)762 2276 MS (i)801 2276 MS (d)814 2276 MS (d)839 2276 MS (l)865 2276 MS (e)878 2276 MS +(w)900 2276 MS (a)936 2276 MS (r)958 2276 MS (e)975 2276 MS ( )997 2276 MS (\()1019 2276 MS (C)1036 2276 MS (O)1069 2276 MS (R)1106 2276 MS (B)1139 2276 MS (A)1173 2276 MS (\))1208 2276 MS (,)1225 2276 MS ( )1238 2276 MS (e)1260 2276 MS (x)1282 2276 MS +(\351)1306 2276 MS (c)1329 2276 MS (u)1351 2276 MS (t)1376 2276 MS (i)1391 2276 MS (f)1404 2276 MS (s)1420 2276 MS ( )1440 2276 MS (\()1462 2276 MS (M)1479 2276 MS (P)1523 2276 MS (I)1551 2276 MS (,)1568 2276 MS ( )1581 2276 MS (D)1603 2276 MS (S)1639 2276 MS +(M)1667 2276 MS (,)1711 2276 MS ( )1724 2276 MS (.)1746 2276 MS (.)1759 2276 MS (.)1771 2276 MS (\))1784 2276 MS ( )1801 2276 MS (e)1823 2276 MS (t)1844 2276 MS ( )1859 2276 MS (d)1881 2276 MS (e)1906 2276 MS ( )1928 2276 MS (l)1951 2276 MS (a)1963 2276 MS +(n)1986 2276 MS (g)2010 2276 MS (a)2035 2276 MS (g)2057 2276 MS (e)2082 2276 MS (s)2105 2276 MS ( )2125 2276 MS +(\()235 2334 MS (J)252 2334 MS (a)271 2334 MS (v)293 2334 MS (a)317 2334 MS (\))339 2334 MS (.)356 2334 MS ( )369 2334 MS (A)386 2334 MS (v)422 2334 MS (e)446 2334 MS (c)468 2334 MS ( )491 2334 MS (c)507 2334 MS (e)529 2334 MS ( )551 2334 MS +(t)567 2334 MS (y)583 2334 MS (p)606 2334 MS (e)631 2334 MS ( )654 2334 MS (d)670 2334 MS (e)695 2334 MS ( )717 2334 MS (p)733 2334 MS (l)759 2334 MS (a)772 2334 MS (t)794 2334 MS (e)809 2334 MS +(-)831 2334 MS +(f)848 2334 MS (o)863 2334 MS (r)889 2334 MS (m)907 2334 MS (e)944 2334 MS (,)966 2334 MS ( )979 2334 MS (u)995 2334 MS (n)1021 2334 MS (e)1045 2334 MS ( )1067 2334 MS (a)1083 2334 MS (p)1105 2334 MS (p)1130 2334 MS (l)1156 2334 MS (i)1170 2334 MS +(c)1183 2334 MS (a)1206 2334 MS (t)1228 2334 MS (i)1243 2334 MS (o)1256 2334 MS (n)1282 2334 MS ( )1306 2334 MS (q)1322 2334 MS (u)1347 2334 MS (i)1373 2334 MS ( )1385 2334 MS (u)1401 2334 MS (t)1426 2334 MS (i)1442 2334 MS (l)1455 2334 MS (i)1469 2334 MS +(s)1482 2334 MS (e)1502 2334 MS ( )1524 2334 MS (\340)1540 2334 MS ( )1562 2334 MS (l)1579 2334 MS (a)1592 2334 MS ( )1615 2334 MS (f)1632 2334 MS (o)1647 2334 MS (i)1674 2334 MS (s)1687 2334 MS ( )1706 2334 MS (C)1722 2334 MS (O)1755 2334 MS (R)1792 2334 MS +(B)1825 2334 MS (A)1859 2334 MS ( )1894 2334 MS (e)1910 2334 MS (t)1932 2334 MS ( )1947 2334 MS (M)1963 2334 MS (P)2007 2334 MS (I)2035 2334 MS ( )2052 2334 MS (e)2068 2334 MS (s)2090 2334 MS (t)2109 2334 MS ( )2125 2334 MS +(a)235 2391 MS (s)257 2391 MS (s)276 2391 MS (u)295 2391 MS (r)320 2391 MS (\351)337 2391 MS (e)359 2391 MS ( )381 2391 MS (d)400 2391 MS (e)425 2391 MS ( )448 2391 MS (p)467 2391 MS (o)492 2391 MS (u)518 2391 MS (v)543 2391 MS (o)567 2391 MS +(i)594 2391 MS (r)606 2391 MS ( )623 2391 MS (u)642 2391 MS (t)667 2391 MS (i)682 2391 MS (l)695 2391 MS (i)709 2391 MS (s)722 2391 MS (e)742 2391 MS (r)764 2391 MS ( )781 2391 MS (l)801 2391 MS (e)813 2391 MS (s)836 2391 MS ( )855 2391 MS +(m)875 2391 MS (e)913 2391 MS (i)936 2391 MS (l)950 2391 MS (l)964 2391 MS (e)977 2391 MS (u)999 2391 MS (r)1024 2391 MS (s)1041 2391 MS ( )1060 2391 MS (r)1079 2391 MS (\351)1096 2391 MS (s)1119 2391 MS (e)1138 2391 MS (a)1160 2391 MS (u)1182 2391 MS +(x)1208 2391 MS ( )1232 2391 MS (d)1252 2391 MS (i)1278 2391 MS (s)1290 2391 MS (p)1309 2391 MS (o)1334 2391 MS (n)1360 2391 MS (i)1385 2391 MS (b)1398 2391 MS (l)1424 2391 MS (e)1437 2391 MS (s)1460 2391 MS +(.)1479 2391 MS ( )1492 2391 MS (U)1511 2391 MS (n)1548 2391 MS (e)1572 2391 MS ( )1594 2391 MS (p)1613 2391 MS (r)1638 2391 MS (e)1655 2391 MS (m)1678 2391 MS (i)1717 2391 MS (\350)1730 2391 MS (r)1752 2391 MS (e)1769 2391 MS ( )1791 2391 MS (i)1811 2391 MS +(m)1825 2391 MS (p)1863 2391 MS (l)1889 2391 MS (\351)1902 2391 MS (m)1925 2391 MS (e)1963 2391 MS (n)1986 2391 MS (t)2010 2391 MS (a)2025 2391 MS (t)2047 2391 MS (i)2062 2391 MS (o)2074 2391 MS (n)2100 2391 MS ( )2125 2391 MS +(e)235 2449 MS (s)257 2449 MS (t)276 2449 MS ( )291 2449 MS (e)312 2449 MS (n)334 2449 MS ( )358 2449 MS (b)379 2449 MS (o)403 2449 MS (n)429 2449 MS (n)454 2449 MS (e)478 2449 MS ( )500 2449 MS (v)522 2449 MS (o)546 2449 MS (i)572 2449 MS +(e)585 2449 MS ( )607 2449 MS (d)628 2449 MS (')653 2449 MS (a)661 2449 MS (c)684 2449 MS (h)707 2449 MS (\350)731 2449 MS (v)754 2449 MS (e)778 2449 MS (m)801 2449 MS (e)839 2449 MS (n)862 2449 MS (t)886 2449 MS ( )901 2449 MS (a)922 2449 MS +(v)944 2449 MS (e)968 2449 MS (c)990 2449 MS ( )1012 2449 MS (d)1033 2449 MS (e)1058 2449 MS (s)1080 2449 MS ( )1099 2449 MS (p)1120 2449 MS (e)1145 2449 MS (r)1167 2449 MS (f)1185 2449 MS (o)1200 2449 MS (r)1226 2449 MS (m)1243 2449 MS (a)1281 2449 MS +(n)1304 2449 MS (c)1328 2449 MS (e)1350 2449 MS (s)1373 2449 MS ( )1392 2449 MS (r)1413 2449 MS (e)1430 2449 MS (m)1453 2449 MS (a)1490 2449 MS (r)1512 2449 MS (q)1529 2449 MS (u)1554 2449 MS (a)1579 2449 MS (b)1602 2449 MS (l)1627 2449 MS (e)1640 2449 MS +(s)1663 2449 MS ( )1682 2449 MS (\()1703 2449 MS (C)1720 2449 MS (O)1753 2449 MS (R)1789 2449 MS (B)1822 2449 MS (A)1856 2449 MS (:)1891 2449 MS ( )1905 2449 MS (2)1926 2449 MS (4)1951 2449 MS (0)1976 2449 MS ( )2001 2449 MS (M)2022 2449 MS (o)2066 2449 MS +(/)2092 2449 MS (s)2106 2449 MS ( )2125 2449 MS +(a)235 2506 MS (v)257 2506 MS (e)281 2506 MS (c)304 2506 MS ( )326 2506 MS (O)362 2506 MS (m)399 2506 MS (n)437 2506 MS (i)462 2506 MS (O)475 2506 MS (R)512 2506 MS (B)545 2506 MS ( )578 2506 MS (e)614 2506 MS (t)636 2506 MS ( )651 2506 MS +(M)687 2506 MS (y)732 2506 MS (r)755 2506 MS (i)773 2506 MS (n)786 2506 MS (e)811 2506 MS (t)833 2506 MS +(-)848 2506 MS +(2)865 2506 MS (0)890 2506 MS (0)915 2506 MS (0)940 2506 MS (\))965 2506 MS (.)981 2506 MS ( )994 2506 MS (C)1030 2506 MS (e)1063 2506 MS (t)1085 2506 MS (t)1099 2506 MS (e)1114 2506 MS ( )1135 2506 MS (p)1171 2506 MS (l)1196 2506 MS (a)1208 2506 MS +(t)1230 2506 MS (e)1245 2506 MS +(-)1267 2506 MS +(f)1284 2506 MS (o)1299 2506 MS (r)1325 2506 MS (m)1343 2506 MS (e)1380 2506 MS ( )1402 2506 MS (e)1438 2506 MS (s)1461 2506 MS (t)1480 2506 MS ( )1495 2506 MS (c)1531 2506 MS (a)1553 2506 MS (p)1575 2506 MS (a)1600 2506 MS (b)1622 2506 MS (l)1647 2506 MS +(e)1660 2506 MS ( )1682 2506 MS (d)1718 2506 MS (')1744 2506 MS (i)1753 2506 MS (n)1766 2506 MS (t)1790 2506 MS (\351)1805 2506 MS (g)1827 2506 MS (r)1852 2506 MS (e)1869 2506 MS (r)1891 2506 MS ( )1908 2506 MS (p)1944 2506 MS (l)1970 2506 MS (u)1982 2506 MS +(s)2007 2506 MS (i)2027 2506 MS (e)2040 2506 MS (u)2062 2506 MS (r)2087 2506 MS (s)2105 2506 MS ( )2125 2506 MS +(i)235 2564 MS (m)249 2564 MS (p)287 2564 MS (l)313 2564 MS (\351)326 2564 MS (m)349 2564 MS (e)387 2564 MS (n)410 2564 MS (t)434 2564 MS (a)449 2564 MS (t)471 2564 MS (i)486 2564 MS (o)498 2564 MS (n)524 2564 MS (s)548 2564 MS ( )567 2564 MS +(d)587 2564 MS (e)612 2564 MS ( )635 2564 MS (C)655 2564 MS (O)688 2564 MS (R)724 2564 MS (B)758 2564 MS (A)792 2564 MS (.)827 2564 MS ( )840 2564 MS (L)860 2564 MS (')891 2564 MS (i)900 2564 MS (n)913 2564 MS (t)937 2564 MS (\351)952 2564 MS +(g)974 2564 MS (r)999 2564 MS (a)1016 2564 MS (t)1038 2564 MS (i)1054 2564 MS (o)1066 2564 MS (n)1092 2564 MS ( )1116 2564 MS (d)1136 2564 MS (')1162 2564 MS (u)1170 2564 MS (n)1196 2564 MS ( )1220 2564 MS (O)1241 2564 MS (R)1277 2564 MS (B)1310 2564 MS +( )1343 2564 MS (d)1363 2564 MS (a)1388 2564 MS (n)1411 2564 MS (s)1436 2564 MS ( )1455 2564 MS (l)1476 2564 MS (a)1489 2564 MS ( )1511 2564 MS (p)1531 2564 MS (l)1557 2564 MS (a)1570 2564 MS (t)1592 2564 MS +(e)1607 2564 MS +(-)1629 2564 MS +(f)1646 2564 MS (o)1661 2564 MS (r)1687 2564 MS (m)1705 2564 MS (e)1742 2564 MS ( )1764 2564 MS (n)1785 2564 MS (e)1809 2564 MS ( )1831 2564 MS (n)1852 2564 MS (\351)1876 2564 MS (c)1899 2564 MS (e)1921 2564 MS (s)1943 2564 MS (s)1963 2564 MS (i)1983 2564 MS +(t)1995 2564 MS (e)2010 2564 MS ( )2032 2564 MS (q)2052 2564 MS (u)2077 2564 MS (e)2102 2564 MS ( )2125 2564 MS +(q)235 2621 MS (u)260 2621 MS (e)285 2621 MS (l)308 2621 MS (q)320 2621 MS (u)345 2621 MS (e)370 2621 MS (s)393 2621 MS ( )412 2621 MS (m)442 2621 MS (o)479 2621 MS (d)505 2621 MS (i)531 2621 MS (f)544 2621 MS (i)561 2621 MS (c)574 2621 MS +(a)597 2621 MS (t)619 2621 MS (i)634 2621 MS (o)646 2621 MS (n)672 2621 MS (s)697 2621 MS ( )716 2621 MS (d)745 2621 MS (e)770 2621 MS ( )792 2621 MS (l)822 2621 MS (')835 2621 MS (O)844 2621 MS (R)881 2621 MS (B)914 2621 MS (.)947 2621 MS +( )960 2621 MS (E)989 2621 MS (n)1020 2621 MS (f)1045 2621 MS (i)1062 2621 MS (n)1075 2621 MS (,)1099 2621 MS ( )1112 2621 MS (l)1142 2621 MS (e)1155 2621 MS ( )1178 2621 MS (t)1207 2621 MS (r)1222 2621 MS (o)1238 2621 MS (i)1264 2621 MS (s)1276 2621 MS +(i)1296 2621 MS (\350)1309 2621 MS (m)1332 2621 MS (e)1370 2621 MS ( )1393 2621 MS (p)1422 2621 MS (r)1447 2621 MS (o)1464 2621 MS (j)1490 2621 MS (e)1502 2621 MS (t)1524 2621 MS ( )1539 2621 MS (c)1568 2621 MS (o)1590 2621 MS (n)1616 2621 MS (c)1640 2621 MS +(e)1662 2621 MS (r)1684 2621 MS (n)1702 2621 MS (e)1726 2621 MS ( )1748 2621 MS (l)1778 2621 MS (')1791 2621 MS (i)1801 2621 MS (n)1814 2621 MS (t)1838 2621 MS (r)1853 2621 MS (o)1870 2621 MS (d)1896 2621 MS (u)1921 2621 MS (c)1946 2621 MS (t)1967 2621 MS +(i)1982 2621 MS (o)1994 2621 MS (n)2020 2621 MS ( )2044 2621 MS (d)2073 2621 MS (u)2099 2621 MS ( )2125 2621 MS +(p)235 2679 MS (a)260 2679 MS (r)282 2679 MS (a)299 2679 MS (l)322 2679 MS (l)335 2679 MS (\351)348 2679 MS (l)371 2679 MS (i)385 2679 MS (s)398 2679 MS (m)418 2679 MS (e)456 2679 MS ( )479 2679 MS (a)494 2679 MS (u)516 2679 MS ( )541 2679 MS +(s)557 2679 MS (e)576 2679 MS (i)599 2679 MS (n)612 2679 MS ( )637 2679 MS (d)652 2679 MS (e)677 2679 MS (s)700 2679 MS ( )719 2679 MS (m)735 2679 MS (o)772 2679 MS (d)798 2679 MS (\350)823 2679 MS (l)846 2679 MS (e)859 2679 MS (s)882 2679 MS +( )901 2679 MS (d)916 2679 MS (e)941 2679 MS ( )964 2679 MS (c)979 2679 MS (o)1001 2679 MS (m)1028 2679 MS (p)1065 2679 MS (o)1090 2679 MS (s)1116 2679 MS (a)1135 2679 MS (n)1157 2679 MS (t)1181 2679 MS (s)1196 2679 MS ( )1215 2679 MS (\()1230 2679 MS +(C)1248 2679 MS (C)1281 2679 MS (M)1314 2679 MS (,)1358 2679 MS ( )1371 2679 MS (E)1386 2679 MS (J)1417 2679 MS (B)1436 2679 MS (\))1469 2679 MS (.)1486 2679 MS ( )1499 2679 MS (I)1514 2679 MS (l)1532 2679 MS ( )1545 2679 MS (y)1561 2679 MS ( )1585 2679 MS +(a)1600 2679 MS ( )1623 2679 MS (u)1638 2679 MS (n)1664 2679 MS (e)1688 2679 MS ( )1710 2679 MS (t)1725 2679 MS (h)1740 2679 MS (\350)1764 2679 MS (s)1787 2679 MS (e)1806 2679 MS ( )1828 2679 MS (q)1843 2679 MS (u)1868 2679 MS (i)1894 2679 MS ( )1907 2679 MS +(d)1923 2679 MS (\351)1948 2679 MS (m)1971 2679 MS (a)2009 2679 MS (r)2031 2679 MS (r)2048 2679 MS (e)2065 2679 MS ( )2087 2679 MS (\340)2102 2679 MS ( )2125 2679 MS +(l)235 2736 MS (\222)248 2736 MS (I)264 2736 MS (R)282 2736 MS (I)315 2736 MS (S)332 2736 MS (A)360 2736 MS ( )396 2736 MS (s)410 2736 MS (u)429 2736 MS (i)455 2736 MS (t)467 2736 MS (e)482 2736 MS ( )504 2736 MS (\340)519 2736 MS ( )541 2736 MS +(u)555 2736 MS (n)581 2736 MS ( )606 2736 MS (s)620 2736 MS (t)639 2736 MS (a)654 2736 MS (g)676 2736 MS (e)701 2736 MS ( )723 2736 MS (d)737 2736 MS (e)762 2736 MS ( )784 2736 MS (D)799 2736 MS (E)835 2736 MS (A)866 2736 MS (.)901 2736 MS +( )914 2736 MS (I)928 2736 MS (l)946 2736 MS (s)959 2736 MS ( )979 2736 MS (u)993 2736 MS (t)1018 2736 MS (i)1033 2736 MS (l)1046 2736 MS (i)1060 2736 MS (s)1073 2736 MS (e)1093 2736 MS (n)1116 2736 MS (t)1140 2736 MS ( )1155 2736 MS (O)1169 2736 MS +(p)1205 2736 MS (e)1230 2736 MS (n)1253 2736 MS (C)1277 2736 MS (C)1311 2736 MS (M)1344 2736 MS +( )1389 2736 MS ([)1403 2736 MS (1)1420 2736 MS (0)1445 2736 MS (])1470 2736 MS ( )1487 2736 MS (\()1501 2736 MS (i)1519 2736 MS (m)1532 2736 MS (p)1570 2736 MS (l)1596 2736 MS (\351)1609 2736 MS (m)1632 2736 MS (e)1670 2736 MS (n)1693 2736 MS (t)1717 2736 MS +(a)1732 2736 MS (t)1754 2736 MS (i)1769 2736 MS (o)1781 2736 MS (n)1807 2736 MS ( )1831 2736 MS (d)1845 2736 MS (e)1870 2736 MS ( )1893 2736 MS (C)1907 2736 MS (C)1941 2736 MS (M)1974 2736 MS ( )2019 2736 MS (a)2033 2736 MS (v)2056 2736 MS (e)2080 2736 MS +(c)2102 2736 MS ( )2125 2736 MS +(J)235 2794 MS (a)254 2794 MS (v)277 2794 MS (a)301 2794 MS (\))323 2794 MS (.)340 2794 MS ( )353 2794 MS (L)367 2794 MS (e)397 2794 MS (u)419 2794 MS (r)444 2794 MS ( )461 2794 MS (o)475 2794 MS (b)501 2794 MS (j)525 2794 MS (e)538 2794 MS +(c)560 2794 MS (t)582 2794 MS (i)598 2794 MS (f)611 2794 MS ( )626 2794 MS (e)640 2794 MS (s)662 2794 MS (t)681 2794 MS ( )696 2794 MS (d)710 2794 MS (e)735 2794 MS ( )757 2794 MS (p)771 2794 MS (o)796 2794 MS (u)822 2794 MS (v)847 2794 MS +(o)871 2794 MS (i)897 2794 MS (r)909 2794 MS ( )926 2794 MS (p)940 2794 MS (r)965 2794 MS (o)981 2794 MS (p)1007 2794 MS (o)1031 2794 MS (s)1057 2794 MS (e)1076 2794 MS (r)1098 2794 MS ( )1115 2794 MS (u)1129 2794 MS (n)1154 2794 MS (e)1178 2794 MS +( )1200 2794 MS (c)1214 2794 MS (o)1236 2794 MS (m)1262 2794 MS (p)1299 2794 MS (o)1324 2794 MS (s)1350 2794 MS (i)1370 2794 MS (t)1382 2794 MS (i)1398 2794 MS (o)1410 2794 MS (n)1436 2794 MS ( )1460 2794 MS (\253)1475 2794 MS +( )1499 2794 MS +(s)1512 2794 MS (c)1531 2794 MS (a)1553 2794 MS (l)1576 2794 MS (a)1589 2794 MS (b)1612 2794 MS (l)1637 2794 MS (e)1650 2794 MS +( )1672 2794 MS +(\273)1686 2794 MS ( )1710 2794 MS (p)1724 2794 MS (e)1749 2794 MS (r)1771 2794 MS (m)1789 2794 MS (e)1826 2794 MS (t)1848 2794 MS (t)1863 2794 MS (a)1878 2794 MS (n)1900 2794 MS (t)1924 2794 MS ( )1939 2794 MS (d)1953 2794 MS (')1978 2794 MS (u)1986 2794 MS +(t)2010 2794 MS (i)2025 2794 MS (l)2038 2794 MS (i)2052 2794 MS (s)2065 2794 MS (e)2085 2794 MS (r)2107 2794 MS ( )2125 2794 MS +(l)235 2851 MS (e)248 2851 MS (s)271 2851 MS ( )290 2851 MS (r)303 2851 MS (\351)320 2851 MS (s)342 2851 MS (e)361 2851 MS (a)383 2851 MS (u)405 2851 MS (x)431 2851 MS ( )455 2851 MS (r)468 2851 MS (a)485 2851 MS (p)507 2851 MS (i)533 2851 MS +(d)545 2851 MS (e)570 2851 MS (s)593 2851 MS ( )612 2851 MS (\()625 2851 MS (v)642 2851 MS (i)667 2851 MS (a)680 2851 MS ( )702 2851 MS (P)715 2851 MS (a)743 2851 MS (d)765 2851 MS (i)791 2851 MS (c)803 2851 MS (o)825 2851 MS (\))851 2851 MS +(.)868 2851 MS +( )881 2851 MS +( )348 2909 MS +(D)348 2966 MS (\222)384 2966 MS (a)400 2966 MS (u)422 2966 MS (t)447 2966 MS (r)462 2966 MS (e)479 2966 MS ( )501 2966 MS (p)539 2966 MS (a)564 2966 MS (r)586 2966 MS (t)602 2966 MS (,)617 2966 MS ( )629 2966 MS (\253)667 2966 MS +( )691 2966 MS +(M)704 2966 MS (e)748 2966 MS (r)770 2966 MS (c)787 2966 MS (u)809 2966 MS (r)834 2966 MS (y)852 2966 MS ( )875 2966 MS (C)913 2966 MS (o)946 2966 MS (m)973 2966 MS (p)1010 2966 MS (u)1035 2966 MS (t)1060 2966 MS (e)1075 2966 MS (r)1097 2966 MS +( )1114 2966 MS (S)1152 2966 MS (y)1180 2966 MS (s)1203 2966 MS (t)1222 2966 MS (e)1237 2966 MS (m)1260 2966 MS (s)1298 2966 MS +( )1317 2966 MS +(\273)1330 2966 MS ( )1355 2966 MS (e)1393 2966 MS (t)1415 2966 MS ( )1429 2966 MS (\253)1467 2966 MS +( )1491 2966 MS +(M)1504 2966 MS (P)1548 2966 MS (I)1576 2966 MS ( )1593 2966 MS (S)1631 2966 MS (o)1658 2966 MS (f)1684 2966 MS (t)1699 2966 MS (w)1714 2966 MS (a)1750 2966 MS (r)1772 2966 MS (e)1789 2966 MS ( )1811 2966 MS (T)1849 2966 MS (e)1880 2966 MS (c)1902 2966 MS +(h)1924 2966 MS (n)1949 2966 MS (o)1973 2966 MS (l)1999 2966 MS (o)2011 2966 MS (g)2037 2966 MS (y)2063 2966 MS +( )2086 2966 MS +(\273)2100 2966 MS ( )2125 2966 MS +(t)235 3024 MS (r)250 3024 MS (a)267 3024 MS (v)289 3024 MS (a)313 3024 MS (i)336 3024 MS (l)349 3024 MS (l)363 3024 MS (e)376 3024 MS (n)399 3024 MS (t)423 3024 MS ( )438 3024 MS (a)472 3024 MS (c)494 3024 MS (t)516 3024 MS (u)531 3024 MS +(e)556 3024 MS +(l)578 3024 MS (l)591 3024 MS (e)604 3024 MS (m)627 3024 MS (e)665 3024 MS (n)688 3024 MS (t)712 3024 MS ( )727 3024 MS (\340)761 3024 MS ( )784 3024 MS (u)818 3024 MS (n)844 3024 MS (e)868 3024 MS ( )890 3024 MS (p)924 3024 MS (r)949 3024 MS +(e)966 3024 MS (m)989 3024 MS (i)1028 3024 MS (\350)1041 3024 MS (r)1063 3024 MS (e)1080 3024 MS ( )1102 3024 MS (i)1137 3024 MS (m)1151 3024 MS (p)1189 3024 MS (l)1215 3024 MS (\351)1228 3024 MS (m)1251 3024 MS (e)1289 3024 MS (n)1312 3024 MS (t)1336 3024 MS +(a)1351 3024 MS (t)1373 3024 MS (i)1388 3024 MS (o)1400 3024 MS (n)1426 3024 MS ( )1450 3024 MS (d)1484 3024 MS (e)1510 3024 MS (s)1532 3024 MS ( )1551 3024 MS (s)1586 3024 MS (p)1605 3024 MS (\351)1630 3024 MS (c)1652 3024 MS (i)1675 3024 MS (f)1689 3024 MS +(i)1706 3024 MS (c)1719 3024 MS (a)1741 3024 MS (t)1763 3024 MS (i)1779 3024 MS (o)1791 3024 MS (n)1817 3024 MS (s)1841 3024 MS ( )1861 3024 MS (d)1895 3024 MS (e)1920 3024 MS ( )1942 3024 MS (l)1977 3024 MS (\222)1990 3024 MS (O)2007 3024 MS (M)2043 3024 MS +(G)2088 3024 MS ( )2125 3024 MS +(c)235 3081 MS (o)257 3081 MS (n)283 3081 MS (c)307 3081 MS (e)329 3081 MS (r)351 3081 MS (n)368 3081 MS (a)392 3081 MS (n)415 3081 MS (t)439 3081 MS ( )454 3081 MS (u)467 3081 MS (n)492 3081 MS ( )516 3081 MS (O)529 3081 MS (R)565 3081 MS +(B)598 3081 MS ( )631 3081 MS (p)644 3081 MS (a)669 3081 MS (r)691 3081 MS (a)708 3081 MS (l)731 3081 MS (l)744 3081 MS (\350)757 3081 MS (l)780 3081 MS (e)793 3081 MS (.)815 3081 MS ( )828 3081 MS (U)841 3081 MS (n)878 3081 MS (e)902 3081 MS +( )924 3081 MS (p)937 3081 MS (r)962 3081 MS (e)979 3081 MS (m)1002 3081 MS (i)1040 3081 MS (\350)1053 3081 MS (r)1075 3081 MS (e)1092 3081 MS ( )1114 3081 MS (v)1128 3081 MS (e)1152 3081 MS (r)1174 3081 MS (s)1191 3081 MS (i)1211 3081 MS (o)1223 3081 MS +(n)1250 3081 MS ( )1274 3081 MS (d)1287 3081 MS (e)1312 3081 MS (v)1335 3081 MS (r)1359 3081 MS (a)1376 3081 MS (i)1399 3081 MS (t)1411 3081 MS ( )1426 3081 MS (\352)1439 3081 MS (t)1461 3081 MS (r)1476 3081 MS (e)1493 3081 MS ( )1514 3081 MS (d)1527 3081 MS +(i)1552 3081 MS (s)1565 3081 MS (p)1584 3081 MS (o)1609 3081 MS (n)1635 3081 MS (i)1660 3081 MS (b)1673 3081 MS (l)1698 3081 MS (e)1711 3081 MS ( )1733 3081 MS (e)1746 3081 MS (n)1769 3081 MS ( )1793 3081 MS (m)1807 3081 MS (a)1845 3081 MS (r)1867 3081 MS +(s)1884 3081 MS ( )1903 3081 MS (2)1916 3081 MS (0)1941 3081 MS (0)1966 3081 MS (3)1991 3081 MS (.)2016 3081 MS +( )2029 3081 MS +( )348 3139 MS +showpage +%%Page: 7 7 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(7)1868 400 MS +(/)1893 400 MS +(3)1907 400 MS (0)1932 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1957 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(D)348 527 MS (\222)384 527 MS (a)400 527 MS (u)422 527 MS (t)447 527 MS (r)462 527 MS (e)479 527 MS (s)501 527 MS ( )520 527 MS (l)545 527 MS (a)557 527 MS (b)580 527 MS (o)604 527 MS (r)630 527 MS (a)647 527 MS (t)669 527 MS +(o)683 527 MS (i)709 527 MS (r)721 527 MS (e)738 527 MS (s)760 527 MS ( )779 527 MS (c)803 527 MS (o)825 527 MS (m)852 527 MS (m)890 527 MS (e)928 527 MS ( )950 527 MS (l)975 527 MS (e)988 527 MS ( )1011 527 MS (C)1035 527 MS +(E)1068 527 MS (R)1099 527 MS (F)1133 527 MS (A)1161 527 MS (C)1196 527 MS (S)1229 527 MS ( )1257 527 MS (o)1281 527 MS (u)1307 527 MS ( )1332 527 MS (l)1357 527 MS (\222)1370 527 MS (I)1386 527 MS (N)1403 527 MS (R)1439 527 MS (I)1472 527 MS +(A)1489 527 MS ( )1525 527 MS (R)1549 527 MS (h)1583 527 MS (\364)1607 527 MS (n)1633 527 MS (e)1657 527 MS +(-)1679 527 MS +(A)1697 527 MS (l)1733 527 MS (p)1746 527 MS (e)1771 527 MS (s)1793 527 MS ( )1812 527 MS (p)1836 527 MS (r)1861 527 MS (o)1878 527 MS (p)1904 527 MS (o)1929 527 MS (s)1955 527 MS (e)1974 527 MS (n)1996 527 MS (t)2020 527 MS ( )2035 527 MS +(d)2059 527 MS (e)2084 527 MS (s)2106 527 MS ( )2125 527 MS +(s)235 585 MS (o)254 585 MS (l)280 585 MS (u)292 585 MS (t)317 585 MS (i)333 585 MS (o)345 585 MS (n)371 585 MS (s)396 585 MS ( )415 585 MS (b)440 585 MS (a)464 585 MS (s)487 585 MS (\351)506 585 MS (e)528 585 MS (s)551 585 MS +( )570 585 MS (s)595 585 MS (o)614 585 MS (i)641 585 MS (t)653 585 MS ( )668 585 MS (s)693 585 MS (u)712 585 MS (r)737 585 MS +( )754 585 MS (C)779 585 MS (O)812 585 MS (R)848 585 MS (B)881 585 MS (A)914 585 MS ( )949 585 MS (\()974 585 MS (p)991 585 MS (i)1017 585 MS (l)1030 585 MS (o)1042 585 MS (t)1068 585 MS (e)1083 585 MS ( )1105 585 MS (A)1130 585 MS +(t)1165 585 MS (h)1180 585 MS (a)1204 585 MS (p)1226 585 MS (a)1252 585 MS (s)1274 585 MS (c)1293 585 MS (a)1315 585 MS (n)1338 585 MS +(-)1362 585 MS +(C)1379 585 MS (O)1412 585 MS (R)1448 585 MS (B)1482 585 MS (A)1516 585 MS (\))1551 585 MS ( )1568 585 MS (s)1593 585 MS (o)1612 585 MS (i)1638 585 MS (t)1650 585 MS ( )1665 585 MS (u)1690 585 MS (n)1715 585 MS (i)1740 585 MS (q)1753 585 MS +(u)1778 585 MS (e)1803 585 MS (m)1826 585 MS (e)1864 585 MS (n)1887 585 MS (t)1911 585 MS ( )1926 585 MS (s)1951 585 MS (u)1970 585 MS (r)1995 585 MS ( )2012 585 MS (M)2037 585 MS (P)2081 585 MS (I)2109 585 MS ( )2125 585 MS +(\()235 642 MS (P)252 642 MS (A)280 642 MS (L)315 642 MS (M)346 642 MS (\))390 642 MS ( )407 642 MS ([)420 642 MS (1)437 642 MS (2)462 642 MS (])487 642 MS (.)503 642 MS +( )516 642 MS +( )348 700 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(3)310 822 MS +( )347 822 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(A)400 822 MS (p)446 822 MS (p)488 822 MS (r)529 822 MS (o)555 822 MS (c)596 822 MS (h)633 822 MS (e)674 822 MS ( )711 822 MS (d)730 822 MS (\351)771 822 MS (v)808 822 MS (e)845 822 MS (l)882 822 MS (o)901 822 MS (p)941 822 MS +(p)982 822 MS (\351)1023 822 MS (e)1060 822 MS ( )1097 822 MS (d)1116 822 MS (a)1157 822 MS (n)1193 822 MS (s)1234 822 MS ( )1271 822 MS (c)1290 822 MS (e)1327 822 MS (t)1364 822 MS (t)1386 822 MS (e)1407 822 MS ( )1444 822 MS (\351)1463 822 MS +(t)1500 822 MS (u)1522 822 MS (d)1563 822 MS (e)1604 822 MS +( )1641 822 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )348 897 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 954 MS (\222)378 954 MS (i)395 954 MS (n)408 954 MS (t)432 954 MS (r)447 954 MS (o)464 954 MS (d)490 954 MS (u)515 954 MS (c)540 954 MS (t)562 954 MS (i)577 954 MS (o)589 954 MS (n)615 954 MS ( )639 954 MS (d)660 954 MS +(u)685 954 MS ( )710 954 MS (p)731 954 MS (a)756 954 MS (r)778 954 MS (a)795 954 MS (l)818 954 MS (l)831 954 MS (\351)844 954 MS (l)867 954 MS (i)881 954 MS (s)894 954 MS (m)914 954 MS (e)952 954 MS ( )974 954 MS (d)995 954 MS +(a)1021 954 MS (n)1044 954 MS (s)1068 954 MS ( )1087 954 MS (l)1109 954 MS (\222)1122 954 MS (a)1139 954 MS (r)1161 954 MS (c)1178 954 MS (h)1200 954 MS (i)1225 954 MS (t)1237 954 MS (e)1252 954 MS (c)1275 954 MS (t)1297 954 MS (u)1312 954 MS +(r)1337 954 MS (e)1353 954 MS ( )1375 954 MS (l)1397 954 MS (o)1409 954 MS (g)1435 954 MS (i)1461 954 MS (c)1473 954 MS (i)1496 954 MS (e)1509 954 MS (l)1532 954 MS (l)1546 954 MS (e)1559 954 MS ( )1581 954 MS (d)1602 954 MS (u)1627 954 MS +( )1652 954 MS (p)1673 954 MS (r)1698 954 MS (o)1715 954 MS (j)1741 954 MS (e)1753 954 MS (t)1775 954 MS ( )1790 954 MS (P)1811 954 MS (A)1839 954 MS (L)1875 954 MS (/)1905 954 MS (S)1919 954 MS (A)1947 954 MS (L)1983 954 MS (O)2013 954 MS +(M)2050 954 MS (E)2094 954 MS ( )2125 954 MS +(d)235 1012 MS (o)260 1012 MS (i)286 1012 MS (t)298 1012 MS ( )313 1012 MS (\352)336 1012 MS (t)358 1012 MS (r)373 1012 MS (e)390 1012 MS ( )412 1012 MS (d)435 1012 MS (i)460 1012 MS (r)472 1012 MS (e)489 1012 MS (c)511 1012 MS (t)533 1012 MS +(e)548 1012 MS (m)571 1012 MS (e)609 1012 MS (n)632 1012 MS (t)656 1012 MS ( )671 1012 MS (l)695 1012 MS (i)708 1012 MS (\351)721 1012 MS (e)743 1012 MS ( )766 1012 MS (\340)789 1012 MS ( )811 1012 MS (l)835 1012 MS (a)848 1012 MS ( )871 1012 MS +(d)894 1012 MS (\351)919 1012 MS (f)942 1012 MS (i)958 1012 MS (n)971 1012 MS (i)997 1012 MS (t)1009 1012 MS (i)1025 1012 MS (o)1037 1012 MS (n)1064 1012 MS ( )1089 1012 MS (e)1112 1012 MS (x)1135 1012 MS (a)1159 1012 MS (c)1181 1012 MS (t)1203 1012 MS +(e)1218 1012 MS ( )1240 1012 MS (d)1263 1012 MS (u)1288 1012 MS ( )1313 1012 MS (g)1336 1012 MS (r)1361 1012 MS (a)1378 1012 MS (i)1401 1012 MS (n)1414 1012 MS ( )1439 1012 MS (d)1462 1012 MS (e)1487 1012 MS (s)1510 1012 MS ( )1529 1012 MS (c)1552 1012 MS +(o)1574 1012 MS (m)1601 1012 MS (p)1638 1012 MS (o)1663 1012 MS (s)1689 1012 MS (a)1708 1012 MS (n)1731 1012 MS (t)1755 1012 MS (s)1770 1012 MS (.)1789 1012 MS ( )1802 1012 MS (E)1825 1012 MS (n)1856 1012 MS ( )1880 1012 MS (e)1903 1012 MS (f)1926 1012 MS +(f)1943 1012 MS (e)1959 1012 MS (t)1981 1012 MS (,)1996 1012 MS ( )2009 1012 MS (s)2032 1012 MS (i)2052 1012 MS ( )2064 1012 MS (l)2088 1012 MS (e)2102 1012 MS ( )2125 1012 MS +(c)235 1069 MS (o)257 1069 MS (u)283 1069 MS (p)308 1069 MS (l)333 1069 MS (a)345 1069 MS (g)367 1069 MS (e)392 1069 MS ( )414 1069 MS (d)429 1069 MS (e)454 1069 MS (s)477 1069 MS ( )496 1069 MS (c)511 1069 MS (o)533 1069 MS (d)559 1069 MS +(e)584 1069 MS (s)606 1069 MS ( )625 1069 MS (r)640 1069 MS (e)657 1069 MS (s)679 1069 MS (t)698 1069 MS (e)713 1069 MS ( )735 1069 MS (a)750 1069 MS (u)772 1069 MS ( )797 1069 MS (n)812 1069 MS (i)837 1069 MS (v)850 1069 MS (e)875 1069 MS +(a)897 1069 MS (u)919 1069 MS ( )944 1069 MS (d)959 1069 MS (u)984 1069 MS ( )1009 1069 MS (c)1024 1069 MS (h)1047 1069 MS (a)1071 1069 MS (\356)1094 1069 MS (n)1107 1069 MS (a)1132 1069 MS (g)1154 1069 MS (e)1179 1069 MS (,)1201 1069 MS ( )1214 1069 MS +(i)1230 1069 MS (l)1243 1069 MS ( )1257 1069 MS (n)1272 1069 MS (\222)1296 1069 MS (e)1313 1069 MS (s)1335 1069 MS (t)1354 1069 MS ( )1369 1069 MS (p)1384 1069 MS (a)1409 1069 MS (s)1431 1069 MS ( )1450 1069 MS (i)1466 1069 MS (n)1479 1069 MS (d)1503 1069 MS +(i)1529 1069 MS (s)1542 1069 MS (p)1562 1069 MS (e)1587 1069 MS (n)1610 1069 MS (s)1634 1069 MS (a)1653 1069 MS (b)1676 1069 MS (l)1701 1069 MS (e)1714 1069 MS ( )1736 1069 MS (\()1751 1069 MS (b)1769 1069 MS (i)1794 1069 MS (e)1807 1069 MS (n)1830 1069 MS +( )1854 1069 MS (q)1869 1069 MS (u)1894 1069 MS (e)1919 1069 MS ( )1941 1069 MS (c)1956 1069 MS (e)1978 1069 MS (l)2001 1069 MS (a)2014 1069 MS ( )2036 1069 MS (s)2052 1069 MS (o)2071 1069 MS (i)2097 1069 MS (t)2109 1069 MS ( )2125 1069 MS +(p)235 1127 MS (l)261 1127 MS (u)273 1127 MS (s)298 1127 MS ( )317 1127 MS (p)332 1127 MS (e)357 1127 MS (r)379 1127 MS (f)397 1127 MS (o)412 1127 MS (r)438 1127 MS (m)456 1127 MS (a)493 1127 MS (n)516 1127 MS (t)540 1127 MS (\))555 1127 MS +( )572 1127 MS (d)587 1127 MS (\222)612 1127 MS (i)629 1127 MS (n)642 1127 MS (t)666 1127 MS (r)681 1127 MS (o)697 1127 MS (d)723 1127 MS (u)748 1127 MS (i)773 1127 MS (r)785 1127 MS (e)802 1127 MS ( )824 1127 MS (d)839 1127 MS (a)864 1127 MS +(n)887 1127 MS (s)912 1127 MS ( )931 1127 MS (l)947 1127 MS (a)959 1127 MS ( )981 1127 MS (n)997 1127 MS (o)1021 1127 MS (t)1047 1127 MS (i)1062 1127 MS (o)1074 1127 MS (n)1100 1127 MS ( )1124 1127 MS (d)1139 1127 MS (e)1164 1127 MS ( )1186 1127 MS +(c)1201 1127 MS (o)1223 1127 MS (m)1248 1127 MS (p)1286 1127 MS (o)1311 1127 MS (s)1337 1127 MS (a)1356 1127 MS (n)1379 1127 MS (t)1403 1127 MS ( )1418 1127 MS (p)1433 1127 MS (a)1458 1127 MS (r)1480 1127 MS (a)1497 1127 MS (l)1519 1127 MS (l)1532 1127 MS +(\350)1545 1127 MS (l)1568 1127 MS (e)1581 1127 MS ( )1603 1127 MS (l)1619 1127 MS (a)1632 1127 MS ( )1654 1127 MS (p)1669 1127 MS (o)1694 1127 MS (s)1720 1127 MS (s)1739 1127 MS (i)1759 1127 MS (b)1772 1127 MS (i)1797 1127 MS (l)1811 1127 MS (i)1825 1127 MS +(t)1837 1127 MS (\351)1852 1127 MS ( )1874 1127 MS (d)1889 1127 MS (\222)1914 1127 MS +( )1930 1127 MS +(\351)1943 1127 MS (c)1965 1127 MS (h)1988 1127 MS (a)2012 1127 MS (n)2035 1127 MS (g)2059 1127 MS (e)2085 1127 MS (r)2107 1127 MS ( )2125 1127 MS +(d)235 1184 MS (e)260 1184 MS (s)282 1184 MS ( )301 1184 MS (d)321 1184 MS (o)346 1184 MS (n)372 1184 MS (n)397 1184 MS (\351)421 1184 MS (e)443 1184 MS (s)466 1184 MS ( )485 1184 MS (d)505 1184 MS (i)531 1184 MS (s)544 1184 MS (t)563 1184 MS +(r)578 1184 MS (i)596 1184 MS (b)609 1184 MS (u)633 1184 MS (\351)658 1184 MS (e)680 1184 MS (s)702 1184 MS (.)721 1184 MS ( )734 1184 MS (P)754 1184 MS (a)782 1184 MS (r)804 1184 MS ( )821 1184 MS (c)841 1184 MS (o)863 1184 MS (n)889 1184 MS +(t)913 1184 MS (r)928 1184 MS (e)945 1184 MS ( )967 1184 MS (s)987 1184 MS (i)1007 1184 MS ( )1019 1184 MS +(l)1040 1184 MS (\222)1053 1184 MS (o)1069 1184 MS (n)1096 1184 MS ( )1120 1184 MS (v)1141 1184 MS (i)1166 1184 MS (s)1179 1184 MS (e)1199 1184 MS ( )1221 1184 MS (d)1242 1184 MS (e)1267 1184 MS (s)1289 1184 MS ( )1308 1184 MS (c)1328 1184 MS (o)1350 1184 MS +(u)1376 1184 MS (p)1401 1184 MS (l)1427 1184 MS (a)1439 1184 MS (g)1461 1184 MS (e)1486 1184 MS (s)1509 1184 MS ( )1528 1184 MS (b)1549 1184 MS (e)1573 1184 MS (a)1595 1184 MS (u)1617 1184 MS (c)1642 1184 MS (o)1664 1184 MS (u)1690 1184 MS (p)1715 1184 MS +( )1740 1184 MS (p)1760 1184 MS (l)1786 1184 MS (u)1798 1184 MS (s)1824 1184 MS ( )1843 1184 MS (f)1864 1184 MS (i)1881 1184 MS (n)1894 1184 MS (s)1919 1184 MS (,)1938 1184 MS ( )1951 1184 MS (a)1971 1184 MS (l)1994 1184 MS (o)2006 1184 MS (r)2032 1184 MS +(s)2049 1184 MS ( )2068 1184 MS (l)2089 1184 MS (a)2102 1184 MS ( )2125 1184 MS +(n)235 1242 MS (\351)259 1242 MS (c)281 1242 MS (e)304 1242 MS (s)326 1242 MS (s)345 1242 MS (i)365 1242 MS (t)377 1242 MS (\351)392 1242 MS ( )414 1242 MS (d)443 1242 MS (e)468 1242 MS ( )490 1242 MS (p)519 1242 MS (r)544 1242 MS (e)561 1242 MS +(n)584 1242 MS (d)608 1242 MS (r)633 1242 MS (e)650 1242 MS ( )672 1242 MS (e)701 1242 MS (n)723 1242 MS ( )747 1242 MS (c)776 1242 MS (o)798 1242 MS (m)825 1242 MS (p)862 1242 MS (t)887 1242 MS (e)902 1242 MS ( )924 1242 MS (l)953 1242 MS +(e)965 1242 MS (s)988 1242 MS ( )1007 1242 MS (\351)1036 1242 MS (c)1058 1242 MS (h)1081 1242 MS (a)1105 1242 MS (n)1128 1242 MS (g)1152 1242 MS (e)1177 1242 MS (s)1200 1242 MS ( )1219 1242 MS (d)1248 1242 MS (e)1273 1242 MS ( )1295 1242 MS (d)1324 1242 MS +(o)1349 1242 MS (n)1375 1242 MS (n)1399 1242 MS (\351)1423 1242 MS (e)1445 1242 MS (s)1468 1242 MS ( )1487 1242 MS (d)1516 1242 MS (i)1542 1242 MS (s)1554 1242 MS (t)1573 1242 MS (r)1588 1242 MS (i)1606 1242 MS (b)1619 1242 MS (u)1643 1242 MS (\351)1668 1242 MS +(e)1690 1242 MS (s)1713 1242 MS ( )1732 1242 MS (e)1761 1242 MS (s)1783 1242 MS (t)1802 1242 MS ( )1817 1242 MS (\340)1846 1242 MS ( )1868 1242 MS (p)1897 1242 MS (r)1922 1242 MS (e)1939 1242 MS (n)1961 1242 MS (d)1985 1242 MS (r)2010 1242 MS (e)2027 1242 MS +( )2049 1242 MS (e)2078 1242 MS (n)2100 1242 MS ( )2125 1242 MS +(c)235 1299 MS (o)257 1299 MS (n)283 1299 MS (s)307 1299 MS (i)327 1299 MS (d)340 1299 MS (\351)365 1299 MS (r)387 1299 MS (a)404 1299 MS (t)426 1299 MS (i)441 1299 MS (o)453 1299 MS (n)479 1299 MS (.)503 1299 MS ( )516 1299 MS +( )529 1299 MS +(C)348 1357 MS (e)381 1357 MS ( )403 1357 MS (d)418 1357 MS (o)443 1357 MS (c)469 1357 MS (u)491 1357 MS (m)517 1357 MS (e)554 1357 MS (n)577 1357 MS (t)601 1357 MS ( )616 1357 MS (t)631 1357 MS (r)646 1357 MS (a)663 1357 MS (i)685 1357 MS +(t)697 1357 MS (e)712 1357 MS ( )734 1357 MS (d)749 1357 MS (o)774 1357 MS (n)800 1357 MS (c)824 1357 MS ( )846 1357 MS (d)861 1357 MS (e)886 1357 MS ( )908 1357 MS (l)924 1357 MS (a)937 1357 MS ( )959 1357 MS (c)974 1357 MS (o)996 1357 MS +(m)1023 1357 MS (m)1061 1357 MS (u)1099 1357 MS (n)1125 1357 MS (i)1150 1357 MS (c)1163 1357 MS (a)1185 1357 MS (t)1207 1357 MS (i)1223 1357 MS (o)1235 1357 MS (n)1261 1357 MS ( )1285 1357 MS (e)1300 1357 MS (n)1323 1357 MS (t)1347 1357 MS (r)1362 1357 MS +(e)1379 1357 MS ( )1401 1357 MS (c)1416 1357 MS (o)1438 1357 MS (m)1464 1357 MS (p)1501 1357 MS (o)1526 1357 MS (s)1552 1357 MS (a)1571 1357 MS (n)1594 1357 MS (t)1618 1357 MS (s)1633 1357 MS ( )1652 1357 MS (p)1667 1357 MS (a)1692 1357 MS (r)1714 1357 MS +(a)1731 1357 MS (l)1754 1357 MS (l)1767 1357 MS (\350)1780 1357 MS (l)1803 1357 MS (e)1816 1357 MS (s)1839 1357 MS ( )1858 1357 MS (p)1873 1357 MS (o)1898 1357 MS (u)1924 1357 MS (v)1949 1357 MS (a)1973 1357 MS (n)1996 1357 MS (t)2020 1357 MS ( )2035 1357 MS +(\352)2050 1357 MS (t)2072 1357 MS (r)2087 1357 MS (e)2104 1357 MS ( )2125 1357 MS +(d)235 1414 MS (i)261 1414 MS (s)273 1414 MS (t)292 1414 MS (r)307 1414 MS (i)325 1414 MS (b)338 1414 MS (u)362 1414 MS (\351)387 1414 MS (s)409 1414 MS ( )428 1414 MS (s)456 1414 MS (u)475 1414 MS (r)500 1414 MS ( )517 1414 MS (d)545 1414 MS +(e)570 1414 MS (s)592 1414 MS +( )611 1414 MS (n)640 1414 MS (o)664 1414 MS (m)691 1414 MS (b)729 1414 MS (r)753 1414 MS (e)770 1414 MS (s)792 1414 MS ( )811 1414 MS (d)839 1414 MS (e)864 1414 MS ( )886 1414 MS (p)914 1414 MS (r)939 1414 MS (o)956 1414 MS (c)982 1414 MS +(e)1004 1414 MS (s)1026 1414 MS (s)1045 1414 MS (u)1064 1414 MS (s)1089 1414 MS ( )1108 1414 MS (d)1136 1414 MS (i)1162 1414 MS (f)1175 1414 MS (f)1191 1414 MS (\351)1207 1414 MS (r)1229 1414 MS (e)1247 1414 MS (n)1269 1414 MS (t)1293 1414 MS (s)1308 1414 MS +(.)1327 1414 MS ( )1340 1414 MS (C)1368 1414 MS (e)1401 1414 MS (s)1423 1414 MS ( )1442 1414 MS (c)1470 1414 MS (o)1492 1414 MS (m)1518 1414 MS (p)1555 1414 MS (o)1580 1414 MS (s)1606 1414 MS (a)1625 1414 MS (n)1648 1414 MS (t)1672 1414 MS (s)1687 1414 MS +( )1706 1414 MS (v)1734 1414 MS (o)1758 1414 MS (n)1784 1414 MS (t)1808 1414 MS ( )1823 1414 MS (\351)1851 1414 MS (c)1873 1414 MS (h)1895 1414 MS (a)1919 1414 MS (n)1942 1414 MS (g)1966 1414 MS (e)1991 1414 MS (r)2013 1414 MS ( )2030 1414 MS (d)2058 1414 MS +(e)2083 1414 MS (s)2105 1414 MS ( )2125 1414 MS +(\253)235 1472 MS +( )259 1472 MS +(d)272 1472 MS (o)297 1472 MS (n)323 1472 MS (n)347 1472 MS (\351)372 1472 MS (e)394 1472 MS (s)416 1472 MS ( )436 1472 MS (d)460 1472 MS (i)486 1472 MS (s)499 1472 MS (t)518 1472 MS (r)533 1472 MS (i)550 1472 MS (b)563 1472 MS (u)587 1472 MS +(\351)613 1472 MS (e)635 1472 MS (s)657 1472 MS +( )676 1472 MS +(\273)690 1472 MS ( )714 1472 MS (d)738 1472 MS (i)764 1472 MS (r)777 1472 MS (e)794 1472 MS (c)816 1472 MS (t)838 1472 MS (e)853 1472 MS (m)876 1472 MS (e)913 1472 MS (n)936 1472 MS (t)960 1472 MS ( )975 1472 MS (d)999 1472 MS (e)1024 1472 MS +( )1046 1472 MS (p)1070 1472 MS (r)1095 1472 MS (o)1112 1472 MS (c)1138 1472 MS (e)1160 1472 MS (s)1182 1472 MS (s)1201 1472 MS (u)1220 1472 MS (s)1246 1472 MS ( )1265 1472 MS (\340)1289 1472 MS ( )1311 1472 MS (p)1335 1472 MS (r)1360 1472 MS (o)1377 1472 MS +(c)1403 1472 MS (e)1425 1472 MS (s)1447 1472 MS (s)1466 1472 MS (u)1485 1472 MS (s)1511 1472 MS ( )1530 1472 MS (s)1555 1472 MS (a)1574 1472 MS (n)1597 1472 MS (s)1621 1472 MS ( )1641 1472 MS (p)1665 1472 MS (a)1690 1472 MS (s)1712 1472 MS (s)1732 1472 MS +(e)1751 1472 MS (r)1773 1472 MS ( )1790 1472 MS (p)1814 1472 MS (a)1839 1472 MS (r)1861 1472 MS ( )1878 1472 MS (u)1902 1472 MS (n)1928 1472 MS ( )1953 1472 MS (s)1977 1472 MS (e)1996 1472 MS (r)2018 1472 MS (v)2036 1472 MS (e)2060 1472 MS (u)2082 1472 MS +(r)2107 1472 MS ( )2125 1472 MS +(u)235 1529 MS (n)260 1529 MS (i)285 1529 MS (q)298 1529 MS (u)323 1529 MS (e)348 1529 MS ( )370 1529 MS (q)385 1529 MS (u)410 1529 MS (i)436 1529 MS ( )449 1529 MS (d)464 1529 MS (e)490 1529 MS (v)513 1529 MS (i)538 1529 MS (e)551 1529 MS +(n)574 1529 MS (d)598 1529 MS (r)623 1529 MS (a)640 1529 MS (i)663 1529 MS (t)675 1529 MS ( )690 1529 MS (u)705 1529 MS (n)730 1529 MS ( )755 1529 MS (g)770 1529 MS (o)795 1529 MS (u)821 1529 MS (l)846 1529 MS (o)858 1529 MS (t)884 1529 MS +( )899 1529 MS (d)914 1529 MS (\222)939 1529 MS (\351)955 1529 MS (t)977 1529 MS (r)992 1529 MS (a)1009 1529 MS (n)1031 1529 MS (g)1055 1529 MS (l)1081 1529 MS (e)1093 1529 MS (m)1116 1529 MS (e)1154 1529 MS (n)1177 1529 MS (t)1201 1529 MS ( )1216 1529 MS +(p)1231 1529 MS (o)1256 1529 MS (u)1282 1529 MS (r)1307 1529 MS ( )1324 1529 MS (l)1339 1529 MS (e)1351 1529 MS ( )1373 1529 MS (t)1388 1529 MS (r)1403 1529 MS (a)1420 1529 MS (n)1442 1529 MS (s)1466 1529 MS (f)1486 1529 MS (e)1502 1529 MS (r)1524 1529 MS +(t)1541 1529 MS ( )1556 1529 MS (d)1571 1529 MS (e)1596 1529 MS ( )1618 1529 MS (c)1633 1529 MS (e)1655 1529 MS (s)1677 1529 MS ( )1696 1529 MS (d)1711 1529 MS (o)1736 1529 MS (n)1762 1529 MS (n)1787 1529 MS (\351)1811 1529 MS (e)1834 1529 MS (s)1856 1529 MS +(.)1875 1529 MS ( )1888 1529 MS (I)1903 1529 MS (l)1921 1529 MS ( )1934 1529 MS (y)1950 1529 MS ( )1974 1529 MS (a)1989 1529 MS ( )2011 1529 MS (d)2026 1529 MS (o)2051 1529 MS (n)2077 1529 MS (c)2102 1529 MS ( )2125 1529 MS +(r)235 1586 MS (e)252 1586 MS (d)274 1586 MS (i)300 1586 MS (s)312 1586 MS (t)331 1586 MS (r)346 1586 MS +(i)364 1586 MS (b)377 1586 MS (u)401 1586 MS (t)426 1586 MS (i)441 1586 MS (o)453 1586 MS (n)479 1586 MS ( )503 1586 MS (d)530 1586 MS (e)556 1586 MS (s)578 1586 MS ( )597 1586 MS (d)624 1586 MS (o)649 1586 MS (n)675 1586 MS (n)700 1586 MS +(\351)724 1586 MS (e)746 1586 MS (s)769 1586 MS (.)788 1586 MS ( )801 1586 MS (C)828 1586 MS (e)861 1586 MS (p)883 1586 MS (e)908 1586 MS (n)931 1586 MS (d)955 1586 MS (a)980 1586 MS (n)1003 1586 MS (t)1027 1586 MS ( )1042 1586 MS (c)1069 1586 MS +(e)1091 1586 MS (l)1114 1586 MS (a)1127 1586 MS ( )1149 1586 MS (n)1177 1586 MS (e)1201 1586 MS ( )1223 1586 MS (r)1251 1586 MS (e)1268 1586 MS (s)1290 1586 MS (t)1309 1586 MS (e)1324 1586 MS ( )1346 1586 MS (p)1373 1586 MS (o)1397 1586 MS (s)1423 1586 MS +(s)1442 1586 MS (i)1462 1586 MS (b)1475 1586 MS (l)1500 1586 MS (e)1513 1586 MS ( )1535 1586 MS (a)1563 1586 MS (s)1585 1586 MS (s)1604 1586 MS (e)1624 1586 MS (z)1646 1586 MS ( )1668 1586 MS (f)1696 1586 MS (a)1712 1586 MS (c)1734 1586 MS (i)1757 1586 MS +(l)1771 1586 MS (e)1784 1586 MS (m)1807 1586 MS (e)1845 1586 MS (n)1868 1586 MS (t)1892 1586 MS ( )1907 1586 MS (q)1934 1586 MS (u)1959 1586 MS (e)1984 1586 MS ( )2006 1586 MS (d)2033 1586 MS (a)2058 1586 MS (n)2080 1586 MS (s)2105 1586 MS ( )2125 1586 MS +(c)235 1644 MS (e)257 1644 MS (r)279 1644 MS (t)296 1644 MS (a)311 1644 MS (i)333 1644 MS (n)346 1644 MS (s)370 1644 MS ( )389 1644 MS (c)418 1644 MS (a)440 1644 MS (s)462 1644 MS ( )481 1644 MS (p)509 1644 MS (r)534 1644 MS (\351)551 1644 MS +(c)573 1644 MS (i)596 1644 MS (s)609 1644 MS ( )629 1644 MS (o)657 1644 MS (\371)683 1644 MS ( )708 1644 MS (l)737 1644 MS (e)749 1644 MS (s)771 1644 MS ( )790 1644 MS (d)818 1644 MS (e)843 1644 MS (u)865 1644 MS (x)891 1644 MS ( )916 1644 MS +(c)944 1644 MS (o)966 1644 MS (m)993 1644 MS (p)1030 1644 MS (o)1055 1644 MS (s)1081 1644 MS (a)1100 1644 MS (n)1122 1644 MS (t)1146 1644 MS (s)1161 1644 MS ( )1180 1644 MS (m)1209 1644 MS (a)1247 1644 MS (n)1269 1644 MS (i)1294 1644 MS (p)1307 1644 MS +(u)1332 1644 MS (l)1358 1644 MS (e)1371 1644 MS (n)1394 1644 MS (t)1418 1644 MS ( )1433 1644 MS (d)1461 1644 MS (e)1486 1644 MS (s)1508 1644 MS ( )1527 1644 MS (d)1555 1644 MS (o)1580 1644 MS (n)1606 1644 MS (n)1631 1644 MS (\351)1655 1644 MS (e)1677 1644 MS +(s)1700 1644 MS ( )1719 1644 MS (d)1747 1644 MS (e)1772 1644 MS ( )1794 1644 MS (m)1823 1644 MS (\352)1861 1644 MS (m)1884 1644 MS (e)1922 1644 MS ( )1944 1644 MS (n)1973 1644 MS (a)1997 1644 MS (t)2019 1644 MS (u)2034 1644 MS (r)2059 1644 MS (e)2076 1644 MS +( )2098 1644 MS +(:)2111 1644 MS ( )2125 1644 MS +(d)235 1701 MS (i)261 1701 MS (s)273 1701 MS (c)293 1701 MS (r)315 1701 MS (\351)332 1701 MS (t)354 1701 MS (i)369 1701 MS (s)382 1701 MS (a)401 1701 MS (t)423 1701 MS (i)439 1701 MS (o)451 1701 MS (n)477 1701 MS ( )501 1701 MS (i)523 1701 MS +(d)535 1701 MS (e)560 1701 MS (n)583 1701 MS (t)607 1701 MS (i)623 1701 MS (q)635 1701 MS (u)660 1701 MS (e)685 1701 MS ( )707 1701 MS (d)728 1701 MS (u)753 1701 MS ( )778 1701 MS (p)799 1701 MS (r)824 1701 MS (o)841 1701 MS (b)867 1701 MS +(l)892 1701 MS (\350)904 1701 MS (m)927 1701 MS (e)965 1701 MS ( )987 1701 MS (t)1008 1701 MS (r)1023 1701 MS (a)1040 1701 MS (i)1063 1701 MS (t)1075 1701 MS (\351)1090 1701 MS (.)1112 1701 MS ( )1125 1701 MS (N)1146 1701 MS (o)1181 1701 MS (u)1207 1701 MS +(s)1232 1701 MS ( )1251 1701 MS (n)1272 1701 MS (\222)1296 1701 MS (\351)1313 1701 MS (t)1335 1701 MS (u)1350 1701 MS (d)1375 1701 MS (i)1400 1701 MS (e)1413 1701 MS (r)1435 1701 MS (o)1452 1701 MS (n)1478 1701 MS (s)1502 1701 MS ( )1521 1701 MS (d)1542 1701 MS +(a)1567 1701 MS (n)1590 1701 MS (s)1614 1701 MS ( )1633 1701 MS (c)1654 1701 MS (e)1676 1701 MS ( )1698 1701 MS (d)1719 1701 MS (o)1744 1701 MS (c)1770 1701 MS (u)1792 1701 MS (m)1818 1701 MS (e)1855 1701 MS (n)1878 1701 MS (t)1902 1701 MS ( )1917 1701 MS +(q)1938 1701 MS (u)1963 1701 MS (e)1988 1701 MS ( )2010 1701 MS (c)2031 1701 MS (e)2053 1701 MS (t)2075 1701 MS (t)2089 1701 MS (e)2104 1701 MS ( )2125 1701 MS +(s)235 1759 MS (i)255 1759 MS (t)267 1759 MS +(u)282 1759 MS (a)307 1759 MS (t)329 1759 MS (i)344 1759 MS (o)356 1759 MS (n)382 1759 MS (.)406 1759 MS +( )419 1759 MS +(U)348 1816 MS (n)384 1816 MS ( )408 1816 MS (a)423 1816 MS (u)445 1816 MS (t)470 1816 MS (r)485 1816 MS (e)502 1816 MS ( )524 1816 MS (p)538 1816 MS (o)563 1816 MS (i)589 1816 MS (n)601 1816 MS (t)625 1816 MS ( )640 1816 MS (i)655 1816 MS +(m)668 1816 MS (p)706 1816 MS (o)731 1816 MS (r)757 1816 MS (t)774 1816 MS (a)789 1816 MS (n)811 1816 MS (t)835 1816 MS ( )850 1816 MS (e)864 1816 MS (s)886 1816 MS (t)905 1816 MS ( )920 1816 MS (d)934 1816 MS (e)959 1816 MS ( )981 1816 MS +(p)995 1816 MS (o)1020 1816 MS (u)1046 1816 MS (v)1071 1816 MS (o)1095 1816 MS (i)1121 1816 MS (r)1133 1816 MS ( )1150 1816 MS (g)1164 1816 MS (a)1189 1816 MS (r)1211 1816 MS (d)1228 1816 MS (e)1253 1816 MS (r)1275 1816 MS ( )1292 1816 MS (e)1306 1816 MS +(n)1329 1816 MS ( )1353 1816 MS (m)1368 1816 MS (\351)1406 1816 MS (m)1429 1816 MS (o)1466 1816 MS (i)1493 1816 MS (r)1505 1816 MS (e)1523 1816 MS ( )1545 1816 MS (l)1560 1816 MS (e)1573 1816 MS (s)1596 1816 MS ( )1615 1816 MS (d)1629 1816 MS (o)1654 1816 MS +(n)1680 1816 MS (n)1705 1816 MS (\351)1729 1816 MS (e)1751 1816 MS (s)1774 1816 MS ( )1793 1816 MS (g)1807 1816 MS (\351)1832 1816 MS (n)1855 1816 MS (\351)1879 1816 MS (r)1901 1816 MS (\351)1918 1816 MS (e)1940 1816 MS (s)1963 1816 MS ( )1982 1816 MS (p)1996 1816 MS +(a)2021 1816 MS (r)2043 1816 MS ( )2060 1816 MS (u)2074 1816 MS (n)2100 1816 MS ( )2125 1816 MS +(s)235 1874 MS (e)254 1874 MS (r)276 1874 MS (v)293 1874 MS (i)318 1874 MS (c)331 1874 MS (e)354 1874 MS (,)376 1874 MS ( )389 1874 MS (\340)403 1874 MS ( )425 1874 MS (l)440 1874 MS (a)453 1874 MS ( )475 1874 MS (f)490 1874 MS (i)507 1874 MS +(n)520 1874 MS ( )545 1874 MS (d)559 1874 MS (e)584 1874 MS ( )607 1874 MS (s)621 1874 MS (o)640 1874 MS (n)666 1874 MS ( )691 1874 MS (e)705 1874 MS (x)728 1874 MS (\351)752 1874 MS (c)774 1874 MS (u)796 1874 MS (t)821 1874 MS (i)837 1874 MS +(o)849 1874 MS (n)875 1874 MS (.)899 1874 MS ( )912 1874 MS (C)926 1874 MS (e)959 1874 MS (l)982 1874 MS (a)995 1874 MS ( )1018 1874 MS (p)1032 1874 MS (e)1057 1874 MS (r)1079 1874 MS (m)1097 1874 MS (e)1135 1874 MS (t)1157 1874 MS ( )1172 1874 MS +(d)1186 1874 MS (\222)1211 1874 MS (a)1227 1874 MS (c)1250 1874 MS (t)1272 1874 MS (i)1287 1874 MS (v)1300 1874 MS (e)1324 1874 MS (r)1346 1874 MS ( )1363 1874 MS (u)1377 1874 MS (n)1403 1874 MS ( )1427 1874 MS (a)1442 1874 MS (u)1464 1874 MS (t)1489 1874 MS +(r)1504 1874 MS (e)1521 1874 MS ( )1543 1874 MS (s)1557 1874 MS (e)1576 1874 MS (r)1598 1874 MS (v)1615 1874 MS (i)1640 1874 MS (c)1653 1874 MS (e)1675 1874 MS (,)1697 1874 MS ( )1710 1874 MS (l)1725 1874 MS (o)1737 1874 MS (c)1763 1874 MS (a)1785 1874 MS +(l)1808 1874 MS ( )1821 1874 MS (o)1835 1874 MS (u)1861 1874 MS ( )1886 1874 MS (d)1900 1874 MS (i)1926 1874 MS (s)1939 1874 MS (t)1958 1874 MS (a)1973 1874 MS (n)1995 1874 MS (t)2019 1874 MS (,)2034 1874 MS ( )2047 1874 MS (q)2061 1874 MS (u)2086 1874 MS +(i)2112 1874 MS ( )2125 1874 MS +(u)235 1931 MS (t)260 1931 MS (i)275 1931 MS (l)288 1931 MS (i)302 1931 MS (s)315 1931 MS (e)334 1931 MS ( )356 1931 MS (c)369 1931 MS (e)391 1931 MS (s)414 1931 MS ( )433 1931 MS (d)446 1931 MS (o)471 1931 MS (n)497 1931 MS (n)521 1931 MS +(\351)545 1931 MS (e)567 1931 MS (s)590 1931 MS ( )609 1931 MS (s)622 1931 MS (a)641 1931 MS (n)664 1931 MS (s)688 1931 MS ( )707 1931 MS (a)720 1931 MS (v)743 1931 MS (o)767 1931 MS (i)794 1931 MS (r)806 1931 MS ( )823 1931 MS (\340)836 1931 MS +( )858 1931 MS (l)872 1931 MS (e)884 1931 MS (s)906 1931 MS ( )925 1931 MS (r)938 1931 MS (e)955 1931 MS (c)977 1931 MS (h)1000 1931 MS (a)1024 1931 MS (r)1046 1931 MS (g)1063 1931 MS (e)1088 1931 MS (r)1110 1931 MS ( )1127 1931 MS (e)1140 1931 MS +(n)1162 1931 MS ( )1186 1931 MS (m)1200 1931 MS (\351)1239 1931 MS (m)1262 1931 MS (o)1299 1931 MS (i)1326 1931 MS (r)1338 1931 MS (e)1355 1931 MS (.)1377 1931 MS +( )1390 1931 MS +(L)348 1989 MS (\222)378 1989 MS (a)394 1989 MS (p)416 1989 MS (p)441 1989 MS +(r)466 1989 MS (o)483 1989 MS (c)509 1989 MS (h)531 1989 MS (e)555 1989 MS ( )578 1989 MS (p)601 1989 MS (r)626 1989 MS (\351)643 1989 MS (s)665 1989 MS (e)684 1989 MS (n)707 1989 MS (t)731 1989 MS (\351)746 1989 MS (e)768 1989 MS ( )790 1989 MS +(d)813 1989 MS (a)838 1989 MS (n)861 1989 MS (s)885 1989 MS ( )905 1989 MS (c)928 1989 MS (e)950 1989 MS ( )972 1989 MS (d)995 1989 MS (o)1020 1989 MS (c)1046 1989 MS (u)1068 1989 MS (m)1094 1989 MS (e)1131 1989 MS (n)1154 1989 MS (t)1178 1989 MS +( )1193 1989 MS (c)1216 1989 MS (o)1238 1989 MS (n)1264 1989 MS (s)1288 1989 MS (i)1308 1989 MS (s)1321 1989 MS (t)1340 1989 MS (e)1355 1989 MS ( )1377 1989 MS (\340)1400 1989 MS ( )1422 1989 MS (u)1445 1989 MS (t)1470 1989 MS (i)1486 1989 MS (l)1499 1989 MS +(i)1512 1989 MS (s)1525 1989 MS (e)1545 1989 MS (r)1567 1989 MS ( )1584 1989 MS (u)1607 1989 MS (n)1633 1989 MS ( )1657 1989 MS (O)1680 1989 MS (R)1717 1989 MS (B)1750 1989 MS ( )1783 1989 MS (s)1807 1989 MS (\351)1826 1989 MS (q)1848 1989 MS (u)1873 1989 MS +(e)1898 1989 MS (n)1921 1989 MS (t)1945 1989 MS (i)1961 1989 MS (e)1973 1989 MS (l)1996 1989 MS ( )2009 1989 MS (p)2032 1989 MS (o)2057 1989 MS (u)2083 1989 MS (r)2108 1989 MS ( )2125 1989 MS +(c)235 2046 MS (o)257 2046 MS (u)283 2046 MS (p)308 2046 MS (l)333 2046 MS (e)345 2046 MS (r)367 2046 MS ( )384 2046 MS (d)397 2046 MS (e)422 2046 MS (s)444 2046 MS ( )463 2046 MS (c)477 2046 MS (o)499 2046 MS (m)525 2046 MS (p)562 2046 MS +(o)587 2046 MS (s)613 2046 MS (a)632 2046 MS (n)655 2046 MS (t)679 2046 MS (s)694 2046 MS ( )713 2046 MS (p)726 2046 MS (a)751 2046 MS (r)773 2046 MS (a)790 2046 MS (l)813 2046 MS (l)826 2046 MS (\350)839 2046 MS (l)862 2046 MS (e)875 2046 MS +(s)898 2046 MS (.)917 2046 MS ( )930 2046 MS (L)943 2046 MS (a)973 2046 MS ( )995 2046 MS (g)1008 2046 MS (e)1033 2046 MS (s)1055 2046 MS (t)1074 2046 MS (i)1090 2046 MS (o)1102 2046 MS (n)1128 2046 MS ( )1152 2046 MS (d)1165 2046 MS (u)1190 2046 MS +( )1215 2046 MS (p)1228 2046 MS (a)1254 2046 MS (r)1276 2046 MS (a)1293 2046 MS (l)1316 2046 MS (l)1329 2046 MS (\351)1342 2046 MS (l)1365 2046 MS (i)1379 2046 MS (s)1392 2046 MS (m)1412 2046 MS (e)1450 2046 MS ( )1472 2046 MS (d)1485 2046 MS (\222)1511 2046 MS +(a)1527 2046 MS (c)1549 2046 MS (t)1571 2046 MS (i)1587 2046 MS (v)1600 2046 MS (a)1624 2046 MS (t)1646 2046 MS (i)1662 2046 MS (o)1674 2046 MS (n)1700 2046 MS ( )1724 2046 MS (d)1737 2046 MS (e)1762 2046 MS ( )1784 2046 MS (s)1797 2046 MS (e)1817 2046 MS +(r)1839 2046 MS (v)1856 2046 MS (i)1881 2046 MS (c)1894 2046 MS (e)1917 2046 MS ( )1939 2046 MS (C)1952 2046 MS (O)1985 2046 MS (R)2021 2046 MS (B)2055 2046 MS (A)2089 2046 MS ( )2125 2046 MS +(e)235 2104 MS (s)257 2104 MS (t)276 2104 MS ( )291 2104 MS (d)313 2104 MS (o)337 2104 MS (n)363 2104 MS (c)387 2104 MS ( )409 2104 MS (e)431 2104 MS (n)454 2104 MS (t)478 2104 MS (i)494 2104 MS (\350)506 2104 MS (r)528 2104 MS (e)545 2104 MS +(m)568 2104 MS (e)606 2104 MS (n)629 2104 MS (t)653 2104 MS ( )668 2104 MS (\340)690 2104 MS ( )712 2104 MS (l)734 2104 MS (a)747 2104 MS ( )769 2104 MS (c)791 2104 MS (h)814 2104 MS (a)838 2104 MS (r)860 2104 MS (g)877 2104 MS (e)902 2104 MS +( )924 2104 MS (d)946 2104 MS (u)971 2104 MS ( )996 2104 MS (c)1018 2104 MS (o)1040 2104 MS (m)1067 2104 MS (p)1104 2104 MS (o)1129 2104 MS (s)1155 2104 MS (a)1174 2104 MS (n)1196 2104 MS (t)1220 2104 MS (.)1235 2104 MS ( )1248 2104 MS (A)1270 2104 MS +(i)1306 2104 MS (n)1319 2104 MS (s)1344 2104 MS (i)1364 2104 MS (,)1377 2104 MS ( )1390 2104 MS (s)1412 2104 MS (e)1431 2104 MS (u)1453 2104 MS (l)1479 2104 MS ( )1492 2104 MS (l)1515 2104 MS (e)1528 2104 MS ( )1550 2104 MS (p)1572 2104 MS (r)1597 2104 MS +(o)1614 2104 MS (c)1640 2104 MS (e)1662 2104 MS (s)1684 2104 MS (s)1703 2104 MS (u)1722 2104 MS (s)1748 2104 MS ( )1767 2104 MS (0)1789 2104 MS ( )1814 2104 MS (d)1836 2104 MS (u)1861 2104 MS ( )1886 2104 MS (c)1908 2104 MS (o)1930 2104 MS (m)1956 2104 MS +(p)1993 2104 MS (o)2018 2104 MS (s)2044 2104 MS (a)2063 2104 MS (n)2086 2104 MS (t)2110 2104 MS ( )2125 2104 MS +(p)235 2161 MS +(a)260 2161 MS (r)282 2161 MS (a)299 2161 MS (l)322 2161 MS (l)335 2161 MS (\350)348 2161 MS (l)371 2161 MS (e)384 2161 MS ( )406 2161 MS (e)422 2161 MS (s)444 2161 MS (t)463 2161 MS ( )478 2161 MS (v)494 2161 MS (i)519 2161 MS (s)532 2161 MS +(i)552 2161 MS (b)565 2161 MS (l)591 2161 MS (e)604 2161 MS ( )626 2161 MS (d)642 2161 MS (e)667 2161 MS (p)689 2161 MS (u)714 2161 MS (i)740 2161 MS (s)753 2161 MS ( )772 2161 MS (l)789 2161 MS (e)802 2161 MS ( )824 2161 MS (c)840 2161 MS +(l)863 2161 MS (i)877 2161 MS (e)890 2161 MS (n)913 2161 MS (t)937 2161 MS (.)952 2161 MS ( )965 2161 MS (U)981 2161 MS (n)1017 2161 MS (e)1041 2161 MS ( )1063 2161 MS (f)1080 2161 MS (o)1095 2161 MS (i)1121 2161 MS (s)1134 2161 MS ( )1153 2161 MS +(a)1169 2161 MS (c)1191 2161 MS (t)1213 2161 MS (i)1229 2161 MS (v)1242 2161 MS (\351)1266 2161 MS ( )1288 2161 MS (p)1304 2161 MS (a)1329 2161 MS (r)1351 2161 MS ( )1368 2161 MS (l)1385 2161 MS (e)1397 2161 MS ( )1419 2161 MS (c)1435 2161 MS (l)1458 2161 MS +(i)1472 2161 MS (e)1485 2161 MS (n)1508 2161 MS (t)1532 2161 MS (,)1547 2161 MS ( )1560 2161 MS (l)1576 2161 MS (e)1588 2161 MS ( )1610 2161 MS (p)1626 2161 MS (r)1651 2161 MS (o)1668 2161 MS (c)1694 2161 MS (e)1716 2161 MS (s)1738 2161 MS (s)1757 2161 MS +(u)1776 2161 MS (s)1801 2161 MS ( )1820 2161 MS (0)1836 2161 MS ( )1861 2161 MS (a)1877 2161 MS (c)1899 2161 MS (t)1921 2161 MS (i)1937 2161 MS (v)1950 2161 MS (e)1974 2161 MS (r)1996 2161 MS (a)2013 2161 MS (,)2035 2161 MS ( )2048 2161 MS (v)2064 2161 MS +(i)2089 2161 MS (a)2102 2161 MS ( )2125 2161 MS +(C)235 2219 MS (O)268 2219 MS (R)304 2219 MS (B)337 2219 MS (A)371 2219 MS (,)406 2219 MS ( )419 2219 MS (l)433 2219 MS (e)445 2219 MS (s)468 2219 MS ( )487 2219 MS (a)500 2219 MS (u)522 2219 MS (t)547 2219 MS (r)562 2219 MS (e)579 2219 MS +(s)601 2219 MS ( )620 2219 MS (p)633 2219 MS (r)658 2219 MS (o)674 2219 MS (c)700 2219 MS (e)722 2219 MS (s)744 2219 MS (s)763 2219 MS (u)782 2219 MS (s)807 2219 MS ( )826 2219 MS (c)839 2219 MS (o)861 2219 MS (n)887 2219 MS (s)911 2219 MS +(t)930 2219 MS (i)946 2219 MS (t)958 2219 MS (u)973 2219 MS (a)998 2219 MS (n)1020 2219 MS (t)1044 2219 MS ( )1059 2219 MS (l)1072 2219 MS (e)1085 2219 MS ( )1107 2219 MS (c)1120 2219 MS (o)1142 2219 MS (m)1168 2219 MS (p)1205 2219 MS (o)1230 2219 MS +(s)1256 2219 MS (a)1275 2219 MS (n)1298 2219 MS (t)1322 2219 MS ( )1337 2219 MS (p)1350 2219 MS (a)1375 2219 MS (r)1397 2219 MS (a)1414 2219 MS (l)1436 2219 MS (l)1449 2219 MS (\350)1462 2219 MS (l)1485 2219 MS (e)1498 2219 MS (.)1520 2219 MS ( )1533 2219 MS +(D)1546 2219 MS (u)1582 2219 MS ( )1607 2219 MS (p)1620 2219 MS (o)1645 2219 MS (i)1671 2219 MS (n)1684 2219 MS (t)1708 2219 MS ( )1723 2219 MS (d)1736 2219 MS (e)1761 2219 MS ( )1783 2219 MS (v)1796 2219 MS (u)1820 2219 MS (e)1845 2219 MS ( )1867 2219 MS +(d)1880 2219 MS (e)1905 2219 MS ( )1927 2219 MS (C)1940 2219 MS (O)1973 2219 MS (R)2009 2219 MS (B)2042 2219 MS (A)2076 2219 MS (,)2111 2219 MS ( )2125 2219 MS +(l)235 2276 MS (e)248 2276 MS ( )270 2276 MS (p)283 2276 MS (r)308 2276 MS (o)325 2276 MS (c)351 2276 MS (e)373 2276 MS (s)395 2276 MS (s)414 2276 MS (u)433 2276 MS (s)459 2276 MS ( )478 2276 MS (0)491 2276 MS ( )516 2276 MS (d)529 2276 MS +(\222)555 2276 MS (u)571 2276 MS (n)597 2276 MS ( )621 2276 MS (c)634 2276 MS (o)656 2276 MS (m)683 2276 MS (p)720 2276 MS (o)745 2276 MS (s)771 2276 MS (a)790 2276 MS (n)812 2276 MS (t)836 2276 MS ( )851 2276 MS (p)864 2276 MS (a)889 2276 MS +(r)911 2276 MS (a)928 2276 MS (l)951 2276 MS (l)964 2276 MS (\350)977 2276 MS (l)1000 2276 MS (e)1013 2276 MS ( )1036 2276 MS (s)1049 2276 MS (e)1068 2276 MS ( )1091 2276 MS (c)1104 2276 MS (o)1126 2276 MS (m)1153 2276 MS (p)1190 2276 MS (o)1215 2276 MS +(r)1241 2276 MS (t)1257 2276 MS (e)1272 2276 MS ( )1294 2276 MS (e)1307 2276 MS (n)1329 2276 MS ( )1353 2276 MS (c)1366 2276 MS (l)1389 2276 MS (i)1403 2276 MS (e)1416 2276 MS (n)1439 2276 MS (t)1463 2276 MS ( )1478 2276 MS (d)1491 2276 MS (e)1516 2276 MS +( )1538 2276 MS (t)1551 2276 MS (o)1565 2276 MS +(u)1591 2276 MS (s)1616 2276 MS ( )1635 2276 MS (l)1649 2276 MS (e)1661 2276 MS (s)1683 2276 MS ( )1702 2276 MS (a)1716 2276 MS (u)1738 2276 MS (t)1763 2276 MS (r)1778 2276 MS (e)1795 2276 MS (s)1817 2276 MS ( )1836 2276 MS (p)1849 2276 MS (r)1874 2276 MS +(o)1891 2276 MS (c)1917 2276 MS (e)1939 2276 MS (s)1961 2276 MS (s)1980 2276 MS (u)1999 2276 MS (s)2024 2276 MS (.)2043 2276 MS ( )2056 2276 MS (E)2069 2276 MS (n)2100 2276 MS ( )2125 2276 MS +(c)235 2334 MS (e)257 2334 MS ( )279 2334 MS (q)309 2334 MS (u)334 2334 MS (i)360 2334 MS ( )372 2334 MS (c)402 2334 MS (o)424 2334 MS (n)450 2334 MS (c)474 2334 MS (e)496 2334 MS (r)518 2334 MS (n)536 2334 MS (e)560 2334 MS ( )582 2334 MS +(l)613 2334 MS (\222)626 2334 MS (\351)642 2334 MS (c)665 2334 MS (h)688 2334 MS (a)712 2334 MS (n)735 2334 MS (g)759 2334 MS (e)784 2334 MS ( )806 2334 MS (e)836 2334 MS (t)858 2334 MS ( )873 2334 MS (l)903 2334 MS (a)916 2334 MS ( )938 2334 MS +(r)968 2334 MS (e)985 2334 MS (d)1007 2334 MS (i)1033 2334 MS (s)1046 2334 MS (t)1065 2334 MS (r)1080 2334 MS (i)1097 2334 MS (b)1110 2334 MS (u)1134 2334 MS (t)1159 2334 MS (i)1175 2334 MS (o)1187 2334 MS (n)1213 2334 MS ( )1238 2334 MS (d)1268 2334 MS +(e)1293 2334 MS ( )1315 2334 MS (d)1345 2334 MS (o)1370 2334 MS (n)1396 2334 MS (n)1420 2334 MS (\351)1444 2334 MS (e)1466 2334 MS (s)1488 2334 MS ( )1507 2334 MS (p)1537 2334 MS (a)1562 2334 MS (r)1584 2334 MS (a)1601 2334 MS (l)1624 2334 MS (l)1638 2334 MS +(\350)1651 2334 MS (l)1674 2334 MS (e)1687 2334 MS (s)1710 2334 MS ( )1729 2334 MS (e)1759 2334 MS (n)1782 2334 MS (t)1806 2334 MS (r)1821 2334 MS (e)1838 2334 MS ( )1860 2334 MS (c)1890 2334 MS (o)1911 2334 MS (m)1937 2334 MS (p)1974 2334 MS (o)1999 2334 MS +(s)2025 2334 MS (a)2044 2334 MS (n)2067 2334 MS (t)2091 2334 MS (s)2106 2334 MS ( )2125 2334 MS +(p)235 2391 MS (a)260 2391 MS (r)282 2391 MS (a)299 2391 MS (l)322 2391 MS (l)335 2391 MS (\350)348 2391 MS (l)371 2391 MS (e)384 2391 MS (s)407 2391 MS (,)426 2391 MS ( )439 2391 MS (c)453 2391 MS (h)476 2391 MS (a)500 2391 MS (q)522 2391 MS +(u)547 2391 MS (e)572 2391 MS ( )594 2391 MS (p)608 2391 MS (r)633 2391 MS (o)650 2391 MS (c)676 2391 MS (e)698 2391 MS (s)720 2391 MS (s)739 2391 MS (u)758 2391 MS (s)784 2391 MS ( )803 2391 MS (q)817 2391 MS (u)842 2391 MS (i)868 2391 MS +( )881 2391 MS (v)896 2391 MS (e)921 2391 MS (u)943 2391 MS (t)968 2391 MS ( )983 2391 MS (r)997 2391 MS (\351)1014 2391 MS (c)1036 2391 MS (u)1058 2391 MS (p)1083 2391 MS (\351)1108 2391 MS (r)1130 2391 MS (e)1147 2391 MS (r)1169 2391 MS ( )1186 2391 MS +(s)1200 2391 MS (a)1219 2391 MS ( )1241 2391 MS (p)1256 2391 MS (a)1281 2391 MS (r)1303 2391 MS (t)1320 2391 MS (i)1335 2391 MS (e)1347 2391 MS ( )1369 2391 MS (l)1384 2391 MS (o)1396 2391 MS (c)1422 2391 MS (a)1444 2391 MS (l)1467 2391 MS (e)1480 2391 MS +( )1503 2391 MS (d)1517 2391 MS (e)1542 2391 MS ( )1565 2391 MS (l)1580 2391 MS (a)1593 2391 MS ( )1615 2391 MS (d)1629 2391 MS (o)1654 2391 MS (n)1680 2391 MS (n)1705 2391 MS (\351)1729 2391 MS (e)1751 2391 MS (,)1773 2391 MS ( )1786 2391 MS (d)1800 2391 MS +(e)1826 2391 MS (v)1849 2391 MS (i)1874 2391 MS (e)1887 2391 MS (n)1910 2391 MS (t)1934 2391 MS ( )1949 2391 MS (l)1964 2391 MS (e)1976 2391 MS ( )1998 2391 MS (c)2013 2391 MS (l)2036 2391 MS (i)2049 2391 MS (e)2062 2391 MS (n)2085 2391 MS (t)2109 2391 MS +( )2125 2391 MS +(s)235 2449 MS (e)254 2449 MS (l)277 2449 MS (o)289 2449 MS (n)316 2449 MS ( )340 2449 MS (C)369 2449 MS (O)402 2449 MS (R)439 2449 MS (B)472 2449 MS (A)506 2449 MS (,)541 2449 MS ( )554 2449 MS (d)583 2449 MS (e)608 2449 MS ( )631 2449 MS +(c)660 2449 MS (h)683 2449 MS (a)707 2449 MS (c)729 2449 MS (u)751 2449 MS (n)777 2449 MS ( )802 2449 MS (d)831 2449 MS (e)856 2449 MS (s)878 2449 MS ( )898 2449 MS (p)927 2449 MS (r)952 2449 MS (o)969 2449 MS (c)995 2449 MS (e)1017 2449 MS +(s)1039 2449 MS (s)1058 2449 MS (u)1077 2449 MS (s)1102 2449 MS ( )1121 2449 MS (d)1150 2449 MS (u)1175 2449 MS ( )1201 2449 MS (c)1230 2449 MS (o)1253 2449 MS (m)1279 2449 MS (p)1316 2449 MS (o)1341 2449 MS +(s)1367 2449 MS (a)1386 2449 MS (n)1409 2449 MS (t)1433 2449 MS ( )1448 2449 MS (p)1477 2449 MS (a)1502 2449 MS (r)1524 2449 MS (a)1541 2449 MS (l)1564 2449 MS (l)1577 2449 MS (\350)1590 2449 MS (l)1613 2449 MS (e)1626 2449 MS ( )1648 2449 MS (q)1677 2449 MS +(u)1702 2449 MS (i)1728 2449 MS ( )1741 2449 MS (a)1771 2449 MS (b)1794 2449 MS (r)1818 2449 MS (i)1836 2449 MS (t)1848 2449 MS (e)1863 2449 MS ( )1885 2449 MS (l)1915 2449 MS (a)1928 2449 MS ( )1950 2449 MS (d)1979 2449 MS (o)2004 2449 MS (n)2030 2449 MS +(n)2055 2449 MS (\351)2079 2449 MS (e)2102 2449 MS ( )2125 2449 MS +(d)235 2506 MS (i)261 2506 MS (s)273 2506 MS (t)292 2506 MS (r)307 2506 MS (i)325 2506 MS (b)338 2506 MS (u)362 2506 MS (\351)387 2506 MS (e)409 2506 MS (.)431 2506 MS ( )444 2506 MS (I)466 2506 MS (l)484 2506 MS ( )496 2506 MS (y)519 2506 MS +( )543 2506 MS (a)565 2506 MS ( )587 2506 MS (a)609 2506 MS (i)632 2506 MS (n)645 2506 MS (s)670 2506 MS (i)691 2506 MS ( )703 2506 MS (c)726 2506 MS (o)748 2506 MS (m)775 2506 MS (m)813 2506 MS (u)850 2506 MS (n)876 2506 MS (i)901 2506 MS +(c)914 2506 MS (a)937 2506 MS (t)959 2506 MS (i)974 2506 MS (o)986 2506 MS (n)1012 2506 MS ( )1036 2506 MS (d)1058 2506 MS (i)1084 2506 MS (r)1097 2506 MS (e)1114 2506 MS (c)1136 2506 MS (t)1158 2506 MS (e)1173 2506 MS ( )1195 2506 MS (d)1217 2506 MS +(e)1242 2506 MS ( )1264 2506 MS (p)1286 2506 MS (r)1311 2506 MS (o)1328 2506 MS (c)1354 2506 MS (e)1376 2506 MS (s)1398 2506 MS (s)1417 2506 MS (u)1436 2506 MS (s)1461 2506 MS ( )1480 2506 MS (\340)1502 2506 MS ( )1524 2506 MS (p)1546 2506 MS (r)1571 2506 MS +(o)1588 2506 MS (c)1614 2506 MS (e)1636 2506 MS (s)1658 2506 MS (s)1677 2506 MS (u)1696 2506 MS (s)1721 2506 MS (,)1740 2506 MS ( )1753 2506 MS (c)1775 2506 MS (e)1797 2506 MS ( )1819 2506 MS (q)1841 2506 MS (u)1866 2506 MS (i)1892 2506 MS ( )1905 2506 MS +(\351)1927 2506 MS (v)1950 2506 MS (i)1975 2506 MS (t)1987 2506 MS (e)2002 2506 MS ( )2024 2506 MS (t)2046 2506 MS (o)2061 2506 MS (u)2086 2506 MS (t)2110 2506 MS ( )2125 2506 MS +(g)235 2564 MS (o)260 2564 MS (u)286 2564 MS (l)311 2564 MS (o)323 2564 MS (t)349 2564 MS ( )364 2564 MS (d)384 2564 MS (\222)409 2564 MS (\351)425 2564 MS (t)447 2564 MS (r)462 2564 MS (a)479 2564 MS (n)501 2564 MS (g)525 2564 MS (l)551 2564 MS +(e)563 2564 MS (m)586 2564 MS (e)624 2564 MS (n)647 2564 MS (t)671 2564 MS ( )686 2564 MS (p)706 2564 MS (o)731 2564 MS (u)757 2564 MS (r)782 2564 MS ( )799 2564 MS (l)819 2564 MS (\222)832 2564 MS (\351)848 2564 MS (c)870 2564 MS (h)893 2564 MS +(a)918 2564 MS (n)941 2564 MS (g)965 2564 MS (e)990 2564 MS ( )1012 2564 MS (d)1032 2564 MS (e)1057 2564 MS ( )1080 2564 MS (d)1100 2564 MS (o)1125 2564 MS (n)1151 2564 MS (n)1176 2564 MS (\351)1200 2564 MS (e)1222 2564 MS (s)1245 2564 MS (.)1264 2564 MS +( )1277 2564 MS (C)1297 2564 MS (e)1330 2564 MS (t)1352 2564 MS (t)1367 2564 MS (e)1382 2564 MS ( )1404 2564 MS (m)1424 2564 MS (\351)1461 2564 MS (t)1483 2564 MS (h)1498 2564 MS (o)1522 2564 MS (d)1548 2564 MS (e)1573 2564 MS ( )1595 2564 MS (e)1615 2564 MS +(s)1638 2564 MS (t)1657 2564 MS ( )1672 2564 MS (l)1693 2564 MS (a)1705 2564 MS ( )1728 2564 MS (m)1749 2564 MS (\351)1787 2564 MS (t)1809 2564 MS (h)1824 2564 MS (o)1848 2564 MS (d)1874 2564 MS (e)1899 2564 MS ( )1921 2564 MS (c)1941 2564 MS (l)1964 2564 MS +(a)1977 2564 MS (s)1999 2564 MS (s)2018 2564 MS (i)2038 2564 MS (q)2051 2564 MS (u)2076 2564 MS (e)2102 2564 MS ( )2125 2564 MS +(u)235 2621 MS (t)260 2621 MS (i)275 2621 MS (l)288 2621 MS (i)302 2621 MS (s)315 2621 MS (\351)334 2621 MS (e)356 2621 MS ( )378 2621 MS (p)393 2621 MS (a)419 2621 MS (r)441 2621 MS ( )458 2621 MS (l)474 2621 MS (e)487 2621 MS (s)509 2621 MS +( )528 2621 MS (p)543 2621 MS (e)568 2621 MS (r)590 2621 MS (s)607 2621 MS (o)626 2621 MS (n)652 2621 MS (n)677 2621 MS (e)702 2621 MS (s)724 2621 MS ( )743 2621 MS (i)759 2621 MS (n)772 2621 MS (t)796 2621 MS (\351)811 2621 MS (r)833 2621 MS +(e)850 2621 MS (s)872 2621 MS (s)892 2621 MS (\351)911 2621 MS (e)933 2621 MS (s)956 2621 MS ( )975 2621 MS (p)990 2621 MS (a)1015 2621 MS +(r)1037 2621 MS ( )1054 2621 MS (l)1070 2621 MS (e)1083 2621 MS ( )1105 2621 MS (c)1120 2621 MS (o)1142 2621 MS (u)1168 2621 MS (p)1193 2621 MS (l)1219 2621 MS (a)1231 2621 MS (g)1254 2621 MS (e)1279 2621 MS ( )1301 2621 MS (d)1316 2621 MS (e)1341 2621 MS +( )1363 2621 MS (c)1378 2621 MS (o)1400 2621 MS (d)1426 2621 MS (e)1451 2621 MS ( )1473 2621 MS (p)1488 2621 MS (a)1513 2621 MS (r)1535 2621 MS (a)1552 2621 MS (l)1575 2621 MS (l)1588 2621 MS (\350)1601 2621 MS (l)1624 2621 MS (e)1637 2621 MS (s)1660 2621 MS +( )1679 2621 MS (d)1694 2621 MS (a)1719 2621 MS (n)1742 2621 MS (s)1766 2621 MS ( )1785 2621 MS (u)1800 2621 MS (n)1826 2621 MS (e)1851 2621 MS ( )1873 2621 MS (a)1888 2621 MS (r)1910 2621 MS (c)1927 2621 MS (h)1950 2621 MS (i)1975 2621 MS (t)1987 2621 MS +(e)2002 2621 MS (c)2024 2621 MS (t)2046 2621 MS (u)2061 2621 MS (r)2086 2621 MS (e)2103 2621 MS ( )2125 2621 MS +(r)235 2679 MS (\351)252 2679 MS (p)274 2679 MS (a)299 2679 MS (r)321 2679 MS (t)338 2679 MS (i)353 2679 MS (e)365 2679 MS ( )387 2679 MS (b)400 2679 MS (a)424 2679 MS (s)447 2679 MS (\351)466 2679 MS (e)488 2679 MS ( )510 2679 MS (s)523 2679 MS +(u)542 2679 MS (r)567 2679 MS ( )584 2679 MS (l)598 2679 MS (e)610 2679 MS ( )632 2679 MS (\253)646 2679 MS +( )670 2679 MS +(m)684 2679 MS (i)722 2679 MS (d)735 2679 MS (d)760 2679 MS (l)786 2679 MS (e)799 2679 MS (w)821 2679 MS (a)857 2679 MS (r)879 2679 MS (e)896 2679 MS ( )918 2679 MS (\273)932 2679 MS ( )956 2679 MS (C)969 2679 MS (O)1002 2679 MS (R)1038 2679 MS +(B)1071 2679 MS (A)1105 2679 MS (.)1140 2679 MS +( )1153 2679 MS +(L)348 2736 MS (e)378 2736 MS (s)400 2736 MS ( )419 2736 MS (o)443 2736 MS (b)469 2736 MS (j)494 2736 MS (e)507 2736 MS (c)529 2736 MS (t)551 2736 MS (i)567 2736 MS (f)580 2736 MS (s)596 2736 MS ( )615 2736 MS (d)639 2736 MS (e)665 2736 MS +( )687 2736 MS (c)711 2736 MS (e)733 2736 MS (t)755 2736 MS (t)770 2736 MS (e)785 2736 MS ( )807 2736 MS (\351)831 2736 MS (t)852 2736 MS (u)867 2736 MS (d)892 2736 MS (e)917 2736 MS ( )939 2736 MS (s)963 2736 MS (o)982 2736 MS (n)1008 2736 MS +(t)1032 2736 MS ( )1047 2736 MS (i)1071 2736 MS (l)1084 2736 MS (l)1097 2736 MS (u)1110 2736 MS (s)1136 2736 MS (t)1155 2736 MS (r)1170 2736 MS (\351)1187 2736 MS (s)1209 2736 MS ( )1228 2736 MS (p)1252 2736 MS (a)1277 2736 MS (r)1299 2736 MS ( )1316 2736 MS +(u)1340 2736 MS (n)1365 2736 MS ( )1389 2736 MS (c)1413 2736 MS (a)1435 2736 MS (s)1458 2736 MS ( )1477 2736 MS (d)1501 2736 MS (\222)1527 2736 MS (u)1543 2736 MS (t)1568 2736 MS (i)1583 2736 MS (l)1596 2736 MS (i)1610 2736 MS (s)1623 2736 MS (a)1643 2736 MS +(t)1665 2736 MS (i)1680 2736 MS (o)1692 2736 MS (n)1718 2736 MS ( )1742 2736 MS (q)1766 2736 MS (u)1791 2736 MS (i)1817 2736 MS ( )1830 2736 MS (e)1855 2736 MS (s)1877 2736 MS (t)1896 2736 MS ( )1911 2736 MS (d)1935 2736 MS (\351)1960 2736 MS (c)1982 2736 MS +(r)2004 2736 MS (i)2022 2736 MS (s)2034 2736 MS ( )2053 2736 MS (a)2078 2736 MS (u)2100 2736 MS ( )2125 2736 MS +(c)235 2794 MS (h)257 2794 MS (a)281 2794 MS (p)303 2794 MS (i)329 2794 MS (t)341 2794 MS (r)356 2794 MS (e)373 2794 MS ( )395 2794 MS (9)408 2794 MS (.)433 2794 MS +%%IncludeFont: Courier +[42 0 0 -42 0 0]/Courier MF +( )446 2794 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )348 2851 MS +[42 0 0 -42 0 0]/Courier MF +( )348 2899 MS +showpage +%%Page: 8 8 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(8)1868 400 MS +(/)1893 400 MS +(3)1907 400 MS (0)1932 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1957 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[42 0 0 -42 0 0]/Courier MF +( )235 517 MS +( )235 565 MS +[50 0 0 -50 0 0]/Times-Roman MF +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(D)348 622 MS (u)384 622 MS ( )409 622 MS (p)435 622 MS (o)460 622 MS (i)486 622 MS (n)499 622 MS (t)523 622 MS ( )538 622 MS (d)564 622 MS (e)589 622 MS ( )611 622 MS (v)637 622 MS (u)661 622 MS (e)686 622 MS ( )708 622 MS +(d)734 622 MS (u)759 622 MS ( )784 622 MS (c)810 622 MS (l)833 622 MS (i)846 622 MS (e)859 622 MS (n)882 622 MS (t)906 622 MS (,)921 622 MS ( )934 622 MS (l)961 622 MS (\222)973 622 MS (i)990 622 MS (n)1003 622 MS (v)1028 622 MS +(o)1052 622 MS (c)1078 622 MS (a)1100 622 MS (t)1122 622 MS (i)1138 622 MS (o)1150 622 MS (n)1176 622 MS ( )1200 622 MS (d)1226 622 MS (\222)1252 622 MS (u)1268 622 MS (n)1294 622 MS ( )1318 622 MS (s)1344 622 MS (e)1364 622 MS (r)1386 622 MS +(v)1403 622 MS (i)1428 622 MS (c)1441 622 MS (e)1463 622 MS ( )1485 622 MS +(d)1511 622 MS (\222)1537 622 MS (u)1553 622 MS (n)1579 622 MS ( )1603 622 MS (c)1629 622 MS (o)1651 622 MS (m)1677 622 MS (p)1714 622 MS (o)1739 622 MS (s)1765 622 MS (a)1784 622 MS (n)1807 622 MS (t)1831 622 MS ( )1846 622 MS (p)1872 622 MS +(a)1897 622 MS (r)1919 622 MS (a)1936 622 MS (l)1959 622 MS (l)1972 622 MS (\350)1985 622 MS (l)2008 622 MS (e)2021 622 MS ( )2043 622 MS (e)2069 622 MS (s)2091 622 MS (t)2110 622 MS ( )2125 622 MS +(i)235 679 MS (d)248 679 MS (e)273 679 MS (n)296 679 MS (t)320 679 MS (i)336 679 MS (q)348 679 MS (u)373 679 MS (e)398 679 MS ( )420 679 MS (\340)435 679 MS ( )457 679 MS (l)473 679 MS (\222)486 679 MS (i)503 679 MS (n)516 679 MS +(v)541 679 MS (o)565 679 MS (c)591 679 MS (a)613 679 MS (t)635 679 MS (i)651 679 MS (o)663 679 MS (n)689 679 MS ( )713 679 MS (d)728 679 MS (\222)753 679 MS (u)769 679 MS (n)795 679 MS ( )819 679 MS (c)834 679 MS (o)856 679 MS +(m)883 679 MS (p)920 679 MS (o)945 679 MS (s)971 679 MS (a)990 679 MS (n)1012 679 MS (t)1036 679 MS ( )1051 679 MS (s)1066 679 MS (\351)1085 679 MS (q)1107 679 MS (u)1132 679 MS (e)1157 679 MS (n)1179 679 MS (t)1203 679 MS (i)1219 679 MS +(e)1231 679 MS (l)1254 679 MS (.)1266 679 MS ( )1279 679 MS (S)1294 679 MS (e)1322 679 MS (u)1344 679 MS (l)1370 679 MS ( )1382 679 MS (l)1398 679 MS (e)1411 679 MS ( )1433 679 MS (s)1448 679 MS (e)1467 679 MS (r)1489 679 MS (v)1507 679 MS +(i)1532 679 MS (c)1545 679 MS (e)1567 679 MS ( )1589 679 MS (s)1604 679 MS (u)1623 679 MS (r)1648 679 MS ( )1665 679 MS (l)1681 679 MS (e)1694 679 MS ( )1716 679 MS (p)1731 679 MS (r)1756 679 MS (o)1773 679 MS (c)1799 679 MS (e)1821 679 MS +(s)1843 679 MS (s)1862 679 MS ( )1881 679 MS (0)1896 679 MS ( )1921 679 MS (e)1936 679 MS (s)1958 679 MS (t)1977 679 MS ( )1991 679 MS (a)2006 679 MS (c)2028 679 MS (t)2049 679 MS (i)2064 679 MS (v)2077 679 MS (\351)2102 679 MS ( )2125 679 MS +(p)235 737 MS (a)260 737 MS (r)282 737 MS ( )299 737 MS (l)312 737 MS (e)324 737 MS ( )346 737 MS (c)359 737 MS (l)382 737 MS (i)396 737 MS (e)409 737 MS (n)432 737 MS (t)456 737 MS (.)471 737 MS ( )484 737 MS (C)497 737 MS +(\222)530 737 MS (e)546 737 MS (s)568 737 MS (t)587 737 MS ( )602 737 MS (c)615 737 MS (e)637 737 MS ( )659 737 MS (s)672 737 MS (e)691 737 MS (r)713 737 MS (v)730 737 MS (i)755 737 MS (c)767 737 MS (e)790 737 MS ( )812 737 MS +(q)825 737 MS (u)850 737 MS (i)876 737 MS ( )888 737 MS (a)901 737 MS (c)923 737 MS (t)945 737 MS (i)961 737 MS (v)974 737 MS (e)998 737 MS ( )1020 737 MS (l)1034 737 MS (e)1046 737 MS ( )1068 737 MS (s)1081 737 MS (e)1101 737 MS +(r)1123 737 MS (v)1140 737 MS (i)1165 737 MS (c)1178 737 MS (e)1201 737 MS ( )1223 737 MS (\351)1236 737 MS (q)1258 737 MS (u)1283 737 MS (i)1309 737 MS (v)1322 737 MS (a)1346 737 MS (l)1369 737 MS (e)1382 737 MS (n)1405 737 MS (t)1429 737 MS +( )1444 737 MS (s)1457 737 MS (u)1476 737 MS (r)1501 737 MS ( )1518 737 MS (l)1531 737 MS (e)1543 737 MS (s)1566 737 MS ( )1585 737 MS (a)1598 737 MS (u)1620 737 MS (t)1645 737 MS (r)1660 737 MS (e)1677 737 MS (s)1699 737 MS ( )1718 737 MS +(p)1731 737 MS (r)1756 737 MS (o)1772 737 MS (c)1798 737 MS (e)1820 737 MS (s)1842 737 MS (s)1861 737 MS ( )1880 737 MS (p)1893 737 MS (o)1918 737 MS (u)1944 737 MS (r)1968 737 MS ( )1985 737 MS (m)1998 737 MS (e)2035 737 MS (t)2057 737 MS +(t)2072 737 MS (r)2086 737 MS (e)2103 737 MS ( )2125 737 MS +(e)235 794 MS (n)257 794 MS ( )281 794 MS (\234)294 794 MS (u)330 794 MS (v)356 794 MS (r)380 794 MS (e)397 794 MS ( )419 794 MS (l)433 794 MS (e)445 794 MS ( )467 794 MS (p)480 794 MS (a)505 794 MS (r)527 794 MS (a)544 794 MS +(l)567 794 MS (l)580 794 MS (\351)593 794 MS (l)617 794 MS (i)630 794 MS (s)643 794 MS (m)664 794 MS (e)702 794 MS (.)724 794 MS +( )737 794 MS +[42 0 0 -42 0 0]/Courier MF +( )235 842 MS +( )235 889 MS +( )235 936 MS +( )235 983 MS +( )235 1031 MS +( )235 1078 MS +( )235 1125 MS +( )235 1172 MS +( )235 1219 MS +( )235 1267 MS +( )235 1314 MS +( )235 1361 MS +( )235 1408 MS +( )235 1455 MS +( )235 1503 MS +( )235 1550 MS +( )235 1597 MS +( )235 1644 MS +( )235 1691 MS +( )235 1739 MS +( )235 1786 MS +( )235 1833 MS +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 1890 MS (e)378 1890 MS (s)400 1890 MS ( )419 1890 MS (\351)437 1890 MS (c)459 1890 MS (h)482 1890 MS (a)506 1890 MS (n)529 1890 MS (g)553 1890 MS (e)578 1890 MS (s)601 1890 MS ( )620 1890 MS (d)638 1890 MS (e)663 1890 MS (s)685 1890 MS +( )704 1890 MS (d)722 1890 MS (o)747 1890 MS (n)773 1890 MS (n)798 1890 MS (\351)822 1890 MS (e)844 1890 MS (s)867 1890 MS ( )886 1890 MS (p)904 1890 MS (a)929 1890 MS (r)951 1890 MS (a)968 1890 MS (l)991 1890 MS (l)1004 1890 MS (\350)1017 1890 MS +(l)1040 1890 MS (e)1053 1890 MS (s)1076 1890 MS ( )1095 1890 MS (r)1113 1890 MS (e)1130 1890 MS (s)1152 1890 MS (t)1171 1890 MS (e)1186 1890 MS (n)1208 1890 MS (t)1232 1890 MS ( )1247 1890 MS (\340)1265 1890 MS ( )1287 1890 MS (l)1305 1890 MS (a)1317 1890 MS +( )1339 1890 MS (c)1357 1890 MS (h)1379 1890 MS (a)1403 1890 MS (r)1425 1890 MS (g)1442 1890 MS (e)1467 1890 MS ( )1489 1890 MS (d)1507 1890 MS (u)1532 1890 MS ( )1557 1890 MS (c)1575 1890 MS (l)1598 1890 MS (i)1611 1890 MS (e)1624 1890 MS (n)1647 1890 MS +(t)1671 1890 MS ( )1686 1890 MS (d)1704 1890 MS (e)1729 1890 MS ( )1751 1890 MS (f)1769 1890 MS (a)1785 1890 MS (\347)1807 1890 MS (o)1829 1890 MS (n)1855 1890 MS ( )1879 1890 MS (\340)1897 1890 MS ( )1919 1890 MS (c)1937 1890 MS (e)1959 1890 MS ( )1981 1890 MS +(q)1999 1890 MS (u)2024 1890 MS (e)2049 1890 MS ( )2071 1890 MS (l)2090 1890 MS (a)2102 1890 MS ( )2125 1890 MS +(r)235 1948 MS (e)252 1948 MS (d)274 1948 MS (i)300 1948 MS (s)312 1948 MS (t)331 1948 MS (r)346 1948 MS (i)364 1948 MS (b)377 1948 MS (u)401 1948 MS (t)426 1948 MS (i)441 1948 MS (o)453 1948 MS (n)479 1948 MS ( )503 1948 MS (s)518 1948 MS +(e)538 1948 MS ( )560 1948 MS (f)576 1948 MS (a)591 1948 MS (s)614 1948 MS (s)633 1948 MS (e)652 1948 MS ( )674 1948 MS (d)689 1948 MS (e)714 1948 MS ( )736 1948 MS (f)752 1948 MS (a)768 1948 MS (\347)790 1948 MS (o)812 1948 MS (n)838 1948 MS +( )862 1948 MS (o)877 1948 MS (p)903 1948 MS (t)927 1948 MS (i)942 1948 MS (m)955 1948 MS (a)993 1948 MS (l)1016 1948 MS (e)1029 1948 MS ( )1051 1948 MS (d)1066 1948 MS (i)1092 1948 MS (r)1105 1948 MS (e)1122 1948 MS (c)1144 1948 MS (t)1166 1948 MS +(e)1181 1948 MS (m)1204 1948 MS (e)1242 1948 MS (n)1264 1948 MS (t)1288 1948 MS ( )1303 1948 MS (d)1318 1948 MS (u)1343 1948 MS ( )1368 1948 MS (p)1383 1948 MS (r)1408 1948 MS (o)1424 1948 MS (c)1450 1948 MS (e)1472 1948 MS (s)1494 1948 MS (s)1513 1948 MS +( )1532 1948 MS (s)1547 1948 MS (e)1566 1948 MS (r)1588 1948 MS (v)1605 1948 MS (e)1629 1948 MS (u)1651 1948 MS (r)1676 1948 MS ( )1693 1948 MS (a)1708 1948 MS (u)1730 1948 MS ( )1755 1948 MS (p)1770 1948 MS (r)1795 1948 MS (o)1812 1948 MS (c)1838 1948 MS +(e)1860 1948 MS (s)1882 1948 MS (s)1901 1948 MS ( )1920 1948 MS (c)1935 1948 MS (l)1958 1948 MS (i)1971 1948 MS (e)1984 1948 MS (n)2007 1948 MS (t)2031 1948 MS ( )2046 1948 MS (q)2061 1948 MS (u)2086 1948 MS (i)2112 1948 MS ( )2125 1948 MS +(h)235 2005 MS (\351)259 2005 MS (b)282 2005 MS (e)306 2005 MS (r)328 2005 MS (g)345 2005 MS (e)370 2005 MS ( )392 2005 MS (l)406 2005 MS (a)419 2005 MS ( )441 2005 MS (d)454 2005 MS (o)479 2005 MS (n)505 2005 MS (n)529 2005 MS (\351)553 2005 MS +(e)576 2005 MS (.)598 2005 MS ( )611 2005 MS +[42 0 0 -42 0 0]/Courier MF +( )624 2005 MS +( )235 2053 MS +( )235 2100 MS +( )235 2147 MS +( )235 2194 MS +( )235 2241 MS +( )235 2289 MS +( )235 2336 MS +( )235 2383 MS +( )235 2430 MS +( )235 2477 MS +0 j +3 sl +n +1075 800 535 832 B +cp +gs +1 g +e +gr +CM [1 0 0 1 -60 -58] concat +s +SM +[100 0 0 -100 0 0]/Times-Roman MF +( )1073 942 MS +1 j +n +335 1757 M +860 1757 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +860 1757 M +860 1612 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +877 1615 M +860 1582 L +844 1615 L +cp +e +0 j +n +350 150 1135 932 B +cp +gs +1 g +e +gr +CM [1 0 0 1 -60 -58] concat +s +SM +[50 0 0 -50 0 0]/_Times-Roman MF +(P)1216 995 MS (r)1244 995 MS (o)1260 995 MS (c)1286 995 MS (e)1308 995 MS (s)1330 995 MS (s)1349 995 MS ( )1368 995 MS (n)1381 995 MS +( )1405 995 MS +n +350 150 685 1432 B +cp +gs +1 g +e +gr +CM [1 0 0 1 -60 -58] concat +s +SM +(P)765 1495 MS (r)793 1495 MS (o)809 1495 MS (c)835 1495 MS (e)857 1495 MS (s)879 1495 MS (s)898 1495 MS ( )917 1495 MS (0)930 1495 MS +( )955 1495 MS +n +350 150 885 1107 B +cp +gs +1 g +e +gr +CM [1 0 0 1 -60 -58] concat +s +SM +[100 0 0 -100 0 0]/Times-Roman MF +( )1060 1214 MS +[50 0 0 -50 0 0]/_Times-Roman MF +(P)965 1193 MS (r)993 1193 MS (o)1009 1193 MS (c)1035 1193 MS (e)1057 1193 MS (s)1079 1193 MS (s)1098 1193 MS ( )1117 1193 MS (1)1130 1193 MS +gs +n +1 57 1155 1148 CB +( )1155 1193 MS +gr +1 j +[0 6 ]0 sd +n +1285 1207 M +1435 1107 L +CM [1 0 0 1 -60 -58] concat +s +SM +[12 9 3 9 ]0 sd +n +1035 1482 M +1135 1482 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +1035 1557 M +1360 1557 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +1135 1482 M +1135 1287 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +1152 1290 M +1136 1258 L +1119 1290 L +cp +e +n +1360 1557 M +1360 1112 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +1377 1115 M +1360 1082 L +1344 1115 L +cp +e +(C)590 918 MS (o)623 918 MS (n)649 918 MS (t)673 918 MS (a)688 918 MS (i)710 918 MS (n)723 918 MS (e)747 918 MS (r)769 918 MS ( )786 918 MS (p)799 918 MS (a)824 918 MS (r)846 918 MS (a)863 918 MS (l)886 918 MS (l)899 918 MS +(\350)912 918 MS (l)936 918 MS (e)949 918 MS +gs +n +3 57 971 873 CB +( )971 918 MS +gr +(I)340 1743 MS (n)357 1743 MS (v)382 1743 MS (o)406 1743 MS (c)432 1743 MS (a)454 1743 MS (t)476 1743 MS (i)491 1743 MS (o)503 1743 MS (n)529 1743 MS ( )553 1743 MS (s)566 1743 MS (e)585 1743 MS (r)607 1743 MS (v)625 1743 MS (i)650 1743 MS +(c)663 1743 MS (e)685 1743 MS +gs +n +3 57 707 1698 CB +( )707 1743 MS +gr +0 j +[0 6 ]0 sd +n +1075 550 610 2052 B +cp +gs +1 g +e +gr +CM [1 0 0 1 -60 -58] concat +s +SM +[100 0 0 -100 0 0]/Times-Roman MF +( )1148 2162 MS +1 j +[]0 sd +n +410 2727 M +1410 2727 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +935 2727 M +935 2582 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +952 2585 M +936 2552 L +919 2585 L +cp +e +[50 0 0 -50 0 0]/_Times-Roman MF +(C)665 2113 MS (o)698 2113 MS (n)724 2113 MS (t)748 2113 MS (a)763 2113 MS (i)785 2113 MS (n)798 2113 MS (e)822 2113 MS (r)844 2113 MS ( )861 2113 MS (p)874 2113 MS (a)899 2113 MS (r)921 2113 MS (a)938 2113 MS (l)961 2113 MS (l)974 2113 MS +(\350)987 2113 MS (l)1011 2113 MS (e)1024 2113 MS +gs +n +3 57 1046 2068 CB +( )1046 2113 MS +gr +(E)415 2713 MS (c)446 2713 MS (h)468 2713 MS (a)492 2713 MS (n)515 2713 MS (g)539 2713 MS (e)564 2713 MS ( )586 2713 MS (d)599 2713 MS (e)624 2713 MS (s)646 2713 MS ( )665 2713 MS (d)678 2713 MS (o)703 2713 MS (n)729 2713 MS (n)754 2713 MS +(\351)778 2713 MS (e)800 2713 MS (s)823 2713 MS +gs +n +2 57 842 2668 CB +( )842 2713 MS +gr +[12 9 ]0 sd +n +1210 2502 M +1485 2327 L +CM [1 0 0 1 -60 -58] concat +s +SM +[]0 sd +n +1110 2489 M +1110 2455 1031 2427 935 2427 c +838 2427 760 2455 760 2489 c +760 2524 838 2552 935 2552 c +1031 2552 1110 2524 1110 2489 c +cp +gs +1 g +e +gr +CM [1 0 0 1 -60 -58] concat +s +SM +(P)840 2503 MS (r)868 2503 MS (o)884 2503 MS (c)910 2503 MS (e)932 2503 MS (s)954 2503 MS (s)973 2503 MS ( )992 2503 MS (0)1005 2503 MS +gs +n +6 57 1030 2458 CB +( )1030 2503 MS +gr +n +1285 2364 M +1285 2330 1206 2302 1110 2302 c +1013 2302 935 2330 935 2364 c +935 2399 1013 2427 1110 2427 c +1206 2427 1285 2399 1285 2364 c +cp +gs +1 g +e +gr +CM [1 0 0 1 -60 -58] concat +s +SM +(P)1015 2378 MS (r)1043 2378 MS (o)1059 2378 MS (c)1085 2378 MS (e)1107 2378 MS (s)1129 2378 MS (s)1148 2378 MS ( )1167 2378 MS (1)1180 2378 MS +gs +n +6 57 1205 2333 CB +( )1205 2378 MS +gr +n +1585 2189 M +1585 2155 1506 2127 1410 2127 c +1313 2127 1235 2155 1235 2189 c +1235 2224 1313 2252 1410 2252 c +1506 2252 1585 2224 1585 2189 c +cp +gs +1 g +e +gr +CM [1 0 0 1 -60 -58] concat +s +SM +(P)1316 2203 MS (r)1344 2203 MS (o)1360 2203 MS (c)1386 2203 MS (e)1408 2203 MS (s)1430 2203 MS (s)1449 2203 MS ( )1468 2203 MS (n)1481 2203 MS +gs +n +6 57 1505 2158 CB +( )1505 2203 MS +gr +n +1135 2727 M +1135 2457 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +1152 2460 M +1136 2428 L +1119 2460 L +cp +e +n +1410 2727 M +1410 2282 L +CM [1 0 0 1 -60 -58] concat +s +SM +n +1427 2285 M +1410 2252 L +1394 2285 L +cp +e +showpage +%%Page: 9 9 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(9)1868 400 MS +(/)1893 400 MS +(3)1907 400 MS (0)1932 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1957 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(4)310 592 MS +( )347 592 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(D)400 592 MS (\351)448 592 MS (f)485 592 MS (i)507 592 MS (n)526 592 MS (i)567 592 MS (t)586 592 MS (i)608 592 MS (o)627 592 MS (n)667 592 MS (s)708 592 MS +( )745 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 667 MS +(U)348 724 MS (n)384 724 MS ( )408 724 MS (c)434 724 MS (o)456 724 MS (m)483 724 MS (p)520 724 MS (o)545 724 MS (s)571 724 MS (a)590 724 MS (n)613 724 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(t)637 724 MS ( )652 724 MS (S)678 724 MS (A)706 724 MS (L)741 724 MS (O)771 724 MS (M)808 724 MS (E)852 724 MS ( )883 724 MS (e)909 724 MS (s)931 724 MS (t)950 724 MS ( )965 724 MS (u)991 724 MS (n)1016 724 MS (e)1040 724 MS +( )1062 724 MS (\253)1089 724 MS +( )1113 724 MS +(e)1126 724 MS (n)1148 724 MS (t)1172 724 MS (i)1188 724 MS (t)1200 724 MS (\351)1215 724 MS ( )1237 724 MS (l)1264 724 MS (o)1276 724 MS (g)1302 724 MS (i)1328 724 MS (c)1340 724 MS (i)1363 724 MS (e)1376 724 MS (l)1399 724 MS (l)1413 724 MS +(e)1426 724 MS +( )1448 724 MS +(\273)1462 724 MS ( )1486 724 MS (d)1512 724 MS (e)1537 724 MS ( )1559 724 MS (b)1586 724 MS (a)1610 724 MS (s)1632 724 MS (e)1651 724 MS ( )1673 724 MS (q)1699 724 MS (u)1724 724 MS (i)1750 724 MS ( )1763 724 MS (o)1789 724 MS (f)1816 724 MS +(f)1832 724 MS (r)1847 724 MS (e)1864 724 MS ( )1886 724 MS (u)1912 724 MS (n)1938 724 MS ( )1962 724 MS (c)1988 724 MS (e)2011 724 MS (r)2033 724 MS (t)2050 724 MS (a)2065 724 MS (i)2087 724 MS (n)2100 724 MS ( )2125 724 MS +(n)235 782 MS (o)259 782 MS (m)286 782 MS (b)324 782 MS (r)348 782 MS (e)365 782 MS ( )387 782 MS (d)406 782 MS (e)431 782 MS ( )453 782 MS (s)472 782 MS (e)491 782 MS (r)513 782 MS (v)531 782 MS (i)556 782 MS (c)569 782 MS +(e)591 782 MS (s)614 782 MS (.)633 782 MS ( )646 782 MS (L)665 782 MS (\222)695 782 MS (e)712 782 MS (n)735 782 MS (s)759 782 MS (e)778 782 MS (m)801 782 MS (b)839 782 MS (l)865 782 MS (e)878 782 MS ( )900 782 MS (d)919 782 MS +(e)944 782 MS ( )966 782 MS (c)986 782 MS (e)1008 782 MS (s)1030 782 MS ( )1049 782 MS (s)1069 782 MS (e)1088 782 MS (r)1110 782 MS (v)1127 782 MS (i)1152 782 MS (c)1165 782 MS (e)1188 782 MS (s)1210 782 MS ( )1229 782 MS (e)1249 782 MS +(s)1271 782 MS (t)1290 782 MS ( )1305 782 MS (d)1324 782 MS (\351)1349 782 MS (f)1371 782 MS (i)1387 782 MS (n)1400 782 MS (i)1426 782 MS ( )1439 782 MS (d)1458 782 MS (a)1483 782 MS (n)1506 782 MS (s)1531 782 MS ( )1550 782 MS (l)1570 782 MS +(e)1583 782 MS ( )1605 782 MS (d)1624 782 MS (o)1649 782 MS (m)1676 782 MS (a)1713 782 MS (i)1736 782 MS (n)1749 782 MS (e)1774 782 MS ( )1796 782 MS (p)1815 782 MS (u)1840 782 MS (b)1866 782 MS (l)1891 782 MS (i)1905 782 MS (c)1918 782 MS +(.)1940 782 MS ( )1953 782 MS (I)1972 782 MS (l)1990 782 MS (s)2002 782 MS ( )2021 782 MS (s)2041 782 MS (o)2060 782 MS (n)2086 782 MS (t)2110 782 MS ( )2125 782 MS +(d)235 839 MS (o)260 839 MS (n)286 839 MS (c)310 839 MS ( )332 839 MS (a)351 839 MS (c)373 839 MS (c)395 839 MS (e)417 839 MS (s)439 839 MS (s)459 839 MS (i)479 839 MS (b)492 839 MS (l)517 839 MS (e)530 839 MS (s)553 839 MS +( )572 839 MS (d)591 839 MS (e)616 839 MS (p)638 839 MS (u)663 839 MS (i)689 839 MS (s)702 839 MS ( )721 839 MS (n)741 839 MS (\222)766 839 MS (i)783 839 MS (m)797 839 MS (p)835 839 MS (o)860 839 MS (r)886 839 MS (t)902 839 MS +(e)917 839 MS ( )939 839 MS (q)958 839 MS (u)983 839 MS (e)1008 839 MS (l)1030 839 MS ( )1042 839 MS (a)1061 839 MS (u)1083 839 MS (t)1108 839 MS (r)1123 839 MS (e)1140 839 MS ( )1162 839 MS (l)1182 839 MS (o)1194 839 MS (g)1220 839 MS +(i)1245 839 MS (c)1258 839 MS (i)1281 839 MS (e)1294 839 MS (l)1317 839 MS ( )1330 839 MS (c)1349 839 MS (l)1372 839 MS (i)1386 839 MS (e)1399 839 MS (n)1422 839 MS (t)1446 839 MS (,)1461 839 MS ( )1474 839 MS (q)1493 839 MS (u)1518 839 MS +(\222)1543 839 MS (i)1560 839 MS (l)1573 839 MS ( )1585 839 MS (s)1605 839 MS (o)1624 839 MS (i)1651 839 MS (t)1663 839 MS ( )1678 839 MS (l)1697 839 MS (o)1709 839 MS (c)1735 839 MS (a)1757 839 MS (l)1780 839 MS (i)1794 839 MS (s)1807 839 MS +(\351)1826 839 MS ( )1848 839 MS (s)1867 839 MS (u)1886 839 MS (r)1911 839 MS ( )1928 839 MS (l)1948 839 MS (a)1961 839 MS ( )1983 839 MS (m)2003 839 MS (\352)2041 839 MS (m)2064 839 MS (e)2102 839 MS ( )2125 839 MS +(m)235 897 MS (a)273 897 MS (c)295 897 MS +(h)318 897 MS (i)343 897 MS (n)356 897 MS (e)381 897 MS ( )403 897 MS (o)418 897 MS (u)444 897 MS ( )469 897 MS (d)484 897 MS (i)510 897 MS (s)522 897 MS (t)541 897 MS (a)556 897 MS (n)578 897 MS (t)602 897 MS (.)617 897 MS +( )630 897 MS (I)645 897 MS (l)662 897 MS (s)674 897 MS ( )693 897 MS (p)708 897 MS (e)733 897 MS (r)755 897 MS (m)773 897 MS (e)811 897 MS (t)833 897 MS (t)848 897 MS (e)863 897 MS (n)885 897 MS (t)909 897 MS ( )923 897 MS +(\351)938 897 MS (g)960 897 MS (a)985 897 MS (l)1008 897 MS (e)1020 897 MS (m)1043 897 MS (e)1081 897 MS (n)1104 897 MS (t)1128 897 MS ( )1143 897 MS (a)1158 897 MS (u)1180 897 MS (x)1205 897 MS ( )1229 897 MS (d)1244 897 MS (i)1270 897 MS +(f)1283 897 MS (f)1299 897 MS (\351)1315 897 MS (r)1337 897 MS (e)1354 897 MS (n)1377 897 MS (t)1401 897 MS (s)1416 897 MS ( )1435 897 MS (c)1450 897 MS (o)1472 897 MS (m)1498 897 MS (p)1535 897 MS (o)1560 897 MS (s)1586 897 MS (a)1605 897 MS +(n)1628 897 MS (t)1652 897 MS (s)1667 897 MS ( )1686 897 MS (d)1701 897 MS (\222)1726 897 MS (\351)1742 897 MS (c)1764 897 MS (h)1787 897 MS (a)1811 897 MS (n)1834 897 MS (g)1858 897 MS (e)1883 897 MS (r)1905 897 MS ( )1922 897 MS (e)1937 897 MS +(n)1960 897 MS (t)1984 897 MS (r)1999 897 MS (e)2016 897 MS ( )2038 897 MS (e)2053 897 MS (u)2075 897 MS (x)2100 897 MS ( )2125 897 MS +(d)235 954 MS (e)260 954 MS (s)282 954 MS ( )301 954 MS (d)321 954 MS (o)346 954 MS (n)372 954 MS (n)396 954 MS (\351)421 954 MS (e)443 954 MS (s)465 954 MS (.)484 954 MS ( )497 954 MS (D)517 954 MS (a)553 954 MS (n)576 954 MS +(s)600 954 MS ( )619 954 MS ( )639 954 MS (S)659 954 MS (A)688 954 MS (L)723 954 MS (O)753 954 MS (M)790 954 MS (E)834 954 MS (,)865 954 MS ( )878 954 MS (u)898 954 MS (n)923 954 MS ( )947 954 MS (c)967 954 MS (o)989 954 MS +(m)1015 954 MS (p)1052 954 MS (o)1077 954 MS (s)1103 954 MS (a)1122 954 MS (n)1145 954 MS (t)1169 954 MS ( )1184 954 MS (e)1204 954 MS (s)1226 954 MS (t)1245 954 MS ( )1260 954 MS (c)1280 954 MS (o)1301 954 MS (n)1327 954 MS (c)1351 954 MS +(r)1373 954 MS (\351)1390 954 MS (t)1412 954 MS (i)1427 954 MS (s)1439 954 MS (\351)1458 954 MS ( )1480 954 MS (p)1500 954 MS (a)1525 954 MS (r)1547 954 MS ( )1564 954 MS (u)1584 954 MS (n)1610 954 MS (e)1634 954 MS ( )1656 954 MS (o)1676 954 MS +(u)1702 954 MS ( )1727 954 MS (p)1747 954 MS (l)1772 954 MS (u)1784 954 MS (s)1810 954 MS (i)1830 954 MS (e)1843 954 MS (u)1865 954 MS (r)1890 954 MS (s)1907 954 MS ( )1926 954 MS (l)1947 954 MS (i)1960 954 MS (b)1973 954 MS (r)1998 954 MS +(a)2015 954 MS (i)2038 954 MS (r)2051 954 MS (i)2069 954 MS (e)2082 954 MS (s)2105 954 MS ( )2125 954 MS +(d)235 1012 MS (y)261 1012 MS (n)285 1012 MS (a)309 1012 MS (m)332 1012 MS (i)371 1012 MS (q)384 1012 MS (u)409 1012 MS (e)434 1012 MS (s)457 1012 MS (.)476 1012 MS +( )489 1012 MS +(L)348 1069 MS (e)378 1069 MS ( )400 1069 MS (\253)429 1069 MS +( )453 1069 MS +(m)467 1069 MS (i)506 1069 MS (d)519 1069 MS (d)544 1069 MS (l)570 1069 MS (e)583 1069 MS (w)605 1069 MS (a)641 1069 MS (r)663 1069 MS (e)680 1069 MS +( )702 1069 MS +(\273)715 1069 MS ( )739 1069 MS (e)768 1069 MS (s)791 1069 MS (t)810 1069 MS ( )825 1069 MS (l)854 1069 MS (a)866 1069 MS ( )888 1069 MS (c)917 1069 MS (o)939 1069 MS (u)965 1069 MS (c)990 1069 MS (h)1012 1069 MS (e)1036 1069 MS ( )1058 1069 MS +(l)1088 1069 MS (o)1100 1069 MS (g)1126 1069 MS (i)1152 1069 MS (c)1165 1069 MS (i)1188 1069 MS (e)1201 1069 MS (l)1224 1069 MS (l)1238 1069 MS (e)1251 1069 MS ( )1273 1069 MS (c)1302 1069 MS (h)1325 1069 MS (a)1350 1069 MS (r)1372 1069 MS (g)1389 1069 MS +(\351)1414 1069 MS (e)1436 1069 MS ( )1458 1069 MS (d)1487 1069 MS (e)1512 1069 MS (s)1534 1069 MS ( )1553 1069 MS (c)1582 1069 MS (o)1604 1069 MS (m)1630 1069 MS (m)1668 1069 MS (u)1706 1069 MS (n)1732 1069 MS (i)1757 1069 MS (c)1770 1069 MS (a)1792 1069 MS +(t)1814 1069 MS (i)1830 1069 MS (o)1842 1069 MS (n)1868 1069 MS +(s)1893 1069 MS ( )1912 1069 MS (e)1941 1069 MS (n)1963 1069 MS (t)1987 1069 MS (r)2002 1069 MS (e)2019 1069 MS ( )2041 1069 MS (l)2071 1069 MS (e)2083 1069 MS (s)2105 1069 MS ( )2125 1069 MS +(c)235 1127 MS (o)257 1127 MS (m)283 1127 MS (p)320 1127 MS (o)345 1127 MS (s)371 1127 MS (a)390 1127 MS (n)413 1127 MS (t)437 1127 MS (s)452 1127 MS ( )471 1127 MS (d)491 1127 MS (a)516 1127 MS (n)539 1127 MS (s)563 1127 MS ( )582 1127 MS +(u)602 1127 MS (n)628 1127 MS (e)653 1127 MS ( )675 1127 MS (a)695 1127 MS (r)717 1127 MS (c)734 1127 MS (h)757 1127 MS (i)782 1127 MS (t)794 1127 MS (e)809 1127 MS (c)831 1127 MS (t)853 1127 MS (u)868 1127 MS (r)893 1127 MS (e)910 1127 MS +( )932 1127 MS (r)952 1127 MS (\351)969 1127 MS (p)991 1127 MS (a)1016 1127 MS (r)1038 1127 MS (t)1055 1127 MS (i)1070 1127 MS (e)1082 1127 MS ( )1104 1127 MS (\()1124 1127 MS (e)1141 1127 MS (x)1164 1127 MS +( )1188 1127 MS +(:)1201 1127 MS ( )1215 1127 MS (C)1236 1127 MS (O)1269 1127 MS (R)1305 1127 MS (B)1338 1127 MS (A)1372 1127 MS (\))1407 1127 MS ( )1424 1127 MS ([)1444 1127 MS (2)1461 1127 MS (])1486 1127 MS (,)1503 1127 MS ( )1516 1127 MS ([)1536 1127 MS (3)1553 1127 MS +(])1578 1127 MS (.)1595 1127 MS ( )1608 1127 MS (I)1628 1127 MS (l)1645 1127 MS ( )1658 1127 MS (d)1678 1127 MS (\351)1703 1127 MS (f)1726 1127 MS (i)1742 1127 MS (n)1755 1127 MS (i)1781 1127 MS (t)1793 1127 MS ( )1808 1127 MS (n)1829 1127 MS (o)1853 1127 MS +(t)1879 1127 MS (a)1894 1127 MS (m)1916 1127 MS (m)1954 1127 MS (e)1992 1127 MS (n)2015 1127 MS (t)2039 1127 MS ( )2054 1127 MS (u)2074 1127 MS (n)2100 1127 MS ( )2125 1127 MS +(s)235 1184 MS (e)254 1184 MS (r)276 1184 MS (v)293 1184 MS (i)318 1184 MS (c)331 1184 MS (e)354 1184 MS ( )376 1184 MS (d)396 1184 MS (e)421 1184 MS ( )444 1184 MS (n)465 1184 MS (o)489 1184 MS (m)516 1184 MS (m)554 1184 MS (a)592 1184 MS +(g)614 1184 MS (e)639 1184 MS ( )661 1184 MS (q)681 1184 MS (u)706 1184 MS (i)732 1184 MS ( )745 1184 MS (d)766 1184 MS (o)791 1184 MS (n)817 1184 MS (n)842 1184 MS (e)866 1184 MS ( )888 1184 MS (u)908 1184 MS (n)934 1184 MS ( )959 1184 MS +(a)979 1184 MS (c)1001 1184 MS (c)1023 1184 MS (\350)1046 1184 MS (s)1068 1184 MS ( )1088 1184 MS (\340)1108 1184 MS ( )1130 1184 MS (l)1151 1184 MS (a)1164 1184 MS ( )1187 1184 MS (r)1207 1184 MS (\351)1224 1184 MS (f)1247 1184 MS (\351)1263 1184 MS (r)1285 1184 MS +(e)1302 1184 MS (n)1325 1184 MS (c)1349 1184 MS (e)1371 1184 MS ( )1394 1184 MS (d)1414 1184 MS (e)1439 1184 MS ( )1461 1184 MS (c)1481 1184 MS (h)1504 1184 MS (a)1529 1184 MS (c)1551 1184 MS (u)1573 1184 MS (n)1599 1184 MS ( )1623 1184 MS (d)1643 1184 MS +(e)1668 1184 MS (s)1691 1184 MS ( )1710 1184 MS (o)1730 1184 MS (b)1756 1184 MS (j)1781 1184 MS (e)1794 1184 MS (t)1816 1184 MS (s)1831 1184 MS ( )1850 1184 MS (i)1871 1184 MS (n)1884 1184 MS (s)1909 1184 MS (t)1928 1184 MS (a)1943 1184 MS (n)1966 1184 MS +(c)1990 1184 MS (i)2013 1184 MS (\351)2026 1184 MS (s)2048 1184 MS ( )2068 1184 MS (e)2088 1184 MS (t)2110 1184 MS ( )2125 1184 MS +(i)235 1242 MS (d)248 1242 MS (e)273 1242 MS (n)296 1242 MS (t)320 1242 MS (i)336 1242 MS (f)349 1242 MS (i)365 1242 MS (\351)378 1242 MS (s)401 1242 MS (.)420 1242 MS +( )433 1242 MS +(U)348 1299 MS (n)384 1299 MS ( )408 1299 MS (\253)424 1299 MS +( )448 1299 MS +(c)461 1299 MS (o)483 1299 MS (n)509 1299 MS (t)533 1299 MS (a)548 1299 MS (i)571 1299 MS (n)584 1299 MS (e)608 1299 MS (r)630 1299 MS +( )647 1299 MS +(\273)660 1299 MS ( )684 1299 MS (e)699 1299 MS (s)721 1299 MS (t)740 1299 MS ( )755 1299 MS (u)770 1299 MS (n)795 1299 MS ( )819 1299 MS (g)834 1299 MS (e)859 1299 MS (s)882 1299 MS (t)901 1299 MS (i)916 1299 MS (o)928 1299 MS (n)954 1299 MS +(n)979 1299 MS (a)1004 1299 MS (i)1027 1299 MS (r)1039 1299 MS (e)1056 1299 MS ( )1078 1299 MS (d)1093 1299 MS (e)1118 1299 MS ( )1140 1299 MS (c)1155 1299 MS (o)1177 1299 MS (m)1204 1299 MS (p)1241 1299 MS (o)1266 1299 MS (s)1292 1299 MS (a)1311 1299 MS +(n)1334 1299 MS (t)1359 1299 MS (s)1374 1299 MS ( )1393 1299 MS (s)1408 1299 MS (u)1427 1299 MS (r)1452 1299 MS ( )1469 1299 MS +(u)1484 1299 MS (n)1509 1299 MS (e)1533 1299 MS ( )1555 1299 MS (m)1571 1299 MS (a)1608 1299 MS (c)1630 1299 MS (h)1653 1299 MS (i)1678 1299 MS (n)1691 1299 MS (e)1716 1299 MS ( )1738 1299 MS (d)1753 1299 MS (o)1778 1299 MS (n)1804 1299 MS (n)1829 1299 MS +(\351)1853 1299 MS (e)1876 1299 MS ( )1898 1299 MS (\()1913 1299 MS (s)1930 1299 MS (t)1949 1299 MS (a)1964 1299 MS (t)1986 1299 MS (i)2001 1299 MS (o)2013 1299 MS (n)2039 1299 MS ( )2063 1299 MS (d)2078 1299 MS (e)2103 1299 MS ( )2125 1299 MS +(t)235 1357 MS (r)250 1357 MS (a)267 1357 MS (v)289 1357 MS (a)313 1357 MS (i)336 1357 MS (l)349 1357 MS (,)361 1357 MS ( )374 1357 MS (s)409 1357 MS (e)428 1357 MS (r)450 1357 MS (v)468 1357 MS (e)492 1357 MS (u)514 1357 MS (r)539 1357 MS +( )556 1357 MS (m)591 1357 MS (u)629 1357 MS (l)655 1357 MS (t)667 1357 MS (i)683 1357 MS +(-)695 1357 MS +(p)712 1357 MS (r)737 1357 MS (o)754 1357 MS (c)780 1357 MS (e)802 1357 MS (s)824 1357 MS (s)843 1357 MS (e)862 1357 MS (u)884 1357 MS (r)909 1357 MS (s)926 1357 MS (,)945 1357 MS ( )958 1357 MS (m)993 1357 MS (a)1031 1357 MS (c)1053 1357 MS +(h)1076 1357 MS (i)1101 1357 MS (n)1114 1357 MS (e)1139 1357 MS ( )1161 1357 MS (v)1196 1357 MS (e)1220 1357 MS (c)1243 1357 MS (t)1265 1357 MS (o)1279 1357 MS (r)1305 1357 MS (i)1322 1357 MS (e)1334 1357 MS (l)1357 1357 MS (l)1371 1357 MS (e)1384 1357 MS +(,)1406 1357 MS ( )1419 1357 MS (m)1454 1357 MS (a)1492 1357 MS (c)1514 1357 MS (h)1537 1357 MS (i)1562 1357 MS (n)1575 1357 MS (e)1600 1357 MS ( )1622 1357 MS (m)1657 1357 MS (a)1695 1357 MS (s)1717 1357 MS (s)1737 1357 MS (i)1757 1357 MS (v)1770 1357 MS +(e)1795 1357 MS (m)1818 1357 MS (e)1856 1357 MS (n)1879 1357 MS (t)1903 1357 MS ( )1918 1357 MS (p)1952 1357 MS (a)1977 1357 MS (r)1999 1357 MS (a)2016 1357 MS (l)2039 1357 MS (l)2052 1357 MS (\350)2065 1357 MS (l)2088 1357 MS (e)2102 1357 MS ( )2125 1357 MS +(c)235 1414 MS (o)257 1414 MS (m)283 1414 MS (m)321 1414 MS (e)359 1414 MS ( )381 1414 MS (l)409 1414 MS (e)422 1414 MS ( )444 1414 MS (C)472 1414 MS (o)505 1414 MS (m)532 1414 MS (p)569 1414 MS (a)594 1414 MS (q)616 1414 MS ( )641 1414 MS +(S)668 1414 MS (C)696 1414 MS (2)729 1414 MS (5)754 1414 MS (6)779 1414 MS ( )804 1414 MS (d)831 1414 MS (e)856 1414 MS ( )879 1414 MS (G)906 1414 MS (r)942 1414 MS (e)959 1414 MS (n)982 1414 MS (o)1006 1414 MS (b)1032 1414 MS (l)1057 1414 MS +(e)1070 1414 MS (,)1092 1414 MS ( )1105 1414 MS (c)1132 1414 MS (l)1155 1414 MS (u)1167 1414 MS (s)1193 1414 MS (t)1212 1414 MS (e)1227 1414 MS (r)1249 1414 MS ( )1266 1414 MS (d)1293 1414 MS (e)1318 1414 MS ( )1340 1414 MS (P)1367 1414 MS (C)1395 1414 MS +(/)1428 1414 MS (l)1443 1414 MS (i)1456 1414 MS (n)1469 1414 MS (u)1494 1414 MS (x)1520 1414 MS (,)1544 1414 MS ( )1557 1414 MS (\205)1584 1414 MS (\))1634 1414 MS (.)1651 1414 MS ( )1664 1414 MS (C)1691 1414 MS (\222)1724 1414 MS (e)1740 1414 MS (s)1762 1414 MS +(t)1781 1414 MS ( )1796 1414 MS (l)1824 1414 MS (u)1836 1414 MS (i)1862 1414 MS ( )1875 1414 MS (q)1902 1414 MS (u)1927 1414 MS (i)1953 1414 MS ( )1966 1414 MS (r)1993 1414 MS (\351)2010 1414 MS (a)2032 1414 MS (l)2055 1414 MS (i)2069 1414 MS (s)2082 1414 MS +(e)2102 1414 MS ( )2125 1414 MS +(l)235 1472 MS (\222)248 1472 MS (i)265 1472 MS (n)278 1472 MS (s)303 1472 MS (t)322 1472 MS (a)337 1472 MS (n)360 1472 MS (c)384 1472 MS (i)407 1472 MS (a)420 1472 MS (t)442 1472 MS (i)458 1472 MS (o)470 1472 MS (n)496 1472 MS ( )520 1472 MS +(e)534 1472 MS (t)556 1472 MS ( )571 1472 MS (l)586 1472 MS (a)598 1472 MS ( )620 1472 MS (d)634 1472 MS (e)659 1472 MS (s)682 1472 MS (t)701 1472 MS (r)716 1472 MS (u)733 1472 MS (c)758 1472 MS (t)779 1472 MS (i)794 1472 MS (o)806 1472 MS +(n)832 1472 MS ( )856 1472 MS (d)870 1472 MS (e)896 1472 MS ( )918 1472 MS (c)932 1472 MS (o)954 1472 MS (m)981 1472 MS (p)1018 1472 MS (o)1043 1472 MS (s)1069 1472 MS (a)1088 1472 MS (n)1110 1472 MS (t)1134 1472 MS (s)1149 1472 MS ( )1168 1472 MS +(s)1182 1472 MS (u)1201 1472 MS (r)1226 1472 MS ( )1243 1472 MS (l)1258 1472 MS (a)1271 1472 MS ( )1293 1472 MS (m)1308 1472 MS +(a)1346 1472 MS (c)1368 1472 MS (h)1391 1472 MS (i)1416 1472 MS (n)1429 1472 MS (e)1454 1472 MS ( )1476 1472 MS (q)1490 1472 MS (u)1515 1472 MS (i)1541 1472 MS ( )1554 1472 MS (l)1569 1472 MS (\222)1582 1472 MS (a)1599 1472 MS (b)1622 1472 MS (r)1646 1472 MS +(i)1664 1472 MS (t)1676 1472 MS (e)1691 1472 MS (.)1713 1472 MS ( )1726 1472 MS (D)1740 1472 MS (a)1776 1472 MS (n)1798 1472 MS (s)1823 1472 MS ( )1842 1472 MS (S)1856 1472 MS (A)1885 1472 MS (L)1920 1472 MS (O)1950 1472 MS (M)1987 1472 MS (E)2031 1472 MS +(,)2062 1472 MS ( )2075 1472 MS (l)2090 1472 MS (e)2102 1472 MS ( )2125 1472 MS +(c)235 1529 MS (o)257 1529 MS (n)283 1529 MS (t)307 1529 MS (a)322 1529 MS (i)344 1529 MS (n)357 1529 MS (e)381 1529 MS (r)403 1529 MS ( )420 1529 MS (e)433 1529 MS (s)455 1529 MS (t)474 1529 MS ( )489 1529 MS (c)502 1529 MS (o)524 1529 MS +(n)550 1529 MS (c)574 1529 MS (r)596 1529 MS (\351)613 1529 MS (t)635 1529 MS (i)650 1529 MS (s)662 1529 MS (\351)681 1529 MS ( )703 1529 MS (p)716 1529 MS (a)741 1529 MS (r)763 1529 MS ( )780 1529 MS (u)793 1529 MS (n)818 1529 MS ( )842 1529 MS +(e)855 1529 MS (x)878 1529 MS (\351)902 1529 MS (c)924 1529 MS (u)946 1529 MS (t)971 1529 MS (a)986 1529 MS (b)1008 1529 MS (l)1033 1529 MS (e)1046 1529 MS ( )1068 1529 MS (q)1081 1529 MS (u)1106 1529 MS (i)1132 1529 MS ( )1144 1529 MS (e)1157 1529 MS +(s)1180 1529 MS (t)1199 1529 MS ( )1214 1529 MS (u)1227 1529 MS (n)1251 1529 MS ( )1275 1529 MS (s)1288 1529 MS (e)1307 1529 MS (r)1329 1529 MS (v)1347 1529 MS (e)1371 1529 MS (u)1393 1529 MS (r)1418 1529 MS ( )1435 1529 MS (C)1448 1529 MS (O)1481 1529 MS +(R)1517 1529 MS (B)1550 1529 MS (A)1584 1529 MS (.)1619 1529 MS +( )1632 1529 MS +(L)348 1586 MS (e)378 1586 MS ( )400 1586 MS (p)416 1586 MS (r)441 1586 MS (i)459 1586 MS (n)472 1586 MS (c)496 1586 MS (i)519 1586 MS (p)532 1586 MS (e)557 1586 MS ( )579 1586 MS (d)595 1586 MS (e)620 1586 MS ( )642 1586 MS (f)659 1586 MS +(o)674 1586 MS (n)700 1586 MS (c)724 1586 MS (t)746 1586 MS (i)762 1586 MS (o)774 1586 MS (n)800 1586 MS (n)825 1586 MS (e)849 1586 MS (m)872 1586 MS (e)910 1586 MS (n)933 1586 MS (t)957 1586 MS ( )972 1586 MS (e)988 1586 MS (s)1010 1586 MS +(t)1029 1586 MS ( )1044 1586 MS (l)1060 1586 MS (e)1072 1586 MS ( )1094 1586 MS (s)1110 1586 MS (u)1129 1586 MS (i)1155 1586 MS (v)1168 1586 MS (a)1193 1586 MS (n)1216 1586 MS (t)1240 1586 MS +( )1255 1586 MS +(:)1268 1586 MS ( )1281 1586 MS (o)1296 1586 MS (n)1322 1586 MS ( )1346 1586 MS (s)1362 1586 MS (u)1381 1586 MS (p)1406 1586 MS (p)1431 1586 MS (o)1456 1586 MS (s)1482 1586 MS (e)1501 1586 MS ( )1523 1586 MS (q)1539 1586 MS (u)1564 1586 MS (\222)1589 1586 MS +(u)1605 1586 MS (n)1630 1586 MS ( )1654 1586 MS (c)1670 1586 MS (o)1692 1586 MS (n)1718 1586 MS (t)1742 1586 MS (a)1757 1586 MS (i)1780 1586 MS (n)1793 1586 MS (e)1817 1586 MS (r)1839 1586 MS ( )1856 1586 MS (e)1872 1586 MS (s)1894 1586 MS (t)1913 1586 MS +( )1928 1586 MS (l)1944 1586 MS (a)1956 1586 MS (n)1979 1586 MS (c)2004 1586 MS (\351)2026 1586 MS ( )2048 1586 MS (s)2064 1586 MS (u)2083 1586 MS (r)2108 1586 MS ( )2125 1586 MS +(u)235 1644 MS (n)260 1644 MS (e)284 1644 MS ( )306 1644 MS (m)330 1644 MS (a)368 1644 MS (c)391 1644 MS (h)414 1644 MS (i)439 1644 MS (n)452 1644 MS (e)477 1644 MS ( )499 1644 MS (d)522 1644 MS (o)547 1644 MS (n)573 1644 MS (n)598 1644 MS +(\351)622 1644 MS (e)645 1644 MS (.)667 1644 MS ( )680 1644 MS (C)703 1644 MS (\222)736 1644 MS (e)753 1644 MS (s)775 1644 MS (t)794 1644 MS ( )809 1644 MS (u)832 1644 MS (n)857 1644 MS ( )881 1644 MS (s)905 1644 MS (e)924 1644 MS (r)946 1644 MS +(v)964 1644 MS (e)988 1644 MS (u)1010 1644 MS (r)1035 1644 MS ( )1052 1644 MS (C)1075 1644 MS (O)1108 1644 MS (R)1145 1644 MS (B)1178 1644 MS (A)1212 1644 MS ( )1248 1644 MS (d)1271 1644 MS (o)1296 1644 MS (n)1322 1644 MS (t)1346 1644 MS ( )1361 1644 MS +(l)1384 1644 MS (a)1397 1644 MS ( )1419 1644 MS (r)1442 1644 MS (\351)1459 1644 MS (f)1482 1644 MS (\351)1498 1644 MS (r)1520 1644 MS (e)1537 1644 MS (n)1559 1644 MS (c)1584 1644 MS (e)1606 1644 MS ( )1628 1644 MS (e)1651 1644 MS +(s)1674 1644 MS (t)1693 1644 MS ( )1708 1644 MS (e)1731 1644 MS (n)1753 1644 MS (r)1777 1644 MS (e)1794 1644 MS (g)1816 1644 MS (i)1842 1644 MS (s)1855 1644 MS (t)1874 1644 MS (r)1889 1644 MS (\351)1906 1644 MS (e)1928 1644 MS ( )1950 1644 MS (d)1973 1644 MS +(a)1998 1644 MS (n)2021 1644 MS (s)2045 1644 MS ( )2064 1644 MS (l)2088 1644 MS (e)2102 1644 MS ( )2125 1644 MS +(s)235 1701 MS (e)254 1701 MS (r)276 1701 MS (v)293 1701 MS (i)318 1701 MS (c)331 1701 MS (e)354 1701 MS ( )376 1701 MS (d)389 1701 MS (e)414 1701 MS ( )436 1701 MS (n)450 1701 MS (o)474 1701 MS (m)501 1701 MS (m)539 1701 MS (a)577 1701 MS +(g)599 1701 MS (e)624 1701 MS (.)646 1701 MS ( )659 1701 MS (L)672 1701 MS (o)702 1701 MS (r)728 1701 MS (s)745 1701 MS (q)764 1701 MS (u)789 1701 MS (\222)814 1701 MS (u)830 1701 MS (n)856 1701 MS ( )880 1701 MS (c)893 1701 MS (l)916 1701 MS +(i)930 1701 MS (e)943 1701 MS (n)966 1701 MS (t)990 1701 MS ( )1005 1701 MS (v)1018 1701 MS (e)1042 1701 MS (u)1064 1701 MS (t)1089 1701 MS ( )1104 1701 MS (u)1117 1701 MS (t)1142 1701 MS (i)1157 1701 MS (l)1170 1701 MS (i)1184 1701 MS (s)1197 1701 MS +(e)1216 1701 MS (r)1238 1701 MS ( )1256 1701 MS (u)1269 1701 MS (n)1294 1701 MS ( )1318 1701 MS (s)1332 1701 MS (e)1351 1701 MS (r)1373 1701 MS (v)1390 1701 MS (i)1415 1701 MS (c)1428 1701 MS (e)1451 1701 MS ( )1473 1701 MS (d)1486 1701 MS (\222)1511 1701 MS +(u)1527 1701 MS (n)1553 1701 MS ( )1577 1701 MS (c)1591 1701 MS (o)1613 1701 MS (m)1639 1701 MS (p)1676 1701 MS (o)1701 1701 MS (s)1727 1701 MS (a)1746 1701 MS (n)1769 1701 MS (t)1793 1701 MS ( )1808 1701 MS (d)1821 1701 MS (o)1846 1701 MS (n)1872 1701 MS +(n)1896 1701 MS (\351)1920 1701 MS ( )1942 1701 MS (s)1956 1701 MS (u)1975 1701 MS (r)2000 1701 MS ( )2017 1701 MS (c)2030 1701 MS (e)2052 1701 MS (t)2074 1701 MS (t)2089 1701 MS (e)2104 1701 MS ( )2125 1701 MS +(m)235 1759 MS (a)273 1759 MS (c)295 1759 MS (h)318 1759 MS (i)343 1759 MS (n)356 1759 MS (e)381 1759 MS (,)403 1759 MS ( )416 1759 MS (i)448 1759 MS (l)462 1759 MS ( )475 1759 MS (d)507 1759 MS (e)532 1759 MS (m)555 1759 MS (a)593 1759 MS +(n)616 1759 MS (d)640 1759 MS (e)665 1759 MS ( )687 1759 MS (a)719 1759 MS (u)741 1759 MS ( )766 1759 MS (c)797 1759 MS (o)819 1759 MS (n)845 1759 MS (t)869 1759 MS (a)884 1759 MS (i)907 1759 MS (n)920 1759 MS (e)944 1759 MS (r)966 1759 MS +( )984 1759 MS (d)1015 1759 MS (\222)1040 1759 MS (i)1057 1759 MS (n)1070 1759 MS (s)1095 1759 MS (t)1114 1759 MS (a)1129 1759 MS (n)1152 1759 MS (c)1176 1759 MS (i)1199 1759 MS (e)1212 1759 MS (r)1234 1759 MS ( )1252 1759 MS (l)1284 1759 MS (e)1297 1759 MS +( )1319 1759 MS (c)1350 1759 MS (o)1372 1759 MS (m)1399 1759 MS (p)1436 1759 MS (o)1461 1759 MS (s)1487 1759 MS (a)1506 1759 MS (n)1529 1759 MS (t)1553 1759 MS (.)1568 1759 MS ( )1581 1759 MS (L)1612 1759 MS (e)1642 1759 MS ( )1664 1759 MS (c)1695 1759 MS +(o)1717 1759 MS (n)1743 1759 MS (t)1767 1759 MS (a)1782 1759 MS (i)1805 1759 MS (n)1818 1759 MS (e)1842 1759 MS (r)1864 1759 MS ( )1881 1759 MS (c)1912 1759 MS (h)1935 1759 MS (a)1960 1759 MS (r)1982 1759 MS (g)1999 1759 MS (e)2024 1759 MS ( )2046 1759 MS +(e)2077 1759 MS (n)2100 1759 MS ( )2125 1759 MS +(d)235 1816 MS (y)261 1816 MS (n)285 1816 MS (a)309 1816 MS (m)332 1816 MS (i)371 1816 MS (q)384 1816 MS (u)409 1816 MS (e)434 1816 MS ( )456 1816 MS (l)483 1816 MS (a)496 1816 MS ( )518 1816 MS (o)544 1816 MS (u)570 1816 MS ( )595 1816 MS +(l)622 1816 MS (e)634 1816 MS (s)657 1816 MS ( )676 1816 MS (l)703 1816 MS (i)716 1816 MS (b)729 1816 MS (r)754 1816 MS (a)771 1816 MS (i)794 1816 MS (r)807 1816 MS (i)825 1816 MS (e)838 1816 MS (s)860 1816 MS ( )879 1816 MS (c)905 1816 MS +(o)927 1816 MS (r)953 1816 MS (r)970 1816 MS (e)987 1816 MS (s)1009 1816 MS (p)1028 1816 MS (o)1053 1816 MS (n)1079 1816 MS (d)1103 1816 MS (a)1128 1816 MS (n)1151 1816 MS (t)1175 1816 MS ( )1190 1816 MS (a)1216 1816 MS (u)1238 1816 MS ( )1263 1816 MS +(c)1289 1816 MS (o)1311 1816 MS (m)1337 1816 MS (p)1374 1816 MS (o)1399 1816 MS (s)1425 1816 MS (a)1444 1816 MS (n)1467 1816 MS (t)1491 1816 MS +(.)1506 1816 MS ( )1519 1816 MS (I)1545 1816 MS (l)1562 1816 MS ( )1574 1816 MS (l)1601 1816 MS (u)1613 1816 MS (i)1639 1816 MS ( )1652 1816 MS (a)1678 1816 MS (f)1701 1816 MS (f)1718 1816 MS (e)1734 1816 MS (c)1756 1816 MS (t)1778 1816 MS (e)1793 1816 MS +( )1815 1816 MS (u)1841 1816 MS (n)1866 1816 MS (e)1890 1816 MS ( )1912 1816 MS (r)1938 1816 MS (\351)1955 1816 MS (f)1978 1816 MS (\351)1994 1816 MS (r)2016 1816 MS (e)2033 1816 MS (n)2056 1816 MS (c)2080 1816 MS (e)2102 1816 MS ( )2125 1816 MS +(C)235 1874 MS (O)268 1874 MS (R)304 1874 MS (B)337 1874 MS (A)371 1874 MS ( )407 1874 MS (e)430 1874 MS (t)452 1874 MS ( )467 1874 MS (l)491 1874 MS (\222)503 1874 MS (e)520 1874 MS (n)543 1874 MS (r)567 1874 MS (e)584 1874 MS (g)606 1874 MS +(i)632 1874 MS (s)645 1874 MS (t)664 1874 MS (r)679 1874 MS (e)696 1874 MS ( )718 1874 MS (a)741 1874 MS (u)763 1874 MS ( )788 1874 MS (s)811 1874 MS (e)830 1874 MS (r)852 1874 MS (v)870 1874 MS (i)895 1874 MS (c)908 1874 MS (e)930 1874 MS +( )952 1874 MS (d)975 1874 MS (e)1000 1874 MS ( )1023 1874 MS (n)1047 1874 MS (o)1071 1874 MS (m)1098 1874 MS (m)1136 1874 MS (a)1174 1874 MS (g)1196 1874 MS (e)1221 1874 MS (.)1243 1874 MS ( )1256 1874 MS (L)1279 1874 MS (e)1309 1874 MS ( )1331 1874 MS +(c)1355 1874 MS (l)1378 1874 MS (i)1391 1874 MS (e)1404 1874 MS (n)1427 1874 MS (t)1451 1874 MS ( )1466 1874 MS (r)1489 1874 MS (\351)1506 1874 MS (c)1528 1874 MS (u)1550 1874 MS (p)1575 1874 MS (\350)1600 1874 MS (r)1622 1874 MS (e)1639 1874 MS ( )1661 1874 MS +(a)1684 1874 MS (u)1706 1874 MS (p)1731 1874 MS (r)1756 1874 MS (\350)1773 1874 MS (s)1796 1874 MS ( )1815 1874 MS (d)1838 1874 MS (u)1863 1874 MS ( )1888 1874 MS (s)1912 1874 MS (e)1931 1874 MS (r)1953 1874 MS (v)1970 1874 MS (i)1995 1874 MS (c)2008 1874 MS +(e)2031 1874 MS ( )2053 1874 MS (d)2076 1874 MS (e)2102 1874 MS ( )2125 1874 MS +(n)235 1931 MS (o)259 1931 MS (m)286 1931 MS (m)324 1931 MS (a)362 1931 MS (g)384 1931 MS (e)409 1931 MS ( )431 1931 MS (l)445 1931 MS (a)458 1931 MS ( )480 1931 MS (r)493 1931 MS (\351)510 1931 MS (f)533 1931 MS (\351)548 1931 MS (r)570 1931 MS +(e)587 1931 MS (n)610 1931 MS (c)634 1931 MS (e)656 1931 MS ( )678 1931 MS (d)691 1931 MS (u)716 1931 MS ( )741 1931 MS (c)754 1931 MS (o)776 1931 MS (m)802 1931 MS (p)839 1931 MS (o)864 1931 MS (s)890 1931 MS (a)909 1931 MS (n)932 1931 MS +(t)956 1931 MS ( )971 1931 MS (e)984 1931 MS (t)1005 1931 MS ( )1020 1931 MS (p)1033 1931 MS (e)1058 1931 MS (u)1080 1931 MS (t)1104 1931 MS ( )1118 1931 MS (a)1131 1931 MS (c)1153 1931 MS (t)1175 1931 MS (i)1190 1931 MS (v)1202 1931 MS (e)1227 1931 MS +(r)1250 1931 MS ( )1267 1931 MS (l)1280 1931 MS (e)1292 1931 MS ( )1314 1931 MS (s)1327 1931 MS (e)1346 1931 MS (r)1368 1931 MS (v)1386 1931 MS (i)1411 1931 MS (c)1424 1931 MS (e)1446 1931 MS ( )1468 1931 MS (v)1482 1931 MS (o)1506 1931 MS (u)1532 1931 MS +(l)1558 1931 MS (u)1570 1931 MS (.)1595 1931 MS +( )1608 1931 MS +( )348 1989 MS +( )348 2046 MS +%%IncludeFont: Helvetica-BoldOblique +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +( )310 2154 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +( )310 2276 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )348 2351 MS +( )348 2408 MS +showpage +%%Page: 10 10 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (0)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(5)310 592 MS +( )347 592 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(L)400 592 MS (\222)437 592 MS (o)456 592 MS (b)497 592 MS (j)538 592 MS (e)556 592 MS (t)593 592 MS ( )615 592 MS (p)634 592 MS (a)673 592 MS (r)710 592 MS (a)736 592 MS (l)773 592 MS (l)791 592 MS (\350)810 592 MS (l)847 592 MS +(e)866 592 MS ( )902 592 MS (g)921 592 MS (\351)962 592 MS (n)999 592 MS (\351)1040 592 MS (r)1077 592 MS (i)1102 592 MS (q)1121 592 MS (u)1162 592 MS (e)1203 592 MS +( )1240 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 667 MS +(P)348 724 MS (o)376 724 MS (u)402 724 MS (r)426 724 MS ( )443 724 MS (i)474 724 MS (n)487 724 MS (t)511 724 MS (r)526 724 MS (o)542 724 MS (d)568 724 MS (u)593 724 MS (i)618 724 MS (r)630 724 MS (e)647 724 MS ( )669 724 MS +(d)699 724 MS (a)725 724 MS (n)748 724 MS (s)772 724 MS ( )792 724 MS (S)822 724 MS (A)850 724 MS (L)886 724 MS (O)916 724 MS (M)953 724 MS (E)997 724 MS ( )1028 724 MS (l)1059 724 MS (e)1072 724 MS ( )1094 724 MS (p)1124 724 MS +(a)1149 724 MS (r)1171 724 MS (a)1188 724 MS (l)1211 724 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(l)1225 724 MS (\351)1238 724 MS (l)1261 724 MS (i)1275 724 MS (s)1288 724 MS (m)1308 724 MS (e)1346 724 MS (,)1369 724 MS ( )1382 724 MS (i)1413 724 MS (l)1426 724 MS ( )1439 724 MS (s)1470 724 MS (\222)1489 724 MS (a)1505 724 MS (g)1527 724 MS +(i)1553 724 MS (t)1565 724 MS ( )1581 724 MS (d)1611 724 MS (e)1636 724 MS ( )1658 724 MS (d)1688 724 MS (\351)1713 724 MS (f)1736 724 MS (i)1753 724 MS (n)1766 724 MS (i)1792 724 MS (r)1805 724 MS ( )1822 724 MS (l)1853 724 MS (a)1866 724 MS +( )1889 724 MS (n)1920 724 MS (o)1944 724 MS (t)1969 724 MS (i)1984 724 MS (o)1996 724 MS (n)2022 724 MS ( )2047 724 MS (d)2077 724 MS (e)2102 724 MS ( )2125 724 MS +(c)235 782 MS (o)257 782 MS (m)283 782 MS (p)320 782 MS (o)345 782 MS (s)371 782 MS (a)390 782 MS (n)413 782 MS (t)437 782 MS ( )452 782 MS (p)475 782 MS (a)500 782 MS (r)522 782 MS (a)539 782 MS (l)561 782 MS (l)574 782 MS +(\350)587 782 MS (l)610 782 MS (e)623 782 MS (.)645 782 MS ( )658 782 MS (L)681 782 MS (e)711 782 MS ( )733 782 MS (c)756 782 MS (y)779 782 MS (c)803 782 MS (l)826 782 MS (e)839 782 MS ( )861 782 MS (d)884 782 MS (e)909 782 MS +( )931 782 MS (v)955 782 MS (i)980 782 MS (e)993 782 MS ( )1015 782 MS (\()1038 782 MS (i)1056 782 MS (n)1069 782 MS (s)1094 782 MS (t)1113 782 MS (a)1128 782 MS (n)1150 782 MS (c)1174 782 MS (i)1197 782 MS (a)1210 782 MS (t)1232 782 MS +(i)1247 782 MS (o)1259 782 MS (n)1286 782 MS (,)1310 782 MS ( )1323 782 MS (a)1346 782 MS (r)1368 782 MS (r)1385 782 MS (\352)1402 782 MS (t)1424 782 MS (,)1438 782 MS ( )1451 782 MS (r)1474 782 MS (e)1491 782 MS (p)1513 782 MS (r)1537 782 MS +(i)1554 782 MS (s)1567 782 MS (e)1586 782 MS (,)1608 782 MS ( )1621 782 MS (d)1644 782 MS (e)1669 782 MS (s)1691 782 MS (t)1710 782 MS (r)1725 782 MS (u)1742 782 MS (c)1767 782 MS (t)1788 782 MS (i)1803 782 MS (o)1815 782 MS (n)1841 782 MS +(,)1865 782 MS ( )1878 782 MS (\205)1901 782 MS (\))1951 782 MS ( )1968 782 MS (d)1991 782 MS (e)2016 782 MS ( )2038 782 MS (c)2061 782 MS (e)2083 782 MS (s)2105 782 MS ( )2125 782 MS +(c)235 839 MS (o)257 839 MS (m)283 839 MS (p)320 839 MS (o)345 839 MS (s)371 839 MS (a)390 839 MS (n)413 839 MS (t)437 839 MS (s)452 839 MS ( )471 839 MS (p)502 839 MS (a)527 839 MS (r)549 839 MS (a)566 839 MS (l)589 839 MS +(l)602 839 MS (\350)615 839 MS (l)638 839 MS (e)651 839 MS (s)674 839 MS ( )693 839 MS (s)724 839 MS (e)744 839 MS (r)766 839 MS (a)783 839 MS ( )805 839 MS (g)836 839 MS (\351)861 839 MS (r)883 839 MS (\351)900 839 MS ( )922 839 MS +(p)953 839 MS (a)978 839 MS (r)1000 839 MS ( )1017 839 MS (u)1048 839 MS (n)1074 839 MS ( )1098 839 MS (c)1129 839 MS (o)1151 839 MS (n)1177 839 MS (t)1201 839 MS (a)1216 839 MS (i)1239 839 MS (n)1252 839 MS (e)1276 839 MS (r)1298 839 MS +( )1315 839 MS (p)1346 839 MS (a)1371 839 MS (r)1393 839 MS (a)1410 839 MS (l)1433 839 MS (l)1447 839 MS (\350)1460 839 MS (l)1483 839 MS (e)1496 839 MS (.)1518 839 MS ( )1531 839 MS (L)1562 839 MS (e)1592 839 MS (s)1615 839 MS ( )1634 839 MS +(c)1665 839 MS (o)1687 839 MS (m)1714 839 MS (p)1751 839 MS (o)1776 839 MS (s)1802 839 MS (a)1821 839 MS (n)1844 839 MS (t)1868 839 MS (s)1883 839 MS ( )1902 839 MS (p)1933 839 MS (a)1958 839 MS (r)1980 839 MS (a)1997 839 MS (l)2020 839 MS +(l)2033 839 MS (\350)2046 839 MS (l)2069 839 MS (e)2082 839 MS (s)2105 839 MS ( )2125 839 MS +(f)235 897 MS (o)250 897 MS (u)276 897 MS (r)301 897 MS (n)318 897 MS (i)343 897 MS (s)356 897 MS (s)376 897 MS (e)395 897 MS (n)418 897 MS (t)442 897 MS ( )457 897 MS (\340)471 897 MS ( )493 897 MS (l)508 897 MS (e)520 897 MS +(u)542 897 MS (r)567 897 MS (s)584 897 MS ( )603 897 MS (c)617 897 MS (l)640 897 MS (i)654 897 MS (e)667 897 MS (n)690 897 MS (t)714 897 MS (s)729 897 MS ( )748 897 MS (d)762 897 MS (e)787 897 MS (s)809 897 MS ( )828 897 MS +(d)842 897 MS (o)867 897 MS (n)893 897 MS +(n)918 897 MS (\351)942 897 MS (e)964 897 MS (s)986 897 MS (,)1005 897 MS ( )1018 897 MS (q)1032 897 MS (u)1057 897 MS (i)1083 897 MS ( )1095 897 MS (s)1110 897 MS (o)1129 897 MS (n)1155 897 MS (t)1179 897 MS ( )1194 897 MS (d)1208 897 MS +(e)1233 897 MS (s)1255 897 MS ( )1274 897 MS (o)1288 897 MS (b)1314 897 MS (j)1339 897 MS (e)1351 897 MS (t)1373 897 MS (s)1388 897 MS ( )1407 897 MS (p)1421 897 MS (a)1446 897 MS (r)1468 897 MS (a)1485 897 MS (l)1508 897 MS (l)1521 897 MS +(\350)1534 897 MS (l)1557 897 MS (e)1570 897 MS (s)1593 897 MS (.)1612 897 MS ( )1625 897 MS (O)1639 897 MS (n)1675 897 MS ( )1699 897 MS (v)1714 897 MS (i)1739 897 MS (e)1752 897 MS (n)1775 897 MS (t)1799 897 MS ( )1814 897 MS (d)1828 897 MS +(e)1853 897 MS ( )1875 897 MS (d)1889 897 MS (\351)1914 897 MS (f)1937 897 MS (i)1953 897 MS (n)1966 897 MS (i)1992 897 MS (r)2004 897 MS ( )2021 897 MS (t)2035 897 MS (r)2050 897 MS (o)2067 897 MS (i)2093 897 MS (s)2105 897 MS ( )2125 897 MS +(\253)235 954 MS +( )259 954 MS +(e)272 954 MS (n)295 954 MS (t)319 954 MS (i)334 954 MS (t)346 954 MS (\351)361 954 MS (s)383 954 MS ( )402 954 MS (p)427 954 MS (a)452 954 MS (r)474 954 MS (a)491 954 MS (l)514 954 MS (l)528 954 MS (\350)541 954 MS (l)564 954 MS +(e)577 954 MS (s)599 954 MS +( )618 954 MS +(\273)632 954 MS ( )656 954 MS (d)681 954 MS (i)707 954 MS (s)720 954 MS (t)739 954 MS (i)755 954 MS (n)768 954 MS (c)792 954 MS (t)814 954 MS (e)829 954 MS (s)851 954 MS +( )870 954 MS +(:)883 954 MS ( )897 954 MS (l)922 954 MS (e)935 954 MS (s)957 954 MS ( )976 954 MS (c)1001 954 MS (o)1023 954 MS (n)1049 954 MS (t)1073 954 MS (a)1088 954 MS (i)1111 954 MS (n)1124 954 MS (e)1148 954 MS (r)1170 954 MS (s)1187 954 MS +(,)1206 954 MS ( )1219 954 MS (l)1245 954 MS (e)1258 954 MS (s)1280 954 MS ( )1299 954 MS (c)1324 954 MS (o)1346 954 MS (m)1372 954 MS (p)1409 954 MS (o)1434 954 MS (s)1460 954 MS (a)1479 954 MS (n)1502 954 MS (t)1526 954 MS (s)1541 954 MS +( )1560 954 MS (e)1585 954 MS (t)1607 954 MS ( )1622 954 MS (l)1647 954 MS (e)1659 954 MS (s)1682 954 MS ( )1701 954 MS (d)1726 954 MS (o)1751 954 MS (n)1777 954 MS (n)1801 954 MS (\351)1826 954 MS (e)1848 954 MS (s)1870 954 MS (.)1889 954 MS +( )1902 954 MS (P)1927 954 MS (o)1955 954 MS (u)1981 954 MS (r)2006 954 MS ( )2023 954 MS (l)2048 954 MS (e)2060 954 MS (u)2082 954 MS (r)2107 954 MS ( )2125 954 MS +(r)235 1012 MS (\351)252 1012 MS (a)274 1012 MS (l)297 1012 MS (i)310 1012 MS (s)323 1012 MS (a)342 1012 MS (t)364 1012 MS (i)380 1012 MS (o)392 1012 MS (n)418 1012 MS (,)442 1012 MS ( )455 1012 MS (i)469 1012 MS (l)482 1012 MS ( )494 1012 MS +(n)508 1012 MS (o)532 1012 MS (u)558 1012 MS (s)583 1012 MS ( )602 1012 MS (f)616 1012 MS (a)631 1012 MS (u)653 1012 MS (t)678 1012 MS ( )693 1012 MS (d)706 1012 MS (\351)731 1012 MS (f)753 1012 MS (i)769 1012 MS (n)782 1012 MS (i)808 1012 MS +(r)821 1012 MS ( )838 1012 MS (u)851 1012 MS (n)876 1012 MS ( )900 1012 MS (o)913 1012 MS (b)939 1012 MS (j)964 1012 MS (e)977 1012 MS (t)999 1012 MS ( )1014 1012 MS (p)1027 1012 MS (a)1052 1012 MS (r)1074 1012 MS (a)1091 1012 MS (l)1113 1012 MS +(l)1126 1012 MS (\350)1139 1012 MS (l)1162 1012 MS (e)1175 1012 MS ( )1197 1012 MS (g)1210 1012 MS (\351)1235 1012 MS (n)1258 1012 MS (\351)1282 1012 MS (r)1304 1012 MS (i)1322 1012 MS (q)1335 1012 MS (u)1360 1012 MS (e)1385 1012 MS (.)1407 1012 MS +( )1420 1012 MS +(L)348 1069 MS (\222)378 1069 MS (i)395 1069 MS (n)408 1069 MS (t)432 1069 MS (\351)447 1069 MS (r)469 1069 MS (\352)486 1069 MS (t)508 1069 MS ( )523 1069 MS (d)541 1069 MS (e)566 1069 MS ( )588 1069 MS (l)607 1069 MS (a)619 1069 MS ( )641 1069 MS +(d)659 1069 MS (\351)684 1069 MS (f)707 1069 MS (i)724 1069 MS (n)737 1069 MS (i)763 1069 MS (t)775 1069 MS (i)791 1069 MS (o)803 1069 MS (n)829 1069 MS ( )853 1069 MS (d)871 1069 MS (\222)897 1069 MS (u)913 1069 MS (n)939 1069 MS ( )963 1069 MS +(o)981 1069 MS (b)1007 1069 MS (j)1032 1069 MS +(e)1045 1069 MS (t)1067 1069 MS ( )1082 1069 MS (p)1100 1069 MS (a)1125 1069 MS (r)1147 1069 MS (a)1164 1069 MS (l)1187 1069 MS (l)1200 1069 MS (\350)1213 1069 MS (l)1236 1069 MS (e)1249 1069 MS ( )1271 1069 MS (g)1289 1069 MS (\351)1314 1069 MS (n)1337 1069 MS +(\351)1362 1069 MS (r)1384 1069 MS (i)1402 1069 MS (q)1414 1069 MS (u)1439 1069 MS (e)1464 1069 MS ( )1486 1069 MS (e)1504 1069 MS (s)1527 1069 MS (t)1546 1069 MS ( )1561 1069 MS (d)1579 1069 MS (e)1604 1069 MS ( )1626 1069 MS (s)1644 1069 MS (p)1663 1069 MS +(\351)1688 1069 MS (c)1710 1069 MS (i)1733 1069 MS (f)1746 1069 MS (i)1763 1069 MS (e)1776 1069 MS (r)1798 1069 MS ( )1815 1069 MS (l)1834 1069 MS (e)1847 1069 MS (s)1869 1069 MS ( )1888 1069 MS (a)1906 1069 MS (t)1928 1069 MS (t)1943 1069 MS (r)1958 1069 MS +(i)1975 1069 MS (b)1988 1069 MS (u)2012 1069 MS (t)2037 1069 MS (s)2052 1069 MS ( )2071 1069 MS (e)2089 1069 MS (t)2111 1069 MS ( )2125 1069 MS +(s)235 1127 MS (e)254 1127 MS (r)276 1127 MS (v)293 1127 MS (i)318 1127 MS (c)331 1127 MS (e)354 1127 MS (s)376 1127 MS ( )395 1127 MS (c)423 1127 MS (o)445 1127 MS (m)472 1127 MS (m)510 1127 MS (u)547 1127 MS (n)573 1127 MS (s)598 1127 MS +( )617 1127 MS (a)644 1127 MS (u)666 1127 MS (x)692 1127 MS ( )717 1127 MS (t)744 1127 MS (r)759 1127 MS (o)775 1127 MS (i)801 1127 MS (s)814 1127 MS ( )833 1127 MS (e)860 1127 MS (n)883 1127 MS (t)907 1127 MS (i)923 1127 MS (t)935 1127 MS +(\351)950 1127 MS (s)972 1127 MS ( )991 1127 MS (p)1018 1127 MS (a)1043 1127 MS (r)1065 1127 MS (a)1082 1127 MS (l)1105 1127 MS (l)1119 1127 MS (\350)1132 1127 MS (l)1155 1127 MS (e)1168 1127 MS (s)1191 1127 MS ( )1210 1127 MS (p)1238 1127 MS (r)1263 1127 MS +(\351)1280 1127 MS (c)1302 1127 MS (\351)1324 1127 MS (d)1346 1127 MS (e)1371 1127 MS (m)1394 1127 MS (m)1432 1127 MS (e)1470 1127 MS (n)1493 1127 MS (t)1517 1127 MS ( )1532 1127 MS (d)1559 1127 MS (\351)1584 1127 MS (f)1607 1127 MS (i)1623 1127 MS (n)1636 1127 MS +(i)1662 1127 MS (e)1675 1127 MS (s)1698 1127 MS (.)1717 1127 MS ( )1730 1127 MS (E)1757 1127 MS (n)1788 1127 MS ( )1813 1127 MS (f)1841 1127 MS (a)1857 1127 MS (i)1880 1127 MS (t)1892 1127 MS (,)1907 1127 MS ( )1920 1127 MS (u)1947 1127 MS (n)1972 1127 MS +( )1997 1127 MS (o)2024 1127 MS (b)2050 1127 MS (j)2075 1127 MS (e)2088 1127 MS (t)2110 1127 MS ( )2125 1127 MS +(p)235 1184 MS (a)260 1184 MS (r)282 1184 MS (a)299 1184 MS (l)322 1184 MS (l)335 1184 MS (\350)348 1184 MS (l)371 1184 MS (e)384 1184 MS ( )406 1184 MS (e)422 1184 MS (s)444 1184 MS (t)463 1184 MS ( )478 1184 MS (u)494 1184 MS (n)519 1184 MS +(e)543 1184 MS ( )565 1184 MS (c)581 1184 MS (o)603 1184 MS (l)629 1184 MS (l)642 1184 MS (e)655 1184 MS (c)678 1184 MS (t)700 1184 MS (i)715 1184 MS (o)727 1184 MS (n)753 1184 MS ( )777 1184 MS (d)793 1184 MS (\222)819 1184 MS (o)835 1184 MS +(b)861 1184 MS (j)886 1184 MS (e)899 1184 MS (t)921 1184 MS (s)936 1184 MS (.)955 1184 MS ( )968 1184 MS (E)984 1184 MS (n)1015 1184 MS ( )1039 1184 MS (e)1055 1184 MS (f)1077 1184 MS (f)1093 1184 MS (e)1109 1184 MS (t)1131 1184 MS ( )1146 1184 MS +(l)1162 1184 MS (e)1174 1184 MS ( )1196 1184 MS (c)1212 1184 MS (o)1235 1184 MS (n)1261 1184 MS (t)1285 1184 MS (a)1300 1184 MS (i)1322 1184 MS (n)1335 1184 MS (e)1359 1184 MS (r)1381 1184 MS ( )1398 1184 MS (p)1414 1184 MS (a)1439 1184 MS (r)1461 1184 MS +(a)1478 1184 MS (l)1501 1184 MS (l)1514 1184 MS (\350)1527 1184 MS (l)1550 1184 MS (e)1563 1184 MS ( )1585 1184 MS (M)1601 1184 MS (P)1645 1184 MS (I)1673 1184 MS ( )1690 1184 MS (e)1706 1184 MS (s)1728 1184 MS (t)1747 1184 MS ( )1762 1184 MS (u)1778 1184 MS +(n)1803 1184 MS (e)1827 1184 MS ( )1849 1184 MS (c)1865 1184 MS (o)1887 1184 MS (l)1913 1184 MS (l)1926 1184 MS (e)1939 1184 MS (c)1961 1184 MS (t)1983 1184 MS (i)1999 1184 MS (o)2011 1184 MS (n)2037 1184 MS ( )2061 1184 MS (d)2077 1184 MS (e)2102 1184 MS +( )2125 1184 MS +(p)235 1242 MS (r)260 1242 MS (o)277 1242 MS (c)303 1242 MS (e)325 1242 MS (s)347 1242 MS (s)366 1242 MS (u)385 1242 MS (s)410 1242 MS ( )429 1242 MS (q)447 1242 MS (u)472 1242 MS (i)498 1242 MS ( )510 1242 MS (e)528 1242 MS +(x)551 1242 MS (\351)575 1242 MS (c)597 1242 MS (u)619 1242 MS (t)644 1242 MS (e)659 1242 MS (n)681 1242 MS (t)705 1242 MS ( )720 1242 MS (l)739 1242 MS (e)751 1242 MS ( )773 1242 MS (m)792 1242 MS (\352)830 1242 MS (m)853 1242 MS (e)891 1242 MS +( )913 1242 MS (p)931 1242 MS (r)956 1242 MS (o)973 1242 MS (g)999 1242 MS (r)1024 1242 MS (a)1041 1242 MS (m)1063 1242 MS (m)1101 1242 MS (e)1139 1242 MS (.)1161 1242 MS ( )1174 1242 MS (D)1192 1242 MS (o)1228 1242 MS (n)1254 1242 MS (c)1278 1242 MS +( )1300 1242 MS (c)1318 1242 MS (h)1341 1242 MS (a)1365 1242 MS (c)1388 1242 MS (u)1410 1242 MS (n)1436 1242 MS ( )1460 1242 MS (d)1478 1242 MS (e)1503 1242 MS ( )1525 1242 MS (c)1543 1242 MS (e)1565 1242 MS (s)1587 1242 MS ( )1606 1242 MS (p)1624 1242 MS +(r)1649 1242 MS (o)1666 1242 MS (c)1692 1242 MS (e)1714 1242 MS (s)1736 1242 MS (s)1755 1242 MS (u)1774 1242 MS (s)1799 1242 MS ( )1818 1242 MS (e)1836 1242 MS (s)1859 1242 MS (t)1878 1242 MS ( )1893 1242 MS (u)1911 1242 MS (n)1936 1242 MS ( )1960 1242 MS +(s)1978 1242 MS (e)1997 1242 MS (r)2019 1242 MS (v)2036 1242 MS (e)2060 1242 MS (u)2082 1242 MS (r)2107 1242 MS ( )2125 1242 MS +(C)235 1299 MS (O)268 1299 MS (R)304 1299 MS (B)337 1299 MS (A)371 1299 MS (.)406 1299 MS ( )419 1299 MS +( )432 1299 MS +( )348 1357 MS +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +(5)310 1464 MS (.)338 1464 MS (1)352 1464 MS +( )380 1464 MS +LATENC /_Helvetica-BoldOblique /Helvetica-BoldOblique reencode +[50 0 0 -50 0 0]/_Helvetica-BoldOblique MF +(D)430 1464 MS (\351)466 1464 MS (f)494 1464 MS (i)511 1464 MS (n)525 1464 MS (i)556 1464 MS (t)570 1464 MS (i)586 1464 MS (o)600 1464 MS (n)630 1464 MS ( )661 1464 MS (d)675 1464 MS (e)706 1464 MS ( )734 1464 MS (l)747 1464 MS (\222)761 1464 MS +(i)775 1464 MS (n)789 1464 MS (t)819 1464 MS (e)836 1464 MS (r)864 1464 MS (f)883 1464 MS (a)900 1464 MS (c)928 1464 MS (e)956 1464 MS ( )984 1464 MS (C)998 1464 MS (O)1034 1464 MS (R)1073 1464 MS (B)1109 1464 MS (A)1145 1464 MS +( )1181 1464 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 1534 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(U)348 1591 MS (n)384 1591 MS ( )408 1591 MS (o)433 1591 MS (b)459 1591 MS (j)484 1591 MS (e)497 1591 MS (t)519 1591 MS ( )534 1591 MS (p)559 1591 MS (a)584 1591 MS (r)606 1591 MS (a)623 1591 MS (l)645 1591 MS (l)658 1591 MS (\350)671 1591 MS +(l)694 1591 MS (e)707 1591 MS ( )729 1591 MS (g)754 1591 MS (\351)779 1591 MS (n)802 1591 MS (\351)826 1591 MS (r)848 1591 MS (i)866 1591 MS (q)879 1591 MS (u)904 1591 MS (e)929 1591 MS ( )951 1591 MS (e)976 1591 MS (s)999 1591 MS (t)1018 1591 MS +( )1033 1591 MS (u)1058 1591 MS (n)1083 1591 MS (e)1107 1591 MS ( )1129 1591 MS (l)1155 1591 MS (i)1168 1591 MS (s)1181 1591 MS (t)1200 1591 MS (e)1215 1591 MS ( )1237 1591 MS (d)1262 1591 MS (e)1287 1591 MS ( )1309 1591 MS (r)1334 1591 MS (\351)1350 1591 MS +(f)1373 1591 MS (\351)1388 1591 MS (r)1410 1591 MS (e)1427 1591 MS (n)1450 1591 MS (c)1474 1591 MS (e)1496 1591 MS (s)1519 1591 MS ( )1538 1591 MS (C)1563 1591 MS (O)1596 1591 MS (R)1632 1591 MS (B)1665 1591 MS (A)1699 1591 MS (,)1734 1591 MS ( )1747 1591 MS +(c)1772 1591 MS (h)1795 1591 MS (a)1819 1591 MS (q)1841 1591 MS (u)1866 1591 MS (e)1891 1591 MS ( )1913 1591 MS (r)1938 1591 MS (\351)1955 1591 MS (f)1978 1591 MS (\351)1994 1591 MS (r)2016 1591 MS (e)2033 1591 MS (n)2055 1591 MS (c)2080 1591 MS (e)2102 1591 MS +( )2125 1591 MS +(c)235 1649 MS (o)257 1649 MS (r)283 1649 MS (r)299 1649 MS (e)316 1649 MS (s)338 1649 MS (p)357 1649 MS (o)382 1649 MS (n)408 1649 MS (d)432 1649 MS (a)457 1649 MS (n)479 1649 MS (t)503 1649 MS ( )518 1649 MS (\340)532 1649 MS ( )554 1649 MS +(l)569 1649 MS (\222)582 1649 MS (i)599 1649 MS (d)612 1649 MS (e)638 1649 MS (n)661 1649 MS (t)685 1649 MS (i)700 1649 MS (f)713 1649 MS (i)730 1649 MS (a)743 1649 MS (n)766 1649 MS (t)790 1649 MS ( )805 1649 MS (d)819 1649 MS (e)844 1649 MS +( )866 1649 MS (l)881 1649 MS (\222)894 1649 MS (o)910 1649 MS (b)936 1649 MS (j)961 1649 MS (e)974 1649 MS (t)996 1649 MS ( )1011 1649 MS (s)1025 1649 MS (u)1044 1649 MS (r)1069 1649 MS ( )1086 1649 MS (u)1100 1649 MS (n)1126 1649 MS ( )1150 1649 MS +(p)1164 1649 MS (r)1189 1649 MS (o)1206 1649 MS (c)1232 1649 MS (e)1254 1649 MS (s)1276 1649 MS (s)1295 1649 MS (u)1314 1649 MS (s)1340 1649 MS ( )1359 1649 MS (d)1373 1649 MS (o)1398 1649 MS (n)1424 1649 MS +(n)1449 1649 MS (\351)1473 1649 MS (.)1495 1649 MS ( )1508 1649 MS (A)1523 1649 MS (u)1558 1649 MS ( )1583 1649 MS (n)1598 1649 MS (i)1623 1649 MS (v)1636 1649 MS (e)1661 1649 MS (a)1683 1649 MS (u)1705 1649 MS ( )1731 1649 MS (d)1745 1649 MS (u)1770 1649 MS +( )1795 1649 MS (l)1810 1649 MS (a)1823 1649 MS (n)1846 1649 MS (g)1870 1649 MS (a)1895 1649 MS (g)1917 1649 MS (e)1943 1649 MS ( )1965 1649 MS (I)1979 1649 MS (D)1996 1649 MS (L)2032 1649 MS ( )2062 1649 MS (d)2076 1649 MS (e)2102 1649 MS ( )2125 1649 MS +(C)235 1706 MS (O)268 1706 MS (R)304 1706 MS (B)337 1706 MS (A)371 1706 MS (,)406 1706 MS ( )419 1706 MS (o)437 1706 MS (n)463 1706 MS ( )487 1706 MS (d)505 1706 MS (\351)530 1706 MS (f)553 1706 MS (i)569 1706 MS (n)582 1706 MS (i)608 1706 MS +(t)620 1706 MS ( )635 1706 MS (u)653 1706 MS (n)678 1706 MS ( )702 1706 MS (t)720 1706 MS (y)736 1706 MS (p)759 1706 MS (e)784 1706 MS ( )806 1706 MS (\253)825 1706 MS +( )849 1706 MS +(I)862 1706 MS (O)879 1706 MS (R)915 1706 MS (T)948 1706 MS (a)979 1706 MS (b)1001 1706 MS +( )1025 1706 MS +(\273)1039 1706 MS ( )1063 1706 MS (q)1081 1706 MS (u)1106 1706 MS (i)1132 1706 MS ( )1144 1706 MS (e)1162 1706 MS (s)1185 1706 MS (t)1204 1706 MS ( )1219 1706 MS (u)1236 1706 MS (n)1261 1706 MS (e)1285 1706 MS ( )1307 1706 MS (s)1325 1706 MS (\351)1345 1706 MS +(q)1367 1706 MS (u)1392 1706 MS (e)1417 1706 MS (n)1440 1706 MS (c)1464 1706 MS (e)1486 1706 MS ( )1508 1706 MS (d)1526 1706 MS (\222)1551 1706 MS (o)1567 1706 MS (b)1593 1706 MS (j)1618 1706 MS (e)1631 1706 MS (t)1653 1706 MS (s)1668 1706 MS ( )1687 1706 MS +(g)1705 1706 MS (\351)1730 1706 MS (n)1753 1706 MS (\351)1777 1706 MS (r)1799 1706 MS (i)1817 1706 MS (q)1829 1706 MS (u)1854 1706 MS (e)1880 1706 MS (s)1902 1706 MS ( )1921 1706 MS (C)1939 1706 MS (O)1972 1706 MS (R)2009 1706 MS (B)2042 1706 MS (A)2076 1706 MS +(.)2111 1706 MS ( )2125 1706 MS +(L)235 1764 MS (\222)265 1764 MS (o)281 1764 MS (b)307 1764 MS (j)332 1764 MS (e)345 1764 MS (t)367 1764 MS ( )382 1764 MS (p)412 1764 MS (a)437 1764 MS (r)459 1764 MS (a)476 1764 MS (l)499 1764 MS (l)512 1764 MS (\350)525 1764 MS (l)548 1764 MS +(e)561 1764 MS ( )584 1764 MS (g)614 1764 MS (\351)639 1764 MS (n)662 1764 MS (\351)686 1764 MS (r)708 1764 MS (i)726 1764 MS (q)739 1764 MS (u)764 1764 MS (e)789 1764 MS ( )811 1764 MS (p)841 1764 MS (o)866 1764 MS (s)892 1764 MS (s)911 1764 MS +(\350)930 1764 MS (d)952 1764 MS (e)977 1764 MS ( )1000 1764 MS (u)1030 1764 MS (n)1056 1764 MS ( )1080 1764 MS (u)1110 1764 MS (n)1136 1764 MS (i)1161 1764 MS (q)1174 1764 MS (u)1199 1764 MS (e)1224 1764 MS ( )1247 1764 MS (a)1277 1764 MS (t)1299 1764 MS +(t)1313 1764 MS (r)1328 1764 MS (i)1345 1764 MS (b)1358 1764 MS (u)1382 1764 MS (t)1407 1764 MS ( )1422 1764 MS (\253)1452 1764 MS +( )1476 1764 MS +(I)1489 1764 MS (O)1506 1764 MS (R)1542 1764 MS (T)1575 1764 MS (a)1606 1764 MS (b)1628 1764 MS +( )1652 1764 MS +(\273)1666 1764 MS (.)1690 1764 MS ( )1703 1764 MS (A)1734 1764 MS (i)1770 1764 MS (n)1783 1764 MS (s)1808 1764 MS (i)1828 1764 MS ( )1841 1764 MS (l)1872 1764 MS (e)1885 1764 MS ( )1908 1764 MS (c)1938 1764 MS (o)1960 1764 MS (n)1986 1764 MS (t)2010 1764 MS +(a)2025 1764 MS (i)2048 1764 MS (n)2061 1764 MS (e)2085 1764 MS (r)2107 1764 MS ( )2125 1764 MS +(p)235 1821 MS (a)260 1821 MS (r)282 1821 MS (a)299 1821 MS (l)322 1821 MS (l)335 1821 MS (\350)348 1821 MS (l)371 1821 MS (e)384 1821 MS ( )406 1821 MS (h)435 1821 MS (\351)460 1821 MS (r)482 1821 MS (i)500 1821 MS (t)512 1821 MS (e)527 1821 MS +( )549 1821 MS (d)577 1821 MS (\222)602 1821 MS (u)618 1821 MS (n)644 1821 MS (e)668 1821 MS ( )691 1821 MS (p)719 1821 MS (a)744 1821 MS (r)766 1821 MS (t)783 1821 MS ( )798 1821 MS (d)826 1821 MS (u)851 1821 MS ( )876 1821 MS (c)904 1821 MS +(o)926 1821 MS (n)952 1821 MS (t)976 1821 MS (a)991 1821 MS (i)1013 1821 MS (n)1026 1821 MS (e)1051 1821 MS (r)1073 1821 MS ( )1090 1821 MS (g)1118 1821 MS (\351)1143 1821 MS (n)1166 1821 MS (\351)1190 1821 MS (r)1212 1821 MS (i)1230 1821 MS (q)1244 1821 MS +(u)1269 1821 MS (e)1294 1821 MS ( )1316 1821 MS (S)1344 1821 MS (A)1372 1821 MS +(L)1408 1821 MS (O)1438 1821 MS (M)1475 1821 MS (E)1519 1821 MS ( )1550 1821 MS (e)1578 1821 MS (t)1600 1821 MS ( )1615 1821 MS (d)1643 1821 MS (\222)1668 1821 MS (a)1684 1821 MS (u)1706 1821 MS (t)1731 1821 MS (r)1746 1821 MS (e)1763 1821 MS ( )1785 1821 MS +(p)1813 1821 MS (a)1838 1821 MS (r)1860 1821 MS (t)1877 1821 MS ( )1892 1821 MS (d)1920 1821 MS (e)1945 1821 MS ( )1967 1821 MS (l)1995 1821 MS (\222)2008 1821 MS (o)2024 1821 MS (b)2050 1821 MS (j)2075 1821 MS (e)2088 1821 MS (t)2110 1821 MS ( )2125 1821 MS +(g)235 1879 MS (\351)260 1879 MS (n)282 1879 MS (\351)306 1879 MS (r)328 1879 MS (i)346 1879 MS (q)359 1879 MS (u)384 1879 MS (e)409 1879 MS ( )431 1879 MS (p)444 1879 MS (a)469 1879 MS (r)491 1879 MS (a)508 1879 MS (l)531 1879 MS (l)544 1879 MS +(\350)557 1879 MS (l)580 1879 MS (e)593 1879 MS (.)615 1879 MS +( )628 1879 MS +( )235 1936 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 1984 MS (i)260 1984 MS (f)285 1984 MS (n)310 1984 MS (d)335 1984 MS (e)360 1984 MS (f)385 1984 MS ( )410 1984 MS (_)435 1984 MS (S)460 1984 MS (A)485 1984 MS (L)510 1984 MS (O)535 1984 MS (M)560 1984 MS (E)585 1984 MS (_)610 1984 MS +(M)635 1984 MS (P)660 1984 MS (I)685 1984 MS (O)710 1984 MS (B)735 1984 MS (J)760 1984 MS (E)785 1984 MS (C)810 1984 MS (T)835 1984 MS (_)860 1984 MS (I)885 1984 MS (D)910 1984 MS (L)935 1984 MS (_)960 1984 MS +( )985 1984 MS +(#)235 2031 MS (d)260 2031 MS (e)285 2031 MS (f)310 2031 MS (i)335 2031 MS (n)360 2031 MS (e)385 2031 MS ( )410 2031 MS (_)435 2031 MS (S)460 2031 MS (A)485 2031 MS (L)510 2031 MS (O)535 2031 MS (M)560 2031 MS (E)585 2031 MS (_)610 2031 MS +(M)635 2031 MS (P)660 2031 MS (I)685 2031 MS (O)710 2031 MS (B)735 2031 MS (J)760 2031 MS (E)785 2031 MS (C)810 2031 MS (T)835 2031 MS (_)860 2031 MS (I)885 2031 MS (D)910 2031 MS (L)935 2031 MS (_)960 2031 MS +( )985 2031 MS +( )235 2078 MS +(m)235 2126 MS (o)260 2126 MS (d)285 2126 MS (u)310 2126 MS (l)335 2126 MS (e)360 2126 MS ( )385 2126 MS (E)410 2126 MS (n)435 2126 MS (g)460 2126 MS (i)485 2126 MS (n)510 2126 MS (e)535 2126 MS (s)560 2126 MS +( )585 2126 MS +({)235 2173 MS +( )260 2173 MS +( )235 2220 MS ( )260 2220 MS (t)285 2220 MS (y)310 2220 MS (p)335 2220 MS (e)360 2220 MS (d)385 2220 MS (e)410 2220 MS (f)435 2220 MS ( )460 2220 MS (s)485 2220 MS (e)510 2220 MS (q)535 2220 MS (u)560 2220 MS (e)585 2220 MS (n)610 2220 MS +(c)635 2220 MS (e)660 2220 MS (<)685 2220 MS (O)710 2220 MS (b)735 2220 MS (j)760 2220 MS (e)785 2220 MS (c)810 2220 MS (t)835 2220 MS (>)860 2220 MS ( )885 2220 MS (I)910 2220 MS (O)935 2220 MS (R)960 2220 MS (T)985 2220 MS (a)1010 2220 MS +(b)1035 2220 MS (;)1060 2220 MS +( )1085 2220 MS +( )235 2267 MS ( )260 2267 MS +(i)285 2267 MS (n)310 2267 MS (t)335 2267 MS (e)360 2267 MS (r)385 2267 MS (f)410 2267 MS (a)435 2267 MS (c)460 2267 MS (e)485 2267 MS ( )510 2267 MS (M)535 2267 MS (P)560 2267 MS (I)585 2267 MS (O)610 2267 MS (b)635 2267 MS (j)660 2267 MS +(e)685 2267 MS (c)710 2267 MS (t)735 2267 MS +( )760 2267 MS +( )235 2314 MS ( )260 2314 MS ({)285 2314 MS +( )310 2314 MS +( )235 2362 MS ( )260 2362 MS ( )285 2362 MS ( )310 2362 MS (a)335 2362 MS (t)360 2362 MS (t)385 2362 MS (r)410 2362 MS (i)435 2362 MS (b)460 2362 MS (u)485 2362 MS (t)510 2362 MS (e)535 2362 MS ( )560 2362 MS (I)585 2362 MS (O)610 2362 MS +(R)635 2362 MS (T)660 2362 MS (a)685 2362 MS (b)710 2362 MS ( )735 2362 MS (t)760 2362 MS (i)785 2362 MS (o)810 2362 MS (r)835 2362 MS (;)860 2362 MS +( )885 2362 MS +( )235 2409 MS ( )260 2409 MS (})285 2409 MS ( )310 2409 MS (;)335 2409 MS +( )360 2409 MS +(})235 2456 MS ( )260 2456 MS (;)285 2456 MS +( )310 2456 MS +( )235 2503 MS +(#)235 2550 MS (e)260 2550 MS (n)285 2550 MS (d)310 2550 MS (i)335 2550 MS (f)360 2550 MS +( )385 2550 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )235 2608 MS +showpage +%%Page: 11 11 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (1)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +(5)310 577 MS (.)338 577 MS (2)352 577 MS +( )380 577 MS +LATENC /_Helvetica-BoldOblique /Helvetica-BoldOblique reencode +[50 0 0 -50 0 0]/_Helvetica-BoldOblique MF +(D)430 577 MS (\351)466 577 MS (f)494 577 MS (i)511 577 MS (n)525 577 MS (i)556 577 MS (t)570 577 MS (i)586 577 MS (o)600 577 MS (n)630 577 MS ( )661 577 MS (d)675 577 MS (e)706 577 MS ( )734 577 MS +(l)747 577 MS (\222)761 577 MS (i)775 577 MS (m)789 577 MS (p)833 577 MS (l)864 577 MS (\351)878 577 MS (m)906 577 MS (e)950 577 MS (n)978 577 MS (t)1008 577 MS (a)1025 577 MS (t)1053 577 MS (i)1070 577 MS (o)1083 577 MS (n)1114 577 MS +( )1145 577 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 647 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 705 MS (\222)378 705 MS (i)395 705 MS (m)409 705 MS (p)447 705 MS (l)473 705 MS (\351)486 705 MS (m)509 705 MS (e)547 705 MS (n)570 705 MS (t)594 705 MS (a)609 705 MS (t)631 705 MS (i)646 705 MS (o)658 705 MS (n)684 705 MS +( )708 705 MS (d)721 705 MS (e)746 705 MS ( )768 705 MS (l)782 705 MS (\222)795 705 MS (o)811 705 MS (b)838 705 MS (j)863 705 MS (e)876 705 MS (t)898 705 MS ( )913 705 MS (g)926 705 MS (\351)951 705 MS (n)973 705 MS (\351)997 705 MS +(r)1019 705 MS (i)1037 705 MS (q)1050 705 MS (u)1075 705 MS (e)1100 705 MS ( )1122 705 MS (p)1135 705 MS (a)1160 705 MS (r)1182 705 MS (a)1199 705 MS (l)1222 705 MS (l)1236 705 MS (\350)1249 705 MS (l)1272 705 MS (e)1285 705 MS ( )1307 705 MS +(d)1320 705 MS (o)1345 705 MS (i)1371 705 MS (t)1383 705 MS ( )1398 705 MS (d)1411 705 MS (\351)1436 705 MS (f)1459 705 MS (i)1476 705 MS (n)1489 705 MS (i)1514 705 MS (r)1527 705 MS ( )1544 705 MS (a)1557 705 MS (u)1579 705 MS ( )1604 705 MS +(m)1618 705 MS (o)1655 705 MS (i)1682 705 MS (n)1695 705 MS (s)1720 705 MS ( )1740 705 MS (d)1753 705 MS (e)1778 705 MS (u)1800 705 MS (x)1826 705 MS ( )1850 705 MS (f)1864 705 MS (o)1879 705 MS (n)1905 705 MS (c)1930 705 MS (t)1952 705 MS +(i)1967 705 MS (o)1979 705 MS (n)2005 705 MS (s)2030 705 MS +( )2049 705 MS +(:)2062 705 MS ( )2076 705 MS (l)2090 705 MS (a)2102 705 MS ( )2125 705 MS +(p)235 762 MS (r)260 762 MS (e)277 762 MS (m)300 762 MS (i)338 762 MS (\350)351 762 MS (r)373 762 MS (e)390 762 MS ( )412 762 MS (q)434 762 MS (u)459 762 MS (i)485 762 MS ( )498 762 MS (d)520 762 MS (o)545 762 MS (n)571 762 MS +(n)596 762 MS (e)620 762 MS ( )642 762 MS (\340)665 762 MS ( )687 762 MS (l)710 762 MS (\222)723 762 MS (o)739 762 MS (b)765 762 MS (j)790 762 MS (e)803 762 MS (t)825 762 MS ( )840 762 MS (p)862 762 MS (a)887 762 MS (r)909 762 MS +(a)926 762 MS (l)949 762 MS (l)962 762 MS (\350)975 762 MS (l)998 762 MS (e)1011 762 MS ( )1034 762 MS (s)1056 762 MS (a)1076 762 MS ( )1098 762 MS (l)1121 762 MS (i)1135 762 MS (s)1148 762 MS (t)1167 762 MS (e)1182 762 MS ( )1204 762 MS +(d)1226 762 MS (e)1251 762 MS ( )1273 762 MS (r)1295 762 MS (\351)1312 762 MS (f)1335 762 MS (\351)1350 762 MS (r)1372 762 MS (e)1389 762 MS (n)1412 762 MS (c)1436 762 MS (e)1458 762 MS (s)1481 762 MS ( )1500 762 MS (C)1522 762 MS (O)1555 762 MS +(R)1592 762 MS (B)1625 762 MS (A)1659 762 MS ( )1695 762 MS (\()1717 762 MS (f)1735 762 MS (o)1750 762 MS (n)1776 762 MS (c)1800 762 MS (t)1822 762 MS (i)1838 762 MS (o)1850 762 MS (n)1876 762 MS ( )1900 762 MS (s)1922 762 MS (e)1942 762 MS +(t)1964 762 MS (\))1979 762 MS (,)1996 762 MS ( )2009 762 MS (e)2031 762 MS (t)2052 762 MS ( )2067 762 MS (l)2089 762 MS (a)2102 762 MS ( )2125 762 MS +(d)235 820 MS (e)260 820 MS (u)282 820 MS (x)307 820 MS (i)332 820 MS (\350)345 820 MS (m)368 820 MS (e)406 820 MS ( )428 820 MS (q)452 820 MS (u)477 820 MS (i)503 820 MS ( )516 820 MS (p)540 820 MS (e)566 820 MS (r)588 820 MS +(m)606 820 MS (e)643 820 MS (t)665 820 MS ( )680 820 MS (\340)704 820 MS ( )726 820 MS (u)750 820 MS (n)776 820 MS ( )800 820 MS (c)824 820 MS (l)847 820 MS (i)861 820 MS (e)874 820 MS (n)897 820 MS (t)921 820 MS ( )936 820 MS +(d)960 820 MS (e)985 820 MS ( )1007 820 MS (r)1031 820 MS (\351)1048 820 MS (c)1070 820 MS (u)1092 820 MS (p)1117 820 MS (\351)1142 820 MS (r)1164 820 MS (e)1181 820 MS (r)1203 820 MS ( )1220 820 MS (l)1245 820 MS (a)1258 820 MS ( )1280 820 MS +(l)1305 820 MS (i)1318 820 MS (s)1331 820 MS (t)1350 820 MS (e)1365 820 MS ( )1387 820 MS (d)1411 820 MS (e)1436 820 MS ( )1458 820 MS (r)1482 820 MS +(\351)1499 820 MS (f)1522 820 MS (\351)1538 820 MS (r)1560 820 MS (e)1577 820 MS (n)1600 820 MS (c)1624 820 MS (e)1646 820 MS (s)1668 820 MS ( )1688 820 MS (C)1712 820 MS (O)1745 820 MS (R)1781 820 MS (B)1815 820 MS (A)1849 820 MS ( )1884 820 MS +(d)1908 820 MS (\222)1934 820 MS (u)1950 820 MS (n)1976 820 MS ( )2000 820 MS (o)2024 820 MS (b)2050 820 MS (j)2075 820 MS (e)2088 820 MS (t)2110 820 MS ( )2125 820 MS +(p)235 877 MS (a)260 877 MS (r)282 877 MS (a)299 877 MS (l)322 877 MS (l)335 877 MS (\350)348 877 MS (l)371 877 MS (e)384 877 MS ( )406 877 MS (q)421 877 MS (u)446 877 MS (e)472 877 MS (l)495 877 MS (c)508 877 MS (o)530 877 MS +(n)556 877 MS (q)580 877 MS (u)605 877 MS (e)630 877 MS ( )652 877 MS (\()667 877 MS (f)685 877 MS (o)700 877 MS (n)727 877 MS (c)751 877 MS (t)773 877 MS (i)789 877 MS (o)801 877 MS (n)827 877 MS ( )851 877 MS (g)866 877 MS +(e)891 877 MS (t)913 877 MS (\))928 877 MS (.)945 877 MS ( )958 877 MS (A)973 877 MS ( )1008 877 MS (c)1023 877 MS (e)1045 877 MS (c)1068 877 MS (i)1091 877 MS ( )1104 877 MS (,)1119 877 MS ( )1132 877 MS (i)1148 877 MS (l)1162 877 MS +( )1175 877 MS (e)1190 877 MS (s)1213 877 MS (t)1232 877 MS ( )1247 877 MS (n)1262 877 MS (\351)1287 877 MS (c)1309 877 MS (e)1331 877 MS (s)1353 877 MS (s)1373 877 MS (a)1392 877 MS (i)1415 877 MS (r)1428 877 MS (e)1445 877 MS ( )1467 877 MS +(d)1482 877 MS (e)1507 877 MS ( )1530 877 MS (r)1545 877 MS (a)1562 877 MS (j)1585 877 MS (o)1597 877 MS (u)1623 877 MS (t)1648 877 MS (e)1663 877 MS (r)1685 877 MS ( )1702 877 MS (q)1717 877 MS (u)1742 877 MS (e)1767 877 MS (l)1790 877 MS +(q)1802 877 MS (u)1827 877 MS (e)1852 877 MS (s)1874 877 MS ( )1894 877 MS (a)1909 877 MS (t)1931 877 MS (t)1946 877 MS (r)1960 877 MS (i)1977 877 MS (b)1990 877 MS (u)2014 877 MS (t)2039 877 MS (s)2054 877 MS ( )2073 877 MS (e)2088 877 MS +(t)2110 877 MS ( )2125 877 MS +(s)235 935 MS (e)254 935 MS (r)276 935 MS (v)293 935 MS (i)318 935 MS (c)331 935 MS (e)354 935 MS (s)376 935 MS ( )395 935 MS (n)420 935 MS (\351)444 935 MS (c)466 935 MS (e)488 935 MS (s)511 935 MS (s)530 935 MS (a)549 935 MS +(i)572 935 MS (r)585 935 MS (e)602 935 MS (s)624 935 MS ( )643 935 MS (a)667 935 MS (u)689 935 MS ( )714 935 MS (b)739 935 MS (o)763 935 MS (n)789 935 MS ( )813 935 MS (f)838 935 MS (o)853 935 MS (n)879 935 MS (c)903 935 MS +(t)925 935 MS (i)941 935 MS (o)953 935 MS (n)979 935 MS (n)1004 935 MS (e)1028 935 MS (m)1051 935 MS (e)1089 935 MS (n)1112 935 MS (t)1136 935 MS ( )1151 935 MS (d)1175 935 MS (e)1200 935 MS ( )1222 935 MS (l)1245 935 MS (\222)1258 935 MS +(o)1274 935 MS (b)1301 935 MS (j)1326 935 MS (e)1339 935 MS (t)1361 935 MS ( )1376 935 MS (p)1400 935 MS (a)1425 935 MS (r)1447 935 MS (a)1464 935 MS (l)1486 935 MS (l)1499 935 MS (\350)1512 935 MS (l)1535 935 MS (e)1548 935 MS ( )1570 935 MS +(g)1594 935 MS (\351)1619 935 MS (n)1642 935 MS (\351)1666 935 MS (r)1688 935 MS (i)1706 935 MS (q)1719 935 MS (u)1744 935 MS (e)1769 935 MS +( )1791 935 MS +(:)1804 935 MS ( )1818 935 MS (l)1842 935 MS (e)1855 935 MS ( )1877 935 MS (n)1901 935 MS (o)1925 935 MS (m)1952 935 MS (b)1990 935 MS (r)2014 935 MS (e)2031 935 MS ( )2053 935 MS (d)2077 935 MS (e)2102 935 MS ( )2125 935 MS +(p)235 992 MS (r)260 992 MS (o)277 992 MS (c)303 992 MS (e)325 992 MS (s)347 992 MS (s)366 992 MS (u)385 992 MS (s)410 992 MS (,)429 992 MS ( )442 992 MS (l)461 992 MS (e)474 992 MS ( )496 992 MS (n)515 992 MS (u)539 992 MS +(m)565 992 MS (\351)603 992 MS (r)625 992 MS (o)642 992 MS ( )668 992 MS (d)687 992 MS (u)712 992 MS ( )737 992 MS (p)756 992 MS (r)781 992 MS (o)797 992 MS (c)823 992 MS (e)845 992 MS (s)867 992 MS (s)886 992 MS (u)905 992 MS +(s)930 992 MS ( )949 992 MS (c)968 992 MS (o)990 992 MS (u)1016 992 MS (r)1041 992 MS (a)1058 992 MS (n)1080 992 MS (t)1104 992 MS (,)1119 992 MS +( )1132 992 MS (l)1151 992 MS (a)1163 992 MS ( )1185 992 MS (l)1205 992 MS (i)1218 992 MS (s)1231 992 MS (t)1252 992 MS (e)1267 992 MS ( )1289 992 MS (d)1308 992 MS (e)1333 992 MS (s)1355 992 MS ( )1374 992 MS (r)1393 992 MS (\351)1410 992 MS +(f)1432 992 MS (\351)1447 992 MS (r)1469 992 MS (e)1486 992 MS (n)1509 992 MS (c)1533 992 MS (e)1555 992 MS (s)1577 992 MS ( )1596 992 MS (C)1616 992 MS (O)1649 992 MS (R)1685 992 MS (B)1718 992 MS (A)1752 992 MS ( )1787 992 MS (d)1806 992 MS +(e)1831 992 MS ( )1853 992 MS (l)1873 992 MS (a)1886 992 MS ( )1908 992 MS (c)1927 992 MS (o)1949 992 MS (l)1976 992 MS (l)1989 992 MS (e)2002 992 MS (c)2024 992 MS (t)2046 992 MS (i)2062 992 MS (o)2074 992 MS (n)2100 992 MS ( )2125 992 MS +(d)235 1050 MS (\222)260 1050 MS (o)276 1050 MS (b)302 1050 MS (j)327 1050 MS (e)340 1050 MS (t)362 1050 MS (s)377 1050 MS ( )396 1050 MS (f)418 1050 MS (o)433 1050 MS (r)459 1050 MS (m)476 1050 MS (a)513 1050 MS (n)536 1050 MS (t)560 1050 MS +( )575 1050 MS (l)597 1050 MS (\222)610 1050 MS (o)626 1050 MS (b)652 1050 MS (j)677 1050 MS (e)690 1050 MS (t)712 1050 MS ( )727 1050 MS (p)748 1050 MS (a)773 1050 MS (r)795 1050 MS (a)812 1050 MS (l)835 1050 MS (l)848 1050 MS (\350)861 1050 MS +(l)884 1050 MS (e)897 1050 MS (,)919 1050 MS ( )932 1050 MS (e)953 1050 MS (t)975 1050 MS ( )990 1050 MS (u)1011 1050 MS (n)1036 1050 MS (e)1060 1050 MS ( )1082 1050 MS (f)1104 1050 MS (o)1119 1050 MS (n)1145 1050 MS (c)1169 1050 MS (t)1191 1050 MS +(i)1207 1050 MS (o)1219 1050 MS (n)1245 1050 MS ( )1269 1050 MS (d)1290 1050 MS (\222)1316 1050 MS (\351)1332 1050 MS (c)1354 1050 MS (h)1377 1050 MS (a)1401 1050 MS (n)1424 1050 MS (g)1448 1050 MS (e)1473 1050 MS ( )1495 1050 MS (d)1516 1050 MS (e)1542 1050 MS +(s)1564 1050 MS ( )1583 1050 MS (r)1604 1050 MS (\351)1621 1050 MS (f)1644 1050 MS (\351)1660 1050 MS (r)1682 1050 MS (e)1699 1050 MS (n)1722 1050 MS (c)1746 1050 MS (e)1768 1050 MS (s)1790 1050 MS ( )1809 1050 MS (C)1831 1050 MS (O)1864 1050 MS (R)1900 1050 MS +(B)1933 1050 MS (A)1967 1050 MS ( )2003 1050 MS (e)2024 1050 MS (n)2047 1050 MS (t)2071 1050 MS (r)2086 1050 MS (e)2103 1050 MS ( )2125 1050 MS +(p)235 1107 MS (r)260 1107 MS (o)277 1107 MS (c)303 1107 MS (e)325 1107 MS (s)347 1107 MS (s)366 1107 MS (u)385 1107 MS (s)410 1107 MS (,)429 1107 MS ( )442 1107 MS (v)455 1107 MS (i)480 1107 MS (a)492 1107 MS ( )514 1107 MS (M)527 1107 MS +(P)571 1107 MS (I)599 1107 MS (,)616 1107 MS ( )629 1107 MS (a)642 1107 MS (f)665 1107 MS (i)681 1107 MS (n)694 1107 MS ( )718 1107 MS (d)731 1107 MS (e)756 1107 MS ( )778 1107 MS (c)791 1107 MS (o)813 1107 MS (n)839 1107 MS (s)863 1107 MS +(t)882 1107 MS (i)898 1107 MS (t)910 1107 MS (u)925 1107 MS (e)950 1107 MS (r)972 1107 MS ( )989 1107 MS (l)1002 1107 MS (a)1014 1107 MS ( )1036 1107 MS (d)1049 1107 MS (i)1075 1107 MS (t)1087 1107 MS (e)1102 1107 MS ( )1124 1107 MS (l)1138 1107 MS +(i)1151 1107 MS (s)1164 1107 MS (t)1183 1107 MS (e)1198 1107 MS (.)1220 1107 MS +( )1233 1107 MS +( )348 1165 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 1212 MS (i)260 1212 MS (f)285 1212 MS (n)310 1212 MS (d)335 1212 MS (e)360 1212 MS (f)385 1212 MS ( )410 1212 MS (_)435 1212 MS (S)460 1212 MS (A)485 1212 MS (L)510 1212 MS (O)535 1212 MS (M)560 1212 MS (E)585 1212 MS (_)610 1212 MS +(M)635 1212 MS (P)660 1212 MS (I)685 1212 MS (O)710 1212 MS (B)735 1212 MS (J)760 1212 MS (E)785 1212 MS (C)810 1212 MS (T)835 1212 MS (_)860 1212 MS (I)885 1212 MS (_)910 1212 MS (H)935 1212 MS (_)960 1212 MS +( )985 1212 MS +(#)235 1260 MS (d)260 1260 MS (e)285 1260 MS (f)310 1260 MS (i)335 1260 MS (n)360 1260 MS (e)385 1260 MS ( )410 1260 MS (_)435 1260 MS (S)460 1260 MS (A)485 1260 MS (L)510 1260 MS (O)535 1260 MS (M)560 1260 MS (E)585 1260 MS (_)610 1260 MS +(M)635 1260 MS (P)660 1260 MS (I)685 1260 MS (O)710 1260 MS (B)735 1260 MS (J)760 1260 MS (E)785 1260 MS (C)810 1260 MS (T)835 1260 MS (_)860 1260 MS (I)885 1260 MS (_)910 1260 MS (H)935 1260 MS (_)960 1260 MS +( )985 1260 MS +( )235 1307 MS +(#)235 1354 MS +(i)260 1354 MS (n)285 1354 MS (c)310 1354 MS (l)335 1354 MS (u)360 1354 MS (d)385 1354 MS (e)410 1354 MS ( )435 1354 MS (")460 1354 MS (S)485 1354 MS (A)510 1354 MS (L)535 1354 MS (O)560 1354 MS (M)585 1354 MS (E)610 1354 MS (c)635 1354 MS +(o)660 1354 MS (n)685 1354 MS (f)710 1354 MS (i)735 1354 MS (g)760 1354 MS (.)785 1354 MS (h)810 1354 MS (")835 1354 MS +( )860 1354 MS +(#)235 1401 MS (i)260 1401 MS (n)285 1401 MS (c)310 1401 MS (l)335 1401 MS (u)360 1401 MS (d)385 1401 MS (e)410 1401 MS ( )435 1401 MS (C)460 1401 MS (O)485 1401 MS (R)510 1401 MS (B)535 1401 MS (A)560 1401 MS (_)585 1401 MS (S)610 1401 MS +(E)635 1401 MS (R)660 1401 MS (V)685 1401 MS (E)710 1401 MS (R)735 1401 MS (_)760 1401 MS (H)785 1401 MS (E)810 1401 MS (A)835 1401 MS (D)860 1401 MS (E)885 1401 MS (R)910 1401 MS (\()935 1401 MS (M)960 1401 MS (P)985 1401 MS (I)1010 1401 MS +(O)1035 1401 MS (b)1060 1401 MS (j)1085 1401 MS (e)1110 1401 MS (c)1135 1401 MS (t)1160 1401 MS (\))1185 1401 MS +( )1210 1401 MS +( )235 1448 MS +(c)235 1496 MS (l)260 1496 MS (a)285 1496 MS (s)310 1496 MS (s)335 1496 MS ( )360 1496 MS (M)385 1496 MS (P)410 1496 MS (I)435 1496 MS (O)460 1496 MS (b)485 1496 MS (j)510 1496 MS (e)535 1496 MS (c)560 1496 MS (t)585 1496 MS (_)610 1496 MS +(i)635 1496 MS (:)660 1496 MS ( )685 1496 MS (p)710 1496 MS (u)735 1496 MS (b)760 1496 MS (l)785 1496 MS (i)810 1496 MS (c)835 1496 MS ( )860 1496 MS (P)885 1496 MS (O)910 1496 MS (A)935 1496 MS (_)960 1496 MS (E)985 1496 MS (n)1010 1496 MS +(g)1035 1496 MS (i)1060 1496 MS (n)1085 1496 MS (e)1110 1496 MS (s)1135 1496 MS (:)1160 1496 MS (:)1185 1496 MS (M)1210 1496 MS (P)1235 1496 MS (I)1260 1496 MS (O)1285 1496 MS (b)1310 1496 MS (j)1335 1496 MS (e)1360 1496 MS (c)1385 1496 MS (t)1410 1496 MS +( )1435 1496 MS +({)235 1543 MS +( )260 1543 MS +( )235 1590 MS (p)260 1590 MS (u)285 1590 MS (b)310 1590 MS (l)335 1590 MS (i)360 1590 MS (c)385 1590 MS (:)410 1590 MS +( )435 1590 MS +( )235 1637 MS ( )260 1637 MS (M)285 1637 MS (P)310 1637 MS (I)335 1637 MS (O)360 1637 MS (b)385 1637 MS (j)410 1637 MS (e)435 1637 MS (c)460 1637 MS (t)485 1637 MS (_)510 1637 MS (i)535 1637 MS (\()560 1637 MS (\))585 1637 MS (;)610 1637 MS +( )635 1637 MS +( )235 1684 MS ( )260 1684 MS (M)285 1684 MS (P)310 1684 MS (I)335 1684 MS (O)360 1684 MS (b)385 1684 MS (j)410 1684 MS (e)435 1684 MS (c)460 1684 MS (t)485 1684 MS (_)510 1684 MS (i)535 1684 MS (\()560 1684 MS (i)585 1684 MS (n)610 1684 MS +(t)635 1684 MS ( )660 1684 MS (n)685 1684 MS (b)710 1684 MS (p)735 1684 MS (r)760 1684 MS (o)785 1684 MS (c)810 1684 MS (,)835 1684 MS ( )860 1684 MS (i)885 1684 MS (n)910 1684 MS (t)935 1684 MS ( )960 1684 MS (n)985 1684 MS (u)1010 1684 MS +(m)1035 1684 MS (p)1060 1684 MS (r)1085 1684 MS (o)1110 1684 MS (c)1135 1684 MS (\))1160 1684 MS (;)1185 1684 MS +( )1210 1684 MS +( )235 1732 MS ( )260 1732 MS (~)285 1732 MS (M)310 1732 MS (P)335 1732 MS (I)360 1732 MS (O)385 1732 MS (b)410 1732 MS (j)435 1732 MS (e)460 1732 MS (c)485 1732 MS (t)510 1732 MS (_)535 1732 MS (i)560 1732 MS (\()585 1732 MS (\))610 1732 MS +(;)635 1732 MS +( )660 1732 MS +( )235 1779 MS ( )260 1779 MS ( )285 1779 MS ( )310 1779 MS +( )335 1779 MS +( )235 1826 MS ( )260 1826 MS (E)285 1826 MS (n)310 1826 MS (g)335 1826 MS (i)360 1826 MS (n)385 1826 MS (e)410 1826 MS (s)435 1826 MS (:)460 1826 MS (:)485 1826 MS (I)510 1826 MS (O)535 1826 MS (R)560 1826 MS (T)585 1826 MS (a)610 1826 MS +(b)635 1826 MS (*)660 1826 MS ( )685 1826 MS (t)710 1826 MS (i)735 1826 MS (o)760 1826 MS (r)785 1826 MS (\()810 1826 MS (\))835 1826 MS (;)860 1826 MS +( )885 1826 MS +( )235 1873 MS ( )260 1873 MS (v)285 1873 MS (o)310 1873 MS (i)335 1873 MS (d)360 1873 MS ( )385 1873 MS (t)410 1873 MS (i)435 1873 MS (o)460 1873 MS (r)485 1873 MS (\()510 1873 MS (c)535 1873 MS (o)560 1873 MS (n)585 1873 MS (s)610 1873 MS +(t)635 1873 MS ( )660 1873 MS (E)685 1873 MS (n)710 1873 MS (g)735 1873 MS (i)760 1873 MS (n)785 1873 MS +(e)810 1873 MS (s)835 1873 MS (:)860 1873 MS (:)885 1873 MS (I)910 1873 MS (O)935 1873 MS (R)960 1873 MS (T)985 1873 MS (a)1010 1873 MS (b)1035 1873 MS (&)1060 1873 MS ( )1085 1873 MS (i)1110 1873 MS (o)1135 1873 MS (r)1160 1873 MS (\))1185 1873 MS +(;)1210 1873 MS +( )1235 1873 MS +( )235 1920 MS +( )235 1968 MS +(p)260 1968 MS (r)285 1968 MS (o)310 1968 MS (t)335 1968 MS (e)360 1968 MS (c)385 1968 MS (t)410 1968 MS (e)435 1968 MS (d)460 1968 MS (:)485 1968 MS +( )510 1968 MS +( )235 2015 MS ( )260 2015 MS (/)285 2015 MS (/)310 2015 MS ( )335 2015 MS (N)360 2015 MS (u)385 2015 MS (m)410 2015 MS (b)435 2015 MS (e)460 2015 MS (r)485 2015 MS ( )510 2015 MS (o)535 2015 MS (f)560 2015 MS ( )585 2015 MS (c)610 2015 MS +(u)635 2015 MS (r)660 2015 MS (r)685 2015 MS (e)710 2015 MS (n)735 2015 MS (t)760 2015 MS ( )785 2015 MS (p)810 2015 MS (r)835 2015 MS (o)860 2015 MS (c)885 2015 MS (e)910 2015 MS (s)935 2015 MS (s)960 2015 MS +( )985 2015 MS +( )235 2062 MS ( )260 2062 MS +(i)285 2062 MS (n)310 2062 MS (t)335 2062 MS ( )360 2062 MS (_)385 2062 MS (n)410 2062 MS (u)435 2062 MS (m)460 2062 MS (p)485 2062 MS (r)510 2062 MS (o)535 2062 MS (c)560 2062 MS (;)585 2062 MS +( )610 2062 MS +( )235 2109 MS ( )260 2109 MS (/)285 2109 MS (/)310 2109 MS ( )335 2109 MS (P)360 2109 MS (r)385 2109 MS (o)410 2109 MS (c)435 2109 MS (e)460 2109 MS (s)485 2109 MS (s)510 2109 MS ( )535 2109 MS (n)560 2109 MS (u)585 2109 MS (m)610 2109 MS +(b)635 2109 MS (e)660 2109 MS (r)685 2109 MS +( )710 2109 MS +( )235 2156 MS ( )260 2156 MS (i)285 2156 MS (n)310 2156 MS (t)335 2156 MS ( )360 2156 MS (_)385 2156 MS (n)410 2156 MS (b)435 2156 MS (p)460 2156 MS (r)485 2156 MS (o)510 2156 MS (c)535 2156 MS (;)560 2156 MS +( )585 2156 MS +( )235 2204 MS ( )260 2204 MS (/)285 2204 MS (/)310 2204 MS ( )335 2204 MS (L)360 2204 MS (i)385 2204 MS (s)410 2204 MS (t)435 2204 MS ( )460 2204 MS (o)485 2204 MS (f)510 2204 MS ( )535 2204 MS (I)560 2204 MS (O)585 2204 MS (R)610 2204 MS +( )635 2204 MS (o)660 2204 MS (f)685 2204 MS ( )710 2204 MS (e)735 2204 MS (a)760 2204 MS (c)785 2204 MS (h)810 2204 MS ( )835 2204 MS (o)860 2204 MS (b)885 2204 MS (j)910 2204 MS (e)935 2204 MS (c)960 2204 MS (t)985 2204 MS ( )1010 2204 MS +(o)1035 2204 MS (n)1060 2204 MS ( )1085 2204 MS (a)1110 2204 MS (l)1135 2204 MS (l)1160 2204 MS ( )1185 2204 MS (m)1210 2204 MS (p)1235 2204 MS (i)1260 2204 MS ( )1285 2204 MS (p)1310 2204 MS (r)1335 2204 MS (o)1360 2204 MS (c)1385 2204 MS (e)1410 2204 MS +(s)1435 2204 MS (s)1460 2204 MS +( )1485 2204 MS +( )235 2251 MS ( )260 2251 MS (E)285 2251 MS (n)310 2251 MS (g)335 2251 MS (i)360 2251 MS (n)385 2251 MS (e)410 2251 MS (s)435 2251 MS (:)460 2251 MS (:)485 2251 MS (I)510 2251 MS (O)535 2251 MS (R)560 2251 MS (T)585 2251 MS (a)610 2251 MS +(b)635 2251 MS (*)660 2251 MS ( )685 2251 MS (_)710 2251 MS (t)735 2251 MS (i)760 2251 MS (o)785 2251 MS (r)810 2251 MS (;)835 2251 MS +( )860 2251 MS +( )235 2298 MS ( )260 2298 MS (/)285 2298 MS (/)310 2298 MS ( )335 2298 MS (B)360 2298 MS (r)385 2298 MS (o)410 2298 MS (a)435 2298 MS (d)460 2298 MS (c)485 2298 MS (a)510 2298 MS (s)535 2298 MS (t)560 2298 MS ( )585 2298 MS (o)610 2298 MS +(f)635 2298 MS ( )660 2298 MS (I)685 2298 MS (O)710 2298 MS (R)735 2298 MS ( )760 2298 MS (b)785 2298 MS (e)810 2298 MS (t)835 2298 MS (w)860 2298 MS (e)885 2298 MS (e)910 2298 MS (n)935 2298 MS ( )960 2298 MS (e)985 2298 MS (a)1010 2298 MS +(c)1035 2298 MS (h)1060 2298 MS ( )1085 2298 MS (p)1110 2298 MS (r)1135 2298 MS (o)1160 2298 MS (c)1185 2298 MS (e)1210 2298 MS (s)1235 2298 MS (s)1260 2298 MS ( )1285 2298 MS (t)1310 2298 MS (o)1335 2298 MS ( )1360 2298 MS (b)1385 2298 MS (u)1410 2298 MS +(i)1435 2298 MS (l)1460 2298 MS (d)1485 2298 MS ( )1510 2298 MS (I)1535 2298 MS (O)1560 2298 MS (R)1585 2298 MS ( )1610 2298 MS (l)1635 2298 MS (i)1660 2298 MS (s)1685 2298 MS (t)1710 2298 MS +( )1735 2298 MS +( )235 2345 MS ( )260 2345 MS +(v)285 2345 MS (o)310 2345 MS (i)335 2345 MS +(d)360 2345 MS ( )385 2345 MS (B)410 2345 MS (C)435 2345 MS (a)460 2345 MS (s)485 2345 MS (t)510 2345 MS (I)535 2345 MS (O)560 2345 MS (R)585 2345 MS (\()610 2345 MS (C)635 2345 MS (O)660 2345 MS (R)685 2345 MS (B)710 2345 MS (A)735 2345 MS +(:)760 2345 MS (:)785 2345 MS (O)810 2345 MS (R)835 2345 MS (B)860 2345 MS (_)885 2345 MS (p)910 2345 MS (t)935 2345 MS (r)960 2345 MS ( )985 2345 MS (o)1010 2345 MS (r)1035 2345 MS (b)1060 2345 MS (,)1085 2345 MS (E)1110 2345 MS (n)1135 2345 MS +(g)1160 2345 MS (i)1185 2345 MS (n)1210 2345 MS (e)1235 2345 MS (s)1260 2345 MS (:)1285 2345 MS (:)1310 2345 MS (M)1335 2345 MS (P)1360 2345 MS (I)1385 2345 MS (O)1410 2345 MS (b)1435 2345 MS (j)1460 2345 MS (e)1485 2345 MS (c)1510 2345 MS (t)1535 2345 MS +(_)1560 2345 MS (v)1585 2345 MS (a)1610 2345 MS (r)1635 2345 MS ( )1660 2345 MS (p)1685 2345 MS (o)1710 2345 MS (b)1735 2345 MS (j)1760 2345 MS (,)1785 2345 MS (b)1810 2345 MS (o)1835 2345 MS (o)1860 2345 MS (l)1885 2345 MS ( )1910 2345 MS +(a)235 2392 MS (m)260 2392 MS (i)285 2392 MS (C)310 2392 MS (o)335 2392 MS (n)360 2392 MS (t)385 2392 MS (\))410 2392 MS (;)435 2392 MS +( )460 2392 MS +(})235 2440 MS ( )260 2440 MS (;)285 2440 MS +( )310 2440 MS +( )235 2487 MS +(#)235 2534 MS (e)260 2534 MS (n)285 2534 MS (d)310 2534 MS (i)335 2534 MS (f)360 2534 MS +( )385 2534 MS +( )235 2581 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )348 2638 MS +showpage +%%Page: 12 12 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (2)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(6)310 592 MS +( )347 592 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(L)400 592 MS (e)441 592 MS ( )478 592 MS (c)497 592 MS (o)534 592 MS (n)575 592 MS (t)616 592 MS (a)636 592 MS (i)673 592 MS (n)691 592 MS (e)732 592 MS (r)769 592 MS ( )795 592 MS (p)814 592 MS (a)853 592 MS (r)890 592 MS +(a)916 592 MS (l)952 592 MS (l)971 592 MS (\350)990 592 MS (l)1027 592 MS (e)1046 592 MS +( )1083 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 667 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 724 MS (e)378 724 MS ( )400 724 MS (c)413 724 MS (o)435 724 MS (n)461 724 MS (t)485 724 MS (a)500 724 MS (i)522 724 MS (n)535 724 MS (e)560 724 MS (r)582 724 MS ( )599 724 MS (p)612 724 MS (a)637 724 MS (r)659 724 MS +(a)676 724 MS (l)699 724 MS (l)712 724 MS (\350)725 724 MS (l)748 724 MS (e)761 724 MS ( )783 724 MS (h)796 724 MS (\351)820 724 MS (r)842 724 MS (i)860 724 MS (t)872 724 MS (e)887 724 MS ( )909 724 MS (d)922 724 MS (u)947 724 MS +( )972 724 MS (c)985 724 MS (o)1007 724 MS (n)1033 724 MS (t)1057 724 MS (a)1072 724 MS (i)1094 724 MS (n)1107 724 MS (e)1131 724 MS (r)1153 724 MS ( )1170 724 MS (g)1183 724 MS (\351)1208 724 MS (n)1231 724 MS (\351)1255 724 MS (r)1277 724 MS +(i)1295 724 MS (q)1307 724 MS (u)1332 724 MS (e)1358 724 MS ( )1380 724 MS (S)1393 724 MS (A)1421 724 MS (L)1456 724 MS (O)1486 724 MS (M)1523 724 MS (E)1567 724 MS ( )1598 724 MS (e)1611 724 MS (t)1633 724 MS ( )1647 724 MS (d)1660 724 MS +(e)1685 724 MS ( )1707 724 MS (l)1720 724 MS (\222)1733 724 MS (o)1749 724 MS (b)1775 724 MS (j)1800 724 MS (e)1813 724 MS (t)1835 724 MS ( )1850 724 MS (p)1863 724 MS (a)1888 724 MS (r)1910 724 MS (a)1927 724 MS (l)1949 724 MS (l)1962 724 MS +(\350)1975 724 MS (l)1998 724 MS (e)2011 724 MS ( )2033 724 MS +(g)235 782 MS (\351)260 782 MS (n)282 782 MS (\351)306 782 MS (r)328 782 MS (i)346 782 MS (q)359 782 MS (u)384 782 MS (e)409 782 MS (.)431 782 MS +( )444 782 MS +( )348 839 MS +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +(6)310 947 MS (.)338 947 MS (1)352 947 MS +( )380 947 MS +LATENC /_Helvetica-BoldOblique /Helvetica-BoldOblique reencode +[50 0 0 -50 0 0]/_Helvetica-BoldOblique MF +(D)430 947 MS (\351)466 947 MS (f)494 947 MS (i)511 947 MS (n)525 947 MS (i)556 947 MS (t)570 947 MS (i)586 947 MS (o)600 947 MS (n)630 947 MS ( )661 947 MS (d)675 947 MS (e)706 947 MS ( )734 947 MS (l)747 947 MS (\222)761 947 MS +(i)775 947 MS (n)789 947 MS (t)819 947 MS (e)836 947 MS (r)864 947 MS (f)883 947 MS (a)900 947 MS (c)928 947 MS (e)956 947 MS ( )984 947 MS (C)998 947 MS (O)1034 947 MS (R)1073 947 MS (B)1109 947 MS (A)1145 947 MS +( )1181 947 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 1017 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(I)348 1074 MS (l)366 1074 MS ( )378 1074 MS (n)391 1074 MS (\222)416 1074 MS (e)432 1074 MS (s)454 1074 MS (t)473 1074 MS ( )488 1074 MS (p)501 1074 MS (a)526 1074 MS (s)548 1074 MS ( )567 1074 MS (n)580 1074 MS (\351)604 1074 MS +(c)626 1074 MS (e)648 1074 MS (s)671 1074 MS (s)690 1074 MS (a)710 1074 MS (i)733 1074 MS (r)745 1074 MS (e)762 1074 MS ( )784 1074 MS (d)797 1074 MS (e)822 1074 MS ( )844 1074 MS (s)857 1074 MS (p)876 1074 MS (\351)901 1074 MS (c)923 1074 MS +(i)946 1074 MS (f)960 1074 MS (i)977 1074 MS (e)990 1074 MS (r)1012 1074 MS ( )1029 1074 MS (d)1042 1074 MS (e)1067 1074 MS ( )1089 1074 MS (n)1102 1074 MS (o)1126 1074 MS (u)1152 1074 MS (v)1177 1074 MS (e)1201 1074 MS (a)1223 1074 MS (u)1245 1074 MS +(x)1271 1074 MS ( )1295 1074 MS (a)1308 1074 MS (t)1330 1074 MS (t)1345 1074 MS (r)1359 1074 MS (i)1377 1074 MS (b)1390 1074 MS (u)1414 1074 MS (t)1439 1074 MS (s)1454 1074 MS ( )1473 1074 MS (o)1485 1074 MS (u)1511 1074 MS ( )1536 1074 MS (s)1549 1074 MS +(e)1568 1074 MS (r)1590 1074 MS (v)1607 1074 MS (i)1632 1074 MS (c)1644 1074 MS (e)1666 1074 MS (s)1689 1074 MS (.)1708 1074 MS ( )1721 1074 MS (I)1734 1074 MS (l)1751 1074 MS (s)1764 1074 MS ( )1783 1074 MS (e)1796 1074 MS (x)1819 1074 MS (i)1844 1074 MS +(s)1857 1074 MS (t)1876 1074 MS (e)1891 1074 MS (n)1913 1074 MS (t)1937 1074 MS ( )1952 1074 MS (d)1965 1074 MS (\351)1990 1074 MS (j)2012 1074 MS (\340)2025 1074 MS ( )2047 1074 MS +(d)235 1132 MS (a)260 1132 MS (n)282 1132 MS (s)307 1132 MS ( )326 1132 MS (l)340 1132 MS (e)352 1132 MS (s)375 1132 MS ( )394 1132 MS (c)407 1132 MS (l)430 1132 MS (a)442 1132 MS (s)465 1132 MS (s)484 1132 MS (e)504 1132 MS (s)526 1132 MS +( )545 1132 MS (p)558 1132 MS (a)583 1132 MS (r)605 1132 MS (e)622 1132 MS (n)645 1132 MS (t)669 1132 MS (e)684 1132 MS (s)706 1132 MS (.)725 1132 MS +( )738 1132 MS +( )348 1189 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 1237 MS (i)260 1237 MS (f)285 1237 MS (n)310 1237 MS (d)335 1237 MS (e)360 1237 MS (f)385 1237 MS ( )410 1237 MS (_)435 1237 MS (S)460 1237 MS (A)485 1237 MS (L)510 1237 MS (O)535 1237 MS (M)560 1237 MS (E)585 1237 MS (_)610 1237 MS +(M)635 1237 MS (P)660 1237 MS (I)685 1237 MS (C)710 1237 MS (O)735 1237 MS (N)760 1237 MS (T)785 1237 MS (A)810 1237 MS (I)835 1237 MS (N)860 1237 MS (E)885 1237 MS (R)910 1237 MS (_)935 1237 MS (I)960 1237 MS (D)985 1237 MS (L)1010 1237 MS +(_)1035 1237 MS +( )1060 1237 MS +(#)235 1284 MS (d)260 1284 MS (e)285 1284 MS (f)310 1284 MS (i)335 1284 MS (n)360 1284 MS (e)385 1284 MS ( )410 1284 MS (_)435 1284 MS (S)460 1284 MS (A)485 1284 MS (L)510 1284 MS (O)535 1284 MS (M)560 1284 MS (E)585 1284 MS (_)610 1284 MS +(M)635 1284 MS (P)660 1284 MS (I)685 1284 MS (C)710 1284 MS (O)735 1284 MS (N)760 1284 MS (T)785 1284 MS (A)810 1284 MS (I)835 1284 MS (N)860 1284 MS (E)885 1284 MS (R)910 1284 MS (_)935 1284 MS (I)960 1284 MS (D)985 1284 MS (L)1010 1284 MS +(_)1035 1284 MS +( )1060 1284 MS +( )235 1331 MS +(#)235 1378 MS (i)260 1378 MS (n)285 1378 MS (c)310 1378 MS (l)335 1378 MS (u)360 1378 MS (d)385 1378 MS (e)410 1378 MS ( )435 1378 MS (")460 1378 MS (S)485 1378 MS (A)510 1378 MS (L)535 1378 MS (O)560 1378 MS (M)585 1378 MS (E)610 1378 MS +(_)635 1378 MS (C)660 1378 MS (o)685 1378 MS (m)710 1378 MS (p)735 1378 MS (o)760 1378 MS (n)785 1378 MS (e)810 1378 MS (n)835 1378 MS (t)860 1378 MS (.)885 1378 MS (i)910 1378 MS (d)935 1378 MS (l)960 1378 MS (")985 1378 MS +( )1010 1378 MS +(#)235 1425 MS (i)260 1425 MS (n)285 1425 MS (c)310 1425 MS (l)335 1425 MS (u)360 1425 MS (d)385 1425 MS (e)410 1425 MS ( )435 1425 MS (")460 1425 MS (M)485 1425 MS (P)510 1425 MS (I)535 1425 MS (O)560 1425 MS (b)585 1425 MS (j)610 1425 MS +(e)635 1425 MS (c)660 1425 MS (t)685 1425 MS (.)710 1425 MS (i)735 1425 MS (d)760 1425 MS (l)785 1425 MS (")810 1425 MS +( )835 1425 MS +( )235 1473 MS +(m)235 1520 MS (o)260 1520 MS (d)285 1520 MS (u)310 1520 MS (l)335 1520 MS (e)360 1520 MS ( )385 1520 MS (E)410 1520 MS (n)435 1520 MS (g)460 1520 MS (i)485 1520 MS (n)510 1520 MS (e)535 1520 MS (s)560 1520 MS +( )585 1520 MS +({)235 1567 MS +( )260 1567 MS +( )235 1614 MS ( )260 1614 MS (i)285 1614 MS (n)310 1614 MS (t)335 1614 MS (e)360 1614 MS (r)385 1614 MS (f)410 1614 MS (a)435 1614 MS +(c)460 1614 MS (e)485 1614 MS ( )510 1614 MS (M)535 1614 MS (P)560 1614 MS (I)585 1614 MS (C)610 1614 MS (o)635 1614 MS (n)660 1614 MS (t)685 1614 MS (a)710 1614 MS (i)735 1614 MS (n)760 1614 MS (e)785 1614 MS (r)810 1614 MS (:)835 1614 MS +(C)860 1614 MS (o)885 1614 MS (n)910 1614 MS (t)935 1614 MS (a)960 1614 MS (i)985 1614 MS (n)1010 1614 MS (e)1035 1614 MS (r)1060 1614 MS (,)1085 1614 MS (M)1110 1614 MS (P)1135 1614 MS (I)1160 1614 MS (O)1185 1614 MS (b)1210 1614 MS (j)1235 1614 MS +(e)1260 1614 MS (c)1285 1614 MS (t)1310 1614 MS +( )1335 1614 MS +( )235 1661 MS ( )260 1661 MS ({)285 1661 MS +( )310 1661 MS +( )235 1709 MS ( )260 1709 MS (})285 1709 MS ( )310 1709 MS (;)335 1709 MS +( )360 1709 MS +(})235 1756 MS ( )260 1756 MS (;)285 1756 MS +( )310 1756 MS +( )235 1803 MS +(#)235 1850 MS (e)260 1850 MS (n)285 1850 MS (d)310 1850 MS (i)335 1850 MS (f)360 1850 MS +( )385 1850 MS +( )235 1897 MS +( )235 1945 MS +showpage +%%Page: 13 13 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (3)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +(6)310 577 MS (.)338 577 MS (2)352 577 MS +( )380 577 MS +LATENC /_Helvetica-BoldOblique /Helvetica-BoldOblique reencode +[50 0 0 -50 0 0]/_Helvetica-BoldOblique MF +(D)430 577 MS (\351)466 577 MS (f)494 577 MS (i)511 577 MS (n)525 577 MS (i)556 577 MS (t)570 577 MS (i)586 577 MS (o)600 577 MS (n)630 577 MS ( )661 577 MS (d)675 577 MS (e)706 577 MS ( )734 577 MS (l)747 577 MS (\222)761 577 MS +(i)775 577 MS (m)789 577 MS (p)833 577 MS (l)864 577 MS (\351)878 577 MS (m)906 577 MS (e)950 577 MS (n)978 577 MS (t)1008 577 MS (a)1025 577 MS (t)1053 577 MS (i)1070 577 MS (o)1083 577 MS (n)1114 577 MS +( )1145 577 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 647 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(D)348 705 MS (a)384 705 MS (n)406 705 MS (s)431 705 MS ( )450 705 MS (l)478 705 MS (\222)491 705 MS (i)508 705 MS (m)522 705 MS (p)560 705 MS (l)586 705 MS (\351)599 705 MS (m)622 705 MS (e)660 705 MS (n)683 705 MS (t)707 705 MS +(a)722 705 MS (t)744 705 MS (i)759 705 MS (o)771 705 MS (n)797 705 MS ( )821 705 MS (d)848 705 MS (u)873 705 MS ( )898 705 MS (c)925 705 MS (o)947 705 MS (n)973 705 MS (t)997 705 MS (a)1012 705 MS (i)1035 705 MS (n)1048 705 MS +(e)1072 705 MS (r)1094 705 MS ( )1111 705 MS (p)1138 705 MS (a)1163 705 MS (r)1185 705 MS (a)1202 705 MS (l)1225 705 MS (l)1238 705 MS (\350)1251 705 MS (l)1274 705 MS (e)1287 705 MS (,)1309 705 MS ( )1322 705 MS (i)1350 705 MS (l)1363 705 MS +( )1376 705 MS (n)1404 705 MS (\222)1428 705 MS (e)1445 705 MS (s)1467 705 MS (t)1486 705 MS ( )1501 705 MS (p)1528 705 MS (a)1553 705 MS (s)1575 705 MS ( )1594 705 MS (n)1621 705 MS (\351)1645 705 MS (c)1667 705 MS (e)1690 705 MS (s)1712 705 MS +(s)1732 705 MS (a)1751 705 MS (i)1774 705 MS (r)1786 705 MS (e)1803 705 MS ( )1825 705 MS (n)1853 705 MS (o)1877 705 MS (n)1903 705 MS ( )1927 705 MS (p)1954 705 MS (l)1980 705 MS (u)1993 705 MS (s)2018 705 MS (,)2037 705 MS ( )2050 705 MS +(d)2077 705 MS (e)2102 705 MS ( )2125 705 MS +(r)235 762 MS (a)252 762 MS (j)275 762 MS (o)287 762 MS (u)313 762 MS (t)338 762 MS (e)353 762 MS (r)374 762 MS ( )391 762 MS (d)415 762 MS (e)440 762 MS ( )462 762 MS (n)486 762 MS (o)510 762 MS (u)536 762 MS (v)561 762 MS +(e)585 762 MS (a)607 762 MS (u)629 762 MS (x)655 762 MS ( )679 762 MS (a)703 762 MS (t)725 762 MS (t)740 762 MS (r)754 762 MS (i)771 762 MS (b)784 762 MS (u)808 762 MS (t)833 762 MS (s)848 762 MS ( )867 762 MS (o)891 762 MS +(u)917 762 MS ( )942 762 MS (s)966 762 MS (e)985 762 MS (r)1007 762 MS (v)1024 762 MS (i)1049 762 MS (c)1062 762 MS (e)1084 762 MS (s)1107 762 MS (.)1126 762 MS ( )1139 762 MS (P)1163 762 MS (a)1191 762 MS (r)1213 762 MS ( )1230 762 MS +(c)1254 762 MS (o)1276 762 MS (n)1302 762 MS (t)1326 762 MS (r)1341 762 MS (e)1358 762 MS ( )1380 762 MS (i)1404 762 MS (l)1417 762 MS ( )1430 762 MS (e)1454 762 MS (s)1476 762 MS (t)1495 762 MS ( )1510 762 MS (n)1534 762 MS (\351)1558 762 MS +(c)1580 762 MS (e)1603 762 MS (s)1625 762 MS (s)1645 762 MS (a)1664 762 MS (i)1687 762 MS (r)1699 762 MS (e)1716 762 MS ( )1738 762 MS (d)1762 762 MS (e)1788 762 MS ( )1810 762 MS (s)1834 762 MS (u)1853 762 MS (r)1878 762 MS (c)1895 762 MS +(h)1918 762 MS (a)1942 762 MS (r)1964 762 MS (g)1981 762 MS (e)2006 762 MS (r)2028 762 MS ( )2045 762 MS (l)2070 762 MS (e)2083 762 MS (s)2105 762 MS ( )2125 762 MS +(d)235 820 MS (i)261 820 MS (f)274 820 MS (f)290 820 MS (\351)306 820 MS (r)328 820 MS (e)345 820 MS (n)368 820 MS (t)392 820 MS (e)407 820 MS (s)429 820 MS ( )448 820 MS (m)465 820 MS (\351)502 820 MS (t)524 820 MS (h)539 820 MS +(o)563 820 MS (d)589 820 MS (e)614 820 MS (s)636 820 MS ( )655 820 MS (d)671 820 MS (\351)696 820 MS (f)719 820 MS (i)735 820 MS (n)748 820 MS (i)774 820 MS (e)787 820 MS (s)810 820 MS ( )829 820 MS (d)845 820 MS (a)870 820 MS +(n)892 820 MS (s)917 820 MS ( )936 820 MS (l)953 820 MS (e)966 820 MS ( )988 820 MS (c)1004 820 MS (o)1026 820 MS (n)1052 820 MS (t)1076 820 MS (a)1091 820 MS (i)1113 820 MS (n)1126 820 MS (e)1150 820 MS (r)1172 820 MS ( )1189 820 MS +(g)1205 820 MS (\351)1230 820 MS (n)1253 820 MS (\351)1277 820 MS (r)1299 820 MS (i)1317 820 MS (q)1330 820 MS (u)1355 820 MS (e)1380 820 MS ( )1402 820 MS (S)1418 820 MS (A)1446 820 MS (L)1482 820 MS (O)1512 820 MS (M)1548 820 MS (E)1592 820 MS +( )1623 820 MS (p)1639 820 MS (o)1664 820 MS (u)1690 820 MS (r)1715 820 MS ( )1732 820 MS (p)1748 820 MS (r)1772 820 MS (e)1789 820 MS (n)1811 820 MS (d)1835 820 MS (r)1860 820 MS (e)1877 820 MS ( )1899 820 MS (e)1915 820 MS (n)1937 820 MS +( )1961 820 MS (c)1977 820 MS (o)1999 820 MS (m)2026 820 MS (p)2063 820 MS (t)2088 820 MS (e)2103 820 MS ( )2125 820 MS +(l)235 877 MS (e)248 877 MS ( )270 877 MS (p)283 877 MS (a)308 877 MS (r)330 877 MS (a)347 877 MS (l)370 877 MS (l)383 877 MS (\351)396 877 MS (l)419 877 MS (i)433 877 MS (s)446 877 MS (m)467 877 MS (e)505 877 MS (.)527 877 MS +( )540 877 MS +( )553 877 MS +( )348 935 MS +(A)348 992 MS (i)384 992 MS (n)397 992 MS (s)422 992 MS (i)442 992 MS ( )455 992 MS (d)469 992 MS (a)494 992 MS (n)517 992 MS (s)541 992 MS ( )561 992 MS (l)575 992 MS (e)588 992 MS ( )610 992 MS (c)623 992 MS (o)645 992 MS +(n)671 992 MS (s)696 992 MS (t)715 992 MS (r)730 992 MS (u)747 992 MS (c)772 992 MS (t)793 992 MS (e)808 992 MS (u)830 992 MS (r)855 992 MS ( )872 992 MS (d)885 992 MS (u)910 992 MS ( )935 992 MS (c)948 992 MS (o)970 992 MS +(n)996 992 MS (t)1020 992 MS (a)1035 992 MS (i)1057 992 MS (n)1070 992 MS (e)1094 992 MS (r)1116 992 MS ( )1133 992 MS (p)1146 992 MS (a)1171 992 MS (r)1193 992 MS (a)1210 992 MS (l)1233 992 MS (l)1247 992 MS (\350)1260 992 MS (l)1283 992 MS +(e)1296 992 MS (,)1318 992 MS ( )1331 992 MS (s)1344 992 MS (e)1364 992 MS (u)1386 992 MS (l)1412 992 MS ( )1424 992 MS (l)1438 992 MS (\222)1451 992 MS (o)1467 992 MS (b)1494 992 MS (j)1519 992 MS (e)1532 992 MS (t)1554 992 MS ( )1569 992 MS +(d)1582 992 MS (u)1607 992 MS ( )1632 992 MS (p)1645 992 MS (r)1670 992 MS (o)1687 992 MS (c)1713 992 MS (e)1735 992 MS (s)1757 992 MS (s)1776 992 MS (u)1795 992 MS (s)1820 992 MS ( )1839 992 MS (0)1852 992 MS ( )1878 992 MS (s)1891 992 MS +(\222)1911 992 MS (e)1927 992 MS (n)1950 992 MS (r)1974 992 MS (e)1991 992 MS (g)2013 992 MS (i)2039 992 MS (s)2052 992 MS (t)2071 992 MS (r)2086 992 MS (e)2103 992 MS ( )2125 992 MS +(a)235 1050 MS (u)257 1050 MS ( )282 1050 MS (s)296 1050 MS (e)315 1050 MS (r)337 1050 MS (v)355 1050 MS (i)380 1050 MS (c)393 1050 MS (e)415 1050 MS ( )437 1050 MS (d)451 1050 MS (e)476 1050 MS ( )498 1050 MS (n)513 1050 MS (o)537 1050 MS +(m)564 1050 MS (m)602 1050 MS (a)640 1050 MS (g)662 1050 MS (e)688 1050 MS (.)710 1050 MS ( )723 1050 MS (L)737 1050 MS (e)767 1050 MS (s)789 1050 MS ( )809 1050 MS (a)823 1050 MS (u)845 1050 MS (t)870 1050 MS (r)885 1050 MS (e)902 1050 MS +(s)924 1050 MS ( )943 1050 MS (p)957 1050 MS (r)982 1050 MS (o)999 1050 MS (c)1025 1050 MS (e)1047 1050 MS (s)1069 1050 MS (s)1088 1050 MS (u)1107 1050 MS (s)1132 1050 MS ( )1151 1050 MS (s)1165 1050 MS (e)1184 1050 MS +( )1206 1050 MS (c)1221 1050 MS (o)1244 1050 MS (n)1270 1050 MS (t)1294 1050 MS (e)1309 1050 MS (n)1331 1050 MS (t)1355 1050 MS (e)1370 1050 MS (n)1392 1050 MS (t)1416 1050 MS ( )1431 1050 MS (d)1445 1050 MS (\222)1470 1050 MS (e)1486 1050 MS (n)1508 1050 MS +(v)1533 1050 MS (o)1557 1050 MS (y)1584 1050 MS (e)1607 1050 MS (r)1629 1050 MS ( )1646 1050 MS (l)1661 1050 MS (e)1674 1050 MS (u)1696 1050 MS (r)1721 1050 MS ( )1738 1050 MS (r)1752 1050 MS (\351)1769 1050 MS (f)1792 1050 MS (\351)1808 1050 MS (r)1830 1050 MS +(e)1847 1050 MS (n)1869 1050 MS (c)1894 1050 MS (e)1916 1050 MS ( )1938 1050 MS (C)1952 1050 MS (O)1985 1050 MS (R)2022 1050 MS (B)2055 1050 MS (A)2089 1050 MS ( )2125 1050 MS +(a)235 1107 MS (u)257 1107 MS ( )282 1107 MS (p)297 1107 MS (r)322 1107 MS (o)338 1107 MS (c)364 1107 MS (e)386 1107 MS (s)408 1107 MS (s)427 1107 MS (u)446 1107 MS (s)471 1107 MS ( )490 1107 MS (0)505 1107 MS ( )530 1107 MS (a)545 1107 MS +(v)567 1107 MS (e)592 1107 MS (c)614 1107 MS ( )636 1107 MS (l)652 1107 MS (a)664 1107 MS ( )686 1107 MS (f)702 1107 MS (o)717 1107 MS (n)744 1107 MS (c)768 1107 MS (t)790 1107 MS (i)806 1107 MS (o)818 1107 MS (n)844 1107 MS ( )868 1107 MS +(d)883 1107 MS (e)908 1107 MS ( )930 1107 MS (l)946 1107 MS (\222)958 1107 MS (o)974 1107 MS (b)1000 1107 MS (j)1025 1107 MS (e)1038 1107 MS (t)1060 1107 MS ( )1075 1107 MS (p)1090 1107 MS (a)1115 1107 MS (r)1137 1107 MS (a)1154 1107 MS (l)1177 1107 MS +(l)1190 1107 MS (\350)1203 1107 MS (l)1226 1107 MS (e)1240 1107 MS ( )1262 1107 MS (g)1277 1107 MS (\351)1302 1107 MS (n)1324 1107 MS (\351)1348 1107 MS (r)1370 1107 MS (i)1388 1107 MS (q)1401 1107 MS (u)1426 1107 MS (e)1451 1107 MS +( )1473 1107 MS +(:)1486 1107 MS ( )1500 1107 MS (B)1515 1107 MS (C)1548 1107 MS (a)1581 1107 MS (s)1603 1107 MS (t)1622 1107 MS (I)1637 1107 MS (O)1654 1107 MS (R)1690 1107 MS (\()1723 1107 MS (\))1740 1107 MS ( )1757 1107 MS (p)1772 1107 MS (o)1796 1107 MS (u)1822 1107 MS +(r)1847 1107 MS ( )1863 1107 MS (c)1878 1107 MS (o)1899 1107 MS (n)1925 1107 MS (s)1949 1107 MS (t)1968 1107 MS (i)1984 1107 MS (t)1996 1107 MS (u)2011 1107 MS (e)2036 1107 MS (r)2058 1107 MS ( )2075 1107 MS (l)2090 1107 MS (a)2102 1107 MS ( )2125 1107 MS +(l)235 1165 MS (i)249 1165 MS (s)262 1165 MS (t)281 1165 MS (e)296 1165 MS ( )318 1165 MS (I)348 1165 MS (O)365 1165 MS (R)401 1165 MS (T)434 1165 MS (a)465 1165 MS (b)487 1165 MS (.)511 1165 MS ( )524 1165 MS (A)554 1165 MS (i)590 1165 MS +(n)603 1165 MS (s)628 1165 MS (i)648 1165 MS (,)661 1165 MS ( )674 1165 MS (l)705 1165 MS (e)717 1165 MS ( )739 1165 MS (c)769 1165 MS (o)791 1165 MS (n)817 1165 MS (t)841 1165 MS (a)856 1165 MS (i)879 1165 MS (n)892 1165 MS (e)916 1165 MS +(r)938 1165 MS ( )955 1165 MS (p)985 1165 MS (a)1010 1165 MS (r)1032 1165 MS (a)1049 1165 MS (l)1072 1165 MS (l)1085 1165 MS (\350)1098 1165 MS (l)1121 1165 MS (e)1134 1165 MS ( )1156 1165 MS (e)1186 1165 MS (s)1208 1165 MS (t)1227 1165 MS ( )1242 1165 MS +(v)1272 1165 MS (u)1296 1165 MS ( )1321 1165 MS (p)1351 1165 MS (a)1376 1165 MS (r)1398 1165 MS ( )1415 1165 MS (l)1445 1165 MS (\222)1458 1165 MS (e)1474 1165 MS (x)1497 1165 MS (t)1521 1165 MS (\351)1536 1165 MS (r)1558 1165 MS (i)1576 1165 MS (e)1588 1165 MS +(u)1610 1165 MS (r)1635 1165 MS ( )1652 1165 MS (c)1682 1165 MS (o)1704 1165 MS (m)1730 1165 MS (m)1768 1165 MS (e)1806 1165 MS ( )1828 1165 MS (u)1858 1165 MS (n)1884 1165 MS ( )1908 1165 MS (c)1938 1165 MS (o)1960 1165 MS (n)1986 1165 MS (t)2010 1165 MS +(a)2025 1165 MS (i)2048 1165 MS (n)2061 1165 MS (e)2085 1165 MS (r)2107 1165 MS ( )2125 1165 MS +(s)235 1222 MS (\351)254 1222 MS (q)276 1222 MS (u)301 1222 MS (e)326 1222 MS (n)349 1222 MS (t)373 1222 MS (i)389 1222 MS (e)401 1222 MS (l)424 1222 MS (.)436 1222 MS ( )449 1222 MS (U)464 1222 MS (n)501 1222 MS ( )525 1222 MS (c)541 1222 MS +(l)564 1222 MS (i)577 1222 MS (e)590 1222 MS (n)613 1222 MS (t)637 1222 MS ( )652 1222 MS (q)667 1222 MS (u)692 1222 MS (i)718 1222 MS ( )731 1222 MS (a)746 1222 MS (c)768 1222 MS (t)790 1222 MS (i)806 1222 MS (v)819 1222 MS (e)843 1222 MS +( )865 1222 MS (u)880 1222 MS (n)906 1222 MS ( )930 1222 MS (s)946 1222 MS (e)965 1222 MS (r)987 1222 MS (v)1004 1222 MS (i)1029 1222 MS (c)1042 1222 MS (e)1065 1222 MS ( )1087 1222 MS (d)1102 1222 MS (\222)1127 1222 MS (u)1143 1222 MS (n)1169 1222 MS +( )1194 1222 MS (c)1209 1222 MS (o)1231 1222 MS (n)1257 1222 MS (t)1281 1222 MS (a)1296 1222 MS (i)1319 1222 MS (n)1332 1222 MS (e)1356 1222 MS (r)1378 1222 MS ( )1395 1222 MS (p)1410 1222 MS (a)1435 1222 MS (r)1457 1222 MS (a)1474 1222 MS (l)1497 1222 MS +(l)1511 1222 MS (\350)1524 1222 MS (l)1547 1222 MS (e)1560 1222 MS (,)1582 1222 MS ( )1595 1222 MS (a)1610 1222 MS (c)1632 1222 MS (t)1654 1222 MS (i)1670 1222 MS (v)1683 1222 MS (e)1707 1222 MS ( )1729 1222 MS (e)1744 1222 MS (n)1767 1222 MS ( )1791 1222 MS +(f)1807 1222 MS (a)1823 1222 MS (i)1846 1222 MS (t)1858 1222 MS ( )1873 1222 MS (u)1888 1222 MS (n)1914 1222 MS (i)1939 1222 MS (q)1952 1222 MS (u)1977 1222 MS (e)2002 1222 MS (m)2025 1222 MS (e)2063 1222 MS (n)2086 1222 MS (t)2110 1222 MS ( )2125 1222 MS +(l)235 1280 MS (e)248 1280 MS ( )270 1280 MS (s)285 1280 MS (e)304 1280 MS (r)326 1280 MS (v)344 1280 MS (i)369 1280 MS (c)382 1280 MS (e)404 1280 MS ( )426 1280 MS (c)440 1280 MS (o)462 1280 MS (r)488 1280 MS (r)505 1280 MS (e)522 1280 MS +(s)544 1280 MS (p)563 1280 MS (o)588 1280 MS (n)614 1280 MS (d)638 1280 MS (a)663 1280 MS (n)685 1280 MS (t)709 1280 MS ( )724 1280 MS (a)738 1280 MS (u)760 1280 MS ( )785 1280 MS (p)799 1280 MS (r)824 1280 MS (o)841 1280 MS (c)867 1280 MS +(e)889 1280 MS (s)911 1280 MS (s)930 1280 MS (u)949 1280 MS (s)974 1280 MS ( )993 1280 MS (0)1007 1280 MS (.)1032 1280 MS ( )1045 1280 MS (C)1059 1280 MS (\222)1093 1280 MS (e)1109 1280 MS (s)1132 1280 MS (t)1151 1280 MS ( )1166 1280 MS (l)1181 1280 MS +(e)1193 1280 MS ( )1215 1280 MS (s)1229 1280 MS (e)1249 1280 MS (r)1271 1280 MS (v)1288 1280 MS (i)1313 1280 MS (c)1326 1280 MS (e)1348 1280 MS ( )1370 1280 MS (a)1384 1280 MS (c)1407 1280 MS (t)1429 1280 MS (i)1444 1280 MS (v)1457 1280 MS (\351)1482 1280 MS +( )1504 1280 MS (d)1518 1280 MS (u)1543 1280 MS ( )1568 1280 MS (p)1582 1280 MS (r)1607 1280 MS (o)1624 1280 MS (c)1650 1280 MS (e)1672 1280 MS (s)1694 1280 MS (s)1713 1280 MS (u)1732 1280 MS (s)1757 1280 MS ( )1777 1280 MS (0)1791 1280 MS (,)1816 1280 MS +( )1829 1280 MS (q)1843 1280 MS (u)1868 1280 MS (i)1894 1280 MS ( )1906 1280 MS (v)1921 1280 MS (a)1945 1280 MS ( )1968 1280 MS (e)1982 1280 MS (n)2005 1280 MS (s)2029 1280 MS (u)2048 1280 MS (i)2074 1280 MS (t)2086 1280 MS (e)2102 1280 MS ( )2125 1280 MS +(a)235 1337 MS (c)257 1337 MS (t)279 1337 MS (i)294 1337 MS (v)307 1337 MS (e)331 1337 MS (r)353 1337 MS ( )370 1337 MS (l)384 1337 MS (e)397 1337 MS (s)420 1337 MS ( )439 1337 MS (s)452 1337 MS (e)471 1337 MS (r)493 1337 MS (v)511 1337 MS +(i)536 1337 MS (c)549 1337 MS (e)571 1337 MS (s)594 1337 MS ( )613 1337 MS (c)626 1337 MS (o)648 1337 MS (r)674 1337 MS (r)691 1337 MS (e)708 1337 MS (s)730 1337 MS (p)749 1337 MS (o)774 1337 MS (n)800 1337 MS (d)824 1337 MS (a)849 1337 MS +(n)871 1337 MS (t)895 1337 MS (s)910 1337 MS ( )929 1337 MS (d)942 1337 MS (e)967 1337 MS (s)989 1337 MS ( )1008 1337 MS (a)1022 1337 MS (u)1044 1337 MS (t)1069 1337 MS (r)1084 1337 MS (e)1101 1337 MS (s)1123 1337 MS ( )1142 1337 MS (p)1155 1337 MS +(r)1180 1337 MS (o)1197 1337 MS (c)1223 1337 MS (e)1244 1337 MS (s)1266 1337 MS (s)1285 1337 MS (u)1304 1337 MS (s)1330 1337 MS (.)1349 1337 MS ( )1362 1337 MS (I)1375 1337 MS (l)1393 1337 MS ( )1405 1337 MS (p)1418 1337 MS (o)1443 1337 MS (u)1469 1337 MS +(r)1494 1337 MS (r)1511 1337 MS (a)1528 1337 MS ( )1550 1337 MS (l)1563 1337 MS (e)1576 1337 MS ( )1598 1337 MS (f)1612 1337 MS (a)1627 1337 MS (i)1650 1337 MS (r)1663 1337 MS (e)1680 1337 MS ( )1702 1337 MS (v)1716 1337 MS (i)1741 1337 MS (a)1754 1337 MS +( )1777 1337 MS (l)1791 1337 MS (e)1804 1337 MS ( )1826 1337 MS (m)1840 1337 MS (\351)1878 1337 MS (c)1900 1337 MS (a)1922 1337 MS (n)1945 1337 MS (i)1970 1337 MS (s)1983 1337 MS (m)2003 1337 MS (e)2041 1337 MS ( )2064 1337 MS (d)2077 1337 MS (e)2102 1337 MS +( )2125 1337 MS +(C)235 1395 MS (O)268 1395 MS (R)304 1395 MS (B)337 1395 MS (A)371 1395 MS (,)406 1395 MS ( )419 1395 MS (p)436 1395 MS (u)461 1395 MS (i)487 1395 MS (s)500 1395 MS (q)520 1395 MS (u)545 1395 MS (\222)570 1395 MS (i)587 1395 MS (l)601 1395 MS +( )614 1395 MS (p)631 1395 MS (o)656 1395 MS (s)682 1395 MS (s)701 1395 MS (\350)721 1395 MS (d)743 1395 MS (e)768 1395 MS ( )790 1395 MS (l)808 1395 MS (a)821 1395 MS ( )844 1395 MS (l)862 1395 MS (i)876 1395 MS (s)889 1395 MS (t)908 1395 MS +(e)923 1395 MS ( )945 1395 MS (d)962 1395 MS (e)987 1395 MS (s)1009 1395 MS ( )1029 1395 MS (r)1046 1395 MS (\351)1063 1395 MS (f)1086 1395 MS (\351)1101 1395 MS (r)1123 1395 MS (e)1140 1395 MS (n)1163 1395 MS (c)1187 1395 MS (e)1210 1395 MS (s)1232 1395 MS +( )1252 1395 MS (C)1269 1395 MS (O)1302 1395 MS (R)1338 1395 MS (B)1372 1395 MS (A)1406 1395 MS ( )1441 1395 MS (d)1458 1395 MS (e)1483 1395 MS (s)1506 1395 MS ( )1525 1395 MS (a)1543 1395 MS (u)1565 1395 MS (t)1590 1395 MS (r)1605 1395 MS (e)1622 1395 MS +(s)1644 1395 MS ( )1663 1395 MS (p)1680 1395 MS (r)1705 1395 MS (o)1722 1395 MS (c)1748 1395 MS (e)1770 1395 MS (s)1792 1395 MS (s)1811 1395 MS (u)1830 1395 MS (s)1855 1395 MS (.)1874 1395 MS ( )1887 1395 MS (U)1904 1395 MS (n)1941 1395 MS ( )1965 1395 MS +(s)1983 1395 MS (e)2002 1395 MS (r)2024 1395 MS (v)2041 1395 MS (i)2066 1395 MS (c)2079 1395 MS (e)2102 1395 MS ( )2125 1395 MS +(q)235 1452 MS (u)260 1452 MS (e)285 1452 MS (l)308 1452 MS (c)320 1452 MS (o)342 1452 MS (n)368 1452 MS (q)392 1452 MS (u)417 1452 MS (e)442 1452 MS ( )464 1452 MS (d)477 1452 MS (u)502 1452 MS ( )527 1452 MS (p)540 1452 MS (r)565 1452 MS +(o)582 1452 MS (c)608 1452 MS (e)630 1452 MS (s)652 1452 MS (s)671 1452 MS (u)690 1452 MS (s)715 1452 MS ( )734 1452 MS (0)747 1452 MS ( )772 1452 MS (d)785 1452 MS (e)810 1452 MS (v)832 1452 MS (i)857 1452 MS (e)870 1452 MS (n)893 1452 MS +(t)917 1452 MS ( )932 1452 MS (a)945 1452 MS (i)968 1452 MS (n)981 1452 MS (s)1005 1452 MS (i)1025 1452 MS ( )1037 1452 MS (l)1051 1452 MS (e)1064 1452 MS ( )1086 1452 MS (c)1099 1452 MS (l)1122 1452 MS (i)1136 1452 MS (e)1149 1452 MS (n)1172 1452 MS +(t)1196 1452 MS ( )1211 1452 MS (p)1224 1452 MS (o)1248 1452 MS (u)1274 1452 MS (r)1299 1452 MS ( )1315 1452 MS (l)1328 1452 MS (e)1340 1452 MS ( )1362 1452 MS (m)1376 1452 MS (\352)1414 1452 MS (m)1437 1452 MS (e)1475 1452 MS ( )1497 1452 MS (s)1510 1452 MS +(e)1529 1452 MS (r)1551 1452 MS (v)1569 1452 MS (i)1594 1452 MS (c)1607 1452 MS (e)1629 1452 MS ( )1651 1452 MS (d)1664 1452 MS (e)1689 1452 MS (s)1711 1452 MS ( )1730 1452 MS (a)1743 1452 MS (u)1765 1452 MS (t)1790 1452 MS (r)1805 1452 MS (e)1822 1452 MS +(s)1844 1452 MS ( )1863 1452 MS (p)1876 1452 MS (r)1901 1452 MS (o)1917 1452 MS (c)1943 1452 MS (e)1965 1452 MS (s)1987 1452 MS (s)2006 1452 MS (u)2025 1452 MS (s)2050 1452 MS (.)2069 1452 MS +( )2082 1452 MS +( )348 1510 MS +(A)348 1567 MS (i)384 1567 MS (n)397 1567 MS (s)422 1567 MS (i)442 1567 MS (,)455 1567 MS ( )468 1567 MS (l)484 1567 MS (o)496 1567 MS (r)522 1567 MS (s)539 1567 MS (q)558 1567 MS (u)583 1567 MS (e)608 1567 MS ( )630 1567 MS (l)646 1567 MS +(e)658 1567 MS ( )680 1567 MS (c)695 1567 MS (o)717 1567 MS (n)743 1567 MS (t)767 1567 MS (a)782 1567 MS (i)805 1567 MS (n)818 1567 MS (e)842 1567 MS (r)864 1567 MS ( )881 1567 MS (p)896 1567 MS (a)921 1567 MS (r)943 1567 MS (a)960 1567 MS +(l)983 1567 MS (l)996 1567 MS (\350)1009 1567 MS (l)1032 1567 MS (e)1045 1567 MS ( )1067 1567 MS (e)1082 1567 MS (s)1105 1567 MS (t)1124 1567 MS ( )1139 1567 MS (a)1154 1567 MS (c)1176 1567 MS (t)1198 1567 MS (i)1213 1567 MS (v)1225 1567 MS (\351)1250 1567 MS +( )1272 1567 MS (p)1287 1567 MS (o)1312 1567 MS (u)1338 1567 MS (r)1362 1567 MS ( )1379 1567 MS (i)1394 1567 MS (n)1407 1567 MS (s)1432 1567 MS (t)1451 1567 MS (a)1466 1567 MS (n)1488 1567 MS (c)1512 1567 MS (i)1535 1567 MS (e)1548 1567 MS (r)1570 1567 MS +( )1587 1567 MS (u)1602 1567 MS (n)1627 1567 MS ( )1651 1567 MS (c)1666 1567 MS (o)1688 1567 MS (m)1715 1567 MS (p)1752 1567 MS (o)1777 1567 MS +(s)1803 1567 MS (a)1822 1567 MS (n)1845 1567 MS (t)1869 1567 MS ( )1884 1567 MS (p)1899 1567 MS (a)1924 1567 MS (r)1946 1567 MS (a)1963 1567 MS (l)1985 1567 MS (l)1998 1567 MS (\350)2011 1567 MS (l)2034 1567 MS (e)2047 1567 MS (,)2069 1567 MS ( )2082 1567 MS +(i)2098 1567 MS (l)2112 1567 MS ( )2125 1567 MS +(v)235 1625 MS (a)259 1625 MS ( )281 1625 MS (d)294 1625 MS (\222)319 1625 MS (a)336 1625 MS (b)359 1625 MS (o)383 1625 MS (r)409 1625 MS (d)426 1625 MS ( )451 1625 MS (d)464 1625 MS (e)489 1625 MS (m)511 1625 MS (a)548 1625 MS (n)571 1625 MS +(d)595 1625 MS (e)620 1625 MS (r)642 1625 MS ( )659 1625 MS (a)672 1625 MS (u)694 1625 MS (x)719 1625 MS ( )743 1625 MS (a)756 1625 MS (u)778 1625 MS (t)803 1625 MS (r)818 1625 MS (e)835 1625 MS (s)857 1625 MS ( )876 1625 MS (p)889 1625 MS +(r)914 1625 MS (o)931 1625 MS (c)957 1625 MS (e)979 1625 MS (s)1001 1625 MS (s)1020 1625 MS (u)1039 1625 MS (s)1064 1625 MS ( )1083 1625 MS (d)1096 1625 MS (\222)1121 1625 MS (i)1138 1625 MS (n)1151 1625 MS (s)1176 1625 MS (t)1195 1625 MS (a)1210 1625 MS +(n)1232 1625 MS (c)1257 1625 MS (i)1280 1625 MS (e)1292 1625 MS (r)1314 1625 MS ( )1331 1625 MS (l)1345 1625 MS (e)1358 1625 MS ( )1380 1625 MS (c)1393 1625 MS (o)1415 1625 MS (m)1441 1625 MS (p)1478 1625 MS (o)1503 1625 MS (s)1529 1625 MS (a)1548 1625 MS +(n)1571 1625 MS (t)1595 1625 MS (,)1610 1625 MS ( )1623 1625 MS (p)1636 1625 MS (u)1661 1625 MS (i)1686 1625 MS (s)1698 1625 MS ( )1717 1625 MS (i)1731 1625 MS (n)1744 1625 MS (s)1769 1625 MS (t)1788 1625 MS (a)1803 1625 MS (n)1825 1625 MS (c)1849 1625 MS +(i)1872 1625 MS (e)1885 1625 MS (r)1907 1625 MS ( )1924 1625 MS (l)1938 1625 MS (u)1950 1625 MS (i)1976 1625 MS ( )1989 1625 MS (m)2003 1625 MS (\352)2041 1625 MS (m)2064 1625 MS (e)2102 1625 MS ( )2125 1625 MS +(c)235 1682 MS (e)257 1682 MS ( )279 1682 MS (c)299 1682 MS (o)321 1682 MS (m)348 1682 MS (p)385 1682 MS (o)410 1682 MS (s)436 1682 MS (a)455 1682 MS (n)477 1682 MS (t)501 1682 MS (.)516 1682 MS ( )529 1682 MS (A)549 1682 MS (i)585 1682 MS +(n)598 1682 MS (s)623 1682 MS (i)644 1682 MS ( )657 1682 MS (u)677 1682 MS (n)703 1682 MS (e)727 1682 MS ( )749 1682 MS (c)770 1682 MS (o)792 1682 MS (l)818 1682 MS (l)831 1682 MS (e)844 1682 MS (c)867 1682 MS (t)889 1682 MS (i)905 1682 MS +(o)917 1682 MS (n)943 1682 MS ( )967 1682 MS (d)987 1682 MS (e)1012 1682 MS ( )1034 1682 MS (c)1055 1682 MS (o)1077 1682 MS (m)1103 1682 MS (p)1140 1682 MS (o)1165 1682 MS (s)1191 1682 MS (a)1210 1682 MS (n)1233 1682 MS (t)1258 1682 MS (s)1273 1682 MS +( )1292 1682 MS (i)1313 1682 MS (d)1325 1682 MS (e)1350 1682 MS (n)1373 1682 MS (t)1397 1682 MS (i)1413 1682 MS (q)1425 1682 MS (u)1450 1682 MS (e)1475 1682 MS (s)1497 1682 MS (,)1516 1682 MS ( )1529 1682 MS (i)1550 1682 MS (d)1563 1682 MS (e)1588 1682 MS +(n)1611 1682 MS (t)1635 1682 MS (i)1651 1682 MS (f)1664 1682 MS (i)1680 1682 MS (\351)1693 1682 MS (s)1716 1682 MS ( )1735 1682 MS (p)1755 1682 MS (a)1781 1682 MS (r)1803 1682 MS ( )1820 1682 MS (l)1841 1682 MS (e)1854 1682 MS (u)1876 1682 MS (r)1901 1682 MS +( )1918 1682 MS (r)1938 1682 MS (\351)1955 1682 MS (f)1978 1682 MS (\351)1993 1682 MS (r)2015 1682 MS (e)2032 1682 MS (n)2055 1682 MS (c)2079 1682 MS (e)2102 1682 MS ( )2125 1682 MS +(C)235 1740 MS (O)268 1740 MS (R)304 1740 MS (B)337 1740 MS (A)371 1740 MS (,)406 1740 MS ( )419 1740 MS (e)445 1740 MS (s)467 1740 MS (t)486 1740 MS ( )501 1740 MS (c)527 1740 MS (h)550 1740 MS (a)574 1740 MS (r)596 1740 MS (g)613 1740 MS +(\351)638 1740 MS (e)660 1740 MS ( )682 1740 MS (e)708 1740 MS (n)731 1740 MS ( )755 1740 MS (m)782 1740 MS (\351)820 1740 MS (m)843 1740 MS (o)880 1740 MS (i)907 1740 MS (r)919 1740 MS (e)937 1740 MS ( )959 1740 MS (s)985 1740 MS (u)1004 1740 MS +(r)1029 1740 MS ( )1046 1740 MS (l)1073 1740 MS (\222)1086 1740 MS (e)1103 1740 MS (n)1126 1740 MS (s)1150 1740 MS (e)1169 1740 MS (m)1192 1740 MS (b)1230 1740 MS (l)1256 1740 MS (e)1269 1740 MS ( )1291 1740 MS (d)1317 1740 MS (e)1342 1740 MS (s)1365 1740 MS +( )1384 1740 MS (p)1410 1740 MS (r)1435 1740 MS (o)1452 1740 MS (c)1478 1740 MS +(e)1500 1740 MS (s)1522 1740 MS (s)1541 1740 MS (u)1560 1740 MS (s)1585 1740 MS ( )1604 1740 MS (c)1630 1740 MS (o)1652 1740 MS (n)1678 1740 MS (s)1703 1740 MS (t)1722 1740 MS (i)1738 1740 MS (t)1750 1740 MS (u)1765 1740 MS (a)1790 1740 MS (n)1812 1740 MS +(t)1836 1740 MS ( )1851 1740 MS (l)1877 1740 MS (e)1890 1740 MS ( )1912 1740 MS (c)1938 1740 MS (o)1960 1740 MS (n)1986 1740 MS (t)2010 1740 MS (a)2025 1740 MS (i)2048 1740 MS (n)2061 1740 MS (e)2085 1740 MS (r)2107 1740 MS ( )2125 1740 MS +(p)235 1797 MS (a)260 1797 MS (r)282 1797 MS (a)299 1797 MS (l)322 1797 MS (l)335 1797 MS (\350)348 1797 MS (l)371 1797 MS (e)384 1797 MS (.)406 1797 MS ( )419 1797 MS (C)433 1797 MS (e)466 1797 MS (s)489 1797 MS ( )508 1797 MS (r)522 1797 MS +(\351)539 1797 MS (f)562 1797 MS (\351)578 1797 MS (r)600 1797 MS (e)617 1797 MS (n)639 1797 MS (c)664 1797 MS (e)686 1797 MS (s)708 1797 MS ( )727 1797 MS (C)742 1797 MS (O)775 1797 MS (R)811 1797 MS (B)844 1797 MS (A)878 1797 MS ( )914 1797 MS +(s)928 1797 MS (o)947 1797 MS (n)973 1797 MS (t)997 1797 MS ( )1012 1797 MS (\351)1026 1797 MS (c)1048 1797 MS (h)1071 1797 MS (a)1095 1797 MS (n)1118 1797 MS (g)1142 1797 MS (\351)1167 1797 MS (e)1189 1797 MS (s)1212 1797 MS ( )1231 1797 MS (e)1246 1797 MS +(n)1268 1797 MS (t)1292 1797 MS (r)1307 1797 MS (e)1324 1797 MS ( )1346 1797 MS (p)1360 1797 MS (r)1385 1797 MS (o)1402 1797 MS (c)1428 1797 MS (e)1450 1797 MS (s)1472 1797 MS (s)1491 1797 MS (u)1510 1797 MS (s)1535 1797 MS (,)1554 1797 MS ( )1567 1797 MS +(v)1581 1797 MS (i)1606 1797 MS (a)1619 1797 MS ( )1641 1797 MS (M)1656 1797 MS (P)1700 1797 MS (I)1728 1797 MS (,)1745 1797 MS ( )1758 1797 MS (p)1772 1797 MS (o)1797 1797 MS (u)1823 1797 MS (r)1847 1797 MS ( )1864 1797 MS (c)1878 1797 MS (o)1900 1797 MS +(n)1926 1797 MS (s)1950 1797 MS (t)1969 1797 MS (i)1984 1797 MS (t)1996 1797 MS (u)2011 1797 MS (e)2036 1797 MS (r)2058 1797 MS ( )2075 1797 MS (l)2090 1797 MS (a)2102 1797 MS ( )2125 1797 MS +(l)235 1855 MS (i)249 1855 MS (s)262 1855 MS (t)281 1855 MS (e)296 1855 MS ( )318 1855 MS (\253)347 1855 MS +( )371 1855 MS +(I)384 1855 MS (O)401 1855 MS (R)437 1855 MS (T)470 1855 MS (a)501 1855 MS (b)524 1855 MS +( )548 1855 MS +(\273)561 1855 MS ( )585 1855 MS (c)614 1855 MS (o)636 1855 MS (r)662 1855 MS (r)679 1855 MS (e)696 1855 MS (s)718 1855 MS (p)737 1855 MS (o)762 1855 MS (n)788 1855 MS (d)812 1855 MS (a)837 1855 MS (n)859 1855 MS (t)883 1855 MS ( )898 1855 MS +(a)927 1855 MS (u)949 1855 MS ( )974 1855 MS (c)1003 1855 MS (o)1025 1855 MS (m)1051 1855 MS (p)1088 1855 MS (o)1113 1855 MS (s)1139 1855 MS (a)1158 1855 MS (n)1181 1855 MS (t)1205 1855 MS ( )1220 1855 MS (p)1249 1855 MS (a)1274 1855 MS (r)1296 1855 MS +(a)1313 1855 MS (l)1336 1855 MS (l)1349 1855 MS (\350)1362 1855 MS (l)1385 1855 MS (e)1398 1855 MS ( )1420 1855 MS (a)1449 1855 MS (i)1472 1855 MS (n)1485 1855 MS (s)1510 1855 MS (i)1530 1855 MS ( )1543 1855 MS (f)1573 1855 MS (o)1588 1855 MS (r)1614 1855 MS +(m)1632 1855 MS (\351)1670 1855 MS (.)1692 1855 MS ( )1705 1855 MS (S)1734 1855 MS (e)1762 1855 MS (u)1784 1855 MS (l)1810 1855 MS (e)1822 1855 MS ( )1844 1855 MS (l)1874 1855 MS (a)1887 1855 MS ( )1909 1855 MS (r)1938 1855 MS (\351)1955 1855 MS (f)1978 1855 MS +(\351)1994 1855 MS (r)2016 1855 MS (e)2033 1855 MS (n)2056 1855 MS (c)2080 1855 MS (e)2102 1855 MS ( )2125 1855 MS +(C)235 1912 MS (O)268 1912 MS (R)304 1912 MS (B)337 1912 MS (A)371 1912 MS ( )407 1912 MS (d)425 1912 MS (u)450 1912 MS ( )475 1912 MS (c)493 1912 MS (o)515 1912 MS (m)542 1912 MS (p)579 1912 MS (o)604 1912 MS (s)630 1912 MS (a)649 1912 MS +(n)672 1912 MS (t)696 1912 MS ( )711 1912 MS (c)729 1912 MS (h)751 1912 MS (a)775 1912 MS (r)797 1912 MS (g)814 1912 MS (\351)839 1912 MS ( )862 1912 MS (s)880 1912 MS (u)899 1912 MS (r)924 1912 MS ( )941 1912 MS (l)960 1912 MS (e)973 1912 MS +( )995 1912 MS (p)1013 1912 MS (r)1038 1912 MS (o)1055 1912 MS (c)1081 1912 MS (e)1103 1912 MS (s)1125 1912 MS (s)1144 1912 MS (u)1163 1912 MS (s)1189 1912 MS ( )1208 1912 MS (0)1226 1912 MS ( )1252 1912 MS (e)1270 1912 MS (s)1292 1912 MS +(t)1311 1912 MS ( )1326 1912 MS (e)1344 1912 MS (n)1366 1912 MS (r)1390 1912 MS (e)1407 1912 MS (g)1429 1912 MS (i)1455 1912 MS (s)1468 1912 MS (t)1487 1912 MS (r)1502 1912 MS (\351)1519 1912 MS (e)1541 1912 MS ( )1563 1912 MS (a)1581 1912 MS (u)1603 1912 MS +( )1628 1912 MS (s)1647 1912 MS (e)1666 1912 MS (r)1688 1912 MS (v)1706 1912 MS (i)1731 1912 MS (c)1744 1912 MS (e)1766 1912 MS ( )1788 1912 MS (d)1806 1912 MS (e)1832 1912 MS ( )1854 1912 MS (n)1873 1912 MS (o)1897 1912 MS (m)1924 1912 MS (m)1962 1912 MS +(a)2000 1912 MS (g)2022 1912 MS (e)2047 1912 MS ( )2069 1912 MS (e)2088 1912 MS (t)2110 1912 MS ( )2125 1912 MS +(r)235 1970 MS (e)252 1970 MS (n)274 1970 MS (v)299 1970 MS (o)323 1970 MS (y)350 1970 MS (\351)373 1970 MS (e)395 1970 MS ( )417 1970 MS (a)430 1970 MS (u)452 1970 MS ( )477 1970 MS (c)490 1970 MS (l)513 1970 MS (i)526 1970 MS (e)539 1970 MS +(n)562 1970 MS (t)586 1970 MS (.)601 1970 MS +( )614 1970 MS +( )348 2027 MS +(I)348 2085 MS (l)366 2085 MS ( )378 2085 MS (e)396 2085 MS (n)419 2085 MS ( )444 2085 MS (v)463 2085 MS (a)487 2085 MS ( )509 2085 MS (d)527 2085 MS (e)552 2085 MS ( )575 2085 MS (m)594 2085 MS (\352)632 2085 MS (m)655 2085 MS (e)693 2085 MS +( )716 2085 MS (p)734 2085 MS (o)759 2085 MS (u)785 2085 MS (r)810 2085 MS ( )827 2085 MS (d)845 2085 MS (\351)870 2085 MS (t)892 2085 MS (r)906 2085 MS (u)923 2085 MS (i)948 2085 MS (r)960 2085 MS (e)977 2085 MS ( )1000 2085 MS (u)1018 2085 MS +(n)1043 2085 MS ( )1068 2085 MS (c)1086 2085 MS (o)1108 2085 MS (m)1135 2085 MS (p)1172 2085 MS (o)1197 2085 MS (s)1223 2085 MS (a)1242 2085 MS (n)1265 2085 MS (t)1289 2085 MS ( )1304 2085 MS (p)1322 2085 MS (a)1347 2085 MS (r)1369 2085 MS (a)1386 2085 MS +(l)1409 2085 MS (l)1422 2085 MS (\350)1435 2085 MS (l)1458 2085 MS (e)1471 2085 MS (.)1493 2085 MS ( )1506 2085 MS (L)1524 2085 MS (e)1555 2085 MS ( )1577 2085 MS (c)1595 2085 MS (l)1618 2085 MS (i)1632 2085 MS (e)1645 2085 MS (n)1668 2085 MS (t)1692 2085 MS +( )1707 2085 MS (a)1725 2085 MS (c)1747 2085 MS (t)1769 2085 MS (i)1785 2085 MS (v)1798 2085 MS (e)1822 2085 MS ( )1844 2085 MS (l)1863 2085 MS (e)1876 2085 MS ( )1899 2085 MS (s)1917 2085 MS (e)1936 2085 MS (r)1958 2085 MS (v)1976 2085 MS (i)2001 2085 MS +(c)2014 2085 MS (e)2036 2085 MS ( )2059 2085 MS (d)2077 2085 MS (e)2102 2085 MS ( )2125 2085 MS +(d)235 2142 MS (e)260 2142 MS (s)282 2142 MS (t)301 2142 MS (r)316 2142 MS (u)333 2142 MS (c)358 2142 MS (t)379 2142 MS (i)394 2142 MS (o)406 2142 MS (n)432 2142 MS ( )456 2142 MS (d)474 2142 MS (\222)500 2142 MS (u)516 2142 MS (n)542 2142 MS +( )566 2142 MS (c)584 2142 MS (o)606 2142 MS (m)633 2142 MS (p)670 2142 MS (o)695 2142 MS (s)721 2142 MS (a)740 2142 MS (n)762 2142 MS (t)786 2142 MS ( )801 2142 MS (d)819 2142 MS (u)844 2142 MS ( )869 2142 MS (c)887 2142 MS (o)909 2142 MS +(n)935 2142 MS (t)959 2142 MS (a)974 2142 MS (i)996 2142 MS (n)1009 2142 MS (e)1034 2142 MS (r)1056 2142 MS ( )1073 2142 MS (s)1091 2142 MS (i)1111 2142 MS (t)1123 2142 MS (u)1138 2142 MS (\351)1163 2142 MS ( )1185 2142 MS (s)1203 2142 MS (u)1222 2142 MS +(r)1248 2142 MS ( )1265 2142 MS (l)1283 2142 MS (e)1296 2142 MS ( )1318 2142 MS (p)1336 2142 MS (r)1361 2142 MS (o)1378 2142 MS (c)1404 2142 MS (e)1426 2142 MS (s)1448 2142 MS (s)1467 2142 MS (u)1486 2142 MS (s)1511 2142 MS ( )1530 2142 MS (0)1548 2142 MS +(.)1573 2142 MS ( )1586 2142 MS (C)1604 2142 MS (e)1637 2142 MS ( )1659 2142 MS (s)1677 2142 MS (e)1697 2142 MS (r)1719 2142 MS (v)1736 2142 MS (i)1761 2142 MS (c)1774 2142 MS (e)1796 2142 MS ( )1818 2142 MS (d)1836 2142 MS (e)1862 2142 MS ( )1884 2142 MS +(d)1902 2142 MS (e)1927 2142 MS (s)1949 2142 MS (t)1968 2142 MS (r)1983 2142 MS (u)2000 2142 MS (c)2025 2142 MS (t)2047 2142 MS (i)2062 2142 MS (o)2074 2142 MS (n)2100 2142 MS ( )2125 2142 MS +(a)235 2200 MS (c)257 2200 MS (t)279 2200 MS (i)294 2200 MS (v)307 2200 MS (e)331 2200 MS ( )353 2200 MS (a)368 2200 MS (l)391 2200 MS (o)403 2200 MS (r)429 2200 MS (s)446 2200 MS ( )465 2200 MS (l)481 2200 MS (e)494 2200 MS ( )516 2200 MS +(m)532 2200 MS (\352)569 2200 MS +(m)592 2200 MS (e)630 2200 MS ( )652 2200 MS (s)667 2200 MS (e)686 2200 MS (r)708 2200 MS (v)726 2200 MS (i)751 2200 MS (c)764 2200 MS (e)786 2200 MS ( )808 2200 MS (s)823 2200 MS (u)842 2200 MS (r)867 2200 MS ( )884 2200 MS (l)900 2200 MS +(e)913 2200 MS (s)935 2200 MS ( )954 2200 MS (a)969 2200 MS (u)991 2200 MS (t)1016 2200 MS (r)1031 2200 MS (e)1048 2200 MS (s)1070 2200 MS ( )1089 2200 MS (p)1104 2200 MS (r)1129 2200 MS (o)1145 2200 MS (c)1171 2200 MS (e)1193 2200 MS (s)1215 2200 MS +(s)1234 2200 MS (u)1253 2200 MS (s)1278 2200 MS (,)1297 2200 MS ( )1310 2200 MS (p)1325 2200 MS (u)1350 2200 MS (i)1375 2200 MS (s)1388 2200 MS (q)1407 2200 MS (u)1432 2200 MS (\222)1457 2200 MS (i)1474 2200 MS (l)1488 2200 MS ( )1501 2200 MS (p)1516 2200 MS +(o)1541 2200 MS (s)1567 2200 MS (s)1586 2200 MS (\350)1605 2200 MS (d)1627 2200 MS (e)1652 2200 MS ( )1674 2200 MS (l)1690 2200 MS (a)1703 2200 MS ( )1725 2200 MS (l)1741 2200 MS (i)1754 2200 MS (s)1767 2200 MS (t)1786 2200 MS (e)1801 2200 MS ( )1823 2200 MS +(d)1838 2200 MS (e)1863 2200 MS (s)1885 2200 MS ( )1904 2200 MS (r)1919 2200 MS (\351)1936 2200 MS (f)1959 2200 MS (\351)1974 2200 MS (r)1996 2200 MS (e)2013 2200 MS (n)2036 2200 MS (c)2060 2200 MS (e)2082 2200 MS (s)2105 2200 MS ( )2125 2200 MS +(d)235 2257 MS (e)260 2257 MS ( )282 2257 MS (c)295 2257 MS (e)317 2257 MS (s)339 2257 MS ( )358 2257 MS (o)371 2257 MS (b)397 2257 MS (j)422 2257 MS (e)434 2257 MS (t)456 2257 MS (s)471 2257 MS ( )490 2257 MS (C)503 2257 MS (O)536 2257 MS +(R)572 2257 MS (B)605 2257 MS (A)639 2257 MS (.)674 2257 MS +( )687 2257 MS +showpage +%%Page: 14 14 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (4)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(7)310 592 MS +( )347 592 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(L)400 592 MS (e)441 592 MS ( )478 592 MS (c)497 592 MS (o)534 592 MS (m)574 592 MS (p)634 592 MS (o)675 592 MS (s)716 592 MS (a)753 592 MS (n)790 592 MS (t)831 592 MS ( )852 592 MS (p)871 592 MS (a)910 592 MS (r)947 592 MS +(a)973 592 MS (l)1010 592 MS (l)1028 592 MS (\350)1047 592 MS (l)1084 592 MS (e)1103 592 MS +( )1140 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 667 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 724 MS (e)378 724 MS ( )400 724 MS (c)413 724 MS (o)435 724 MS (m)461 724 MS (p)498 724 MS (o)523 724 MS (s)549 724 MS (a)568 724 MS (n)591 724 MS (t)615 724 MS ( )630 724 MS (p)643 724 MS (a)668 724 MS (r)690 724 MS +(a)707 724 MS (l)729 724 MS (l)742 724 MS (\350)755 724 MS (l)778 724 MS (e)791 724 MS ( )813 724 MS (h)827 724 MS (\351)851 724 MS (r)873 724 MS (i)891 724 MS (t)903 724 MS (e)918 724 MS ( )940 724 MS (d)953 724 MS (u)978 724 MS +( )1003 724 MS (c)1016 724 MS (o)1038 724 MS (m)1064 724 MS (p)1101 724 MS (o)1126 724 MS (s)1152 724 MS (a)1171 724 MS (n)1193 724 MS (t)1217 724 MS ( )1232 724 MS (g)1245 724 MS (\351)1270 724 MS (n)1292 724 MS (\351)1316 724 MS (r)1338 724 MS +(i)1356 724 MS (q)1370 724 MS (u)1395 724 MS (e)1420 724 MS ( )1442 724 MS (S)1455 724 MS (A)1483 724 MS (L)1518 724 MS (O)1548 724 MS (M)1585 724 MS (E)1629 724 MS ( )1660 724 MS (e)1673 724 MS (t)1695 724 MS ( )1709 724 MS (d)1722 724 MS +(e)1747 724 MS ( )1769 724 MS (l)1782 724 MS (\222)1795 724 MS (o)1811 724 MS (b)1837 724 MS (j)1862 724 MS (e)1875 724 MS (t)1897 724 MS ( )1912 724 MS (p)1925 724 MS (a)1950 724 MS (r)1972 724 MS (a)1989 724 MS (l)2011 724 MS (l)2024 724 MS +(\350)2037 724 MS (l)2060 724 MS (e)2073 724 MS ( )2095 724 MS +(g)235 782 MS (\351)260 782 MS (n)282 782 MS (\351)306 782 MS (r)328 782 MS (i)346 782 MS (q)359 782 MS (u)384 782 MS (e)409 782 MS (.)431 782 MS +( )444 782 MS +( )235 839 MS +(L)348 897 MS (\222)378 897 MS (i)395 897 MS (n)408 897 MS (t)432 897 MS (e)447 897 MS (r)469 897 MS (f)487 897 MS (a)503 897 MS (c)525 897 MS (e)547 897 MS ( )569 897 MS (C)591 897 MS (O)624 897 MS (R)661 897 MS (B)694 897 MS +(A)728 897 MS ( )763 897 MS (d)785 897 MS (\222)810 897 MS (u)826 897 MS (n)852 897 MS ( )876 897 MS (c)898 897 MS (o)920 897 MS (m)947 897 MS (p)984 897 MS (o)1009 897 MS (s)1035 897 MS (a)1054 897 MS (n)1077 897 MS (t)1101 897 MS +( )1116 897 MS (p)1138 897 MS (a)1163 897 MS +(r)1185 897 MS (a)1202 897 MS (l)1225 897 MS (l)1238 897 MS (\350)1251 897 MS (l)1274 897 MS (e)1287 897 MS ( )1309 897 MS (e)1331 897 MS (s)1354 897 MS (t)1373 897 MS ( )1388 897 MS (b)1410 897 MS (i)1435 897 MS (e)1447 897 MS (n)1470 897 MS +( )1494 897 MS (s)1516 897 MS (\373)1535 897 MS (r)1560 897 MS ( )1577 897 MS (s)1599 897 MS (p)1618 897 MS (\351)1643 897 MS (c)1666 897 MS (i)1689 897 MS (f)1702 897 MS (i)1719 897 MS (q)1732 897 MS (u)1757 897 MS (e)1782 897 MS ( )1804 897 MS +(\340)1826 897 MS ( )1848 897 MS (l)1871 897 MS (a)1884 897 MS ( )1906 897 MS (n)1929 897 MS (a)1953 897 MS (t)1975 897 MS (u)1990 897 MS (r)2015 897 MS (e)2032 897 MS ( )2054 897 MS (d)2076 897 MS (u)2101 897 MS ( )2125 897 MS +(c)235 954 MS (o)257 954 MS (m)283 954 MS (p)320 954 MS (o)345 954 MS (s)371 954 MS (a)390 954 MS (n)413 954 MS (t)437 954 MS (.)452 954 MS ( )465 954 MS (C)485 954 MS (e)518 954 MS (p)540 954 MS (e)565 954 MS (n)587 954 MS +(d)611 954 MS (a)636 954 MS (n)659 954 MS (t)683 954 MS (,)698 954 MS ( )711 954 MS (o)730 954 MS (n)756 954 MS ( )780 954 MS (p)800 954 MS (e)825 954 MS (u)847 954 MS (t)872 954 MS ( )887 954 MS (t)906 954 MS (i)921 954 MS +(r)933 954 MS (e)950 954 MS (r)972 954 MS ( )989 954 MS (c)1009 954 MS (e)1031 954 MS (r)1053 954 MS (t)1070 954 MS (a)1085 954 MS (i)1107 954 MS (n)1120 954 MS (e)1145 954 MS (s)1167 954 MS ( )1186 954 MS (g)1206 954 MS (\351)1231 954 MS +(n)1254 954 MS (\351)1278 954 MS (r)1300 954 MS (a)1317 954 MS (l)1340 954 MS (i)1354 954 MS (t)1366 954 MS (\351)1381 954 MS (s)1403 954 MS ( )1422 954 MS (l)1443 954 MS (i)1457 954 MS (\351)1470 954 MS (e)1492 954 MS (s)1515 954 MS ( )1534 954 MS +(\340)1554 954 MS ( )1576 954 MS (l)1597 954 MS (a)1610 954 MS ( )1632 954 MS (n)1653 954 MS (a)1677 954 MS (t)1699 954 MS (u)1714 954 MS (r)1739 954 MS (e)1756 954 MS ( )1778 954 MS (d)1798 954 MS (u)1823 954 MS ( )1848 954 MS (p)1868 954 MS +(a)1893 954 MS (r)1915 954 MS (a)1932 954 MS (l)1955 954 MS (l)1968 954 MS (\351)1981 954 MS (l)2004 954 MS (i)2018 954 MS (s)2031 954 MS (m)2051 954 MS (e)2089 954 MS (.)2111 954 MS ( )2125 954 MS +(A)235 1012 MS (i)271 1012 MS (n)284 1012 MS (s)309 1012 MS (i)329 1012 MS (,)342 1012 MS ( )355 1012 MS (l)372 1012 MS (o)384 1012 MS (r)410 1012 MS (s)427 1012 MS (q)446 1012 MS (u)471 1012 MS (e)496 1012 MS ( )519 1012 MS (u)535 1012 MS +(n)561 1012 MS ( )585 1012 MS (s)602 1012 MS (e)621 1012 MS (r)643 1012 MS (v)660 1012 MS (i)685 1012 MS (c)698 1012 MS (e)721 1012 MS ( )743 1012 MS (d)759 1012 MS (o)784 1012 MS (n)810 1012 MS (n)835 1012 MS (\351)859 1012 MS ( )882 1012 MS +(d)898 1012 MS (\222)923 1012 MS (u)939 1012 MS (n)965 1012 MS ( )990 1012 MS (c)1006 1012 MS (o)1028 1012 MS (m)1055 1012 MS (p)1092 1012 MS (o)1117 1012 MS (s)1143 1012 MS (a)1162 1012 MS (n)1184 1012 MS (t)1208 1012 MS ( )1223 1012 MS (p)1240 1012 MS +(a)1265 1012 MS (r)1287 1012 MS (a)1304 1012 MS (l)1327 1012 MS (l)1340 1012 MS (\350)1353 1012 MS (l)1376 1012 MS (e)1389 1012 MS ( )1411 1012 MS (e)1428 1012 MS (s)1450 1012 MS (t)1469 1012 MS ( )1484 1012 MS (a)1500 1012 MS (c)1522 1012 MS (t)1544 1012 MS +(i)1560 1012 MS (v)1573 1012 MS (\351)1597 1012 MS ( )1619 1012 MS (p)1635 1012 MS (a)1660 1012 MS (r)1682 1012 MS ( )1699 1012 MS (u)1715 1012 MS (n)1741 1012 MS ( )1766 1012 MS (c)1782 1012 MS (l)1805 1012 MS (i)1819 1012 MS (e)1832 1012 MS (n)1855 1012 MS +(t)1879 1012 MS (,)1894 1012 MS ( )1907 1012 MS (c)1923 1012 MS (e)1945 1012 MS ( )1967 1012 MS (d)1983 1012 MS (e)2008 1012 MS (r)2030 1012 MS (n)2047 1012 MS (i)2072 1012 MS (e)2085 1012 MS (r)2107 1012 MS ( )2125 1012 MS +(c)235 1069 MS (o)257 1069 MS (n)283 1069 MS (n)307 1069 MS (a)331 1069 MS (\356)354 1069 MS (t)366 1069 MS ( )381 1069 MS (u)394 1069 MS (n)420 1069 MS (i)445 1069 MS (q)458 1069 MS (u)483 1069 MS (e)508 1069 MS (m)531 1069 MS (e)569 1069 MS +(n)592 1069 MS (t)616 1069 MS ( )631 1069 MS (l)644 1069 MS (a)656 1069 MS ( )678 1069 MS +(r)691 1069 MS (\351)708 1069 MS (f)731 1069 MS (\351)746 1069 MS (r)768 1069 MS (e)785 1069 MS (n)808 1069 MS (c)832 1069 MS (e)855 1069 MS ( )877 1069 MS (C)890 1069 MS (O)923 1069 MS (R)959 1069 MS (B)992 1069 MS (A)1026 1069 MS ( )1061 1069 MS +(d)1074 1069 MS (u)1099 1069 MS ( )1124 1069 MS (c)1137 1069 MS (o)1159 1069 MS (m)1185 1069 MS (p)1222 1069 MS (o)1248 1069 MS (s)1274 1069 MS (a)1293 1069 MS (n)1315 1069 MS (t)1339 1069 MS ( )1354 1069 MS (s)1367 1069 MS (i)1386 1069 MS (t)1398 1069 MS +(u)1413 1069 MS (\351)1438 1069 MS ( )1460 1069 MS (s)1473 1069 MS (u)1492 1069 MS (r)1517 1069 MS ( )1534 1069 MS (l)1547 1069 MS (e)1560 1069 MS ( )1582 1069 MS (p)1595 1069 MS (r)1620 1069 MS (o)1637 1069 MS (c)1663 1069 MS (e)1685 1069 MS (s)1707 1069 MS +(s)1726 1069 MS (u)1745 1069 MS (s)1770 1069 MS ( )1789 1069 MS (0)1802 1069 MS (.)1827 1069 MS ( )1840 1069 MS +( )1853 1069 MS +(D)348 1127 MS (o)384 1127 MS (n)410 1127 MS (c)434 1127 MS (,)456 1127 MS ( )469 1127 MS (s)491 1127 MS (e)510 1127 MS (u)532 1127 MS (l)558 1127 MS ( )570 1127 MS (l)593 1127 MS (e)606 1127 MS ( )628 1127 MS (s)650 1127 MS (e)669 1127 MS +(r)691 1127 MS (v)709 1127 MS (i)734 1127 MS (c)747 1127 MS (e)769 1127 MS ( )791 1127 MS (c)813 1127 MS (o)835 1127 MS (r)861 1127 MS (r)878 1127 MS (e)895 1127 MS (s)917 1127 MS (p)936 1127 MS (o)961 1127 MS (n)987 1127 MS (d)1011 1127 MS +(a)1036 1127 MS (n)1058 1127 MS (t)1082 1127 MS ( )1097 1127 MS (a)1119 1127 MS (u)1141 1127 MS ( )1166 1127 MS (p)1188 1127 MS (r)1213 1127 MS (o)1229 1127 MS (c)1255 1127 MS (e)1277 1127 MS (s)1299 1127 MS (s)1318 1127 MS (u)1337 1127 MS (s)1362 1127 MS +( )1381 1127 MS (0)1403 1127 MS ( )1428 1127 MS (s)1450 1127 MS (\222)1469 1127 MS (e)1485 1127 MS (x)1508 1127 MS (\351)1532 1127 MS (c)1554 1127 MS (u)1576 1127 MS (t)1601 1127 MS (e)1616 1127 MS (.)1638 1127 MS ( )1651 1127 MS (I)1673 1127 MS (l)1690 1127 MS +( )1702 1127 MS (f)1725 1127 MS (a)1740 1127 MS (u)1762 1127 MS (t)1787 1127 MS ( )1802 1127 MS (q)1824 1127 MS (u)1849 1127 MS (e)1874 1127 MS ( )1896 1127 MS (c)1918 1127 MS (e)1940 1127 MS ( )1962 1127 MS (s)1984 1127 MS (e)2003 1127 MS (r)2025 1127 MS +(v)2042 1127 MS (i)2067 1127 MS (c)2080 1127 MS (e)2102 1127 MS ( )2125 1127 MS +(a)235 1184 MS (c)257 1184 MS (t)279 1184 MS (i)294 1184 MS (v)307 1184 MS (e)331 1184 MS ( )354 1184 MS (l)375 1184 MS (e)388 1184 MS ( )410 1184 MS (m)431 1184 MS (\352)469 1184 MS (m)492 1184 MS (e)530 1184 MS ( )552 1184 MS (s)573 1184 MS +(e)592 1184 MS (r)614 1184 MS (v)632 1184 MS (i)657 1184 MS (c)670 1184 MS (e)692 1184 MS ( )714 1184 MS (d)734 1184 MS (u)759 1184 MS ( )784 1184 MS (c)805 1184 MS (o)827 1184 MS (m)853 1184 MS (p)890 1184 MS (o)915 1184 MS (s)941 1184 MS +(a)960 1184 MS (n)983 1184 MS (t)1007 1184 MS ( )1022 1184 MS (s)1042 1184 MS (i)1062 1184 MS (t)1074 1184 MS (u)1089 1184 MS (\351)1114 1184 MS ( )1136 1184 MS (s)1156 1184 MS (u)1175 1184 MS (r)1200 1184 MS ( )1217 1184 MS (l)1238 1184 MS (\222)1252 1184 MS +(e)1268 1184 MS (n)1291 1184 MS (s)1315 1184 MS (e)1334 1184 MS (m)1357 1184 MS (b)1395 1184 MS (l)1421 1184 MS (e)1434 1184 MS ( )1457 1184 MS (d)1477 1184 MS (e)1502 1184 MS (s)1524 1184 MS ( )1544 1184 MS (a)1564 1184 MS (u)1586 1184 MS (t)1611 1184 MS +(r)1626 1184 MS (e)1643 1184 MS (s)1665 1184 MS ( )1684 1184 MS (p)1704 1184 MS (r)1729 1184 MS (o)1746 1184 MS (c)1772 1184 MS (e)1794 1184 MS (s)1816 1184 MS (s)1835 1184 MS (u)1854 1184 MS (s)1879 1184 MS (.)1898 1184 MS ( )1911 1184 MS (I)1931 1184 MS +(l)1949 1184 MS ( )1961 1184 MS (p)1981 1184 MS (e)2006 1184 MS (u)2028 1184 MS (t)2053 1184 MS ( )2068 1184 MS (l)2089 1184 MS (e)2102 1184 MS ( )2125 1184 MS +(f)235 1242 MS (a)251 1242 MS (i)274 1242 MS (r)286 1242 MS (e)304 1242 MS (,)326 1242 MS ( )339 1242 MS (c)354 1242 MS (a)376 1242 MS (r)398 1242 MS ( )415 1242 MS (i)431 1242 MS (l)444 1242 MS ( )457 1242 MS (p)472 1242 MS (o)497 1242 MS +(s)523 1242 MS (s)542 1242 MS (\350)561 1242 MS (d)583 1242 MS (e)608 1242 MS ( )630 1242 MS (l)646 1242 MS (a)659 1242 MS ( )681 1242 MS +(l)697 1242 MS (i)711 1242 MS (s)724 1242 MS (t)743 1242 MS (e)758 1242 MS ( )780 1242 MS (d)795 1242 MS (e)820 1242 MS (s)842 1242 MS ( )861 1242 MS (r)876 1242 MS (\351)893 1242 MS (f)916 1242 MS (\351)931 1242 MS (r)953 1242 MS (e)970 1242 MS +(n)993 1242 MS (c)1018 1242 MS (e)1040 1242 MS (s)1062 1242 MS ( )1081 1242 MS (C)1096 1242 MS (O)1130 1242 MS (R)1166 1242 MS (B)1199 1242 MS (A)1233 1242 MS ( )1268 1242 MS (d)1283 1242 MS (e)1308 1242 MS ( )1330 1242 MS (c)1345 1242 MS (e)1368 1242 MS +(s)1390 1242 MS ( )1409 1242 MS (c)1424 1242 MS (o)1446 1242 MS (m)1473 1242 MS (p)1510 1242 MS (o)1535 1242 MS (s)1561 1242 MS (a)1580 1242 MS (n)1603 1242 MS (t)1627 1242 MS (s)1642 1242 MS (.)1661 1242 MS ( )1674 1242 MS (D)1689 1242 MS (e)1725 1242 MS +( )1747 1242 MS (p)1762 1242 MS (l)1788 1242 MS (u)1800 1242 MS (s)1825 1242 MS (,)1844 1242 MS ( )1857 1242 MS (p)1872 1242 MS (o)1897 1242 MS (u)1923 1242 MS (r)1948 1242 MS ( )1965 1242 MS (q)1980 1242 MS (u)2005 1242 MS (e)2030 1242 MS ( )2052 1242 MS +(c)2067 1242 MS (e)2089 1242 MS (t)2110 1242 MS ( )2125 1242 MS +(e)235 1299 MS (n)257 1299 MS (s)282 1299 MS (e)301 1299 MS (m)324 1299 MS (b)362 1299 MS (l)388 1299 MS (e)401 1299 MS ( )423 1299 MS (d)442 1299 MS (e)467 1299 MS ( )489 1299 MS (s)508 1299 MS (e)527 1299 MS (r)549 1299 MS (v)567 1299 MS +(i)592 1299 MS (c)605 1299 MS (e)627 1299 MS (s)649 1299 MS ( )668 1299 MS (i)688 1299 MS (d)701 1299 MS (e)726 1299 MS (n)749 1299 MS (t)773 1299 MS (i)789 1299 MS (q)801 1299 MS (u)826 1299 MS (e)851 1299 MS (s)874 1299 MS (,)893 1299 MS +( )906 1299 MS (s)925 1299 MS (\222)944 1299 MS (e)960 1299 MS (x)983 1299 MS (\351)1007 1299 MS (c)1030 1299 MS (u)1052 1299 MS (t)1077 1299 MS (e)1092 1299 MS (n)1114 1299 MS (t)1138 1299 MS ( )1153 1299 MS (e)1172 1299 MS (n)1194 1299 MS ( )1218 1299 MS +(p)1237 1299 MS (a)1262 1299 MS (r)1284 1299 MS (a)1301 1299 MS (l)1324 1299 MS (l)1337 1299 MS (\350)1350 1299 MS (l)1373 1299 MS (e)1386 1299 MS (,)1408 1299 MS ( )1421 1299 MS (l)1441 1299 MS (e)1453 1299 MS ( )1475 1299 MS (p)1494 1299 MS (r)1519 1299 MS +(o)1536 1299 MS (c)1562 1299 MS (e)1584 1299 MS (s)1606 1299 MS (s)1625 1299 MS (u)1644 1299 MS (s)1669 1299 MS ( )1688 1299 MS (0)1707 1299 MS ( )1732 1299 MS (d)1751 1299 MS (o)1776 1299 MS (i)1803 1299 MS (t)1815 1299 MS ( )1830 1299 MS (l)1849 1299 MS +(e)1861 1299 MS (s)1884 1299 MS ( )1903 1299 MS (a)1922 1299 MS (c)1944 1299 MS (t)1966 1299 MS (i)1982 1299 MS (v)1995 1299 MS (e)2019 1299 MS (r)2041 1299 MS ( )2058 1299 MS (e)2077 1299 MS (n)2100 1299 MS ( )2125 1299 MS +(m)235 1357 MS (o)272 1357 MS (d)298 1357 MS (e)323 1357 MS ( )345 1357 MS (a)362 1357 MS (s)385 1357 MS (y)405 1357 MS (n)429 1357 MS (c)454 1357 MS (h)477 1357 MS (r)501 1357 MS (o)518 1357 MS (n)544 1357 MS (e)568 1357 MS +( )590 1357 MS +(:)603 1357 MS ( )617 1357 MS (c)634 1357 MS (\222)656 1357 MS (e)672 1357 MS (s)695 1357 MS (t)714 1357 MS ( )729 1357 MS (\340)746 1357 MS ( )768 1357 MS (d)785 1357 MS (i)811 1357 MS (r)823 1357 MS (e)840 1357 MS ( )862 1357 MS (a)879 1357 MS +(c)901 1357 MS (t)923 1357 MS (i)939 1357 MS (v)952 1357 MS (e)976 1357 MS (r)998 1357 MS ( )1015 1357 MS (l)1033 1357 MS (e)1046 1357 MS ( )1068 1357 MS (s)1086 1357 MS (e)1105 1357 MS (r)1127 1357 MS (v)1144 1357 MS (i)1169 1357 MS (c)1182 1357 MS +(e)1205 1357 MS ( )1227 1357 MS (d)1245 1357 MS (e)1270 1357 MS (s)1292 1357 MS ( )1311 1357 MS (a)1328 1357 MS (u)1350 1357 MS (t)1375 1357 MS (r)1390 1357 MS (e)1407 1357 MS (s)1429 1357 MS ( )1448 1357 MS (p)1465 1357 MS (r)1490 1357 MS (o)1507 1357 MS +(c)1533 1357 MS (e)1555 1357 MS (s)1577 1357 MS (s)1596 1357 MS (u)1615 1357 MS (s)1640 1357 MS ( )1659 1357 MS (e)1676 1357 MS (t)1698 1357 MS ( )1713 1357 MS (c)1730 1357 MS (o)1752 1357 MS (n)1778 1357 MS (t)1802 1357 MS (i)1817 1357 MS (n)1830 1357 MS +(u)1854 1357 MS (e)1879 1357 MS (r)1901 1357 MS ( )1918 1357 MS (s)1935 1357 MS (a)1954 1357 MS ( )1976 1357 MS (p)1993 1357 MS (r)2018 1357 MS (o)2035 1357 MS (p)2061 1357 MS (r)2086 1357 MS (e)2103 1357 MS ( )2125 1357 MS +(e)235 1414 MS (x)257 1414 MS (\351)281 1414 MS (c)304 1414 MS (u)326 1414 MS (t)351 1414 MS (i)366 1414 MS (o)378 1414 MS (n)404 1414 MS ( )428 1414 MS (s)441 1414 MS (a)460 1414 MS (n)483 1414 MS (s)508 1414 MS ( )527 1414 MS (a)540 1414 MS +(t)562 1414 MS (t)576 1414 MS (e)591 1414 MS (n)613 1414 MS (d)637 1414 MS (r)662 1414 MS (e)679 1414 MS ( )701 1414 MS (q)714 1414 MS (u)739 1414 MS (e)764 1414 MS ( )786 1414 MS (l)799 1414 MS (e)812 1414 MS (s)834 1414 MS ( )853 1414 MS +(s)866 1414 MS (e)885 1414 MS (r)907 1414 MS (v)925 1414 MS (i)950 1414 MS (c)963 1414 MS (e)985 1414 MS (s)1008 1414 MS ( )1027 1414 MS (i)1041 1414 MS (n)1054 1414 MS (v)1079 1414 MS (o)1103 1414 MS (q)1129 1414 MS (u)1154 1414 MS (\351)1179 1414 MS +(s)1201 1414 MS ( )1220 1414 MS (n)1233 1414 MS (e)1258 1414 MS ( )1280 1414 MS (s)1293 1414 MS (o)1312 1414 MS (i)1338 1414 MS (t)1350 1414 MS ( )1365 1414 MS (t)1377 1414 MS (e)1392 1414 MS (r)1414 1414 MS (m)1431 1414 MS (i)1469 1414 MS (n)1482 1414 MS +(\351)1507 1414 MS (s)1530 1414 MS (.)1549 1414 MS ( )1562 1414 MS +( )1575 1414 MS +(A)348 1472 MS (i)384 1472 MS (n)397 1472 MS (s)422 1472 MS (i)442 1472 MS (,)455 1472 MS ( )468 1472 MS (u)489 1472 MS (n)515 1472 MS ( )539 1472 MS (s)560 1472 MS (e)579 1472 MS (r)601 1472 MS (v)619 1472 MS (i)644 1472 MS (c)657 1472 MS +(e)679 1472 MS ( )701 1472 MS (d)722 1472 MS (\222)747 1472 MS (u)763 1472 MS (n)789 1472 MS ( )813 1472 MS (c)834 1472 MS (o)856 1472 MS (m)883 1472 MS (p)920 1472 MS (o)945 1472 MS (s)971 1472 MS (a)990 1472 MS (n)1013 1472 MS (t)1037 1472 MS +( )1052 1472 MS (p)1073 1472 MS (a)1098 1472 MS (r)1120 1472 MS (a)1137 1472 MS (l)1159 1472 MS (l)1172 1472 MS (\350)1185 1472 MS (l)1208 1472 MS (e)1221 1472 MS ( )1243 1472 MS (d)1264 1472 MS (o)1289 1472 MS (i)1316 1472 MS (t)1328 1472 MS ( )1343 1472 MS +(n)1364 1472 MS (\351)1388 1472 MS (c)1410 1472 MS (e)1433 1472 MS (s)1455 1472 MS (s)1474 1472 MS (a)1494 1472 MS (i)1517 1472 MS (r)1529 1472 MS (e)1546 1472 MS (m)1569 1472 MS (e)1607 1472 MS (n)1630 1472 MS (t)1654 1472 MS ( )1669 1472 MS (\352)1690 1472 MS +(t)1712 1472 MS (r)1727 1472 MS (e)1744 1472 MS ( )1766 1472 MS (a)1787 1472 MS (s)1809 1472 MS (y)1828 1472 MS (n)1852 1472 MS (c)1877 1472 MS (h)1900 1472 MS (r)1924 1472 MS (o)1941 1472 MS (n)1967 1472 MS (e)1991 1472 MS ( )2013 1472 MS (\()2034 1472 MS +(n)2051 1472 MS (o)2075 1472 MS (n)2101 1472 MS ( )2125 1472 MS +(b)235 1529 MS (l)260 1529 MS (o)272 1529 MS (q)298 1529 MS (u)323 1529 MS (a)348 1529 MS (n)371 1529 MS (t)395 1529 MS (\))410 1529 MS (.)427 1529 MS ( )440 1529 MS (O)453 1529 MS (r)489 1529 MS (,)506 1529 MS ( )519 1529 MS (c)532 1529 MS +(e)554 1529 MS (l)576 1529 MS (a)589 1529 MS ( )611 1529 MS (n)625 1529 MS (\222)650 1529 MS (e)666 1529 MS (s)688 1529 MS (t)707 1529 MS ( )722 1529 MS (p)735 1529 MS (a)760 1529 MS (s)782 1529 MS ( )802 1529 MS (p)815 1529 MS (o)840 1529 MS +(s)866 1529 MS (s)885 1529 MS (i)905 1529 MS (b)918 1529 MS (l)943 1529 MS (e)956 1529 MS (,)978 1529 MS ( )991 1529 MS (s)1005 1529 MS (i)1025 1529 MS ( )1038 1529 MS (l)1052 1529 MS (e)1065 1529 MS ( )1087 1529 MS (s)1101 1529 MS (e)1120 1529 MS +(r)1142 1529 MS (v)1160 1529 MS (i)1185 1529 MS (c)1198 1529 MS (e)1220 1529 MS ( )1242 1529 MS (e)1256 1529 MS (n)1278 1529 MS ( )1303 1529 MS (q)1316 1529 MS (u)1341 1529 MS (e)1366 1529 MS (s)1388 1529 MS (t)1407 1529 MS (i)1423 1529 MS (o)1435 1529 MS +(n)1461 1529 MS ( )1485 1529 MS (d)1498 1529 MS (o)1523 1529 MS (i)1550 1529 MS (t)1562 1529 MS ( )1577 1529 MS (r)1590 1529 MS (e)1607 1529 MS (t)1629 1529 MS (o)1643 1529 MS (u)1669 1529 MS (r)1694 1529 MS (n)1711 1529 MS (e)1735 1529 MS (r)1757 1529 MS +( )1774 1529 MS (a)1787 1529 MS (u)1809 1529 MS ( )1834 1529 MS (c)1847 1529 MS (l)1870 1529 MS (i)1884 1529 MS (e)1897 1529 MS (n)1920 1529 MS (t)1944 1529 MS ( )1959 1529 MS (u)1972 1529 MS (n)1997 1529 MS (e)2021 1529 MS ( )2044 1529 MS (\()2057 1529 MS +(o)2074 1529 MS (u)2100 1529 MS ( )2125 1529 MS +(p)235 1586 MS (l)261 1586 MS (u)273 1586 MS (s)298 1586 MS +(i)318 1586 MS (e)331 1586 MS (u)353 1586 MS (r)378 1586 MS (s)396 1586 MS (\))415 1586 MS ( )432 1586 MS (d)448 1586 MS (o)473 1586 MS (n)499 1586 MS (n)523 1586 MS (\351)548 1586 MS (e)570 1586 MS (.)592 1586 MS ( )605 1586 MS (D)621 1586 MS +(a)657 1586 MS (n)680 1586 MS (s)704 1586 MS ( )724 1586 MS (c)740 1586 MS (e)762 1586 MS ( )784 1586 MS (d)800 1586 MS (e)826 1586 MS (r)848 1586 MS (n)865 1586 MS (i)890 1586 MS (e)903 1586 MS (r)925 1586 MS ( )942 1586 MS (c)958 1586 MS +(a)981 1586 MS (s)1003 1586 MS (,)1022 1586 MS ( )1035 1586 MS (l)1052 1586 MS (\222)1065 1586 MS (i)1082 1586 MS (n)1095 1586 MS (t)1119 1586 MS (e)1134 1586 MS (r)1156 1586 MS (f)1174 1586 MS (a)1190 1586 MS (c)1212 1586 MS (e)1234 1586 MS ( )1257 1586 MS +(C)1273 1586 MS (O)1306 1586 MS (R)1342 1586 MS (B)1375 1586 MS (A)1409 1586 MS ( )1445 1586 MS (d)1461 1586 MS (o)1486 1586 MS (i)1513 1586 MS (t)1525 1586 MS ( )1540 1586 MS (n)1556 1586 MS (\351)1580 1586 MS (c)1602 1586 MS (e)1625 1586 MS (s)1647 1586 MS +(s)1666 1586 MS (a)1686 1586 MS (i)1709 1586 MS (r)1721 1586 MS (e)1738 1586 MS (m)1761 1586 MS (e)1799 1586 MS (n)1822 1586 MS (t)1846 1586 MS ( )1861 1586 MS (d)1877 1586 MS (\351)1902 1586 MS (f)1925 1586 MS (i)1941 1586 MS (n)1954 1586 MS (i)1980 1586 MS +(r)1993 1586 MS ( )2010 1586 MS (d)2026 1586 MS (e)2051 1586 MS (u)2073 1586 MS (x)2100 1586 MS ( )2125 1586 MS +(s)235 1644 MS (e)254 1644 MS (r)276 1644 MS (v)293 1644 MS (i)318 1644 MS (c)331 1644 MS (e)354 1644 MS (s)376 1644 MS ( )395 1644 MS (d)416 1644 MS (i)442 1644 MS (f)455 1644 MS (f)472 1644 MS (\351)488 1644 MS (r)510 1644 MS (e)527 1644 MS +(n)550 1644 MS (t)574 1644 MS (s)589 1644 MS ( )608 1644 MS (p)629 1644 MS (o)654 1644 MS (u)680 1644 MS (r)704 1644 MS ( )721 1644 MS (r)742 1644 MS (\351)759 1644 MS (a)781 1644 MS (l)803 1644 MS (i)816 1644 MS (s)829 1644 MS (e)849 1644 MS +(r)871 1644 MS ( )888 1644 MS (l)910 1644 MS (a)922 1644 MS ( )944 1644 MS (m)966 1644 MS (\352)1004 1644 MS (m)1027 1644 MS (e)1065 1644 MS ( )1087 1644 MS (f)1109 1644 MS (o)1124 1644 MS (n)1150 1644 MS (c)1174 1644 MS (t)1196 1644 MS (i)1212 1644 MS +(o)1224 1644 MS (n)1250 1644 MS (.)1274 1644 MS ( )1287 1644 MS (L)1308 1644 MS (e)1338 1644 MS ( )1360 1644 MS (p)1381 1644 MS (r)1406 1644 MS (e)1423 1644 MS (m)1446 1644 MS (i)1484 1644 MS (e)1497 1644 MS (r)1519 1644 MS ( )1536 1644 MS (e)1557 1644 MS +(s)1579 1644 MS (t)1598 1644 MS ( )1613 1644 MS (s)1634 1644 MS (y)1654 1644 MS (n)1678 1644 MS (c)1702 1644 MS (h)1725 1644 MS (r)1749 1644 MS (o)1766 1644 MS (n)1792 1644 MS (e)1816 1644 MS ( )1838 1644 MS (\()1859 1644 MS (b)1876 1644 MS (l)1901 1644 MS +(o)1913 1644 MS (q)1939 1644 MS (u)1964 1644 MS (a)1990 1644 MS (n)2013 1644 MS (t)2037 1644 MS (\))2052 1644 MS ( )2069 1644 MS (e)2090 1644 MS (t)2111 1644 MS ( )2125 1644 MS +(r)235 1701 MS (e)252 1701 MS (t)274 1701 MS (o)288 1701 MS (u)314 1701 MS (r)338 1701 MS (n)355 1701 MS (e)379 1701 MS ( )401 1701 MS (a)420 1701 MS (u)442 1701 MS ( )467 1701 MS (c)486 1701 MS (l)509 1701 MS (i)522 1701 MS (e)535 1701 MS +(n)558 1701 MS (t)582 1701 MS ( )597 1701 MS (l)617 1701 MS (a)629 1701 MS ( )651 1701 MS (d)670 1701 MS (o)695 1701 MS (n)721 1701 MS (n)746 1701 MS (\351)771 1701 MS (e)793 1701 MS ( )815 1701 MS (p)834 1701 MS (a)859 1701 MS (r)881 1701 MS +(a)898 1701 MS (l)921 1701 MS (l)934 1701 MS (\350)947 1701 MS (l)970 1701 MS (e)983 1701 MS (.)1005 1701 MS ( )1018 1701 MS (I)1037 1701 MS (l)1055 1701 MS ( )1067 1701 MS (s)1087 1701 MS (\222)1107 1701 MS (e)1123 1701 MS (x)1146 1701 MS (\351)1170 1701 MS +(c)1192 1701 MS (u)1214 1701 MS (t)1239 1701 MS (e)1254 1701 MS ( )1276 1701 MS (s)1295 1701 MS (e)1314 1701 MS (u)1336 1701 MS (l)1362 1701 MS (e)1375 1701 MS (m)1398 1701 MS (e)1436 1701 MS (n)1459 1701 MS (t)1483 1701 MS ( )1498 1701 MS (s)1517 1701 MS +(u)1536 1701 MS (r)1561 1701 MS ( )1578 1701 MS (l)1597 1701 MS (e)1610 1701 MS ( )1632 1701 MS (p)1651 1701 MS (r)1676 1701 MS (o)1693 1701 MS (c)1719 1701 MS (e)1741 1701 MS (s)1763 1701 MS (s)1782 1701 MS (u)1801 1701 MS +(s)1826 1701 MS ( )1845 1701 MS (0)1864 1701 MS ( )1889 1701 MS (d)1908 1701 MS (u)1933 1701 MS ( )1958 1701 MS (s)1977 1701 MS (e)1996 1701 MS (r)2018 1701 MS (v)2036 1701 MS (e)2060 1701 MS (u)2082 1701 MS (r)2107 1701 MS ( )2125 1701 MS +(p)235 1759 MS (a)260 1759 MS (r)282 1759 MS (a)299 1759 MS (l)322 1759 MS (l)335 1759 MS (\350)348 1759 MS (l)371 1759 MS (e)384 1759 MS (.)406 1759 MS ( )419 1759 MS (L)434 1759 MS (e)464 1759 MS ( )486 1759 MS (s)501 1759 MS (e)520 1759 MS +(c)542 1759 MS (o)564 1759 MS (n)590 1759 MS (d)614 1759 MS ( )639 1759 MS (e)654 1759 MS (s)677 1759 MS (t)696 1759 MS ( )711 1759 MS (a)726 1759 MS (s)748 1759 MS (y)768 1759 MS (n)792 1759 MS (c)816 1759 MS (h)839 1759 MS (r)863 1759 MS +(o)880 1759 MS (n)906 1759 MS (e)930 1759 MS ( )952 1759 MS (\()967 1759 MS (n)984 1759 MS (o)1008 1759 MS (n)1034 1759 MS ( )1058 1759 MS (b)1074 1759 MS (l)1099 1759 MS (o)1111 1759 MS (q)1137 1759 MS (u)1162 1759 MS (a)1187 1759 MS (n)1210 1759 MS +(t)1234 1759 MS (\))1249 1759 MS +( )1266 1759 MS +(:)1279 1759 MS ( )1293 1759 MS (i)1308 1759 MS (l)1321 1759 MS ( )1333 1759 MS (s)1349 1759 MS (\222)1368 1759 MS (e)1384 1759 MS (x)1407 1759 MS (\351)1432 1759 MS (c)1454 1759 MS (u)1476 1759 MS (t)1501 1759 MS (e)1516 1759 MS ( )1538 1759 MS (s)1553 1759 MS +(u)1572 1759 MS (r)1597 1759 MS ( )1614 1759 MS (t)1628 1759 MS (o)1642 1759 MS (u)1668 1759 MS (s)1693 1759 MS ( )1712 1759 MS (l)1727 1759 MS (e)1739 1759 MS (s)1762 1759 MS ( )1781 1759 MS (a)1796 1759 MS (u)1818 1759 MS (t)1843 1759 MS (r)1858 1759 MS +(e)1875 1759 MS (s)1897 1759 MS ( )1916 1759 MS (p)1931 1759 MS (r)1956 1759 MS (o)1972 1759 MS (c)1998 1759 MS (e)2020 1759 MS (s)2042 1759 MS (s)2061 1759 MS (u)2080 1759 MS (s)2105 1759 MS ( )2125 1759 MS +(e)235 1816 MS (t)257 1816 MS ( )272 1816 MS (e)287 1816 MS (s)309 1816 MS (t)328 1816 MS ( )343 1816 MS (a)358 1816 MS (c)380 1816 MS (t)402 1816 MS (i)417 1816 MS (v)430 1816 MS (\351)454 1816 MS ( )476 1816 MS (u)491 1816 MS (n)517 1816 MS +(i)542 1816 MS (q)555 1816 MS (u)580 1816 MS (e)605 1816 MS (m)628 1816 MS (e)666 1816 MS (n)689 1816 MS (t)713 1816 MS ( )728 1816 MS (p)743 1816 MS (a)768 1816 MS (r)790 1816 MS ( )807 1816 MS (l)823 1816 MS (a)836 1816 MS ( )858 1816 MS +(f)874 1816 MS (o)889 1816 MS (n)916 1816 MS (c)940 1816 MS (t)962 1816 MS (i)978 1816 MS (o)990 1816 MS (n)1016 1816 MS ( )1040 1816 MS (s)1056 1816 MS (y)1076 1816 MS (n)1100 1816 MS (c)1125 1816 MS (h)1148 1816 MS (r)1172 1816 MS (o)1189 1816 MS +(n)1215 1816 MS (e)1239 1816 MS ( )1261 1816 MS (d)1276 1816 MS (u)1301 1816 MS ( )1326 1816 MS (p)1341 1816 MS (r)1366 1816 MS (o)1383 1816 MS (c)1409 1816 MS (e)1431 1816 MS (s)1453 1816 MS (s)1472 1816 MS (u)1491 1816 MS (s)1516 1816 MS ( )1536 1816 MS +(0)1551 1816 MS (.)1576 1816 MS ( )1589 1816 MS (S)1604 1816 MS (i)1633 1816 MS ( )1646 1816 MS (l)1662 1816 MS (e)1675 1816 MS ( )1697 1816 MS (s)1713 1816 MS (e)1732 1816 MS (r)1754 1816 MS (v)1771 1816 MS (i)1796 1816 MS (c)1809 1816 MS (e)1832 1816 MS +( )1854 1816 MS (r)1869 1816 MS (e)1886 1816 MS (t)1908 1816 MS (o)1923 1816 MS (u)1949 1816 MS (r)1973 1816 MS (n)1990 1816 MS (e)2014 1816 MS ( )2036 1816 MS (u)2051 1816 MS (n)2077 1816 MS (e)2102 1816 MS ( )2125 1816 MS +(d)235 1874 MS (o)260 1874 MS (n)286 1874 MS (n)310 1874 MS (\351)334 1874 MS (e)356 1874 MS ( )378 1874 MS (a)394 1874 MS (u)416 1874 MS ( )442 1874 MS (c)457 1874 MS (l)480 1874 MS (i)494 1874 MS (e)507 1874 MS (n)530 1874 MS (t)554 1874 MS +(,)569 1874 MS ( )582 1874 MS (c)597 1874 MS (e)619 1874 MS (l)642 1874 MS (l)655 1874 MS (e)668 1874 MS +(-)690 1874 MS +(c)707 1874 MS (i)730 1874 MS ( )743 1874 MS (e)758 1874 MS (s)781 1874 MS (t)800 1874 MS ( )815 1874 MS (u)830 1874 MS (n)855 1874 MS (e)879 1874 MS ( )902 1874 MS (d)917 1874 MS (o)942 1874 MS (n)968 1874 MS (n)993 1874 MS (\351)1017 1874 MS +(e)1039 1874 MS ( )1062 1874 MS (p)1077 1874 MS (a)1102 1874 MS (r)1124 1874 MS (a)1141 1874 MS (l)1164 1874 MS (l)1178 1874 MS (\350)1191 1874 MS (l)1214 1874 MS (e)1227 1874 MS +(.)1250 1874 MS ( )1263 1874 MS (C)1278 1874 MS (\222)1311 1874 MS (e)1327 1874 MS (s)1350 1874 MS (t)1369 1874 MS ( )1384 1874 MS (\340)1399 1874 MS ( )1421 1874 MS (d)1436 1874 MS (i)1462 1874 MS (r)1474 1874 MS (e)1491 1874 MS ( )1514 1874 MS (q)1529 1874 MS +(u)1554 1874 MS (e)1579 1874 MS ( )1602 1874 MS (c)1617 1874 MS (h)1640 1874 MS (a)1664 1874 MS (q)1686 1874 MS (u)1711 1874 MS (e)1736 1874 MS ( )1759 1874 MS (p)1774 1874 MS (r)1799 1874 MS (o)1816 1874 MS (c)1842 1874 MS (e)1864 1874 MS (s)1886 1874 MS +(s)1905 1874 MS (u)1924 1874 MS (s)1949 1874 MS ( )1969 1874 MS (c)1984 1874 MS (r)2006 1874 MS (\351)2023 1874 MS (e)2045 1874 MS ( )2067 1874 MS (s)2083 1874 MS (a)2102 1874 MS ( )2125 1874 MS +(p)235 1931 MS (r)260 1931 MS (o)277 1931 MS (p)303 1931 MS (r)327 1931 MS (e)344 1931 MS ( )366 1931 MS (d)387 1931 MS (o)412 1931 MS (n)438 1931 MS (n)462 1931 MS (\351)486 1931 MS (e)508 1931 MS ( )530 1931 MS (C)551 1931 MS (O)585 1931 MS +(R)621 1931 MS (B)654 1931 MS (A)688 1931 MS ( )724 1931 MS (e)745 1931 MS (t)767 1931 MS ( )782 1931 MS (e)803 1931 MS (n)825 1931 MS (v)850 1931 MS (o)874 1931 MS (i)901 1931 MS (e)913 1931 MS (,)935 1931 MS ( )948 1931 MS (v)970 1931 MS +(i)995 1931 MS (a)1008 1931 MS ( )1030 1931 MS (M)1051 1931 MS (P)1095 1931 MS (I)1123 1931 MS (,)1140 1931 MS ( )1153 1931 MS (a)1174 1931 MS (u)1196 1931 MS ( )1221 1931 MS (p)1243 1931 MS (r)1268 1931 MS (o)1285 1931 MS (c)1311 1931 MS (e)1333 1931 MS +(s)1355 1931 MS (s)1374 1931 MS (u)1393 1931 MS (s)1418 1931 MS ( )1437 1931 MS (0)1458 1931 MS ( )1483 1931 MS (l)1505 1931 MS (a)1518 1931 MS ( )1540 1931 MS (r)1561 1931 MS (\351)1578 1931 MS (f)1601 1931 MS (\351)1617 1931 MS (r)1639 1931 MS (e)1656 1931 MS +(n)1678 1931 MS (c)1703 1931 MS (e)1725 1931 MS ( )1747 1931 MS (C)1768 1931 MS (O)1801 1931 MS (R)1838 1931 MS (B)1871 1931 MS (A)1905 1931 MS ( )1940 1931 MS (d)1961 1931 MS (e)1986 1931 MS ( )2009 1931 MS (c)2030 1931 MS (e)2052 1931 MS (t)2074 1931 MS +(t)2089 1931 MS (e)2104 1931 MS ( )2125 1931 MS +(d)235 1989 MS (o)260 1989 MS (n)286 1989 MS (n)310 1989 MS (\351)334 1989 MS (e)356 1989 MS (.)378 1989 MS ( )391 1989 MS (U)404 1989 MS (n)441 1989 MS (e)465 1989 MS ( )487 1989 MS (f)501 1989 MS (o)516 1989 MS (i)543 1989 MS (s)556 1989 MS +( )575 1989 MS (q)588 1989 MS (u)613 1989 MS (e)638 1989 MS ( )660 1989 MS (l)674 1989 MS (e)687 1989 MS ( )709 1989 MS (p)722 1989 MS (r)747 1989 MS (o)764 1989 MS (c)790 1989 MS (e)812 1989 MS (s)834 1989 MS (s)853 1989 MS (u)872 1989 MS +(s)897 1989 MS ( )916 1989 MS (0)929 1989 MS ( )954 1989 MS (,)967 1989 MS ( )980 1989 MS (a)993 1989 MS ( )1015 1989 MS (r)1028 1989 MS (e)1045 1989 MS (\347)1067 1989 MS (u)1089 1989 MS ( )1114 1989 MS (l)1128 1989 MS (\222)1140 1989 MS (e)1156 1989 MS +(n)1179 1989 MS (s)1204 1989 MS (e)1223 1989 MS (m)1246 1989 MS (b)1284 1989 MS (l)1310 1989 MS (e)1323 1989 MS ( )1345 1989 MS (d)1358 1989 MS (e)1383 1989 MS (s)1405 1989 MS ( )1424 1989 MS (r)1437 1989 MS (\351)1454 1989 MS (f)1477 1989 MS (\351)1493 1989 MS +(r)1515 1989 MS (e)1532 1989 MS (n)1555 1989 MS (c)1579 1989 MS (e)1601 1989 MS (s)1624 1989 MS ( )1643 1989 MS (C)1656 1989 MS (O)1689 1989 MS (R)1725 1989 MS (B)1759 1989 MS (A)1793 1989 MS ( )1828 1989 MS (c)1841 1989 MS (o)1863 1989 MS (r)1889 1989 MS +(r)1906 1989 MS (e)1923 1989 MS (s)1945 1989 MS (p)1964 1989 MS (o)1989 1989 MS (n)2015 1989 MS (d)2039 1989 MS (a)2064 1989 MS (n)2086 1989 MS (t)2110 1989 MS ( )2125 1989 MS +(\340)235 2046 MS ( )257 2046 MS (l)271 2046 MS (a)283 2046 MS ( )305 2046 MS (d)318 2046 MS (o)343 2046 MS (n)369 2046 MS (n)393 2046 MS (\351)417 2046 MS (e)440 2046 MS ( )462 2046 MS (p)475 2046 MS (a)500 2046 MS (r)522 2046 MS (a)539 2046 MS +(l)562 2046 MS (l)575 2046 MS (\350)588 2046 MS (l)611 2046 MS (e)624 2046 MS ( )646 2046 MS (\()659 2046 MS (v)676 2046 MS (i)701 2046 MS (a)714 2046 MS ( )736 2046 MS (l)750 2046 MS (a)763 2046 MS ( )785 2046 MS (f)799 2046 MS (o)814 2046 MS +(n)840 2046 MS (c)864 2046 MS (t)886 2046 MS (i)902 2046 MS (o)914 2046 MS (n)940 2046 MS +( )964 2046 MS (B)977 2046 MS (C)1010 2046 MS (a)1043 2046 MS (s)1066 2046 MS (t)1085 2046 MS (I)1100 2046 MS (O)1117 2046 MS (R)1153 2046 MS (\()1186 2046 MS (\))1203 2046 MS (\))1220 2046 MS (,)1236 2046 MS ( )1248 2046 MS (i)1261 2046 MS (l)1274 2046 MS +( )1287 2046 MS (p)1300 2046 MS (e)1325 2046 MS (u)1347 2046 MS (t)1372 2046 MS ( )1387 2046 MS (l)1400 2046 MS (a)1412 2046 MS ( )1434 2046 MS (r)1447 2046 MS (e)1464 2046 MS (n)1487 2046 MS (v)1512 2046 MS (o)1536 2046 MS (y)1563 2046 MS (e)1586 2046 MS +(r)1608 2046 MS ( )1625 2046 MS (a)1638 2046 MS (u)1660 2046 MS ( )1685 2046 MS (c)1698 2046 MS (l)1721 2046 MS (i)1734 2046 MS (e)1747 2046 MS (n)1770 2046 MS (t)1794 2046 MS (.)1809 2046 MS +( )1822 2046 MS +( )235 2104 MS +showpage +%%Page: 15 15 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (5)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(8)310 592 MS +( )347 592 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(L)400 592 MS (a)441 592 MS ( )478 592 MS (d)497 592 MS (o)538 592 MS (n)578 592 MS (n)619 592 MS (\351)660 592 MS (e)697 592 MS ( )734 592 MS (p)753 592 MS (a)792 592 MS (r)829 592 MS (a)855 592 MS (l)891 592 MS (l)910 592 MS +(\350)929 592 MS (l)965 592 MS (e)984 592 MS +( )1021 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 667 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 724 MS (a)378 724 MS ( )400 724 MS (d)418 724 MS (o)443 724 MS (n)469 724 MS (n)494 724 MS (\351)518 724 MS (e)540 724 MS ( )562 724 MS (p)580 724 MS (a)605 724 MS (r)627 724 MS (a)644 724 MS (l)667 724 MS (l)681 724 MS +(\350)694 724 MS (l)717 724 MS (e)730 724 MS ( )752 724 MS (h)771 724 MS (\351)796 724 MS (r)818 724 MS (i)836 724 MS (t)848 724 MS (e)863 724 MS ( )885 724 MS (d)903 724 MS (e)928 724 MS ( )950 724 MS (l)969 724 MS (\222)982 724 MS +(o)998 724 MS (b)1024 724 MS (j)1049 724 MS (e)1062 724 MS (t)1084 724 MS ( )1099 724 MS (p)1117 724 MS (a)1142 724 MS (r)1164 724 MS (a)1181 724 MS (l)1204 724 MS (l)1217 724 MS (\350)1230 724 MS (l)1253 724 MS (e)1266 724 MS ( )1288 724 MS +(g)1306 724 MS (\351)1332 724 MS (n)1355 724 MS (\351)1379 724 MS (r)1401 724 MS (i)1419 724 MS (q)1432 724 MS (u)1457 724 MS (e)1482 724 MS (.)1504 724 MS ( )1517 724 MS (C)1535 724 MS (\222)1568 724 MS (e)1585 724 MS (s)1607 724 MS (t)1626 724 MS +( )1641 724 MS (u)1659 724 MS (n)1684 724 MS (e)1708 724 MS ( )1730 724 MS (c)1749 724 MS (o)1771 724 MS (l)1797 724 MS (l)1810 724 MS (e)1823 724 MS (c)1846 724 MS (t)1868 724 MS (i)1884 724 MS (o)1896 724 MS (n)1922 724 MS ( )1946 724 MS +(d)1964 724 MS (\222)1989 724 MS (o)2005 724 MS (b)2031 724 MS (j)2056 724 MS (e)2069 724 MS (t)2091 724 MS (s)2106 724 MS ( )2125 724 MS +(i)235 782 MS (d)248 782 MS (e)273 782 MS (n)296 782 MS (t)320 782 MS (i)336 782 MS (q)348 782 MS (u)373 782 MS (e)398 782 MS (s)420 782 MS ( )439 782 MS (d)453 782 MS (i)479 782 MS (s)492 782 MS (t)511 782 MS (r)526 782 MS +(i)544 782 MS (b)557 782 MS (u)581 782 MS (\351)606 782 MS (s)629 782 MS ( )648 782 MS (s)662 782 MS (u)681 782 MS (r)706 782 MS ( )723 782 MS (d)737 782 MS (i)763 782 MS (f)776 782 MS (f)792 782 MS (\351)808 782 MS (r)830 782 MS +(e)847 782 MS (n)870 782 MS (t)894 782 MS (s)909 782 MS ( )928 782 MS (p)942 782 MS (r)967 782 MS (o)984 782 MS (c)1010 782 MS (e)1032 782 MS (s)1054 782 MS (s)1073 782 MS (u)1092 782 MS (s)1117 782 MS (.)1136 782 MS ( )1149 782 MS +(S)1163 782 MS (o)1191 782 MS (n)1217 782 MS ( )1241 782 MS (i)1254 782 MS (n)1267 782 MS (t)1291 782 MS (e)1306 782 MS (r)1328 782 MS (f)1346 782 MS (a)1361 782 MS (c)1384 782 MS (e)1406 782 MS ( )1428 782 MS (C)1442 782 MS (O)1475 782 MS +(R)1511 782 MS (B)1545 782 MS (A)1579 782 MS ( )1614 782 MS (e)1628 782 MS (s)1650 782 MS (t)1669 782 MS ( )1684 782 MS (s)1698 782 MS (p)1717 782 MS (\351)1742 782 MS (c)1764 782 MS (i)1787 782 MS (f)1800 782 MS (i)1817 782 MS (q)1830 782 MS +(u)1855 782 MS (e)1880 782 MS ( )1902 782 MS (a)1916 782 MS (u)1938 782 MS ( )1963 782 MS (t)1977 782 MS (y)1992 782 MS (p)2015 782 MS (e)2041 782 MS ( )2063 782 MS (d)2077 782 MS (e)2102 782 MS ( )2125 782 MS +(l)235 839 MS (a)248 839 MS ( )271 839 MS (d)287 839 MS (o)312 839 MS +(n)338 839 MS (n)363 839 MS (\351)387 839 MS (e)409 839 MS (,)431 839 MS ( )444 839 MS (p)460 839 MS (a)485 839 MS (r)507 839 MS ( )524 839 MS (e)540 839 MS (x)563 839 MS (e)588 839 MS (m)611 839 MS (p)648 839 MS (l)674 839 MS +(e)687 839 MS ( )710 839 MS (u)726 839 MS (n)752 839 MS (e)776 839 MS ( )799 839 MS (s)815 839 MS (\351)834 839 MS (q)856 839 MS (u)881 839 MS (e)907 839 MS (n)930 839 MS (c)954 839 MS (e)976 839 MS ( )998 839 MS (d)1014 839 MS +(e)1040 839 MS ( )1062 839 MS (d)1078 839 MS (o)1103 839 MS (u)1129 839 MS (b)1154 839 MS (l)1179 839 MS (e)1192 839 MS (s)1215 839 MS ( )1234 839 MS (f)1251 839 MS (l)1268 839 MS (o)1280 839 MS (t)1306 839 MS (t)1320 839 MS (a)1335 839 MS +(n)1357 839 MS (t)1381 839 MS (s)1396 839 MS ( )1415 839 MS (p)1431 839 MS (o)1456 839 MS (u)1482 839 MS (r)1507 839 MS ( )1524 839 MS (u)1540 839 MS (n)1565 839 MS ( )1589 839 MS (v)1606 839 MS (e)1630 839 MS (c)1652 839 MS (t)1674 839 MS +(e)1689 839 MS (u)1711 839 MS (r)1736 839 MS (.)1753 839 MS ( )1766 839 MS (C)1782 839 MS (e)1815 839 MS (p)1837 839 MS (e)1862 839 MS (n)1885 839 MS (d)1909 839 MS (a)1934 839 MS (n)1957 839 MS (t)1981 839 MS (,)1996 839 MS ( )2009 839 MS +(i)2026 839 MS (l)2039 839 MS ( )2052 839 MS (e)2068 839 MS (s)2091 839 MS (t)2110 839 MS ( )2125 839 MS +(n)235 897 MS (\351)259 897 MS (c)281 897 MS (e)304 897 MS (s)326 897 MS (s)345 897 MS (a)365 897 MS (i)388 897 MS (r)400 897 MS (e)417 897 MS ( )439 897 MS (d)455 897 MS (e)480 897 MS ( )502 897 MS (s)518 897 MS (p)537 897 MS +(\351)562 897 MS (c)585 897 MS (i)608 897 MS (f)621 897 MS (i)638 897 MS (e)651 897 MS (r)673 897 MS ( )690 897 MS (c)706 897 MS (e)728 897 MS (r)750 897 MS (t)767 897 MS (a)782 897 MS (i)804 897 MS (n)817 897 MS (s)842 897 MS +( )861 897 MS (s)877 897 MS (e)896 897 MS (r)918 897 MS (v)936 897 MS (i)961 897 MS (c)974 897 MS (e)996 897 MS (s)1018 897 MS ( )1037 897 MS (q)1053 897 MS (u)1078 897 MS (i)1104 897 MS ( )1116 897 MS (p)1132 897 MS (e)1158 897 MS +(r)1180 897 MS (m)1198 897 MS (e)1235 897 MS (t)1258 897 MS (t)1272 897 MS (r)1286 897 MS (o)1302 897 MS (n)1328 897 MS (t)1352 897 MS ( )1367 897 MS (a)1383 897 MS (u)1405 897 MS ( )1430 897 MS (c)1446 897 MS (l)1468 897 MS (i)1481 897 MS +(e)1494 897 MS (n)1517 897 MS (t)1541 897 MS ( )1556 897 MS (d)1572 897 MS (\222)1597 897 MS (a)1613 897 MS (v)1635 897 MS (o)1659 897 MS (i)1686 897 MS (r)1698 897 MS ( )1715 897 MS (d)1731 897 MS (e)1756 897 MS (s)1778 897 MS ( )1797 897 MS +(r)1813 897 MS (e)1830 897 MS (n)1852 897 MS (s)1877 897 MS (e)1896 897 MS (i)1919 897 MS (g)1932 897 MS (n)1958 897 MS (e)1982 897 MS (m)2005 897 MS (e)2043 897 MS (n)2066 897 MS (t)2090 897 MS (s)2105 897 MS ( )2125 897 MS +(s)235 954 MS (u)254 954 MS (r)279 954 MS ( )296 954 MS (l)318 954 MS (a)330 954 MS ( )352 954 MS (d)373 954 MS (i)399 954 MS (s)412 954 MS (t)431 954 MS (r)446 954 MS (i)463 954 MS (b)476 954 MS (u)500 954 MS (t)525 954 MS +(i)541 954 MS (o)553 954 MS (n)579 954 MS ( )603 954 MS (d)624 954 MS (e)649 954 MS ( )671 954 MS (l)693 954 MS (\222)706 954 MS (o)722 954 MS (b)748 954 MS (j)773 954 MS (e)786 954 MS (t)808 954 MS ( )823 954 MS (p)844 954 MS +(a)869 954 MS (r)891 954 MS (a)908 954 MS (l)930 954 MS (l)943 954 MS (\350)956 954 MS (l)979 954 MS (e)992 954 MS ( )1014 954 MS (s)1035 954 MS (i)1055 954 MS (t)1067 954 MS (u)1082 954 MS (\351)1107 954 MS ( )1129 954 MS (s)1150 954 MS +(u)1169 954 MS (r)1194 954 MS ( )1211 954 MS (l)1233 954 MS (e)1246 954 MS ( )1268 954 MS (s)1289 954 MS (e)1308 954 MS (r)1330 954 MS (v)1347 954 MS (e)1371 954 MS (u)1393 954 MS (r)1418 954 MS (.)1435 954 MS ( )1448 954 MS (N)1469 954 MS +(o)1505 954 MS (t)1530 954 MS (a)1545 954 MS (m)1567 954 MS (m)1605 954 MS (e)1643 954 MS (n)1666 954 MS (t)1690 954 MS (,)1705 954 MS ( )1718 954 MS +(i)1739 954 MS (l)1752 954 MS ( )1764 954 MS (e)1785 954 MS (s)1808 954 MS (t)1827 954 MS ( )1842 954 MS (i)1863 954 MS (m)1876 954 MS (p)1914 954 MS (o)1939 954 MS (r)1965 954 MS (t)1982 954 MS (a)1997 954 MS (n)2019 954 MS (t)2043 954 MS +( )2057 954 MS (d)2078 954 MS (e)2103 954 MS ( )2125 954 MS +(p)235 1012 MS (o)260 1012 MS (u)286 1012 MS (v)311 1012 MS (o)335 1012 MS (i)361 1012 MS (r)373 1012 MS ( )390 1012 MS (r)414 1012 MS (\351)431 1012 MS (c)453 1012 MS (u)475 1012 MS (p)500 1012 MS (\351)525 1012 MS (r)547 1012 MS (e)564 1012 MS +(r)586 1012 MS ( )603 1012 MS (l)628 1012 MS (a)640 1012 MS ( )662 1012 MS (t)686 1012 MS (a)701 1012 MS (i)724 1012 MS (l)737 1012 MS (l)751 1012 MS (e)764 1012 MS ( )786 1012 MS (t)810 1012 MS (o)824 1012 MS (t)849 1012 MS (a)864 1012 MS +(l)886 1012 MS (e)899 1012 MS ( )921 1012 MS (d)945 1012 MS (e)970 1012 MS ( )992 1012 MS (l)1017 1012 MS (\222)1030 1012 MS (o)1046 1012 MS (b)1072 1012 MS (j)1097 1012 MS (e)1110 1012 MS (t)1132 1012 MS ( )1147 1012 MS (e)1171 1012 MS (t)1193 1012 MS +( )1208 1012 MS (s)1232 1012 MS (a)1250 1012 MS ( )1272 1012 MS (d)1296 1012 MS (i)1322 1012 MS (s)1334 1012 MS (t)1353 1012 MS (r)1368 1012 MS (i)1386 1012 MS (b)1399 1012 MS (u)1423 1012 MS (t)1448 1012 MS (i)1464 1012 MS (o)1476 1012 MS (n)1502 1012 MS +( )1526 1012 MS (s)1550 1012 MS (u)1569 1012 MS (r)1594 1012 MS ( )1611 1012 MS (l)1636 1012 MS (e)1648 1012 MS (s)1671 1012 MS ( )1690 1012 MS (d)1714 1012 MS (i)1740 1012 MS (f)1753 1012 MS (f)1770 1012 MS (\351)1786 1012 MS (r)1808 1012 MS (e)1825 1012 MS +(n)1848 1012 MS (t)1872 1012 MS (s)1887 1012 MS ( )1906 1012 MS (p)1930 1012 MS (r)1955 1012 MS (o)1972 1012 MS (c)1998 1012 MS (e)2020 1012 MS (s)2042 1012 MS (s)2061 1012 MS (u)2080 1012 MS (s)2105 1012 MS ( )2125 1012 MS +(c)235 1069 MS (o)257 1069 MS (n)283 1069 MS (t)307 1069 MS (e)322 1069 MS (n)344 1069 MS (a)368 1069 MS (n)390 1069 MS (t)414 1069 MS ( )429 1069 MS (l)443 1069 MS (e)455 1069 MS ( )477 1069 MS (c)490 1069 MS (o)512 1069 MS (m)538 1069 MS +(p)575 1069 MS (o)600 1069 MS (s)626 1069 MS (a)645 1069 MS (n)668 1069 MS (t)692 1069 MS ( )707 1069 MS (p)720 1069 MS (a)745 1069 MS (r)767 1069 MS (a)784 1069 MS (l)806 1069 MS (l)819 1069 MS (\350)832 1069 MS (l)855 1069 MS (e)868 1069 MS +( )890 1069 MS (q)903 1069 MS (u)928 1069 MS (i)954 1069 MS ( )966 1069 MS (a)980 1069 MS (b)1003 1069 MS (r)1027 1069 MS (i)1045 1069 MS (t)1057 1069 MS (e)1072 1069 MS ( )1094 1069 MS (l)1108 1069 MS (a)1120 1069 MS ( )1142 1069 MS (d)1155 1069 MS +(o)1180 1069 MS (n)1206 1069 MS (n)1230 1069 MS (\351)1255 1069 MS (e)1277 1069 MS (.)1299 1069 MS +( )1312 1069 MS +( )348 1127 MS +(L)348 1184 MS (e)378 1184 MS ( )400 1184 MS (c)420 1184 MS (l)443 1184 MS (i)457 1184 MS (e)470 1184 MS (n)493 1184 MS (t)517 1184 MS ( )532 1184 MS (q)552 1184 MS (u)577 1184 MS (i)602 1184 MS ( )614 1184 MS (v)635 1184 MS (e)660 1184 MS +(u)682 1184 MS (t)707 1184 MS ( )722 1184 MS (r)742 1184 MS (\351)759 1184 MS (c)781 1184 MS (u)803 1184 MS (p)828 1184 MS (\351)853 1184 MS (r)875 1184 MS (e)892 1184 MS (r)914 1184 MS ( )931 1184 MS (u)951 1184 MS (n)976 1184 MS (e)1000 1184 MS +( )1022 1184 MS (d)1042 1184 MS (o)1067 1184 MS (n)1093 1184 MS (n)1117 1184 MS (\351)1141 1184 MS (e)1163 1184 MS ( )1185 1184 MS (p)1205 1184 MS (a)1231 1184 MS (r)1253 1184 MS (a)1270 1184 MS (l)1293 1184 MS (l)1306 1184 MS (\350)1319 1184 MS (l)1342 1184 MS +(e)1356 1184 MS (,)1378 1184 MS ( )1391 1184 MS (p)1411 1184 MS (e)1436 1184 MS (u)1458 1184 MS (t)1483 1184 MS ( )1498 1184 MS (\352)1518 1184 MS (t)1539 1184 MS (r)1553 1184 MS (e)1570 1184 MS ( )1592 1184 MS (l)1612 1184 MS (u)1624 1184 MS (i)1650 1184 MS +( )1663 1184 MS (m)1684 1184 MS (\352)1722 1184 MS (m)1745 1184 MS (e)1783 1184 MS ( )1805 1184 MS (p)1825 1184 MS (a)1850 1184 MS (r)1872 1184 MS (a)1889 1184 MS (l)1912 1184 MS (l)1926 1184 MS (\350)1939 1184 MS (l)1962 1184 MS (e)1975 1184 MS (,)1997 1184 MS +( )2010 1184 MS (m)2031 1184 MS (a)2069 1184 MS (i)2092 1184 MS (s)2105 1184 MS ( )2125 1184 MS +(a)235 1242 MS (v)257 1242 MS (e)281 1242 MS (c)304 1242 MS ( )326 1242 MS (u)344 1242 MS (n)369 1242 MS ( )393 1242 MS (n)412 1242 MS (o)436 1242 MS (m)462 1242 MS (b)500 1242 MS (r)524 1242 MS (e)541 1242 MS ( )563 1242 MS (d)581 1242 MS +(e)606 1242 MS ( )628 1242 MS (p)646 1242 MS (r)671 1242 MS (o)688 1242 MS (c)714 1242 MS (e)736 1242 MS (s)758 1242 MS (s)777 1242 MS (u)796 1242 MS (s)821 1242 MS ( )840 1242 MS (d)858 1242 MS (i)884 1242 MS (f)897 1242 MS (f)914 1242 MS +(\351)930 1242 MS (r)952 1242 MS (e)969 1242 MS (n)992 1242 MS (t)1016 1242 MS (s)1031 1242 MS ( )1050 1242 MS (d)1068 1242 MS (u)1093 1242 MS ( )1118 1242 MS (s)1136 1242 MS (e)1155 1242 MS (r)1177 1242 MS (v)1194 1242 MS (e)1218 1242 MS (u)1240 1242 MS +(r)1265 1242 MS (.)1282 1242 MS ( )1295 1242 MS (L)1313 1242 MS (o)1342 1242 MS (r)1368 1242 MS (s)1385 1242 MS ( )1404 1242 MS (d)1422 1242 MS (u)1447 1242 MS ( )1471 1242 MS (t)1488 1242 MS (r)1503 1242 MS (a)1520 1242 MS (n)1542 1242 MS (s)1566 1242 MS +(f)1586 1242 MS (e)1601 1242 MS (r)1623 1242 MS (t)1640 1242 MS ( )1655 1242 MS (d)1673 1242 MS (e)1698 1242 MS (s)1720 1242 MS ( )1739 1242 MS (d)1757 1242 MS (o)1782 1242 MS (n)1808 1242 MS (n)1832 1242 MS (\351)1856 1242 MS (e)1878 1242 MS (s)1900 1242 MS +(,)1919 1242 MS ( )1932 1242 MS (i)1951 1242 MS (l)1964 1242 MS ( )1977 1242 MS (y)1996 1242 MS ( )2019 1242 MS (a)2037 1242 MS (u)2059 1242 MS (r)2084 1242 MS (a)2102 1242 MS ( )2125 1242 MS +(d)235 1299 MS (o)260 1299 MS (n)286 1299 MS (c)310 1299 MS ( )332 1299 MS (r)355 1299 MS (e)372 1299 MS (d)394 1299 MS (i)420 1299 MS (s)432 1299 MS (t)451 1299 MS (r)466 1299 MS (i)484 1299 MS (b)497 1299 MS (u)521 1299 MS (t)546 1299 MS +(i)561 1299 MS (o)573 1299 MS (n)599 1299 MS ( )623 1299 MS (d)646 1299 MS (e)672 1299 MS ( )694 1299 MS (l)718 1299 MS (\222)731 1299 MS (o)747 1299 MS (b)773 1299 MS (j)798 1299 MS (e)811 1299 MS (t)833 1299 MS (.)848 1299 MS ( )861 1299 MS +(I)884 1299 MS (l)901 1299 MS ( )913 1299 MS (f)937 1299 MS (a)953 1299 MS (u)975 1299 MS (t)1000 1299 MS ( )1015 1299 MS (q)1038 1299 MS (u)1063 1299 MS (e)1088 1299 MS ( )1110 1299 MS (c)1133 1299 MS (e)1155 1299 MS ( )1177 1299 MS (m)1201 1299 MS +(\351)1239 1299 MS (c)1261 1299 MS (a)1283 1299 MS (n)1306 1299 MS (i)1331 1299 MS (s)1344 1299 MS (m)1364 1299 MS (e)1402 1299 MS ( )1424 1299 MS (s)1447 1299 MS (o)1466 1299 MS (i)1493 1299 MS (t)1505 1299 MS ( )1520 1299 MS (o)1543 1299 MS (p)1569 1299 MS +(t)1593 1299 MS (i)1608 1299 MS (m)1621 1299 MS (a)1659 1299 MS (l)1682 1299 MS (,)1694 1299 MS ( )1707 1299 MS (c)1730 1299 MS (\222)1753 1299 MS (e)1769 1299 MS (s)1792 1299 MS (t)1811 1299 MS ( )1826 1299 MS (\340)1849 1299 MS ( )1871 1299 MS (d)1894 1299 MS +(i)1919 1299 MS (r)1931 1299 MS (e)1948 1299 MS ( )1970 1299 MS (q)1993 1299 MS (u)2018 1299 MS (e)2043 1299 MS ( )2065 1299 MS (l)2089 1299 MS (a)2102 1299 MS ( )2125 1299 MS +(d)235 1357 MS (o)260 1357 MS (n)286 1357 MS (n)310 1357 MS (\351)334 1357 MS (e)356 1357 MS ( )378 1357 MS (n)402 1357 MS (e)426 1357 MS ( )448 1357 MS (t)471 1357 MS (r)486 1357 MS (a)503 1357 MS (n)525 1357 MS (s)549 1357 MS (i)569 1357 MS +(t)581 1357 MS (e)596 1357 MS ( )618 1357 MS (q)641 1357 MS (u)666 1357 MS (\222)691 1357 MS (u)707 1357 MS (n)733 1357 MS (e)758 1357 MS ( )780 1357 MS (s)803 1357 MS (e)822 1357 MS (u)844 1357 MS (l)870 1357 MS (e)883 1357 MS ( )905 1357 MS +(f)929 1357 MS (o)944 1357 MS (i)971 1357 MS (s)984 1357 MS ( )1003 1357 MS (s)1026 1357 MS (u)1045 1357 MS (r)1070 1357 MS ( )1087 1357 MS (l)1111 1357 MS (e)1123 1357 MS ( )1145 1357 MS (r)1168 1357 MS (\351)1185 1357 MS (s)1207 1357 MS (e)1227 1357 MS +(a)1250 1357 MS (u)1272 1357 MS ( )1297 1357 MS (e)1320 1357 MS (t)1342 1357 MS ( )1357 1357 MS (q)1380 1357 MS (u)1405 1357 MS (e)1430 1357 MS ( )1452 1357 MS (c)1475 1357 MS (h)1497 1357 MS (a)1521 1357 MS (q)1543 1357 MS (u)1568 1357 MS (e)1593 1357 MS +( )1615 1357 MS (p)1638 1357 MS (r)1663 1357 MS (o)1679 1357 MS (c)1705 1357 MS (e)1727 1357 MS (s)1749 1357 MS (s)1768 1357 MS (u)1787 1357 MS +(s)1812 1357 MS ( )1831 1357 MS (c)1854 1357 MS (l)1877 1357 MS (i)1891 1357 MS (e)1904 1357 MS (n)1927 1357 MS (t)1951 1357 MS ( )1966 1357 MS (t)1989 1357 MS (i)2004 1357 MS (r)2016 1357 MS (e)2033 1357 MS ( )2055 1357 MS (e)2078 1357 MS (n)2100 1357 MS +( )2125 1357 MS +(p)235 1414 MS (a)260 1414 MS (r)282 1414 MS (a)299 1414 MS (l)322 1414 MS (l)335 1414 MS (\350)348 1414 MS (l)371 1414 MS (e)384 1414 MS ( )406 1414 MS (l)436 1414 MS (e)449 1414 MS (s)471 1414 MS ( )490 1414 MS (d)519 1414 MS (o)544 1414 MS +(n)570 1414 MS (n)595 1414 MS (\351)619 1414 MS (e)641 1414 MS (s)664 1414 MS ( )683 1414 MS (q)712 1414 MS (u)737 1414 MS (\222)762 1414 MS (i)779 1414 MS (l)793 1414 MS ( )805 1414 MS (a)834 1414 MS ( )856 1414 MS (b)886 1414 MS (e)910 1414 MS +(s)933 1414 MS (o)952 1414 MS (i)979 1414 MS (n)992 1414 MS ( )1016 1414 MS (e)1045 1414 MS (n)1067 1414 MS ( )1091 1414 MS (l)1121 1414 MS (o)1133 1414 MS (c)1159 1414 MS (a)1181 1414 MS (l)1204 1414 MS ( )1217 1414 MS (e)1247 1414 MS (t)1269 1414 MS +( )1284 1414 MS (u)1313 1414 MS (n)1338 1414 MS (i)1363 1414 MS (q)1375 1414 MS (u)1400 1414 MS (e)1425 1414 MS (m)1448 1414 MS (e)1486 1414 MS (n)1509 1414 MS (t)1533 1414 MS ( )1548 1414 MS (c)1577 1414 MS (e)1599 1414 MS (l)1622 1414 MS (l)1635 1414 MS +(e)1648 1414 MS (s)1670 1414 MS +(-)1689 1414 MS +(c)1706 1414 MS (i)1729 1414 MS (.)1741 1414 MS ( )1754 1414 MS (I)1783 1414 MS (l)1801 1414 MS ( )1813 1414 MS (n)1843 1414 MS (e)1867 1414 MS ( )1889 1414 MS (s)1918 1414 MS (\222)1938 1414 MS (a)1954 1414 MS (g)1976 1414 MS (i)2002 1414 MS (t)2014 1414 MS +( )2029 1414 MS (p)2058 1414 MS (a)2083 1414 MS (s)2105 1414 MS ( )2125 1414 MS +(d)235 1472 MS (\222)260 1472 MS (e)276 1472 MS (f)299 1472 MS (f)315 1472 MS (e)331 1472 MS (c)354 1472 MS (t)376 1472 MS (u)391 1472 MS (e)416 1472 MS (r)438 1472 MS ( )455 1472 MS (u)476 1472 MS (n)501 1472 MS (e)525 1472 MS ( )547 1472 MS +(r)568 1472 MS (e)585 1472 MS (d)607 1472 MS (i)633 1472 MS (s)646 1472 MS (t)665 1472 MS (r)680 1472 MS (i)697 1472 MS (b)710 1472 MS (u)734 1472 MS (t)759 1472 MS (i)775 1472 MS (o)787 1472 MS (n)813 1472 MS ( )837 1472 MS (s)858 1472 MS +(u)877 1472 MS (r)902 1472 MS ( )919 1472 MS (l)941 1472 MS (e)954 1472 MS (s)977 1472 MS ( )996 1472 MS (d)1017 1472 MS (i)1043 1472 MS (f)1056 1472 MS (f)1073 1472 MS (\351)1089 1472 MS (r)1111 1472 MS (e)1128 1472 MS (n)1151 1472 MS (t)1175 1472 MS +(s)1190 1472 MS ( )1209 1472 MS (p)1230 1472 MS (r)1255 1472 MS (o)1272 1472 MS (c)1298 1472 MS (e)1320 1472 MS (s)1342 1472 MS (s)1361 1472 MS (u)1380 1472 MS (s)1405 1472 MS ( )1424 1472 MS (d)1445 1472 MS (u)1470 1472 MS ( )1495 1472 MS (c)1516 1472 MS +(l)1539 1472 MS (i)1552 1472 MS (e)1565 1472 MS (n)1588 1472 MS (t)1612 1472 MS ( )1627 1472 MS (a)1648 1472 MS (p)1670 1472 MS (r)1695 1472 MS (\350)1712 1472 MS (s)1734 1472 MS ( )1753 1472 MS (l)1775 1472 MS (e)1788 1472 MS ( )1810 1472 MS (t)1831 1472 MS +(r)1846 1472 MS (a)1863 1472 MS (n)1885 1472 MS (s)1910 1472 MS (f)1930 1472 MS (e)1945 1472 MS (r)1967 1472 MS (t)1984 1472 MS ( )1999 1472 MS (d)2020 1472 MS (e)2045 1472 MS ( )2067 1472 MS (l)2089 1472 MS (a)2102 1472 MS ( )2125 1472 MS +(d)235 1529 MS (o)260 1529 MS (n)286 1529 MS (n)310 1529 MS (\351)334 1529 MS (e)356 1529 MS ( )378 1529 MS (p)396 1529 MS (a)421 1529 MS (r)443 1529 MS (a)460 1529 MS (l)483 1529 MS (l)497 1529 MS (\350)510 1529 MS (l)533 1529 MS (e)546 1529 MS +(.)568 1529 MS ( )581 1529 MS (C)599 1529 MS (e)632 1529 MS (c)654 1529 MS (i)677 1529 MS ( )690 1529 MS (e)708 1529 MS (s)730 1529 MS (t)749 1529 MS ( )764 1529 MS (f)782 1529 MS (a)798 1529 MS (i)821 1529 MS (s)834 1529 MS (a)853 1529 MS +(b)876 1529 MS (l)901 1529 MS (e)914 1529 MS ( )936 1529 MS (p)954 1529 MS (u)979 1529 MS (i)1005 1529 MS (s)1018 1529 MS (q)1037 1529 MS (u)1062 1529 MS (e)1087 1529 MS ( )1109 1529 MS (l)1128 1529 MS (e)1141 1529 MS ( )1163 1529 MS (c)1181 1529 MS +(l)1204 1529 MS (i)1218 1529 MS (e)1231 1529 MS (n)1254 1529 MS (t)1278 1529 MS ( )1293 1529 MS (\340)1311 1529 MS ( )1333 1529 MS +(a)1351 1529 MS (c)1373 1529 MS (c)1395 1529 MS (\350)1417 1529 MS (s)1439 1529 MS ( )1458 1529 MS (\340)1476 1529 MS ( )1498 1529 MS (l)1517 1529 MS (a)1529 1529 MS ( )1551 1529 MS (t)1569 1529 MS (a)1584 1529 MS (i)1607 1529 MS (l)1620 1529 MS (l)1634 1529 MS +(e)1647 1529 MS ( )1669 1529 MS (t)1687 1529 MS (o)1701 1529 MS (t)1726 1529 MS (a)1741 1529 MS (l)1763 1529 MS (e)1776 1529 MS ( )1798 1529 MS (d)1816 1529 MS (e)1841 1529 MS ( )1863 1529 MS (l)1882 1529 MS (\222)1895 1529 MS (o)1911 1529 MS (b)1937 1529 MS +(j)1962 1529 MS (e)1975 1529 MS (t)1997 1529 MS ( )2012 1529 MS (e)2030 1529 MS (t)2051 1529 MS ( )2066 1529 MS (s)2084 1529 MS (a)2103 1529 MS ( )2125 1529 MS +(d)235 1586 MS (i)261 1586 MS (s)273 1586 MS (t)292 1586 MS (r)307 1586 MS (i)325 1586 MS (b)338 1586 MS (u)362 1586 MS (t)387 1586 MS (i)403 1586 MS (o)415 1586 MS (n)441 1586 MS ( )465 1586 MS (s)488 1586 MS (u)507 1586 MS (r)532 1586 MS +( )549 1586 MS (l)573 1586 MS (e)585 1586 MS ( )607 1586 MS (s)631 1586 MS (e)650 1586 MS (r)672 1586 MS (v)690 1586 MS (e)714 1586 MS (u)736 1586 MS (r)761 1586 MS (.)778 1586 MS ( )791 1586 MS (C)814 1586 MS (h)847 1586 MS (a)871 1586 MS +(q)893 1586 MS (u)918 1586 MS (e)944 1586 MS ( )966 1586 MS (p)989 1586 MS (r)1014 1586 MS (o)1031 1586 MS (c)1057 1586 MS (e)1079 1586 MS (s)1101 1586 MS (s)1120 1586 MS (u)1139 1586 MS (s)1164 1586 MS ( )1183 1586 MS (d)1206 1586 MS (u)1231 1586 MS +( )1257 1586 MS (c)1280 1586 MS (l)1303 1586 MS (i)1316 1586 MS (e)1329 1586 MS (n)1352 1586 MS (t)1376 1586 MS ( )1391 1586 MS (s)1414 1586 MS (e)1433 1586 MS (r)1455 1586 MS (a)1472 1586 MS ( )1494 1586 MS (d)1517 1586 MS (o)1542 1586 MS (n)1568 1586 MS +(c)1592 1586 MS ( )1614 1586 MS (c)1637 1586 MS (a)1659 1586 MS (p)1681 1586 MS (a)1706 1586 MS (b)1729 1586 MS (l)1754 1586 MS (e)1767 1586 MS ( )1789 1586 MS (d)1812 1586 MS (e)1837 1586 MS ( )1859 1586 MS (d)1882 1586 MS (e)1907 1586 MS (m)1930 1586 MS +(a)1968 1586 MS (n)1991 1586 MS (d)2015 1586 MS (e)2040 1586 MS (r)2062 1586 MS ( )2079 1586 MS (\340)2102 1586 MS ( )2125 1586 MS +(c)235 1644 MS (h)257 1644 MS (a)281 1644 MS (q)303 1644 MS (u)328 1644 MS (e)354 1644 MS ( )376 1644 MS (p)389 1644 MS (r)414 1644 MS (o)431 1644 MS (c)457 1644 MS (e)479 1644 MS (s)501 1644 MS (s)520 1644 MS (u)539 1644 MS (s)564 1644 MS +( )583 1644 MS (d)596 1644 MS (u)621 1644 MS ( )646 1644 MS (s)659 1644 MS (e)678 1644 MS (r)700 1644 MS (v)717 1644 MS (e)741 1644 MS (u)763 1644 MS (r)788 1644 MS ( )805 1644 MS (l)819 1644 MS (e)831 1644 MS (s)854 1644 MS ( )873 1644 MS +(d)886 1644 MS (o)911 1644 MS (n)937 1644 MS (n)961 1644 MS (\351)985 1644 MS (e)1007 1644 MS (s)1030 1644 MS ( )1049 1644 MS (l)1063 1644 MS (o)1075 1644 MS (c)1101 1644 MS (a)1123 1644 MS (l)1146 1644 MS (e)1159 1644 MS (s)1181 1644 MS ( )1200 1644 MS +(d)1213 1644 MS (o)1239 1644 MS (n)1265 1644 MS (t)1289 1644 MS ( )1303 1644 MS (i)1316 1644 MS (l)1329 1644 MS ( )1342 1644 MS (a)1355 1644 MS ( )1377 1644 MS (b)1390 1644 MS (e)1415 1644 MS (s)1437 1644 MS (o)1456 1644 MS (i)1483 1644 MS (n)1496 1644 MS +( )1520 1644 MS (e)1533 1644 MS (t)1555 1644 MS ( )1570 1644 MS (u)1583 1644 MS (n)1608 1644 MS (i)1633 1644 MS (q)1645 1644 MS (u)1670 1644 MS (e)1695 1644 MS (m)1718 1644 MS (e)1756 1644 MS (n)1779 1644 MS (t)1803 1644 MS ( )1818 1644 MS (c)1831 1644 MS +(e)1853 1644 MS (l)1876 1644 MS (l)1889 1644 MS (e)1902 1644 MS (s)1924 1644 MS +(-)1943 1644 MS +(c)1960 1644 MS (i)1983 1644 MS (.)1995 1644 MS +( )2008 1644 MS +( )348 1701 MS +(O)348 1759 MS (n)384 1759 MS ( )408 1759 MS (p)426 1759 MS (o)451 1759 MS (u)477 1759 MS (r)502 1759 MS (r)519 1759 MS (a)536 1759 MS (i)558 1759 MS (t)570 1759 MS ( )585 1759 MS (i)604 1759 MS (m)617 1759 MS (a)655 1759 MS (g)677 1759 MS +(i)703 1759 MS (n)716 1759 MS (e)741 1759 MS (r)763 1759 MS ( )780 1759 MS (u)798 1759 MS (n)823 1759 MS (e)847 1759 MS ( )869 1759 MS (a)887 1759 MS (u)909 1759 MS (t)934 1759 MS (r)949 1759 MS (e)966 1759 MS ( )988 1759 MS (f)1006 1759 MS +(a)1022 1759 MS (\347)1044 1759 MS (o)1066 1759 MS +(n)1092 1759 MS ( )1116 1759 MS (d)1134 1759 MS (e)1159 1759 MS ( )1181 1759 MS (t)1199 1759 MS (r)1214 1759 MS (a)1231 1759 MS (n)1253 1759 MS (s)1277 1759 MS (f)1297 1759 MS (\351)1312 1759 MS (r)1334 1759 MS (e)1352 1759 MS (r)1374 1759 MS ( )1391 1759 MS +(l)1409 1759 MS (e)1422 1759 MS (s)1444 1759 MS ( )1463 1759 MS (d)1481 1759 MS (o)1506 1759 MS (n)1532 1759 MS (n)1557 1759 MS (\351)1581 1759 MS (e)1603 1759 MS (s)1626 1759 MS +( )1645 1759 MS +(:)1658 1759 MS ( )1672 1759 MS (a)1690 1759 MS (u)1712 1759 MS ( )1737 1759 MS (l)1755 1759 MS (i)1768 1759 MS (e)1781 1759 MS (u)1804 1759 MS ( )1829 1759 MS (q)1847 1759 MS (u)1872 1759 MS (e)1897 1759 MS ( )1919 1759 MS (c)1937 1759 MS (e)1959 1759 MS +( )1981 1759 MS (s)1999 1759 MS (o)2018 1759 MS (i)2045 1759 MS (t)2057 1759 MS ( )2072 1759 MS (l)2090 1759 MS (e)2102 1759 MS ( )2125 1759 MS +(c)235 1816 MS (l)258 1816 MS (i)271 1816 MS (e)284 1816 MS (n)307 1816 MS (t)331 1816 MS ( )346 1816 MS (q)370 1816 MS (u)395 1816 MS (i)421 1816 MS ( )433 1816 MS (s)457 1816 MS (\351)476 1816 MS (l)499 1816 MS (e)512 1816 MS (c)534 1816 MS +(t)556 1816 MS (i)572 1816 MS (o)584 1816 MS (n)610 1816 MS (n)635 1816 MS (e)659 1816 MS ( )681 1816 MS (l)706 1816 MS (e)719 1816 MS (s)741 1816 MS ( )760 1816 MS (v)785 1816 MS (a)809 1816 MS (l)832 1816 MS (e)845 1816 MS (u)867 1816 MS +(r)892 1816 MS (s)909 1816 MS ( )928 1816 MS (d)952 1816 MS (o)977 1816 MS (n)1003 1816 MS (t)1027 1816 MS ( )1042 1816 MS (i)1066 1816 MS (l)1079 1816 MS ( )1092 1816 MS (a)1116 1816 MS ( )1138 1816 MS (b)1162 1816 MS (e)1187 1816 MS (s)1209 1816 MS +(o)1228 1816 MS (i)1254 1816 MS (n)1267 1816 MS ( )1292 1816 MS (e)1316 1816 MS (n)1339 1816 MS ( )1363 1816 MS (f)1388 1816 MS (o)1403 1816 MS (n)1429 1816 MS (c)1453 1816 MS (t)1475 1816 MS (i)1491 1816 MS (o)1503 1816 MS (n)1529 1816 MS ( )1553 1816 MS +(d)1577 1816 MS (e)1602 1816 MS ( )1624 1816 MS (l)1649 1816 MS (e)1661 1816 MS (u)1683 1816 MS (r)1708 1816 MS ( )1725 1816 MS (d)1749 1816 MS (i)1775 1816 MS (s)1788 1816 MS (t)1807 1816 MS (r)1822 1816 MS (i)1839 1816 MS (b)1852 1816 MS (u)1876 1816 MS +(t)1901 1816 MS (i)1917 1816 MS (o)1929 1816 MS (n)1955 1816 MS ( )1979 1816 MS (s)2003 1816 MS (u)2022 1816 MS (r)2047 1816 MS ( )2064 1816 MS (l)2089 1816 MS (e)2102 1816 MS ( )2125 1816 MS +(s)235 1874 MS (e)254 1874 MS (r)276 1874 MS (v)293 1874 MS (e)317 1874 MS (u)339 1874 MS (r)364 1874 MS (,)381 1874 MS ( )394 1874 MS (o)411 1874 MS (n)437 1874 MS ( )461 1874 MS (a)478 1874 MS (u)500 1874 MS (r)525 1874 MS (a)542 1874 MS +(i)565 1874 MS (t)577 1874 MS ( )592 1874 MS (p)609 1874 MS (u)634 1874 MS ( )659 1874 MS (f)677 1874 MS (a)692 1874 MS (i)715 1874 MS (r)727 1874 MS (e)745 1874 MS ( )767 1874 MS (q)784 1874 MS (u)809 1874 MS (e)834 1874 MS ( )856 1874 MS +(c)873 1874 MS (h)896 1874 MS (a)920 1874 MS (q)942 1874 MS (u)967 1874 MS (e)992 1874 MS ( )1014 1874 MS (p)1031 1874 MS (r)1056 1874 MS (o)1073 1874 MS (c)1099 1874 MS (e)1121 1874 MS (s)1143 1874 MS (s)1162 1874 MS (u)1181 1874 MS (s)1206 1874 MS +( )1225 1874 MS (c)1243 1874 MS (l)1266 1874 MS (i)1279 1874 MS (e)1292 1874 MS (n)1315 1874 MS (t)1339 1874 MS ( )1354 1874 MS (d)1371 1874 MS (e)1396 1874 MS (m)1419 1874 MS (a)1456 1874 MS (n)1479 1874 MS (d)1503 1874 MS (e)1528 1874 MS ( )1550 1874 MS +(\340)1568 1874 MS ( )1590 1874 MS (c)1607 1874 MS (h)1630 1874 MS (a)1654 1874 MS (q)1676 1874 MS (u)1701 1874 MS (e)1726 1874 MS ( )1748 1874 MS (p)1765 1874 MS (r)1790 1874 MS (o)1807 1874 MS (c)1833 1874 MS (e)1855 1874 MS (s)1877 1874 MS (s)1896 1874 MS +(u)1915 1874 MS (s)1940 1874 MS ( )1959 1874 MS (s)1977 1874 MS (e)1996 1874 MS (r)2018 1874 MS (v)2035 1874 MS (e)2060 1874 MS (u)2082 1874 MS (r)2107 1874 MS ( )2125 1874 MS +(l)235 1931 MS (e)248 1931 MS (s)271 1931 MS ( )290 1931 MS (d)307 1931 MS (o)332 1931 MS (n)358 1931 MS (n)383 1931 MS (\351)407 1931 MS (e)429 1931 MS (s)451 1931 MS ( )471 1931 MS (l)489 1931 MS (o)501 1931 MS (c)527 1931 MS (a)549 1931 MS +(l)572 1931 MS (e)585 1931 MS (s)607 1931 MS ( )627 1931 MS +(d)644 1931 MS (a)669 1931 MS (n)692 1931 MS (s)716 1931 MS ( )735 1931 MS (l)753 1931 MS (a)766 1931 MS ( )789 1931 MS (d)806 1931 MS (i)832 1931 MS (s)845 1931 MS (t)864 1931 MS (r)879 1931 MS (i)896 1931 MS (b)909 1931 MS (u)933 1931 MS +(t)958 1931 MS (i)974 1931 MS (o)986 1931 MS (n)1012 1931 MS ( )1036 1931 MS (c)1053 1931 MS (l)1076 1931 MS (i)1090 1931 MS (e)1103 1931 MS (n)1126 1931 MS (t)1150 1931 MS (e)1165 1931 MS (.)1187 1931 MS ( )1200 1931 MS (C)1217 1931 MS (h)1251 1931 MS +(a)1275 1931 MS (q)1297 1931 MS (u)1322 1931 MS (e)1347 1931 MS ( )1370 1931 MS (p)1387 1931 MS (r)1412 1931 MS (o)1429 1931 MS (c)1455 1931 MS (e)1477 1931 MS (s)1499 1931 MS (s)1518 1931 MS (u)1537 1931 MS (s)1562 1931 MS ( )1581 1931 MS (s)1598 1931 MS +(e)1618 1931 MS (r)1640 1931 MS (v)1657 1931 MS (e)1682 1931 MS (u)1704 1931 MS (r)1729 1931 MS ( )1746 1931 MS (l)1764 1931 MS (u)1776 1931 MS (i)1802 1931 MS ( )1815 1931 MS (a)1832 1931 MS (u)1854 1931 MS (r)1879 1931 MS (a)1896 1931 MS (i)1919 1931 MS +(t)1931 1931 MS ( )1946 1931 MS (r)1963 1931 MS (e)1980 1931 MS (n)2003 1931 MS (v)2028 1931 MS (o)2052 1931 MS (y)2079 1931 MS (\351)2102 1931 MS ( )2125 1931 MS +(u)235 1989 MS (n)260 1989 MS (i)285 1989 MS (q)298 1989 MS (u)323 1989 MS (e)348 1989 MS (m)371 1989 MS (e)409 1989 MS (n)432 1989 MS (t)456 1989 MS ( )471 1989 MS (c)496 1989 MS (e)518 1989 MS (l)541 1989 MS (l)554 1989 MS (e)567 1989 MS +(s)589 1989 MS ( )608 1989 MS (q)633 1989 MS (u)658 1989 MS (i)684 1989 MS ( )696 1989 MS (l)722 1989 MS (u)735 1989 MS (i)761 1989 MS ( )774 1989 MS (s)799 1989 MS (o)818 1989 MS (n)844 1989 MS (t)868 1989 MS ( )883 1989 MS (l)908 1989 MS +(o)920 1989 MS (c)946 1989 MS (a)968 1989 MS (l)991 1989 MS (e)1004 1989 MS (s)1026 1989 MS (.)1045 1989 MS ( )1058 1989 MS (D)1083 1989 MS (a)1119 1989 MS (n)1142 1989 MS (s)1166 1989 MS ( )1185 1989 MS (c)1210 1989 MS (e)1232 1989 MS ( )1255 1989 MS +(d)1280 1989 MS (e)1305 1989 MS (r)1327 1989 MS (n)1344 1989 MS (i)1369 1989 MS (e)1381 1989 MS (r)1403 1989 MS ( )1420 1989 MS (c)1445 1989 MS (a)1467 1989 MS (s)1489 1989 MS (,)1508 1989 MS ( )1521 1989 MS (l)1547 1989 MS (e)1560 1989 MS ( )1582 1989 MS +(c)1607 1989 MS (l)1630 1989 MS (i)1643 1989 MS (e)1656 1989 MS (n)1679 1989 MS (t)1703 1989 MS ( )1718 1989 MS (n)1743 1989 MS (\222)1767 1989 MS (a)1784 1989 MS ( )1806 1989 MS (p)1831 1989 MS (a)1856 1989 MS (s)1878 1989 MS ( )1897 1989 MS (b)1922 1989 MS +(e)1947 1989 MS (s)1969 1989 MS (o)1988 1989 MS (i)2015 1989 MS (n)2028 1989 MS ( )2052 1989 MS (d)2077 1989 MS (e)2102 1989 MS ( )2125 1989 MS +(d)235 2046 MS (e)260 2046 MS (m)283 2046 MS (a)320 2046 MS (n)343 2046 MS (d)367 2046 MS (e)392 2046 MS (r)414 2046 MS ( )431 2046 MS (a)444 2046 MS (u)466 2046 MS ( )491 2046 MS (p)504 2046 MS (r)529 2046 MS (\351)546 2046 MS (a)568 2046 MS +(l)591 2046 MS (a)603 2046 MS (b)626 2046 MS (l)651 2046 MS (e)664 2046 MS ( )686 2046 MS (a)699 2046 MS (u)721 2046 MS ( )746 2046 MS (s)759 2046 MS (e)778 2046 MS (r)800 2046 MS (v)818 2046 MS (e)842 2046 MS (u)864 2046 MS (r)889 2046 MS +( )906 2046 MS (d)919 2046 MS (e)944 2046 MS ( )966 2046 MS (l)980 2046 MS (u)992 2046 MS (i)1018 2046 MS ( )1030 2046 MS (e)1043 2046 MS (n)1066 2046 MS (v)1091 2046 MS (o)1115 2046 MS (y)1142 2046 MS (e)1166 2046 MS (r)1188 2046 MS ( )1205 2046 MS +(l)1219 2046 MS (a)1231 2046 MS ( )1254 2046 MS (d)1267 2046 MS (i)1292 2046 MS (s)1305 2046 MS (t)1324 2046 MS (r)1339 2046 MS (i)1356 2046 MS (b)1369 2046 MS (u)1393 2046 MS (t)1418 2046 MS (i)1434 2046 MS (o)1446 2046 MS (n)1472 2046 MS ( )1496 2046 MS +(d)1509 2046 MS (e)1534 2046 MS (s)1556 2046 MS ( )1575 2046 MS (d)1588 2046 MS (o)1613 2046 MS (n)1639 2046 MS (n)1664 2046 MS (\351)1688 2046 MS (e)1710 2046 MS (s)1732 2046 MS ( )1751 2046 MS (\340)1764 2046 MS ( )1786 2046 MS (t)1799 2046 MS (r)1814 2046 MS +(a)1831 2046 MS (n)1853 2046 MS (s)1877 2046 MS (f)1897 2046 MS (\351)1913 2046 MS (r)1935 2046 MS (e)1952 2046 MS (r)1974 2046 MS (.)1991 2046 MS +( )2004 2046 MS +( )348 2104 MS +( )235 2161 MS +showpage +%%Page: 16 16 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (6)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(9)310 592 MS +( )347 592 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(C)400 592 MS (a)448 592 MS (s)485 592 MS ( )522 592 MS (d)541 592 MS (\222)582 592 MS (u)601 592 MS (t)642 592 MS (i)663 592 MS (l)682 592 MS (i)701 592 MS (s)720 592 MS (a)757 592 MS (t)794 592 MS (i)815 592 MS (o)834 592 MS +(n)875 592 MS +( )916 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 667 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 724 MS (\222)378 724 MS (o)394 724 MS (b)420 724 MS (j)445 724 MS (e)458 724 MS (c)480 724 MS (t)502 724 MS (i)518 724 MS (f)531 724 MS ( )547 724 MS (d)563 724 MS (e)588 724 MS ( )610 724 MS (l)627 724 MS (\222)640 724 MS +(e)656 724 MS (x)679 724 MS (e)703 724 MS (r)725 724 MS (c)742 724 MS (i)765 724 MS (c)778 724 MS (e)800 724 MS ( )822 724 MS (e)838 724 MS (s)861 724 MS (t)880 724 MS ( )895 724 MS (l)911 724 MS (e)923 724 MS ( )945 724 MS +(s)961 724 MS (u)980 724 MS (i)1006 724 MS (v)1019 724 MS (a)1044 724 MS (n)1067 724 MS (t)1091 724 MS +( )1106 724 MS +(:)1119 724 MS ( )1133 724 MS (i)1149 724 MS (l)1162 724 MS ( )1175 724 MS (s)1191 724 MS (\222)1211 724 MS (a)1227 724 MS (g)1249 724 MS (i)1275 724 MS (t)1287 724 MS ( )1302 724 MS (d)1318 724 MS (e)1343 724 MS ( )1366 724 MS (l)1383 724 MS +(a)1395 724 MS (n)1418 724 MS (c)1442 724 MS (e)1464 724 MS (r)1486 724 MS ( )1503 724 MS (d)1519 724 MS (e)1544 724 MS (u)1566 724 MS (x)1592 724 MS ( )1616 724 MS (c)1632 724 MS (o)1654 724 MS (n)1680 724 MS (t)1704 724 MS (a)1719 724 MS +(i)1741 724 MS (n)1754 724 MS (e)1779 724 MS (r)1801 724 MS (s)1818 724 MS ( )1837 724 MS (p)1853 724 MS (a)1878 724 MS (r)1900 724 MS (a)1917 724 MS (l)1940 724 MS (l)1953 724 MS (\350)1966 724 MS (l)1989 724 MS (e)2002 724 MS (s)2025 724 MS +(.)2044 724 MS ( )2057 724 MS (L)2073 724 MS (e)2103 724 MS ( )2125 724 MS +(p)235 782 MS (r)260 782 MS (e)277 782 MS (m)300 782 MS (i)338 782 MS (e)351 782 MS (r)373 782 MS ( )390 782 MS (c)417 782 MS (o)439 782 MS (n)465 782 MS (t)489 782 MS (a)504 782 MS (i)527 782 MS (n)540 782 MS (e)564 782 MS +(r)586 782 MS ( )603 782 MS (p)630 782 MS (a)655 782 MS (r)677 782 MS (a)694 782 MS (l)717 782 MS (l)730 782 MS (\350)743 782 MS (l)766 782 MS (e)779 782 MS ( )802 782 MS (e)829 782 MS (s)851 782 MS (t)870 782 MS ( )885 782 MS +(a)912 782 MS (c)934 782 MS (t)956 782 MS (i)971 782 MS (v)984 782 MS (\351)1009 782 MS ( )1031 782 MS (s)1058 782 MS (u)1077 782 MS (r)1102 782 MS ( )1119 782 MS (n)1147 782 MS ( )1171 782 MS (m)1199 782 MS (a)1238 782 MS (c)1260 782 MS +(h)1282 782 MS (i)1307 782 MS (n)1320 782 MS (e)1345 782 MS (s)1368 782 MS ( )1387 782 MS (\()1414 782 MS (P)1431 782 MS (C)1459 782 MS (/)1492 782 MS (l)1507 782 MS (i)1520 782 MS (n)1533 782 MS (u)1558 782 MS (x)1584 782 MS (\))1608 782 MS +( )1625 782 MS (d)1652 782 MS (i)1678 782 MS (f)1692 782 MS (f)1708 782 MS (\351)1724 782 MS (r)1746 782 MS (e)1763 782 MS (n)1786 782 MS (t)1810 782 MS (e)1825 782 MS (s)1847 782 MS (.)1866 782 MS ( )1879 782 MS (L)1906 782 MS (e)1936 782 MS +( )1958 782 MS (s)1986 782 MS (e)2005 782 MS (c)2027 782 MS (o)2049 782 MS (n)2075 782 MS (d)2099 782 MS ( )2125 782 MS +(c)235 839 MS (o)257 839 MS (n)283 839 MS (t)307 839 MS (a)322 839 MS (i)344 839 MS (n)357 839 MS (e)381 839 MS (r)403 839 MS ( )420 839 MS (e)444 839 MS (s)467 839 MS (t)486 839 MS ( )501 839 MS (a)525 839 MS (c)547 839 MS +(t)569 839 MS (i)584 839 MS (v)597 839 MS (\351)621 839 MS ( )643 839 MS (s)668 839 MS (u)687 839 MS (r)712 839 MS ( )729 839 MS (p)753 839 MS ( )778 839 MS (a)802 839 MS (u)824 839 MS (t)849 839 MS (r)864 839 MS (e)881 839 MS +(s)903 839 MS ( )922 839 MS (m)947 839 MS (a)985 839 MS (c)1007 839 MS (h)1030 839 MS (i)1055 839 MS (n)1068 839 MS (e)1093 839 MS (s)1115 839 MS ( )1135 839 MS (\()1159 839 MS (P)1176 839 MS (C)1204 839 MS (/)1237 839 MS (l)1251 839 MS +(i)1265 839 MS (n)1278 839 MS (u)1303 839 MS (x)1329 839 MS (\))1353 839 MS ( )1370 839 MS (d)1394 839 MS (i)1420 839 MS +(s)1433 839 MS (t)1452 839 MS (i)1468 839 MS (n)1481 839 MS (c)1505 839 MS (t)1527 839 MS (e)1542 839 MS (s)1564 839 MS ( )1583 839 MS (d)1607 839 MS (e)1632 839 MS (s)1654 839 MS ( )1674 839 MS (m)1699 839 MS (a)1737 839 MS (c)1759 839 MS +(h)1782 839 MS (i)1807 839 MS (n)1820 839 MS (e)1845 839 MS (s)1867 839 MS ( )1887 839 MS (a)1911 839 MS (b)1934 839 MS (r)1958 839 MS (i)1976 839 MS (t)1988 839 MS (a)2003 839 MS (n)2025 839 MS (t)2049 839 MS ( )2064 839 MS (l)2089 839 MS +(e)2102 839 MS ( )2125 839 MS +(p)235 897 MS (r)260 897 MS (e)277 897 MS (m)300 897 MS (i)338 897 MS (e)351 897 MS (r)373 897 MS ( )390 897 MS (c)407 897 MS (o)429 897 MS (n)455 897 MS (t)479 897 MS (a)494 897 MS (i)516 897 MS (n)529 897 MS (e)553 897 MS +(r)575 897 MS (.)592 897 MS ( )605 897 MS (O)622 897 MS (n)658 897 MS ( )682 897 MS (s)700 897 MS (u)719 897 MS (p)744 897 MS (p)769 897 MS (o)794 897 MS (s)820 897 MS (e)839 897 MS (,)861 897 MS ( )874 897 MS (b)891 897 MS +(i)916 897 MS (e)928 897 MS (n)951 897 MS ( )975 897 MS (e)992 897 MS (n)1015 897 MS (t)1039 897 MS (e)1054 897 MS (n)1076 897 MS (d)1100 897 MS (u)1125 897 MS (,)1150 897 MS ( )1163 897 MS (q)1180 897 MS (u)1205 897 MS (e)1230 897 MS +( )1253 897 MS (l)1271 897 MS (e)1283 897 MS ( )1305 897 MS (s)1322 897 MS (e)1341 897 MS (r)1363 897 MS (v)1381 897 MS (i)1406 897 MS (c)1419 897 MS (e)1441 897 MS ( )1463 897 MS (d)1480 897 MS (e)1505 897 MS ( )1527 897 MS (n)1545 897 MS +(o)1569 897 MS (m)1595 897 MS (m)1633 897 MS (a)1671 897 MS (g)1694 897 MS (e)1719 897 MS ( )1741 897 MS (C)1758 897 MS (O)1791 897 MS (R)1827 897 MS (B)1861 897 MS (A)1895 897 MS ( )1930 897 MS (e)1947 897 MS (s)1969 897 MS (t)1988 897 MS +( )2003 897 MS (l)2020 897 MS (a)2033 897 MS (n)2056 897 MS (c)2080 897 MS (\351)2102 897 MS ( )2125 897 MS +(p)235 954 MS (r)260 954 MS (\351)277 954 MS (a)299 954 MS (l)322 954 MS (a)334 954 MS (b)357 954 MS (l)382 954 MS (e)395 954 MS (m)418 954 MS (e)456 954 MS (n)479 954 MS (t)503 954 MS (.)518 954 MS ( )531 954 MS (U)557 954 MS +(n)593 954 MS ( )617 954 MS (c)643 954 MS (o)665 954 MS (d)691 954 MS (e)716 954 MS ( )738 954 MS (c)764 954 MS (l)786 954 MS (i)799 954 MS (e)812 954 MS (n)835 954 MS (t)859 954 MS ( )874 954 MS (d)900 954 MS (e)925 954 MS +(m)947 954 MS (a)985 954 MS (n)1008 954 MS (d)1032 954 MS (e)1057 954 MS ( )1079 954 MS (e)1105 954 MS (n)1127 954 MS (s)1152 954 MS (u)1171 954 MS (i)1197 954 MS (t)1209 954 MS (e)1224 954 MS ( )1247 954 MS (d)1273 954 MS (\222)1298 954 MS +(i)1315 954 MS (n)1328 954 MS (s)1353 954 MS (t)1372 954 MS (a)1387 954 MS (n)1409 954 MS (c)1433 954 MS (i)1456 954 MS (e)1469 954 MS (r)1491 954 MS ( )1508 954 MS (s)1534 954 MS (u)1553 954 MS (r)1578 954 MS ( )1595 954 MS (l)1622 954 MS +(e)1634 954 MS ( )1656 954 MS (p)1682 954 MS (r)1707 954 MS (e)1724 954 MS (m)1747 954 MS (i)1785 954 MS (e)1798 954 MS (r)1820 954 MS ( )1837 954 MS (c)1863 954 MS (o)1885 954 MS (n)1911 954 MS (t)1935 954 MS (a)1950 954 MS (i)1972 954 MS +(n)1985 954 MS (e)2010 954 MS (r)2032 954 MS ( )2049 954 MS (u)2075 954 MS (n)2100 954 MS ( )2125 954 MS +(c)235 1012 MS (o)257 1012 MS (m)283 1012 MS (p)320 1012 MS (o)345 1012 MS (s)371 1012 MS (a)390 1012 MS (n)413 1012 MS (t)437 1012 MS ( )452 1012 MS (N)466 1012 MS (u)502 1012 MS (m)527 1012 MS (e)565 1012 MS (r)587 1012 MS (i)605 1012 MS +(c)617 1012 MS (a)639 1012 MS (l)662 1012 MS ( )675 1012 MS (P)689 1012 MS (l)718 1012 MS (a)731 1012 MS (t)753 1012 MS (o)768 1012 MS (n)794 1012 MS ( )818 1012 MS ([)832 1012 MS (8)849 1012 MS (])874 1012 MS ( )891 1012 MS (d)905 1012 MS +(o)929 1012 MS (n)955 1012 MS (t)979 1012 MS ( )994 1012 MS (l)1008 1012 MS (e)1020 1012 MS ( )1042 1012 MS (b)1056 1012 MS (u)1080 1012 MS (t)1105 1012 MS ( )1120 1012 MS (e)1134 1012 MS (s)1156 1012 MS (t)1175 1012 MS ( )1190 1012 MS (d)1204 1012 MS +(e)1229 1012 MS ( )1251 1012 MS (c)1265 1012 MS (h)1287 1012 MS (a)1311 1012 MS (r)1333 1012 MS (g)1350 1012 MS (e)1375 1012 MS (r)1397 1012 MS ( )1414 1012 MS (e)1428 1012 MS (n)1451 1012 MS ( )1475 1012 MS (m)1490 1012 MS (\351)1528 1012 MS (m)1551 1012 MS +(o)1588 1012 MS (i)1615 1012 MS (r)1627 1012 MS (e)1644 1012 MS ( )1666 1012 MS (u)1680 1012 MS (n)1706 1012 MS (e)1730 1012 MS ( )1752 1012 MS (m)1767 1012 MS (a)1805 1012 MS (t)1827 1012 MS (r)1842 1012 MS (i)1859 1012 MS (c)1872 1012 MS (e)1894 1012 MS +( )1916 1012 MS (d)1930 1012 MS (e)1955 1012 MS (p)1977 1012 MS (u)2002 1012 MS (i)2028 1012 MS (s)2041 1012 MS ( )2060 1012 MS (u)2074 1012 MS (n)2100 1012 MS ( )2125 1012 MS +(f)235 1069 MS (i)252 1069 MS (c)265 1069 MS (h)288 1069 MS (i)313 1069 MS (e)326 1069 MS (r)348 1069 MS (,)365 1069 MS ( )378 1069 MS (u)398 1069 MS (n)423 1069 MS ( )447 1069 MS (c)467 1069 MS (o)489 1069 MS (m)516 1069 MS (p)553 1069 MS +(o)578 1069 MS (s)604 1069 MS (a)623 1069 MS (n)645 1069 MS (t)669 1069 MS ( )684 1069 MS (N)704 1069 MS (u)740 1069 MS (m)766 1069 MS (e)803 1069 MS (r)825 1069 MS (i)843 1069 MS (c)856 1069 MS (a)878 1069 MS (l)901 1069 MS ( )914 1069 MS +(P)934 1069 MS (l)963 1069 MS (a)976 1069 MS (t)998 1069 MS (o)1013 1069 MS (n)1039 1069 MS ( )1063 1069 MS (d)1083 1069 MS (o)1108 1069 MS (n)1134 1069 MS (t)1157 1069 MS ( )1172 1069 MS (l)1192 1069 MS (e)1204 1069 MS ( )1226 1069 MS (b)1247 1069 MS +(u)1271 1069 MS (t)1296 1069 MS ( )1311 1069 MS (e)1331 1069 MS (s)1353 1069 MS (t)1372 1069 MS ( )1387 1069 MS (d)1407 1069 MS (e)1432 1069 MS ( )1454 1069 MS (c)1474 1069 MS (h)1496 1069 MS (a)1520 1069 MS (r)1542 1069 MS (g)1559 1069 MS (e)1584 1069 MS +(r)1606 1069 MS ( )1623 1069 MS (e)1643 1069 MS (n)1665 1069 MS ( )1689 1069 MS (m)1710 1069 MS (\351)1748 1069 MS (m)1771 1069 MS (o)1808 1069 MS (i)1835 1069 MS (r)1847 1069 MS (e)1865 1069 MS ( )1887 1069 MS (u)1907 1069 MS (n)1932 1069 MS ( )1956 1069 MS +(v)1977 1069 MS (e)2002 1069 MS (c)2024 1069 MS (t)2046 1069 MS (e)2061 1069 MS (u)2083 1069 MS (r)2108 1069 MS ( )2125 1069 MS +(d)235 1127 MS (e)260 1127 MS (p)282 1127 MS (u)307 1127 MS (i)333 1127 MS (s)346 1127 MS ( )365 1127 MS (u)389 1127 MS (n)414 1127 MS ( )438 1127 MS (f)463 1127 MS (i)479 1127 MS (c)492 1127 MS (h)515 1127 MS (i)540 1127 MS (e)553 1127 MS +(r)575 1127 MS (,)592 1127 MS ( )605 1127 MS (u)629 1127 MS (n)654 1127 MS ( )678 1127 MS (a)702 1127 MS (u)724 1127 MS (t)749 1127 MS (r)764 1127 MS (e)781 1127 MS ( )803 1127 MS (c)827 1127 MS (o)849 1127 MS (m)875 1127 MS (p)912 1127 MS +(o)937 1127 MS (s)963 1127 MS (a)982 1127 MS (n)1004 1127 MS (t)1028 1127 MS ( )1043 1127 MS (N)1067 1127 MS (u)1103 1127 MS (m)1129 1127 MS (e)1166 1127 MS (r)1188 1127 MS (i)1206 1127 MS (c)1219 1127 MS (a)1242 1127 MS (l)1265 1127 MS ( )1277 1127 MS +(P)1301 1127 MS (l)1330 1127 MS (a)1343 1127 MS (t)1365 1127 MS (o)1379 1127 MS (n)1405 1127 MS ( )1429 1127 MS (d)1453 1127 MS (o)1478 1127 MS (n)1504 1127 MS (t)1528 1127 MS ( )1543 1127 MS (l)1567 1127 MS (e)1579 1127 MS ( )1601 1127 MS (b)1625 1127 MS +(u)1649 1127 MS (t)1674 1127 MS ( )1689 1127 MS (e)1713 1127 MS (s)1735 1127 MS (t)1754 1127 MS ( )1769 1127 MS (d)1793 1127 MS (e)1818 1127 MS ( )1840 1127 MS (r)1863 1127 MS (\351)1880 1127 MS (c)1902 1127 MS (u)1924 1127 MS (p)1949 1127 MS (\351)1974 1127 MS +(r)1996 1127 MS (e)2013 1127 MS (r)2035 1127 MS ( )2052 1127 MS (u)2076 1127 MS (n)2101 1127 MS ( )2125 1127 MS +(v)235 1184 MS (e)259 1184 MS (c)281 1184 MS (t)303 1184 MS (e)318 1184 MS (u)340 1184 MS (r)365 1184 MS ( )382 1184 MS (e)395 1184 MS (t)417 1184 MS ( )432 1184 MS (d)445 1184 MS (e)470 1184 MS ( )492 1184 MS (l)506 1184 MS (e)518 1184 MS +( )540 1184 MS (s)554 1184 MS (t)573 1184 MS (o)587 1184 MS (c)613 1184 MS (k)635 1184 MS (e)660 1184 MS (r)682 1184 MS ( )699 1184 MS (d)712 1184 MS (a)737 1184 MS (n)759 1184 MS (s)783 1184 MS ( )802 1184 MS (u)815 1184 MS (n)841 1184 MS +( )866 1184 MS (f)880 1184 MS (i)896 1184 MS (c)909 1184 MS (h)932 1184 MS (i)957 1184 MS +(e)970 1184 MS (r)992 1184 MS (.)1009 1184 MS ( )1022 1184 MS (C)1035 1184 MS (e)1068 1184 MS (s)1091 1184 MS ( )1110 1184 MS (t)1123 1184 MS (r)1138 1184 MS (o)1154 1184 MS (i)1180 1184 MS (s)1193 1184 MS ( )1212 1184 MS (o)1225 1184 MS (b)1251 1184 MS +(j)1276 1184 MS (e)1289 1184 MS (t)1311 1184 MS (s)1326 1184 MS ( )1345 1184 MS (N)1358 1184 MS (u)1394 1184 MS (m)1420 1184 MS (e)1458 1184 MS (r)1480 1184 MS (i)1498 1184 MS (c)1510 1184 MS (a)1533 1184 MS (l)1556 1184 MS ( )1569 1184 MS (P)1582 1184 MS +(l)1611 1184 MS (a)1624 1184 MS (t)1646 1184 MS (o)1660 1184 MS (n)1686 1184 MS ( )1710 1184 MS (s)1723 1184 MS (o)1742 1184 MS (n)1768 1184 MS (t)1792 1184 MS ( )1807 1184 MS (d)1820 1184 MS (o)1845 1184 MS (n)1871 1184 MS (c)1895 1184 MS ( )1917 1184 MS +(d)1930 1184 MS (i)1956 1184 MS (s)1969 1184 MS (t)1988 1184 MS (r)2003 1184 MS (i)2020 1184 MS (b)2033 1184 MS (u)2057 1184 MS (\351)2082 1184 MS (s)2105 1184 MS ( )2125 1184 MS +(s)235 1242 MS (u)254 1242 MS (r)279 1242 MS ( )296 1242 MS (l)311 1242 MS (e)323 1242 MS (s)346 1242 MS ( )365 1242 MS (n)379 1242 MS ( )403 1242 MS (p)417 1242 MS (r)442 1242 MS (o)459 1242 MS (c)485 1242 MS (e)507 1242 MS (s)529 1242 MS +(s)548 1242 MS (u)567 1242 MS (s)593 1242 MS ( )612 1242 MS (c)626 1242 MS (o)648 1242 MS (n)674 1242 MS (s)698 1242 MS (t)717 1242 MS (i)733 1242 MS (t)745 1242 MS (u)760 1242 MS (a)785 1242 MS (n)807 1242 MS (t)831 1242 MS ( )846 1242 MS +(l)861 1242 MS (e)873 1242 MS ( )895 1242 MS (p)909 1242 MS (r)934 1242 MS (e)951 1242 MS (m)974 1242 MS (i)1013 1242 MS (e)1026 1242 MS (r)1048 1242 MS ( )1065 1242 MS (c)1079 1242 MS (o)1101 1242 MS (n)1127 1242 MS (t)1151 1242 MS (a)1166 1242 MS +(i)1188 1242 MS (n)1201 1242 MS (e)1226 1242 MS (r)1249 1242 MS (.)1266 1242 MS ( )1279 1242 MS (L)1293 1242 MS (e)1323 1242 MS ( )1345 1242 MS (m)1360 1242 MS (\352)1397 1242 MS (m)1420 1242 MS (e)1458 1242 MS ( )1480 1242 MS (c)1494 1242 MS (o)1516 1242 MS +(d)1542 1242 MS (e)1567 1242 MS ( )1589 1242 MS (c)1603 1242 MS (l)1626 1242 MS (i)1639 1242 MS (e)1652 1242 MS (n)1675 1242 MS (t)1699 1242 MS ( )1714 1242 MS (d)1728 1242 MS (e)1753 1242 MS (m)1776 1242 MS (a)1813 1242 MS (n)1836 1242 MS (d)1860 1242 MS +(e)1885 1242 MS ( )1907 1242 MS (e)1922 1242 MS (n)1945 1242 MS (s)1969 1242 MS (u)1988 1242 MS (i)2014 1242 MS (t)2026 1242 MS (e)2041 1242 MS ( )2063 1242 MS (a)2077 1242 MS (u)2099 1242 MS ( )2125 1242 MS +(s)235 1299 MS (e)254 1299 MS (c)276 1299 MS (o)298 1299 MS (n)324 1299 MS (d)348 1299 MS ( )373 1299 MS (c)389 1299 MS (o)411 1299 MS (n)437 1299 MS (t)461 1299 MS (a)476 1299 MS (i)499 1299 MS (n)512 1299 MS (e)536 1299 MS (r)558 1299 MS +( )575 1299 MS (d)591 1299 MS (\222)617 1299 MS (i)634 1299 MS (n)647 1299 MS (s)672 1299 MS (t)691 1299 MS (a)706 1299 MS (n)728 1299 MS (c)752 1299 MS (i)775 1299 MS (e)788 1299 MS (r)810 1299 MS ( )827 1299 MS (u)843 1299 MS (n)869 1299 MS +( )893 1299 MS (c)910 1299 MS (o)932 1299 MS (m)958 1299 MS (p)995 1299 MS (o)1020 1299 MS (s)1046 1299 MS (a)1065 1299 MS (n)1088 1299 MS (t)1112 1299 MS ( )1127 1299 MS (N)1143 1299 MS (u)1179 1299 MS (m)1205 1299 MS (e)1243 1299 MS (r)1265 1299 MS +(i)1283 1299 MS (c)1295 1299 MS (a)1317 1299 MS (l)1340 1299 MS ( )1353 1299 MS (P)1369 1299 MS (l)1398 1299 MS (a)1411 1299 MS (t)1433 1299 MS (o)1448 1299 MS (n)1474 1299 MS ( )1498 1299 MS (d)1514 1299 MS (o)1539 1299 MS (n)1565 1299 MS (t)1589 1299 MS +( )1604 1299 MS (l)1620 1299 MS (e)1632 1299 MS ( )1654 1299 MS (b)1671 1299 MS (u)1695 1299 MS (t)1720 1299 MS ( )1735 1299 MS (e)1751 1299 MS (s)1773 1299 MS (t)1792 1299 MS ( )1807 1299 MS (d)1823 1299 MS (e)1848 1299 MS ( )1870 1299 MS (r)1886 1299 MS +(\351)1903 1299 MS (s)1925 1299 MS (o)1944 1299 MS (u)1970 1299 MS (d)1995 1299 MS (r)2020 1299 MS (e)2037 1299 MS ( )2059 1299 MS (u)2075 1299 MS (n)2100 1299 MS ( )2125 1299 MS +(s)235 1357 MS (y)255 1357 MS (s)279 1357 MS (t)298 1357 MS (\350)313 1357 MS (m)336 1357 MS (e)373 1357 MS ( )395 1357 MS (l)418 1357 MS (i)431 1357 MS (n)444 1357 MS (\351)469 1357 MS (a)492 1357 MS +(i)515 1357 MS (r)527 1357 MS (e)545 1357 MS (.)567 1357 MS ( )580 1357 MS (C)602 1357 MS (e)635 1357 MS ( )657 1357 MS (c)679 1357 MS (o)701 1357 MS (m)727 1357 MS (p)764 1357 MS (o)789 1357 MS (s)815 1357 MS (a)834 1357 MS (n)857 1357 MS +(t)881 1357 MS ( )896 1357 MS (a)918 1357 MS ( )940 1357 MS (d)962 1357 MS (o)986 1357 MS (n)1012 1357 MS (c)1036 1357 MS ( )1058 1357 MS (u)1080 1357 MS (n)1105 1357 MS ( )1129 1357 MS (u)1151 1357 MS (n)1176 1357 MS (i)1201 1357 MS (q)1214 1357 MS +(u)1240 1357 MS (e)1265 1357 MS ( )1287 1357 MS (s)1309 1357 MS (e)1328 1357 MS (r)1350 1357 MS (v)1367 1357 MS (i)1392 1357 MS (c)1405 1357 MS (e)1427 1357 MS ( )1449 1357 MS (S)1471 1357 MS (o)1499 1357 MS (l)1526 1357 MS (v)1539 1357 MS (e)1563 1357 MS +(\()1585 1357 MS (\))1602 1357 MS ( )1619 1357 MS (q)1641 1357 MS (u)1666 1357 MS (i)1692 1357 MS ( )1704 1357 MS (p)1726 1357 MS (r)1751 1357 MS (e)1768 1357 MS (n)1790 1357 MS (d)1814 1357 MS ( )1839 1357 MS (e)1861 1357 MS (n)1884 1357 MS ( )1908 1357 MS +(e)1930 1357 MS (n)1953 1357 MS (t)1977 1357 MS (r)1992 1357 MS (\351)2009 1357 MS (e)2031 1357 MS ( )2053 1357 MS (u)2075 1357 MS (n)2100 1357 MS ( )2125 1357 MS +(m)235 1414 MS (a)273 1414 MS (t)295 1414 MS (r)310 1414 MS (i)328 1414 MS (c)340 1414 MS (e)362 1414 MS ( )384 1414 MS (e)408 1414 MS (t)430 1414 MS ( )445 1414 MS (u)469 1414 MS (n)494 1414 MS ( )518 1414 MS (v)543 1414 MS (e)567 1414 MS +(c)590 1414 MS (t)612 1414 MS (e)627 1414 MS (u)649 1414 MS (r)674 1414 MS ( )691 1414 MS (e)715 1414 MS (t)736 1414 MS ( )751 1414 MS (r)775 1414 MS (e)792 1414 MS (d)814 1414 MS (o)838 1414 MS (n)864 1414 MS (n)888 1414 MS (e)913 1414 MS +( )935 1414 MS (e)959 1414 MS (n)982 1414 MS ( )1006 1414 MS (s)1030 1414 MS (o)1049 1414 MS (r)1075 1414 MS (t)1092 1414 MS (i)1107 1414 MS (e)1119 1414 MS ( )1141 1414 MS (l)1166 1414 MS (e)1179 1414 MS ( )1201 1414 MS (v)1226 1414 MS (e)1251 1414 MS +(c)1273 1414 MS (t)1295 1414 MS (e)1310 1414 MS (u)1332 1414 MS (r)1357 1414 MS ( )1374 1414 MS (s)1398 1414 MS (o)1417 1414 MS (l)1443 1414 MS (u)1455 1414 MS (t)1480 1414 MS (i)1495 1414 MS (o)1507 1414 MS (n)1533 1414 MS (.)1557 1414 MS ( )1570 1414 MS +(C)1594 1414 MS (e)1627 1414 MS (s)1650 1414 MS ( )1669 1414 MS (t)1693 1414 MS (r)1708 1414 MS (o)1724 1414 MS (i)1750 1414 MS (s)1763 1414 MS ( )1782 1414 MS (o)1806 1414 MS (b)1832 1414 MS (j)1857 1414 MS (e)1870 1414 MS (t)1892 1414 MS (s)1907 1414 MS +( )1926 1414 MS (s)1950 1414 MS (o)1969 1414 MS (n)1995 1414 MS (t)2019 1414 MS ( )2034 1414 MS (d)2058 1414 MS (e)2083 1414 MS (s)2105 1414 MS ( )2125 1414 MS +(d)235 1472 MS (o)260 1472 MS (n)286 1472 MS (n)310 1472 MS (\351)334 1472 MS (e)356 1472 MS (s)379 1472 MS ( )398 1472 MS (C)425 1472 MS (O)458 1472 MS (R)495 1472 MS (B)528 1472 MS (A)562 1472 MS ( )597 1472 MS (p)624 1472 MS (a)649 1472 MS +(r)671 1472 MS (a)688 1472 MS (l)711 1472 MS (l)725 1472 MS (\350)738 1472 MS (l)761 1472 MS (e)774 1472 MS (s)797 1472 MS (.)816 1472 MS ( )829 1472 MS (U)856 1472 MS (n)892 1472 MS (e)916 1472 MS ( )938 1472 MS (f)966 1472 MS (o)981 1472 MS +(i)1008 1472 MS (s)1021 1472 MS ( )1040 1472 MS (a)1067 1472 MS (c)1090 1472 MS (t)1112 1472 MS (i)1127 1472 MS (v)1140 1472 MS (\351)1165 1472 MS (,)1187 1472 MS ( )1200 1472 MS (l)1228 1472 MS (e)1241 1472 MS ( )1263 1472 MS (s)1290 1472 MS (e)1309 1472 MS +(r)1331 1472 MS (v)1348 1472 MS (i)1373 1472 MS (c)1386 1472 MS (e)1409 1472 MS ( )1431 1472 MS (S)1458 1472 MS (o)1486 1472 MS (l)1512 1472 MS (v)1525 1472 MS (e)1550 1472 MS (\()1572 1472 MS (\))1589 1472 MS ( )1606 1472 MS (t)1633 1472 MS (r)1647 1472 MS +(a)1664 1472 MS (v)1686 1472 MS (a)1710 1472 MS (i)1733 1472 MS (l)1747 1472 MS (l)1760 1472 MS (e)1773 1472 MS ( )1796 1472 MS (s)1823 1472 MS (u)1842 1472 MS (r)1867 1472 MS ( )1884 1472 MS (d)1911 1472 MS (e)1936 1472 MS (s)1958 1472 MS ( )1977 1472 MS +(o)2004 1472 MS (b)2030 1472 MS (j)2055 1472 MS (e)2068 1472 MS (t)2090 1472 MS (s)2105 1472 MS ( )2125 1472 MS +(N)235 1529 MS (u)271 1529 MS (m)297 1529 MS (e)334 1529 MS (r)356 1529 MS +(i)374 1529 MS (c)387 1529 MS (a)409 1529 MS (l)432 1529 MS ( )445 1529 MS (P)462 1529 MS (l)491 1529 MS (a)504 1529 MS (t)526 1529 MS (o)541 1529 MS (n)567 1529 MS ( )591 1529 MS (d)608 1529 MS (i)634 1529 MS (s)646 1529 MS (t)665 1529 MS +(r)680 1529 MS (i)698 1529 MS (b)711 1529 MS (u)735 1529 MS (\351)760 1529 MS (s)782 1529 MS ( )801 1529 MS (s)819 1529 MS (u)838 1529 MS (r)863 1529 MS ( )880 1529 MS (p)897 1529 MS ( )922 1529 MS (m)940 1529 MS (a)978 1529 MS (c)1000 1529 MS +(h)1023 1529 MS (i)1048 1529 MS (n)1061 1529 MS (e)1086 1529 MS (s)1109 1529 MS (.)1128 1529 MS ( )1141 1529 MS (L)1158 1529 MS (a)1188 1529 MS ( )1210 1529 MS (s)1227 1529 MS (o)1247 1529 MS (l)1273 1529 MS (u)1285 1529 MS (t)1310 1529 MS (i)1326 1529 MS +(o)1338 1529 MS (n)1364 1529 MS ( )1388 1529 MS (e)1405 1529 MS (s)1427 1529 MS (t)1446 1529 MS ( )1461 1529 MS (e)1478 1529 MS (n)1501 1529 MS (s)1525 1529 MS (u)1544 1529 MS (i)1570 1529 MS (t)1582 1529 MS (e)1597 1529 MS ( )1619 1529 MS (r)1636 1529 MS +(e)1653 1529 MS (n)1676 1529 MS (v)1701 1529 MS (o)1725 1529 MS (y)1752 1529 MS (\351)1775 1529 MS (e)1797 1529 MS ( )1819 1529 MS (s)1837 1529 MS (u)1856 1529 MS (r)1881 1529 MS ( )1898 1529 MS (l)1916 1529 MS (e)1929 1529 MS ( )1951 1529 MS (p)1968 1529 MS +(r)1993 1529 MS (e)2010 1529 MS (m)2033 1529 MS (i)2071 1529 MS (e)2084 1529 MS (r)2107 1529 MS ( )2125 1529 MS +(c)235 1586 MS (o)257 1586 MS (n)283 1586 MS (t)307 1586 MS (a)322 1586 MS (i)344 1586 MS (n)357 1586 MS (e)381 1586 MS (r)403 1586 MS ( )420 1586 MS (\()433 1586 MS (e)450 1586 MS (t)472 1586 MS ( )487 1586 MS (d)500 1586 MS (o)524 1586 MS +(n)550 1586 MS (c)574 1586 MS ( )596 1586 MS (r)609 1586 MS (e)626 1586 MS (d)648 1586 MS (i)673 1586 MS (s)686 1586 MS (t)705 1586 MS (r)720 1586 MS (i)737 1586 MS (b)750 1586 MS (u)774 1586 MS (\351)799 1586 MS (e)821 1586 MS ( )843 1586 MS +(s)856 1586 MS (u)875 1586 MS (r)900 1586 MS ( )917 1586 MS (n)930 1586 MS ( )954 1586 MS (m)968 1586 MS (a)1006 1586 MS (c)1028 1586 MS (h)1051 1586 MS (i)1076 1586 MS (n)1089 1586 MS (e)1114 1586 MS (s)1137 1586 MS (\))1156 1586 MS (,)1173 1586 MS +( )1186 1586 MS (p)1199 1586 MS (u)1224 1586 MS (i)1248 1586 MS (s)1261 1586 MS ( )1280 1586 MS (s)1293 1586 MS (t)1312 1586 MS (o)1327 1586 MS (c)1353 1586 MS (k)1375 1586 MS (\351)1400 1586 MS (e)1422 1586 MS ( )1444 1586 MS (d)1457 1586 MS (a)1482 1586 MS +(n)1504 1586 MS (s)1528 1586 MS ( )1547 1586 MS (u)1560 1586 MS (n)1585 1586 MS ( )1609 1586 MS (f)1623 1586 MS (i)1639 1586 MS (c)1652 1586 MS (h)1675 1586 MS (i)1700 1586 MS (e)1713 1586 MS (r)1735 1586 MS (.)1752 1586 MS +( )1765 1586 MS +( )348 1644 MS +(L)348 1701 MS (e)378 1701 MS (s)400 1701 MS ( )419 1701 MS (o)441 1701 MS (b)467 1701 MS (j)492 1701 MS (e)505 1701 MS (t)527 1701 MS (s)542 1701 MS ( )561 1701 MS (C)583 1701 MS (O)616 1701 MS (R)653 1701 MS (B)686 1701 MS (A)720 1701 MS +( )755 1701 MS (u)777 1701 MS (t)802 1701 MS (i)818 1701 MS (l)831 1701 MS (i)845 1701 MS (s)858 1701 MS (\351)877 1701 MS (s)900 1701 MS ( )919 1701 MS (d)941 1701 MS (a)966 1701 MS (n)989 1701 MS (s)1014 1701 MS ( )1033 1701 MS (c)1055 1701 MS +(e)1077 1701 MS (t)1099 1701 MS ( )1114 1701 MS (e)1136 1701 MS (x)1158 1701 MS (e)1182 1701 MS (r)1204 1701 MS (c)1221 1701 MS (i)1244 1701 MS (c)1257 1701 MS (e)1280 1701 MS ( )1302 1701 MS (s)1324 1701 MS (o)1343 1701 MS (n)1369 1701 MS (t)1393 1701 MS +( )1408 1701 MS (d)1430 1701 MS (o)1455 1701 MS (n)1481 1701 MS (c)1505 1701 MS ( )1527 1701 MS (d)1549 1701 MS (e)1574 1701 MS (s)1596 1701 MS ( )1615 1701 MS (v)1638 1701 MS (e)1662 1701 MS (c)1684 1701 MS (t)1706 1701 MS (e)1721 1701 MS (u)1743 1701 MS +(r)1768 1701 MS (s)1785 1701 MS +( )1804 1701 MS +(:)1817 1701 MS ( )1831 1701 MS (s)1853 1701 MS (\351)1872 1701 MS (q)1894 1701 MS (u)1919 1701 MS (e)1944 1701 MS (n)1967 1701 MS (c)1991 1701 MS (e)2013 1701 MS (s)2036 1701 MS ( )2055 1701 MS (d)2077 1701 MS (e)2102 1701 MS ( )2125 1701 MS +(d)235 1759 MS (o)260 1759 MS (u)286 1759 MS (b)311 1759 MS (l)336 1759 MS (e)348 1759 MS ( )370 1759 MS +(f)384 1759 MS (l)401 1759 MS (o)413 1759 MS (t)439 1759 MS (t)453 1759 MS (a)468 1759 MS (n)490 1759 MS (t)514 1759 MS (s)529 1759 MS ( )548 1759 MS (e)561 1759 MS (t)583 1759 MS ( )598 1759 MS (u)611 1759 MS (n)636 1759 MS (e)660 1759 MS +( )682 1759 MS (m)696 1759 MS (a)733 1759 MS (t)755 1759 MS (r)770 1759 MS (i)787 1759 MS (c)799 1759 MS (e)822 1759 MS ( )844 1759 MS (c)857 1759 MS (r)879 1759 MS (e)896 1759 MS (u)918 1759 MS (s)943 1759 MS (e)962 1759 MS ( )984 1759 MS +(a)997 1759 MS (u)1019 1759 MS ( )1044 1759 MS (f)1058 1759 MS (o)1073 1759 MS (r)1099 1759 MS (m)1117 1759 MS (a)1155 1759 MS (t)1177 1759 MS ( )1192 1759 MS (C)1205 1759 MS (o)1238 1759 MS (m)1264 1759 MS (p)1301 1759 MS (r)1326 1759 MS (e)1343 1759 MS +(s)1365 1759 MS (s)1385 1759 MS (e)1404 1759 MS (d)1426 1759 MS ( )1451 1759 MS (S)1464 1759 MS (p)1492 1759 MS (a)1517 1759 MS (r)1539 1759 MS (s)1556 1759 MS (e)1575 1759 MS ( )1597 1759 MS (R)1610 1759 MS (o)1643 1759 MS (w)1669 1759 MS ( )1705 1759 MS +(\()1718 1759 MS (C)1735 1759 MS (S)1768 1759 MS (R)1796 1759 MS (\))1829 1759 MS (.)1846 1759 MS ( )1859 1759 MS (C)1872 1759 MS (e)1905 1759 MS (s)1927 1759 MS ( )1946 1759 MS (t)1959 1759 MS (y)1974 1759 MS (p)1997 1759 MS (e)2022 1759 MS (s)2045 1759 MS +( )2064 1759 MS (d)2077 1759 MS (e)2102 1759 MS ( )2125 1759 MS +(b)235 1816 MS (a)259 1816 MS (s)282 1816 MS (e)301 1816 MS ( )323 1816 MS (s)336 1816 MS (o)355 1816 MS (n)381 1816 MS (t)405 1816 MS ( )420 1816 MS (d)433 1816 MS (\351)458 1816 MS (f)480 1816 MS (i)496 1816 MS (n)509 1816 MS (i)535 1816 MS +(s)548 1816 MS ( )567 1816 MS (d)580 1816 MS (a)605 1816 MS (n)628 1816 MS (s)652 1816 MS ( )671 1816 MS (u)684 1816 MS (n)710 1816 MS ( )734 1816 MS (f)748 1816 MS (i)764 1816 MS (c)777 1816 MS (h)800 1816 MS (i)825 1816 MS (e)838 1816 MS +(r)860 1816 MS ( )877 1816 MS (d)890 1816 MS (\222)915 1816 MS (i)932 1816 MS (n)945 1816 MS (c)970 1816 MS (l)993 1816 MS (u)1006 1816 MS (d)1031 1816 MS (e)1056 1816 MS +( )1078 1816 MS +(:)1091 1816 MS ( )1105 1816 MS (\253)1118 1816 MS +( )1142 1816 MS +(T)1155 1816 MS (y)1187 1816 MS (p)1210 1816 MS (e)1235 1816 MS (D)1258 1816 MS (a)1294 1816 MS (t)1316 1816 MS (a)1331 1816 MS (.)1353 1816 MS (i)1366 1816 MS (d)1378 1816 MS (l)1404 1816 MS +( )1416 1816 MS +(\273)1430 1816 MS (.)1454 1816 MS +( )1467 1816 MS +( )348 1874 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 1921 MS (i)260 1921 MS (f)285 1921 MS (n)310 1921 MS (d)335 1921 MS (e)360 1921 MS (f)385 1921 MS ( )410 1921 MS (_)435 1921 MS (S)460 1921 MS (A)485 1921 MS (L)510 1921 MS (O)535 1921 MS (M)560 1921 MS (E)585 1921 MS (_)610 1921 MS +(T)635 1921 MS (Y)660 1921 MS (P)685 1921 MS (E)710 1921 MS (D)735 1921 MS (A)760 1921 MS (T)785 1921 MS (A)810 1921 MS (_)835 1921 MS (I)860 1921 MS (D)885 1921 MS (L)910 1921 MS (_)935 1921 MS +( )960 1921 MS +(#)235 1969 MS (d)260 1969 MS (e)285 1969 MS (f)310 1969 MS (i)335 1969 MS (n)360 1969 MS (e)385 1969 MS ( )410 1969 MS (_)435 1969 MS (S)460 1969 MS (A)485 1969 MS (L)510 1969 MS (O)535 1969 MS (M)560 1969 MS (E)585 1969 MS (_)610 1969 MS +(T)635 1969 MS (Y)660 1969 MS (P)685 1969 MS (E)710 1969 MS (D)735 1969 MS (A)760 1969 MS (T)785 1969 MS (A)810 1969 MS (_)835 1969 MS (I)860 1969 MS (D)885 1969 MS (L)910 1969 MS (_)935 1969 MS +( )960 1969 MS +( )235 2016 MS +(m)235 2063 MS (o)260 2063 MS (d)285 2063 MS (u)310 2063 MS (l)335 2063 MS (e)360 2063 MS ( )385 2063 MS (E)410 2063 MS (n)435 2063 MS (g)460 2063 MS (i)485 2063 MS (n)510 2063 MS (e)535 2063 MS (s)560 2063 MS +( )585 2063 MS +({)235 2110 MS +( )260 2110 MS +( )235 2157 MS +( )235 2205 MS ( )260 2205 MS (t)285 2205 MS (y)310 2205 MS (p)335 2205 MS (e)360 2205 MS (d)385 2205 MS (e)410 2205 MS (f)435 2205 MS ( )460 2205 MS (s)485 2205 MS (e)510 2205 MS (q)535 2205 MS (u)560 2205 MS (e)585 2205 MS (n)610 2205 MS +(c)635 2205 MS (e)660 2205 MS (<)685 2205 MS (d)710 2205 MS (o)735 2205 MS (u)760 2205 MS (b)785 2205 MS (l)810 2205 MS (e)835 2205 MS (>)860 2205 MS ( )885 2205 MS (D)910 2205 MS +(o)935 2205 MS (u)960 2205 MS (b)985 2205 MS (l)1010 2205 MS (e)1035 2205 MS (V)1060 2205 MS (e)1085 2205 MS (c)1110 2205 MS ( )1135 2205 MS (;)1160 2205 MS +( )1185 2205 MS +( )235 2252 MS ( )260 2252 MS (t)285 2252 MS (y)310 2252 MS (p)335 2252 MS (e)360 2252 MS (d)385 2252 MS (e)410 2252 MS (f)435 2252 MS ( )460 2252 MS (s)485 2252 MS (e)510 2252 MS (q)535 2252 MS (u)560 2252 MS (e)585 2252 MS (n)610 2252 MS +(c)635 2252 MS (e)660 2252 MS (<)685 2252 MS (l)710 2252 MS (o)735 2252 MS (n)760 2252 MS (g)785 2252 MS (>)810 2252 MS ( )835 2252 MS (I)860 2252 MS (n)885 2252 MS (t)910 2252 MS (V)935 2252 MS (e)960 2252 MS (c)985 2252 MS (;)1010 2252 MS +( )1035 2252 MS +( )235 2299 MS +( )235 2346 MS ( )260 2346 MS (t)285 2346 MS (y)310 2346 MS (p)335 2346 MS (e)360 2346 MS (d)385 2346 MS (e)410 2346 MS (f)435 2346 MS ( )460 2346 MS (s)485 2346 MS (t)510 2346 MS (r)535 2346 MS (u)560 2346 MS (c)585 2346 MS (t)610 2346 MS +( )635 2346 MS (C)660 2346 MS (S)685 2346 MS (R)710 2346 MS ( )735 2346 MS ({)760 2346 MS +( )785 2346 MS +( )235 2393 MS ( )260 2393 MS ( )285 2393 MS ( )310 2393 MS (u)335 2393 MS (n)360 2393 MS (s)385 2393 MS (i)410 2393 MS (g)435 2393 MS (n)460 2393 MS (e)485 2393 MS (d)510 2393 MS ( )535 2393 MS (l)560 2393 MS (o)585 2393 MS (n)610 2393 MS +(g)635 2393 MS ( )660 2393 MS (n)685 2393 MS (b)710 2393 MS (p)735 2393 MS (o)760 2393 MS (s)785 2393 MS (;)810 2393 MS +( )835 2393 MS +( )235 2441 MS ( )260 2441 MS ( )285 2441 MS ( )310 2441 MS (u)335 2441 MS (n)360 2441 MS (s)385 2441 MS (i)410 2441 MS (g)435 2441 MS (n)460 2441 MS (e)485 2441 MS (d)510 2441 MS ( )535 2441 MS (l)560 2441 MS (o)585 2441 MS (n)610 2441 MS +(g)635 2441 MS ( )660 2441 MS (n)685 2441 MS (b)710 2441 MS (v)735 2441 MS (a)760 2441 MS (l)785 2441 MS (;)810 2441 MS +( )835 2441 MS +( )235 2488 MS ( )260 2488 MS ( )285 2488 MS ( )310 2488 MS +(I)335 2488 MS (n)360 2488 MS (t)385 2488 MS (V)410 2488 MS (e)435 2488 MS (c)460 2488 MS ( )485 2488 MS (p)510 2488 MS (o)535 2488 MS (s)560 2488 MS (;)585 2488 MS +( )610 2488 MS +( )235 2535 MS ( )260 2535 MS ( )285 2535 MS ( )310 2535 MS (I)335 2535 MS (n)360 2535 MS (t)385 2535 MS (V)410 2535 MS (e)435 2535 MS (c)460 2535 MS ( )485 2535 MS (c)510 2535 MS (o)535 2535 MS (l)560 2535 MS (;)585 2535 MS +( )610 2535 MS +( )235 2582 MS ( )260 2582 MS ( )285 2582 MS ( )310 2582 MS (D)335 2582 MS (o)360 2582 MS (u)385 2582 MS (b)410 2582 MS (l)435 2582 MS (e)460 2582 MS (V)485 2582 MS (e)510 2582 MS (c)535 2582 MS ( )560 2582 MS (d)585 2582 MS (a)610 2582 MS +(t)635 2582 MS (a)660 2582 MS (;)685 2582 MS +( )710 2582 MS +( )235 2629 MS ( )260 2629 MS (})285 2629 MS ( )310 2629 MS (C)335 2629 MS (S)360 2629 MS (R)385 2629 MS (M)410 2629 MS (a)435 2629 MS (t)460 2629 MS (S)485 2629 MS (t)510 2629 MS (r)535 2629 MS (u)560 2629 MS (c)585 2629 MS (t)610 2629 MS +(;)635 2629 MS +( )660 2629 MS +( )235 2677 MS +(})235 2724 MS ( )260 2724 MS (;)285 2724 MS +( )310 2724 MS +( )235 2771 MS +( )260 2771 MS +(#)235 2818 MS (e)260 2818 MS (n)285 2818 MS (d)310 2818 MS (i)335 2818 MS (f)360 2818 MS +( )385 2818 MS +( )235 2865 MS +( )235 2913 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )348 2970 MS +( )235 3027 MS +showpage +%%Page: 17 17 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (7)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +(9)310 527 MS (.)338 527 MS (1)352 527 MS +( )380 527 MS +LATENC /_Helvetica-BoldOblique /Helvetica-BoldOblique reencode +[50 0 0 -50 0 0]/_Helvetica-BoldOblique MF +(L)430 527 MS (e)461 527 MS ( )489 527 MS (c)503 527 MS (o)531 527 MS (m)562 527 MS (p)606 527 MS (o)636 527 MS (s)667 527 MS (a)695 527 MS (n)722 527 MS (t)753 527 MS ( )770 527 MS (e)784 527 MS (t)811 527 MS ( )828 527 MS +(l)842 527 MS (a)856 527 MS ( )884 527 MS (d)897 527 MS (o)928 527 MS (n)958 527 MS (n)989 527 MS (\351)1020 527 MS (e)1047 527 MS ( )1075 527 MS (v)1089 527 MS (e)1117 527 MS (c)1145 527 MS (t)1172 527 MS (e)1189 527 MS (u)1217 527 MS +(r)1248 527 MS ( )1267 527 MS (p)1281 527 MS (a)1311 527 MS (r)1339 527 MS (a)1358 527 MS (l)1386 527 MS (l)1400 527 MS (\350)1414 527 MS (l)1441 527 MS (e)1455 527 MS +( )1483 527 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 597 MS +(L)348 655 MS (e)378 655 MS ( )400 655 MS (c)416 655 MS (o)438 655 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(m)464 655 MS (p)501 655 MS (o)526 655 MS (s)552 655 MS (a)571 655 MS (n)594 655 MS (t)618 655 MS ( )633 655 MS (p)649 655 MS (a)674 655 MS (r)696 655 MS (a)713 655 MS (l)736 655 MS (l)749 655 MS (\350)762 655 MS (l)785 655 MS +(e)798 655 MS ( )820 655 MS (v)836 655 MS (e)861 655 MS (c)883 655 MS (t)905 655 MS (e)920 655 MS (u)942 655 MS (r)967 655 MS ( )984 655 MS (N)1000 655 MS (u)1036 655 MS (m)1061 655 MS (e)1098 655 MS (r)1120 655 MS (i)1138 655 MS +(c)1151 655 MS (a)1173 655 MS (l)1196 655 MS ( )1209 655 MS (P)1225 655 MS (l)1254 655 MS (a)1267 655 MS (t)1289 655 MS (o)1304 655 MS (n)1330 655 MS ( )1354 655 MS (e)1369 655 MS (s)1391 655 MS (t)1410 655 MS ( )1425 655 MS (c)1441 655 MS +(e)1463 655 MS (n)1485 655 MS (s)1509 655 MS (\351)1528 655 MS ( )1550 655 MS (\352)1566 655 MS (t)1588 655 MS (r)1603 655 MS (e)1620 655 MS ( )1642 655 MS (r)1658 655 MS (e)1675 655 MS (p)1697 655 MS (r)1722 655 MS (\351)1739 655 MS (s)1761 655 MS +(e)1780 655 MS (n)1802 655 MS (t)1826 655 MS (a)1841 655 MS (t)1863 655 MS (i)1878 655 MS (f)1891 655 MS ( )1906 655 MS (d)1922 655 MS (\222)1948 655 MS (u)1964 655 MS (n)1990 655 MS ( )2014 655 MS (c)2030 655 MS (o)2052 655 MS (d)2078 655 MS +(e)2103 655 MS ( )2125 655 MS +(d)235 712 MS (e)260 712 MS ( )282 712 MS (c)296 712 MS (a)318 712 MS (l)341 712 MS (c)354 712 MS (u)376 712 MS (l)402 712 MS ( )415 712 MS (q)429 712 MS (u)454 712 MS (i)480 712 MS ( )493 712 MS (g)508 712 MS (\351)533 712 MS +(n)556 712 MS (\350)580 712 MS (r)602 712 MS (e)619 712 MS ( )641 712 MS (u)655 712 MS (n)681 712 MS ( )706 712 MS (r)720 712 MS (\351)737 712 MS (s)759 712 MS (u)778 712 MS (l)804 712 MS (t)816 712 MS (a)831 712 MS (t)853 712 MS +( )868 712 MS (d)882 712 MS (e)907 712 MS ( )929 712 MS (t)943 712 MS (y)959 712 MS (p)982 712 MS (e)1007 712 MS ( )1030 712 MS (o)1044 712 MS (b)1070 712 MS (j)1095 712 MS (e)1108 712 MS (t)1130 712 MS ( )1145 712 MS (v)1159 712 MS +(e)1183 712 MS (c)1205 712 MS (t)1227 712 MS (e)1242 712 MS (u)1264 712 MS (r)1289 712 MS ( )1306 712 MS (p)1320 712 MS (a)1345 712 MS (r)1367 712 MS (a)1384 712 MS (l)1407 712 MS (l)1420 712 MS (\350)1433 712 MS (l)1456 712 MS (e)1469 712 MS +(.)1491 712 MS ( )1504 712 MS (I)1518 712 MS (l)1536 712 MS ( )1549 712 MS (f)1564 712 MS (a)1580 712 MS (u)1602 712 MS (t)1627 712 MS ( )1642 712 MS (b)1656 712 MS (i)1681 712 MS (e)1694 712 MS (n)1717 712 MS ( )1742 712 MS (f)1757 712 MS +(a)1773 712 MS (i)1796 712 MS (r)1808 712 MS (e)1825 712 MS ( )1848 712 MS (l)1863 712 MS (a)1876 712 MS ( )1898 712 MS (d)1912 712 MS (i)1938 712 MS (s)1951 712 MS (t)1970 712 MS (i)1986 712 MS (n)1999 712 MS (c)2024 712 MS (t)2046 712 MS +(i)2062 712 MS (o)2074 712 MS (n)2100 712 MS ( )2125 712 MS +(e)235 770 MS (n)257 770 MS (t)281 770 MS (r)296 770 MS (e)313 770 MS ( )335 770 MS (l)358 770 MS (e)370 770 MS ( )392 770 MS (c)415 770 MS (o)437 770 MS (m)464 770 MS (p)501 770 MS (o)526 770 MS (s)552 770 MS (a)571 770 MS +(n)593 770 MS (t)617 770 MS ( )632 770 MS (e)654 770 MS (t)676 770 MS ( )691 770 MS (l)714 770 MS (a)726 770 MS ( )748 770 MS (d)770 770 MS (o)795 770 MS (n)821 770 MS (n)846 770 MS (\351)870 770 MS (e)892 770 MS (,)914 770 MS +( )927 770 MS (m)950 770 MS (\352)988 770 MS (m)1011 770 MS (e)1049 770 MS ( )1071 770 MS (s)1094 770 MS (i)1114 770 MS ( )1127 770 MS (t)1149 770 MS (o)1164 770 MS (u)1190 770 MS (s)1215 770 MS ( )1234 770 MS (l)1256 770 MS (e)1269 770 MS +(s)1292 770 MS ( )1311 770 MS (d)1333 770 MS (e)1358 770 MS (u)1380 770 MS (x)1406 770 MS ( )1430 770 MS (s)1453 770 MS (o)1472 770 MS (n)1498 770 MS (t)1522 770 MS ( )1537 770 MS (r)1559 770 MS (e)1576 770 MS (p)1598 770 MS (r)1623 770 MS +(\351)1640 770 MS (s)1662 770 MS (e)1681 770 MS (n)1703 770 MS (t)1727 770 MS (\351)1742 770 MS (s)1764 770 MS ( )1783 770 MS (d)1805 770 MS (a)1830 770 MS +(n)1853 770 MS (s)1877 770 MS ( )1897 770 MS (l)1920 770 MS (\222)1933 770 MS (i)1950 770 MS (n)1963 770 MS (t)1987 770 MS (e)2002 770 MS (r)2024 770 MS (f)2042 770 MS (a)2058 770 MS (c)2080 770 MS (e)2102 770 MS ( )2125 770 MS +(C)235 827 MS (O)268 827 MS (R)304 827 MS (B)337 827 MS (A)371 827 MS ( )406 827 MS (c)419 827 MS (o)441 827 MS (m)468 827 MS (m)506 827 MS (e)544 827 MS ( )566 827 MS (u)579 827 MS (n)605 827 MS (e)629 827 MS ( )651 827 MS +(\253)665 827 MS +( )689 827 MS +(i)703 827 MS (n)716 827 MS (t)740 827 MS (e)755 827 MS (r)777 827 MS (f)794 827 MS (a)810 827 MS (c)832 827 MS (e)854 827 MS +( )876 827 MS +(\273)890 827 MS (.)914 827 MS ( )927 827 MS (S)940 827 MS (i)968 827 MS ( )980 827 MS (l)994 827 MS (a)1007 827 MS ( )1029 827 MS (d)1042 827 MS (o)1067 827 MS (n)1093 827 MS (n)1118 827 MS (\351)1142 827 MS (e)1164 827 MS ( )1186 827 MS +(v)1200 827 MS (e)1224 827 MS (c)1247 827 MS (t)1269 827 MS (e)1284 827 MS (u)1306 827 MS (r)1331 827 MS ( )1348 827 MS (e)1361 827 MS (s)1383 827 MS (t)1401 827 MS ( )1416 827 MS (u)1429 827 MS (n)1454 827 MS (e)1478 827 MS ( )1500 827 MS +(i)1514 827 MS (n)1527 827 MS (t)1551 827 MS (e)1566 827 MS (r)1588 827 MS (f)1605 827 MS (a)1620 827 MS (c)1642 827 MS (e)1665 827 MS ( )1687 827 MS (e)1700 827 MS (t)1722 827 MS ( )1737 827 MS (n)1750 827 MS (o)1774 827 MS (n)1800 827 MS +( )1824 827 MS (s)1837 827 MS (e)1856 827 MS (u)1878 827 MS (l)1904 827 MS (e)1917 827 MS (m)1940 827 MS (e)1978 827 MS (n)2001 827 MS (t)2025 827 MS ( )2040 827 MS (u)2053 827 MS (n)2078 827 MS (e)2102 827 MS ( )2125 827 MS +(s)235 885 MS (\351)254 885 MS (q)276 885 MS (u)301 885 MS (e)326 885 MS (n)349 885 MS (c)373 885 MS (e)395 885 MS ( )417 885 MS (d)436 885 MS (e)461 885 MS ( )483 885 MS (d)502 885 MS (o)527 885 MS (u)553 885 MS (b)578 885 MS +(l)603 885 MS (e)616 885 MS ( )638 885 MS (f)658 885 MS (l)675 885 MS (o)687 885 MS (t)713 885 MS (t)728 885 MS (a)743 885 MS (n)765 885 MS (t)789 885 MS (s)804 885 MS (,)823 885 MS ( )836 885 MS (c)855 885 MS (\222)877 885 MS +(e)893 885 MS (s)915 885 MS (t)934 885 MS ( )949 885 MS (p)968 885 MS (o)992 885 MS (u)1018 885 MS (r)1043 885 MS ( )1060 885 MS (p)1079 885 MS (e)1104 885 MS (r)1126 885 MS (m)1143 885 MS (e)1180 885 MS (t)1202 885 MS (t)1217 885 MS +(r)1231 885 MS (e)1247 885 MS ( )1269 885 MS (d)1288 885 MS (\222)1313 885 MS (u)1329 885 MS (n)1355 885 MS (e)1379 885 MS ( )1401 885 MS (p)1420 885 MS (a)1445 885 MS (r)1467 885 MS (t)1484 885 MS ( )1499 885 MS (d)1518 885 MS (e)1543 885 MS +( )1565 885 MS (t)1584 885 MS (r)1599 885 MS (a)1616 885 MS (n)1638 885 MS (s)1662 885 MS (m)1682 885 MS (e)1719 885 MS (t)1741 885 MS (t)1756 885 MS (r)1771 885 MS (e)1788 885 MS ( )1810 885 MS (u)1829 885 MS (n)1854 885 MS (i)1879 885 MS +(q)1891 885 MS (u)1916 885 MS (e)1941 885 MS (m)1964 885 MS (e)2002 885 MS (n)2025 885 MS (t)2049 885 MS ( )2064 885 MS (s)2083 885 MS (a)2102 885 MS ( )2125 885 MS +(r)235 942 MS (\351)252 942 MS (f)274 942 MS (\351)290 942 MS (r)312 942 MS (e)329 942 MS (n)352 942 MS (c)376 942 MS (e)398 942 MS ( )420 942 MS (C)433 942 MS (O)467 942 MS (R)503 942 MS (B)536 942 MS (A)570 942 MS ( )605 942 MS +(e)619 942 MS (n)642 942 MS ( )666 942 MS (a)679 942 MS (r)701 942 MS (g)718 942 MS (u)743 942 MS (m)769 942 MS (e)807 942 MS (n)830 942 MS (t)854 942 MS ( )869 942 MS (d)882 942 MS (e)907 942 MS ( )929 942 MS (s)942 942 MS +(e)961 942 MS (r)983 942 MS (v)1000 942 MS (i)1025 942 MS (c)1038 942 MS (e)1061 942 MS ( )1083 942 MS (e)1096 942 MS (t)1118 942 MS ( )1133 942 MS (n)1146 942 MS (o)1170 942 MS (n)1196 942 MS ( )1220 942 MS (p)1234 942 MS (a)1259 942 MS +(s)1281 942 MS ( )1300 942 MS (l)1314 942 MS (\222)1327 942 MS (e)1344 942 MS (n)1367 942 MS (s)1391 942 MS (e)1410 942 MS (m)1433 942 MS (b)1471 942 MS (l)1497 942 MS +(e)1510 942 MS ( )1532 942 MS (d)1545 942 MS (u)1570 942 MS ( )1595 942 MS (v)1609 942 MS (e)1634 942 MS (c)1656 942 MS (t)1678 942 MS (e)1693 942 MS (u)1715 942 MS (r)1740 942 MS (,)1757 942 MS ( )1770 942 MS (e)1783 942 MS (t)1804 942 MS +( )1819 942 MS (d)1832 942 MS (\222)1857 942 MS (a)1873 942 MS (u)1895 942 MS (t)1920 942 MS (r)1935 942 MS (e)1952 942 MS ( )1974 942 MS (p)1987 942 MS (a)2012 942 MS (r)2034 942 MS (t)2050 942 MS ( )2065 942 MS (d)2078 942 MS (e)2103 942 MS +( )2125 942 MS +(l)235 1000 MS (e)248 1000 MS ( )270 1000 MS (d)286 1000 MS (\351)311 1000 MS (f)334 1000 MS (i)351 1000 MS (n)364 1000 MS (i)389 1000 MS (r)402 1000 MS ( )419 1000 MS (e)435 1000 MS (n)458 1000 MS ( )482 1000 MS (t)498 1000 MS (a)513 1000 MS +(n)535 1000 MS (t)559 1000 MS ( )574 1000 MS (q)590 1000 MS (u)615 1000 MS (e)640 1000 MS ( )662 1000 MS (d)678 1000 MS (o)703 1000 MS (n)729 1000 MS (n)753 1000 MS (\351)777 1000 MS (e)799 1000 MS ( )821 1000 MS (p)837 1000 MS (a)862 1000 MS +(r)884 1000 MS (a)901 1000 MS (l)924 1000 MS (l)938 1000 MS (\350)951 1000 MS (l)974 1000 MS (e)987 1000 MS +( )1009 1000 MS +(:)1022 1000 MS ( )1036 1000 MS (c)1052 1000 MS (\222)1074 1000 MS (e)1090 1000 MS (s)1112 1000 MS (t)1131 1000 MS ( )1146 1000 MS (\340)1162 1000 MS ( )1184 1000 MS (d)1200 1000 MS (i)1226 1000 MS (r)1238 1000 MS (e)1256 1000 MS ( )1278 1000 MS (q)1294 1000 MS +(u)1319 1000 MS (e)1344 1000 MS ( )1366 1000 MS (l)1383 1000 MS (\222)1395 1000 MS (i)1412 1000 MS (n)1425 1000 MS (t)1449 1000 MS (e)1464 1000 MS (r)1486 1000 MS (f)1504 1000 MS (a)1520 1000 MS (c)1542 1000 MS (e)1564 1000 MS ( )1586 1000 MS (P)1602 1000 MS +(V)1630 1000 MS (e)1666 1000 MS (c)1688 1000 MS ( )1710 1000 MS (h)1727 1000 MS (\351)1751 1000 MS (r)1773 1000 MS (i)1791 1000 MS (t)1803 1000 MS (e)1818 1000 MS ( )1840 1000 MS (d)1856 1000 MS (e)1881 1000 MS ( )1903 1000 MS (l)1920 1000 MS (\222)1933 1000 MS +(i)1950 1000 MS (n)1963 1000 MS (t)1987 1000 MS (e)2002 1000 MS (r)2024 1000 MS (f)2042 1000 MS (a)2058 1000 MS (c)2080 1000 MS (e)2102 1000 MS ( )2125 1000 MS +(g)235 1057 MS (\351)260 1057 MS (n)282 1057 MS (\351)306 1057 MS (r)328 1057 MS (i)346 1057 MS (q)359 1057 MS (u)384 1057 MS (e)409 1057 MS ( )431 1057 MS (M)444 1057 MS (P)488 1057 MS (I)516 1057 MS (O)533 1057 MS (b)570 1057 MS (j)595 1057 MS +(e)608 1057 MS (c)630 1057 MS (t)652 1057 MS (.)667 1057 MS +( )680 1057 MS +( )235 1115 MS +[54 0 0 -54 0 0]/Helvetica-Bold MF +(9)310 1225 MS (.)340 1225 MS (1)355 1225 MS (.)385 1225 MS (1)400 1225 MS +( )430 1225 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[54 0 0 -54 0 0]/_Helvetica-Bold MF +(D)460 1225 MS (\351)499 1225 MS (f)529 1225 MS (i)547 1225 MS (n)562 1225 MS (i)595 1225 MS (t)610 1225 MS (i)628 1225 MS (o)643 1225 MS (n)676 1225 MS ( )709 1225 MS (d)724 1225 MS (e)757 1225 MS ( )787 1225 MS (l)802 1225 MS (\222)817 1225 MS +(i)832 1225 MS (n)847 1225 MS (t)880 1225 MS (e)898 1225 MS (r)928 1225 MS (f)949 1225 MS (a)968 1225 MS (c)998 1225 MS (e)1028 1225 MS ( )1058 1225 MS (C)1073 1225 MS (O)1112 1225 MS (R)1154 1225 MS (B)1193 1225 MS (A)1233 1225 MS +( )1271 1225 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 1297 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(D)348 1355 MS (a)384 1355 MS (n)406 1355 MS (s)431 1355 MS ( )450 1355 MS (l)483 1355 MS (\222)496 1355 MS (e)512 1355 MS (x)535 1355 MS (e)560 1355 MS (m)583 1355 MS (p)620 1355 MS (l)646 1355 MS (e)659 1355 MS ( )682 1355 MS (c)714 1355 MS +(i)737 1355 MS +(-)749 1355 MS +(d)766 1355 MS (e)791 1355 MS (s)814 1355 MS (s)833 1355 MS (o)852 1355 MS (u)878 1355 MS (s)903 1355 MS (,)922 1355 MS ( )935 1355 MS (o)967 1355 MS (n)993 1355 MS ( )1017 1355 MS (d)1049 1355 MS (\351)1074 1355 MS (f)1097 1355 MS (i)1113 1355 MS +(n)1126 1355 MS (i)1152 1355 MS (t)1164 1355 MS ( )1179 1355 MS (d)1211 1355 MS (e)1236 1355 MS (u)1258 1355 MS (x)1284 1355 MS ( )1308 1355 MS (i)1341 1355 MS (n)1355 1355 MS (t)1379 1355 MS (e)1394 1355 MS (r)1416 1355 MS (f)1433 1355 MS (a)1449 1355 MS +(c)1471 1355 MS (e)1493 1355 MS (s)1515 1355 MS (.)1534 1355 MS ( )1547 1355 MS (C)1579 1355 MS (e)1612 1355 MS (s)1635 1355 MS ( )1654 1355 MS (d)1686 1355 MS (e)1711 1355 MS (u)1733 1355 MS (x)1759 1355 MS ( )1783 1355 MS (i)1816 1355 MS (n)1829 1355 MS +(t)1853 1355 MS (e)1868 1355 MS (r)1890 1355 MS (f)1908 1355 MS +(a)1923 1355 MS (c)1946 1355 MS (e)1968 1355 MS (s)1990 1355 MS ( )2009 1355 MS (s)2042 1355 MS (o)2061 1355 MS (n)2087 1355 MS (t)2111 1355 MS ( )2125 1355 MS +(p)235 1412 MS (a)260 1412 MS (r)282 1412 MS (a)299 1412 MS (l)322 1412 MS (l)335 1412 MS (\350)348 1412 MS (l)371 1412 MS (e)384 1412 MS (s)407 1412 MS ( )426 1412 MS (c)439 1412 MS (a)461 1412 MS (r)483 1412 MS ( )500 1412 MS (e)513 1412 MS +(l)536 1412 MS (l)549 1412 MS (e)562 1412 MS (s)584 1412 MS ( )603 1412 MS (h)617 1412 MS (\351)641 1412 MS (r)663 1412 MS (i)681 1412 MS (t)693 1412 MS (e)708 1412 MS (n)730 1412 MS (t)754 1412 MS ( )769 1412 MS (d)782 1412 MS (e)807 1412 MS +( )829 1412 MS (l)842 1412 MS (\222)855 1412 MS (i)872 1412 MS (n)885 1412 MS (t)909 1412 MS (e)924 1412 MS (r)946 1412 MS (f)964 1412 MS (a)980 1412 MS (c)1002 1412 MS (e)1024 1412 MS ( )1046 1412 MS (g)1059 1412 MS (\351)1084 1412 MS (n)1107 1412 MS +(\351)1131 1412 MS (r)1153 1412 MS (i)1171 1412 MS (q)1183 1412 MS (u)1208 1412 MS (e)1233 1412 MS ( )1256 1412 MS (p)1269 1412 MS (a)1294 1412 MS (r)1316 1412 MS (a)1333 1412 MS (l)1355 1412 MS (l)1368 1412 MS (\350)1381 1412 MS (l)1404 1412 MS (e)1417 1412 MS +( )1439 1412 MS +(:)1452 1412 MS ( )1466 1412 MS (M)1479 1412 MS (P)1523 1412 MS (I)1551 1412 MS (O)1568 1412 MS (b)1604 1412 MS (j)1629 1412 MS (e)1642 1412 MS (c)1665 1412 MS (t)1687 1412 MS (.)1702 1412 MS ( )1715 1412 MS +( )1728 1412 MS +(L)348 1470 MS (a)378 1470 MS ( )400 1470 MS (p)429 1470 MS (r)454 1470 MS (e)471 1470 MS (m)494 1470 MS (i)533 1470 MS (\350)546 1470 MS (r)568 1470 MS (e)585 1470 MS ( )607 1470 MS (i)637 1470 MS (n)650 1470 MS (t)674 1470 MS (e)689 1470 MS +(r)711 1470 MS (f)729 1470 MS (a)745 1470 MS (c)767 1470 MS (e)789 1470 MS ( )811 1470 MS (n)841 1470 MS (o)865 1470 MS (m)892 1470 MS (m)930 1470 MS (\351)968 1470 MS (e)990 1470 MS ( )1013 1470 MS (P)1042 1470 MS (V)1070 1470 MS (e)1106 1470 MS +(c)1128 1470 MS ( )1150 1470 MS (r)1179 1470 MS (e)1196 1470 MS (p)1218 1470 MS (r)1243 1470 MS (\351)1260 1470 MS (s)1283 1470 MS (e)1302 1470 MS (n)1325 1470 MS (t)1349 1470 MS (e)1364 1470 MS ( )1386 1470 MS (l)1416 1470 MS (a)1429 1470 MS ( )1451 1470 MS +(d)1480 1470 MS (o)1505 1470 MS (n)1531 1470 MS (n)1556 1470 MS (\351)1580 1470 MS (e)1602 1470 MS ( )1625 1470 MS (v)1655 1470 MS (e)1679 1470 MS (c)1701 1470 MS (t)1723 1470 MS (e)1738 1470 MS (u)1760 1470 MS (r)1785 1470 MS ( )1802 1470 MS (p)1831 1470 MS +(a)1856 1470 MS (r)1878 1470 MS (a)1895 1470 MS (l)1918 1470 MS (l)1931 1470 MS (\350)1944 1470 MS (l)1967 1470 MS (e)1980 1470 MS (.)2002 1470 MS ( )2015 1470 MS (E)2044 1470 MS (l)2076 1470 MS (l)2089 1470 MS (e)2102 1470 MS ( )2125 1470 MS +(c)235 1527 MS (o)257 1527 MS (n)283 1527 MS (t)307 1527 MS (i)322 1527 MS (e)334 1527 MS (n)357 1527 MS (t)381 1527 MS ( )396 1527 MS (u)422 1527 MS (n)447 1527 MS ( )471 1527 MS (a)497 1527 MS (t)519 1527 MS (t)533 1527 MS (r)548 1527 MS +(i)565 1527 MS (b)578 1527 MS (u)602 1527 MS (t)627 1527 MS ( )642 1527 MS (d)668 1527 MS (e)693 1527 MS ( )715 1527 MS (t)740 1527 MS (y)755 1527 MS (p)778 1527 MS (e)804 1527 MS ( )826 1527 MS (s)852 1527 MS (\351)871 1527 MS (q)893 1527 MS +(u)918 1527 MS (e)943 1527 MS (n)966 1527 MS (c)990 1527 MS (e)1012 1527 MS ( )1034 1527 MS (d)1060 1527 MS (e)1085 1527 MS ( )1107 1527 MS (d)1133 1527 MS (o)1158 1527 MS (u)1184 1527 MS (b)1209 1527 MS (l)1234 1527 MS (e)1248 1527 MS ( )1270 1527 MS +(f)1297 1527 MS (l)1313 1527 MS (o)1325 1527 MS (t)1351 1527 MS (t)1365 1527 MS (a)1380 1527 MS (n)1402 1527 MS (t)1426 1527 MS (s)1441 1527 MS (.)1460 1527 MS ( )1473 1527 MS (C)1499 1527 MS (e)1532 1527 MS (t)1553 1527 MS (t)1567 1527 MS (e)1582 1527 MS +( )1604 1527 MS (s)1630 1527 MS (\351)1649 1527 MS (q)1671 1527 MS (u)1696 1527 MS (e)1721 1527 MS (n)1743 1527 MS (c)1767 1527 MS (e)1789 1527 MS ( )1811 1527 MS (r)1837 1527 MS (e)1854 1527 MS (p)1876 1527 MS (r)1901 1527 MS (\351)1918 1527 MS (s)1940 1527 MS +(e)1959 1527 MS (n)1982 1527 MS (t)2006 1527 MS (e)2021 1527 MS ( )2043 1527 MS (l)2070 1527 MS (e)2082 1527 MS (s)2105 1527 MS +( )2125 1527 MS +(d)235 1585 MS (o)260 1585 MS (n)286 1585 MS (n)310 1585 MS (\351)334 1585 MS (e)356 1585 MS (s)379 1585 MS ( )398 1585 MS (l)419 1585 MS (o)431 1585 MS (c)457 1585 MS (a)479 1585 MS (l)502 1585 MS (e)515 1585 MS (s)538 1585 MS ( )557 1585 MS +(\340)577 1585 MS ( )599 1585 MS (u)619 1585 MS (n)645 1585 MS ( )669 1585 MS (p)689 1585 MS (r)714 1585 MS (o)731 1585 MS (c)757 1585 MS (e)779 1585 MS (s)801 1585 MS (s)820 1585 MS (e)839 1585 MS (u)861 1585 MS (r)886 1585 MS (,)903 1585 MS +( )916 1585 MS (e)936 1585 MS (t)958 1585 MS ( )973 1585 MS (c)993 1585 MS (o)1015 1585 MS (n)1041 1585 MS (s)1065 1585 MS (t)1084 1585 MS (i)1099 1585 MS (t)1111 1585 MS (u)1126 1585 MS (e)1151 1585 MS ( )1173 1585 MS (d)1193 1585 MS (o)1218 1585 MS +(n)1243 1585 MS (c)1267 1585 MS ( )1289 1585 MS (u)1309 1585 MS (n)1335 1585 MS (e)1359 1585 MS ( )1382 1585 MS (p)1402 1585 MS (a)1427 1585 MS (r)1449 1585 MS (t)1466 1585 MS (i)1481 1585 MS (e)1493 1585 MS ( )1516 1585 MS (s)1536 1585 MS (e)1555 1585 MS +(u)1577 1585 MS (l)1603 1585 MS (e)1616 1585 MS (m)1639 1585 MS (e)1677 1585 MS (n)1700 1585 MS (t)1724 1585 MS ( )1739 1585 MS (d)1759 1585 MS (e)1784 1585 MS ( )1806 1585 MS (l)1827 1585 MS (\222)1840 1585 MS (o)1856 1585 MS (b)1882 1585 MS (j)1907 1585 MS +(e)1920 1585 MS (t)1942 1585 MS ( )1957 1585 MS (v)1977 1585 MS (e)2001 1585 MS (c)2024 1585 MS (t)2046 1585 MS (e)2061 1585 MS (u)2083 1585 MS (r)2108 1585 MS ( )2125 1585 MS +(d)235 1642 MS (i)261 1642 MS (s)273 1642 MS (t)292 1642 MS (r)307 1642 MS (i)325 1642 MS (b)338 1642 MS (u)362 1642 MS (\351)387 1642 MS (.)409 1642 MS ( )422 1642 MS (C)441 1642 MS (e)474 1642 MS (t)496 1642 MS (t)511 1642 MS (e)526 1642 MS +( )548 1642 MS (i)567 1642 MS (n)580 1642 MS (t)604 1642 MS (e)619 1642 MS (r)641 1642 MS (f)658 1642 MS (a)673 1642 MS (c)695 1642 MS (e)718 1642 MS ( )740 1642 MS (p)759 1642 MS (o)784 1642 MS (s)810 1642 MS (s)829 1642 MS (\350)848 1642 MS +(d)870 1642 MS (e)895 1642 MS ( )917 1642 MS (d)936 1642 MS (e)961 1642 MS ( )983 1642 MS (p)1002 1642 MS (l)1028 1642 MS (u)1040 1642 MS (s)1066 1642 MS ( )1085 1642 MS (u)1104 1642 MS (n)1130 1642 MS (e)1154 1642 MS ( )1176 1642 MS (f)1196 1642 MS +(o)1211 1642 MS (n)1237 1642 MS (c)1261 1642 MS (t)1283 1642 MS (i)1299 1642 MS (o)1311 1642 MS (n)1337 1642 MS ( )1361 1642 MS (S)1380 1642 MS (i)1409 1642 MS (z)1422 1642 MS (e)1444 1642 MS (\()1466 1642 MS (\))1483 1642 MS ( )1500 1642 MS (q)1519 1642 MS +(u)1544 1642 MS (i)1570 1642 MS ( )1582 1642 MS (r)1601 1642 MS (e)1618 1642 MS (n)1641 1642 MS (v)1666 1642 MS (o)1690 1642 MS (i)1717 1642 MS (e)1729 1642 MS ( )1751 1642 MS (l)1771 1642 MS (a)1784 1642 MS ( )1806 1642 MS (t)1825 1642 MS (a)1840 1642 MS +(i)1862 1642 MS (l)1875 1642 MS (l)1889 1642 MS (e)1902 1642 MS ( )1924 1642 MS (t)1943 1642 MS (o)1958 1642 MS (t)1983 1642 MS (a)1998 1642 MS (l)2020 1642 MS (e)2032 1642 MS ( )2054 1642 MS (d)2073 1642 MS (u)2099 1642 MS ( )2125 1642 MS +(v)235 1700 MS (e)259 1700 MS (c)281 1700 MS (t)303 1700 MS (e)318 1700 MS (u)340 1700 MS (r)365 1700 MS ( )382 1700 MS (s)408 1700 MS (u)427 1700 MS (r)452 1700 MS ( )469 1700 MS (l)496 1700 MS (\222)509 1700 MS (e)526 1700 MS (n)549 1700 MS +(s)573 1700 MS (e)592 1700 MS (m)615 1700 MS (b)653 1700 MS (l)679 1700 MS (e)692 1700 MS ( )715 1700 MS (d)741 1700 MS (e)766 1700 MS (s)788 1700 MS ( )808 1700 MS (p)834 1700 MS (r)859 1700 MS (o)876 1700 MS (c)902 1700 MS (e)924 1700 MS +(s)946 1700 MS (s)965 1700 MS (e)984 1700 MS (u)1006 1700 MS (r)1031 1700 MS (s)1048 1700 MS (,)1067 1700 MS ( )1080 1700 MS (e)1106 1700 MS (t)1128 1700 MS ( )1143 1700 MS (u)1169 1700 MS (n)1194 1700 MS (e)1219 1700 MS ( )1242 1700 MS (f)1269 1700 MS +(o)1284 1700 MS (n)1310 1700 MS (c)1334 1700 MS (t)1356 1700 MS (i)1372 1700 MS (o)1384 1700 MS (n)1410 1700 MS ( )1434 1700 MS (L)1461 1700 MS (V)1491 1700 MS (e)1527 1700 MS (c)1549 1700 MS (\()1571 1700 MS (s)1589 1700 MS (t)1608 1700 MS (a)1623 1700 MS +(r)1645 1700 MS (t)1661 1700 MS (,)1676 1700 MS (e)1689 1700 MS (n)1711 1700 MS +(d)1735 1700 MS (\))1760 1700 MS ( )1777 1700 MS (q)1803 1700 MS (u)1828 1700 MS (i)1854 1700 MS ( )1866 1700 MS (r)1892 1700 MS (e)1909 1700 MS (n)1932 1700 MS (v)1957 1700 MS (o)1981 1700 MS (i)2008 1700 MS (e)2020 1700 MS ( )2043 1700 MS (l)2070 1700 MS +(e)2083 1700 MS (s)2105 1700 MS ( )2125 1700 MS +(i)235 1757 MS (n)248 1757 MS (d)273 1757 MS (i)299 1757 MS (c)312 1757 MS (e)334 1757 MS (s)357 1757 MS ( )376 1757 MS (d)394 1757 MS (e)419 1757 MS ( )441 1757 MS (d)459 1757 MS (\351)484 1757 MS (b)506 1757 MS (u)530 1757 MS (t)555 1757 MS +( )570 1757 MS (e)588 1757 MS (t)610 1757 MS ( )624 1757 MS (d)642 1757 MS (e)667 1757 MS ( )689 1757 MS (f)707 1757 MS (i)723 1757 MS (n)736 1757 MS ( )760 1757 MS (c)778 1757 MS (o)800 1757 MS (r)826 1757 MS (r)843 1757 MS (e)860 1757 MS +(s)882 1757 MS (p)901 1757 MS (o)926 1757 MS (n)952 1757 MS (d)976 1757 MS (a)1001 1757 MS (n)1023 1757 MS (t)1047 1757 MS ( )1062 1757 MS (\340)1080 1757 MS ( )1102 1757 MS (l)1120 1757 MS (a)1132 1757 MS ( )1154 1757 MS (p)1172 1757 MS (a)1197 1757 MS +(r)1219 1757 MS (t)1236 1757 MS (i)1251 1757 MS (e)1264 1757 MS ( )1286 1757 MS (l)1305 1757 MS (o)1317 1757 MS (c)1343 1757 MS (a)1365 1757 MS (l)1388 1757 MS (e)1401 1757 MS ( )1423 1757 MS (d)1441 1757 MS (u)1466 1757 MS ( )1491 1757 MS (v)1509 1757 MS +(e)1533 1757 MS (c)1555 1757 MS (t)1577 1757 MS (e)1592 1757 MS (u)1614 1757 MS (r)1639 1757 MS ( )1656 1757 MS (s)1674 1757 MS (u)1693 1757 MS (r)1718 1757 MS ( )1735 1757 MS (c)1753 1757 MS (h)1775 1757 MS (a)1799 1757 MS (q)1821 1757 MS (u)1846 1757 MS +(e)1871 1757 MS ( )1893 1757 MS (p)1911 1757 MS (r)1936 1757 MS (o)1953 1757 MS (c)1979 1757 MS (e)2001 1757 MS (s)2023 1757 MS (s)2042 1757 MS (e)2061 1757 MS (u)2083 1757 MS (r)2108 1757 MS ( )2125 1757 MS +(\253)235 1815 MS +( )259 1815 MS +(s)272 1815 MS (e)291 1815 MS (r)313 1815 MS (v)331 1815 MS (e)355 1815 MS (u)377 1815 MS (r)402 1815 MS +( )419 1815 MS +(\273)432 1815 MS ( )456 1815 MS (p)478 1815 MS (a)504 1815 MS (r)526 1815 MS (m)544 1815 MS (i)582 1815 MS ( )595 1815 MS (l)618 1815 MS (\222)631 1815 MS (e)648 1815 MS (n)671 1815 MS (s)695 1815 MS (e)715 1815 MS (m)738 1815 MS (b)776 1815 MS +(l)801 1815 MS (e)814 1815 MS ( )837 1815 MS (d)859 1815 MS (u)884 1815 MS ( )909 1815 MS (v)932 1815 MS (e)956 1815 MS (c)978 1815 MS (t)1000 1815 MS (e)1015 1815 MS (u)1037 1815 MS (r)1062 1815 MS (.)1079 1815 MS ( )1092 1815 MS (C)1114 1815 MS +(e)1147 1815 MS (t)1169 1815 MS (t)1183 1815 MS (e)1198 1815 MS ( )1220 1815 MS (p)1242 1815 MS (a)1267 1815 MS (r)1289 1815 MS (t)1306 1815 MS (i)1321 1815 MS (e)1333 1815 MS ( )1355 1815 MS (l)1378 1815 MS (o)1390 1815 MS (c)1416 1815 MS (a)1438 1815 MS +(l)1461 1815 MS (e)1474 1815 MS ( )1497 1815 MS (e)1519 1815 MS (s)1541 1815 MS (t)1560 1815 MS ( )1575 1815 MS (c)1597 1815 MS (o)1619 1815 MS (n)1645 1815 MS (s)1669 1815 MS (t)1688 1815 MS (i)1704 1815 MS (t)1716 1815 MS (u)1731 1815 MS (\351)1756 1815 MS +(e)1778 1815 MS ( )1800 1815 MS (d)1822 1815 MS (\222)1847 1815 MS (u)1863 1815 MS (n)1889 1815 MS ( )1913 1815 MS (e)1935 1815 MS (n)1958 1815 MS (s)1983 1815 MS (e)2002 1815 MS (m)2025 1815 MS (b)2063 1815 MS (l)2089 1815 MS (e)2102 1815 MS ( )2125 1815 MS +(c)235 1872 MS (o)257 1872 MS (n)283 1872 MS (t)307 1872 MS (i)322 1872 MS (g)334 1872 MS (u)359 1872 MS ( )384 1872 MS (d)407 1872 MS (\222)433 1872 MS (i)450 1872 MS (n)463 1872 MS (d)488 1872 MS (i)514 1872 MS (c)527 1872 MS (e)549 1872 MS +(s)572 1872 MS (.)591 1872 MS ( )604 1872 MS (E)627 1872 MS (n)658 1872 MS (f)683 1872 MS (i)700 1872 MS (n)713 1872 MS ( )738 1872 MS (u)761 1872 MS (n)787 1872 MS (e)811 1872 MS ( )833 1872 MS (f)857 1872 MS (o)872 1872 MS (n)899 1872 MS +(c)923 1872 MS (t)945 1872 MS (i)961 1872 MS (o)973 1872 MS (n)999 1872 MS ( )1023 1872 MS (n)1047 1872 MS (v)1072 1872 MS (e)1097 1872 MS (c)1119 1872 MS (\()1141 1872 MS (s)1158 1872 MS (t)1177 1872 MS (a)1192 1872 MS (r)1214 1872 MS (t)1231 1872 MS +(,)1245 1872 MS (e)1257 1872 MS (n)1279 1872 MS (d)1303 1872 MS (\))1328 1872 MS ( )1345 1872 MS +(p)1368 1872 MS (e)1393 1872 MS (r)1415 1872 MS (m)1433 1872 MS (e)1471 1872 MS (t)1493 1872 MS ( )1508 1872 MS (\340)1531 1872 MS ( )1553 1872 MS (u)1576 1872 MS (n)1602 1872 MS ( )1626 1872 MS (p)1649 1872 MS (r)1674 1872 MS (o)1691 1872 MS (c)1717 1872 MS +(e)1739 1872 MS (s)1761 1872 MS (s)1780 1872 MS (u)1799 1872 MS (s)1825 1872 MS ( )1844 1872 MS (\253)1868 1872 MS +( )1892 1872 MS +(c)1905 1872 MS (l)1928 1872 MS (i)1942 1872 MS (e)1955 1872 MS (n)1978 1872 MS (t)2002 1872 MS +( )2017 1872 MS +(\273)2030 1872 MS ( )2054 1872 MS (d)2077 1872 MS (e)2102 1872 MS ( )2125 1872 MS +(r)235 1930 MS (\351)252 1930 MS (c)274 1930 MS (u)296 1930 MS (p)321 1930 MS (\351)346 1930 MS (r)368 1930 MS (e)385 1930 MS (r)407 1930 MS ( )424 1930 MS (u)440 1930 MS (n)465 1930 MS (e)489 1930 MS ( )511 1930 MS (p)527 1930 MS (a)552 1930 MS +(r)574 1930 MS (t)591 1930 MS (i)607 1930 MS (e)619 1930 MS ( )641 1930 MS (s)658 1930 MS (e)677 1930 MS (u)699 1930 MS (l)725 1930 MS (e)738 1930 MS (m)761 1930 MS (e)799 1930 MS (n)822 1930 MS (t)846 1930 MS ( )861 1930 MS (d)877 1930 MS +(e)902 1930 MS (s)924 1930 MS ( )943 1930 MS (d)959 1930 MS (o)984 1930 MS (n)1010 1930 MS (n)1035 1930 MS (\351)1059 1930 MS (e)1081 1930 MS (s)1104 1930 MS ( )1123 1930 MS (l)1140 1930 MS (o)1152 1930 MS (c)1178 1930 MS (a)1200 1930 MS (l)1223 1930 MS +(e)1237 1930 MS (s)1259 1930 MS ( )1278 1930 MS (a)1294 1930 MS (u)1316 1930 MS ( )1341 1930 MS (p)1357 1930 MS (r)1382 1930 MS (o)1399 1930 MS (c)1425 1930 MS (e)1447 1930 MS (s)1469 1930 MS (s)1488 1930 MS (e)1507 1930 MS (u)1529 1930 MS (r)1554 1930 MS +( )1571 1930 MS (\253)1588 1930 MS +( )1612 1930 MS +(s)1625 1930 MS (e)1644 1930 MS (r)1666 1930 MS (v)1684 1930 MS (e)1708 1930 MS (u)1730 1930 MS (r)1755 1930 MS +( )1772 1930 MS +(\273)1785 1930 MS (.)1809 1930 MS ( )1822 1930 MS (C)1838 1930 MS (e)1872 1930 MS (t)1894 1930 MS (t)1908 1930 MS (e)1923 1930 MS ( )1945 1930 MS (d)1961 1930 MS (e)1986 1930 MS (r)2008 1930 MS (n)2025 1930 MS (i)2050 1930 MS (\350)2063 1930 MS (r)2085 1930 MS +(e)2102 1930 MS ( )2125 1930 MS +(f)235 1987 MS (o)250 1987 MS (n)277 1987 MS (c)301 1987 MS (t)323 1987 MS (i)339 1987 MS (o)351 1987 MS (n)377 1987 MS ( )401 1987 MS (e)426 1987 MS (s)448 1987 MS (t)467 1987 MS ( )482 1987 MS (i)508 1987 MS (m)521 1987 MS (p)559 1987 MS +(o)584 1987 MS (r)610 1987 MS (t)626 1987 MS (a)641 1987 MS (n)663 1987 MS (t)687 1987 MS (e)702 1987 MS (,)724 1987 MS ( )737 1987 MS (c)762 1987 MS (a)784 1987 MS (r)806 1987 MS ( )823 1987 MS (e)848 1987 MS (l)870 1987 MS (l)883 1987 MS +(e)896 1987 MS ( )918 1987 MS (p)943 1987 MS (e)968 1987 MS (r)990 1987 MS (m)1008 1987 MS (e)1046 1987 MS (t)1068 1987 MS ( )1083 1987 MS (\340)1108 1987 MS ( )1130 1987 MS (c)1155 1987 MS (h)1177 1987 MS (a)1201 1987 MS (q)1223 1987 MS (u)1249 1987 MS +(e)1274 1987 MS ( )1296 1987 MS (p)1321 1987 MS (r)1346 1987 MS (o)1363 1987 MS (c)1389 1987 MS (e)1411 1987 MS (s)1433 1987 MS (s)1452 1987 MS (u)1471 1987 MS (s)1496 1987 MS ( )1515 1987 MS (d)1540 1987 MS (\222)1565 1987 MS (u)1581 1987 MS (n)1607 1987 MS +( )1631 1987 MS (\253)1657 1987 MS +( )1681 1987 MS +(c)1694 1987 MS (l)1717 1987 MS (i)1730 1987 MS (e)1743 1987 MS (n)1766 1987 MS (t)1790 1987 MS +( )1805 1987 MS +(\273)1818 1987 MS ( )1842 1987 MS (p)1867 1987 MS (a)1892 1987 MS (r)1914 1987 MS (a)1931 1987 MS (l)1954 1987 MS (l)1968 1987 MS (\350)1981 1987 MS (l)2004 1987 MS (e)2017 1987 MS (,)2039 1987 MS ( )2052 1987 MS (d)2077 1987 MS (e)2102 1987 MS ( )2125 1987 MS +(r)235 2045 MS (\351)252 2045 MS (c)274 2045 MS (u)296 2045 MS (p)321 2045 MS (\351)346 2045 MS (r)368 2045 MS (e)385 2045 MS (r)407 2045 MS ( )424 2045 MS (s)453 2045 MS (u)472 2045 MS (r)497 2045 MS ( )514 2045 MS (l)543 2045 MS (e)555 2045 MS +(s)578 2045 MS ( )597 2045 MS (p)626 2045 MS (r)651 2045 MS (o)668 2045 MS (c)694 2045 MS (e)716 2045 MS (s)738 2045 MS (s)757 2045 MS (u)776 2045 MS (s)801 2045 MS ( )820 2045 MS (c)849 2045 MS (o)871 2045 MS (n)897 2045 MS (c)921 2045 MS +(e)943 2045 MS (r)965 2045 MS (n)982 2045 MS (\351)1007 2045 MS (s)1029 2045 MS +( )1048 2045 MS (d)1077 2045 MS (u)1102 2045 MS ( )1127 2045 MS (\253)1156 2045 MS +( )1180 2045 MS +(s)1193 2045 MS (e)1213 2045 MS (r)1235 2045 MS (v)1252 2045 MS (e)1276 2045 MS (u)1298 2045 MS (r)1323 2045 MS +( )1340 2045 MS +(\273)1353 2045 MS ( )1377 2045 MS (p)1406 2045 MS (a)1431 2045 MS (r)1453 2045 MS (a)1470 2045 MS (l)1493 2045 MS (l)1507 2045 MS (\350)1520 2045 MS (l)1543 2045 MS (e)1556 2045 MS (,)1578 2045 MS ( )1591 2045 MS (u)1620 2045 MS (n)1645 2045 MS (i)1670 2045 MS +(q)1683 2045 MS (u)1708 2045 MS (e)1733 2045 MS (m)1756 2045 MS (e)1794 2045 MS (n)1817 2045 MS (t)1841 2045 MS ( )1856 2045 MS (s)1885 2045 MS (e)1904 2045 MS (s)1926 2045 MS ( )1945 2045 MS (p)1974 2045 MS (r)1999 2045 MS (o)2016 2045 MS (p)2042 2045 MS +(r)2067 2045 MS (e)2084 2045 MS (s)2106 2045 MS ( )2125 2045 MS +(d)235 2102 MS (o)260 2102 MS (n)286 2102 MS (n)310 2102 MS (\351)334 2102 MS (e)356 2102 MS (s)379 2102 MS ( )398 2102 MS (l)423 2102 MS (o)435 2102 MS (c)461 2102 MS (a)483 2102 MS (l)506 2102 MS (e)519 2102 MS (s)542 2102 MS (.)561 2102 MS +( )574 2102 MS (L)598 2102 MS (e)628 2102 MS (s)650 2102 MS ( )669 2102 MS (t)693 2102 MS (r)708 2102 MS (a)725 2102 MS (n)747 2102 MS (s)771 2102 MS (f)791 2102 MS (e)807 2102 MS (r)829 2102 MS (t)846 2102 MS (s)861 2102 MS ( )880 2102 MS +(d)904 2102 MS (\222)929 2102 MS (u)945 2102 MS (n)971 2102 MS (e)995 2102 MS ( )1017 2102 MS (d)1041 2102 MS (o)1066 2102 MS (n)1092 2102 MS (n)1117 2102 MS (\351)1141 2102 MS (e)1163 2102 MS ( )1185 2102 MS (p)1209 2102 MS (a)1235 2102 MS (r)1258 2102 MS +(a)1275 2102 MS (l)1298 2102 MS (l)1311 2102 MS (\350)1324 2102 MS (l)1347 2102 MS (e)1360 2102 MS ( )1382 2102 MS (e)1406 2102 MS (s)1429 2102 MS (t)1448 2102 MS ( )1463 2102 MS (d)1487 2102 MS (o)1511 2102 MS (n)1537 2102 MS (c)1561 2102 MS ( )1583 2102 MS +(o)1607 2102 MS (p)1633 2102 MS (t)1657 2102 MS (i)1672 2102 MS (m)1685 2102 MS (i)1724 2102 MS (s)1737 2102 MS (\351)1757 2102 MS (e)1779 2102 MS ( )1801 2102 MS (s)1825 2102 MS (u)1844 2102 MS (r)1869 2102 MS ( )1886 2102 MS (l)1911 2102 MS (e)1924 2102 MS +( )1946 2102 MS (r)1970 2102 MS (\351)1987 2102 MS (s)2009 2102 MS (e)2029 2102 MS (a)2051 2102 MS (u)2073 2102 MS +( )2098 2102 MS +(:)2111 2102 MS ( )2125 2102 MS +(c)235 2160 MS (h)257 2160 MS (a)281 2160 MS (q)303 2160 MS (u)328 2160 MS (e)354 2160 MS ( )376 2160 MS (c)394 2160 MS (o)416 2160 MS (m)443 2160 MS (p)480 2160 MS (o)505 2160 MS (s)531 2160 MS (a)550 2160 MS (n)572 2160 MS (t)596 2160 MS +(e)611 2160 MS ( )633 2160 MS (d)651 2160 MS (u)676 2160 MS ( )701 2160 MS (v)719 2160 MS (e)743 2160 MS (c)766 2160 MS (t)788 2160 MS (e)803 2160 MS (u)825 2160 MS (r)850 2160 MS ( )867 2160 MS (p)885 2160 MS (a)910 2160 MS (r)932 2160 MS +(a)949 2160 MS (l)971 2160 MS (l)984 2160 MS (\350)997 2160 MS (l)1020 2160 MS (e)1033 2160 MS ( )1055 2160 MS (n)1074 2160 MS (e)1099 2160 MS ( )1121 2160 MS (t)1139 2160 MS (r)1154 2160 MS (a)1171 2160 MS (n)1193 2160 MS (s)1217 2160 MS (i)1237 2160 MS +(t)1251 2160 MS (e)1266 2160 MS ( )1288 2160 MS (q)1306 2160 MS (u)1331 2160 MS (\222)1356 2160 MS (u)1372 2160 MS (n)1397 2160 MS (e)1421 2160 MS ( )1443 2160 MS (s)1461 2160 MS (e)1481 2160 MS (u)1503 2160 MS (l)1529 2160 MS (e)1542 2160 MS ( )1564 2160 MS +(f)1583 2160 MS (o)1598 2160 MS (i)1625 2160 MS (s)1638 2160 MS ( )1657 2160 MS (s)1675 2160 MS (u)1694 2160 MS (r)1719 2160 MS ( )1736 2160 MS (l)1755 2160 MS (e)1768 2160 MS ( )1790 2160 MS (r)1808 2160 MS (\351)1825 2160 MS (s)1847 2160 MS (e)1866 2160 MS +(a)1888 2160 MS (u)1910 2160 MS ( )1935 2160 MS (e)1954 2160 MS (t)1976 2160 MS ( )1991 2160 MS (a)2009 2160 MS (r)2031 2160 MS (r)2048 2160 MS (i)2065 2160 MS (v)2078 2160 MS (e)2102 2160 MS ( )2125 2160 MS +(d)235 2217 MS (i)261 2217 MS (r)273 2217 MS (e)290 2217 MS (c)312 2217 MS (t)334 2217 MS (e)349 2217 MS (m)372 2217 MS (e)409 2217 MS (n)432 2217 MS (t)456 2217 MS ( )471 2217 MS (s)500 2217 MS (u)519 2217 MS (r)544 2217 MS ( )561 2217 MS +(l)591 2217 MS (e)603 2217 MS ( )625 2217 MS (p)654 2217 MS (r)679 2217 MS (o)696 2217 MS (c)722 2217 MS +(e)744 2217 MS (s)766 2217 MS (s)785 2217 MS (u)804 2217 MS (s)829 2217 MS ( )848 2217 MS (\253)878 2217 MS +( )902 2217 MS +(c)915 2217 MS (l)938 2217 MS (i)952 2217 MS (e)965 2217 MS (n)988 2217 MS (t)1012 2217 MS +( )1027 2217 MS +(\273)1040 2217 MS ( )1064 2217 MS (q)1093 2217 MS (u)1118 2217 MS (i)1144 2217 MS ( )1156 2217 MS (l)1186 2217 MS (\222)1199 2217 MS (h)1216 2217 MS (\351)1242 2217 MS (b)1264 2217 MS (e)1288 2217 MS (r)1310 2217 MS (g)1327 2217 MS (e)1352 2217 MS ( )1374 2217 MS +(e)1403 2217 MS (n)1426 2217 MS ( )1450 2217 MS (l)1480 2217 MS (o)1492 2217 MS (c)1518 2217 MS (a)1541 2217 MS (l)1564 2217 MS (.)1576 2217 MS ( )1589 2217 MS (I)1618 2217 MS (l)1636 2217 MS ( )1649 2217 MS (n)1679 2217 MS (\222)1703 2217 MS (y)1720 2217 MS +( )1744 2217 MS (a)1773 2217 MS ( )1795 2217 MS (p)1824 2217 MS (a)1849 2217 MS (s)1872 2217 MS ( )1891 2217 MS (d)1920 2217 MS (e)1945 2217 MS ( )1967 2217 MS (g)1996 2217 MS (o)2021 2217 MS (u)2047 2217 MS (l)2073 2217 MS (o)2085 2217 MS (t)2111 2217 MS +( )2125 2217 MS +(d)235 2275 MS (\222)260 2275 MS (\351)276 2275 MS (t)298 2275 MS (r)313 2275 MS (a)330 2275 MS (n)352 2275 MS (g)376 2275 MS (l)402 2275 MS (e)415 2275 MS (m)438 2275 MS (e)476 2275 MS (n)499 2275 MS (t)523 2275 MS ( )538 2275 MS (l)556 2275 MS +(o)568 2275 MS (g)594 2275 MS (i)620 2275 MS (c)632 2275 MS (i)655 2275 MS (e)668 2275 MS (l)691 2275 MS ( )704 2275 MS (c)722 2275 MS (a)744 2275 MS (r)766 2275 MS ( )783 2275 MS (l)802 2275 MS (e)815 2275 MS ( )837 2275 MS (t)855 2275 MS +(r)870 2275 MS (a)887 2275 MS (n)909 2275 MS (s)933 2275 MS (f)953 2275 MS (e)968 2275 MS (r)990 2275 MS (t)1007 2275 MS ( )1022 2275 MS (s)1040 2275 MS (e)1059 2275 MS ( )1081 2275 MS (f)1099 2275 MS (a)1115 2275 MS (i)1138 2275 MS (t)1150 2275 MS +( )1165 2275 MS (e)1183 2275 MS (n)1205 2275 MS ( )1229 2275 MS (p)1248 2275 MS (a)1273 2275 MS (r)1295 2275 MS (a)1312 2275 MS (l)1335 2275 MS (l)1348 2275 MS (\350)1361 2275 MS (l)1384 2275 MS (e)1397 2275 MS ( )1419 2275 MS (s)1437 2275 MS (u)1456 2275 MS +(r)1481 2275 MS ( )1498 2275 MS (c)1516 2275 MS (h)1539 2275 MS (a)1563 2275 MS (c)1585 2275 MS (u)1607 2275 MS (n)1633 2275 MS ( )1657 2275 MS (d)1675 2275 MS (e)1700 2275 MS (s)1722 2275 MS ( )1741 2275 MS (c)1759 2275 MS (o)1781 2275 MS (u)1807 2275 MS +(p)1832 2275 MS (l)1858 2275 MS (e)1870 2275 MS (s)1893 2275 MS ( )1912 2275 MS (p)1930 2275 MS (r)1955 2275 MS (o)1972 2275 MS (c)1998 2275 MS (e)2020 2275 MS (s)2042 2275 MS (s)2061 2275 MS (u)2080 2275 MS (s)2105 2275 MS ( )2125 2275 MS +(\253)235 2332 MS +( )259 2332 MS +(c)272 2332 MS (l)295 2332 MS (i)308 2332 MS (e)321 2332 MS (n)344 2332 MS (t)368 2332 MS (/)383 2332 MS (s)397 2332 MS (e)416 2332 MS (r)438 2332 MS (v)456 2332 MS (e)480 2332 MS (u)502 2332 MS (r)527 2332 MS +( )544 2332 MS +(\273)557 2332 MS ( )581 2332 MS (c)598 2332 MS (o)620 2332 MS (n)646 2332 MS (c)670 2332 MS (e)692 2332 MS (r)714 2332 MS (n)732 2332 MS (\351)756 2332 MS (s)778 2332 MS (,)797 2332 MS ( )810 2332 MS (e)826 2332 MS (t)848 2332 MS ( )863 2332 MS +(i)880 2332 MS (l)893 2332 MS ( )906 2332 MS (n)923 2332 MS (\222)948 2332 MS (y)965 2332 MS ( )989 2332 MS (a)1006 2332 MS ( )1028 2332 MS (p)1044 2332 MS (a)1069 2332 MS (s)1092 2332 MS ( )1111 2332 MS (r)1127 2332 MS (e)1144 2332 MS (d)1166 2332 MS +(i)1192 2332 MS (s)1205 2332 MS (t)1224 2332 MS (r)1239 2332 MS (i)1256 2332 MS (b)1269 2332 MS (u)1294 2332 MS (t)1319 2332 MS (i)1335 2332 MS (o)1347 2332 MS (n)1373 2332 MS ( )1397 2332 MS (d)1413 2332 MS (e)1438 2332 MS (s)1461 2332 MS ( )1480 2332 MS +(d)1496 2332 MS (o)1521 2332 MS (n)1547 2332 MS (n)1572 2332 MS (\351)1596 2332 MS (e)1618 2332 MS (s)1641 2332 MS (,)1660 2332 MS ( )1673 2332 MS (u)1689 2332 MS (n)1715 2332 MS (e)1739 2332 MS ( )1761 2332 MS (f)1778 2332 MS (o)1793 2332 MS (i)1820 2332 MS +(s)1833 2332 MS ( )1853 2332 MS (q)1869 2332 MS (u)1894 2332 MS (e)1919 2332 MS ( )1941 2332 MS (c)1957 2332 MS (e)1980 2332 MS (l)2003 2332 MS (l)2016 2332 MS (e)2029 2332 MS (s)2052 2332 MS +(-)2071 2332 MS +(c)2088 2332 MS (i)2112 2332 MS ( )2125 2332 MS +(s)235 2390 MS (o)254 2390 MS (n)280 2390 MS (t)304 2390 MS ( )319 2390 MS (a)334 2390 MS (r)356 2390 MS (r)373 2390 MS (i)390 2390 MS (v)402 2390 MS (\351)427 2390 MS (e)449 2390 MS (s)471 2390 MS ( )490 2390 MS (s)505 2390 MS (u)524 2390 MS +(r)549 2390 MS ( )566 2390 MS (l)582 2390 MS (e)595 2390 MS (s)617 2390 MS ( )636 2390 MS (p)651 2390 MS (r)676 2390 MS (o)693 2390 MS (c)719 2390 MS (e)741 2390 MS (s)763 2390 MS (s)782 2390 MS (u)801 2390 MS (s)826 2390 MS ( )845 2390 MS +(\253)861 2390 MS +( )885 2390 MS +(c)898 2390 MS (l)921 2390 MS (i)935 2390 MS (e)948 2390 MS (n)971 2390 MS (t)995 2390 MS +( )1010 2390 MS +(\273)1023 2390 MS (.)1047 2390 MS ( )1060 2390 MS (L)1075 2390 MS (e)1105 2390 MS ( )1127 2390 MS (s)1142 2390 MS (e)1161 2390 MS (u)1183 2390 MS (l)1209 2390 MS ( )1221 2390 MS (g)1237 2390 MS (o)1262 2390 MS (u)1288 2390 MS (l)1313 2390 MS (o)1325 2390 MS +(t)1351 2390 MS ( )1365 2390 MS (d)1380 2390 MS (\222)1405 2390 MS (\351)1421 2390 MS (t)1443 2390 MS (r)1458 2390 MS (a)1475 2390 MS (n)1497 2390 MS (g)1521 2390 MS (l)1547 2390 MS (e)1559 2390 MS (m)1582 2390 MS (e)1620 2390 MS (n)1643 2390 MS (t)1667 2390 MS +( )1682 2390 MS (e)1697 2390 MS (s)1719 2390 MS (t)1738 2390 MS ( )1753 2390 MS (l)1768 2390 MS (e)1780 2390 MS ( )1802 2390 MS (d)1817 2390 MS (\351)1842 2390 MS (b)1865 2390 MS (i)1890 2390 MS (t)1902 2390 MS ( )1917 2390 MS (d)1932 2390 MS (u)1957 2390 MS +( )1982 2390 MS (r)1997 2390 MS (\351)2014 2390 MS (s)2036 2390 MS (e)2055 2390 MS (a)2077 2390 MS (u)2099 2390 MS ( )2125 2390 MS +(u)235 2447 MS (t)260 2447 MS (i)275 2447 MS (l)288 2447 MS (i)302 2447 MS (s)315 2447 MS (\351)334 2447 MS (.)356 2447 MS +( )369 2447 MS +(L)348 2505 MS (a)378 2505 MS ( )400 2505 MS (s)413 2505 MS (e)432 2505 MS (c)454 2505 MS (o)476 2505 MS (n)502 2505 MS (d)526 2505 MS (e)551 2505 MS ( )573 2505 MS (i)587 2505 MS (n)600 2505 MS (t)624 2505 MS (e)639 2505 MS (r)661 2505 MS +(f)679 2505 MS (a)695 2505 MS (c)717 2505 MS (e)739 2505 MS ( )761 2505 MS (n)775 2505 MS (o)799 2505 MS (m)825 2505 MS (m)863 2505 MS (\351)901 2505 MS (e)924 2505 MS ( )946 2505 MS (N)959 2505 MS (P)995 2505 MS (V)1023 2505 MS (e)1059 2505 MS +(c)1081 2505 MS (C)1103 2505 MS (o)1136 2505 MS (m)1163 2505 MS (p)1200 2505 MS (o)1225 2505 MS (n)1251 2505 MS (e)1275 2505 MS (n)1298 2505 MS (t)1322 2505 MS ( )1337 2505 MS (r)1350 2505 MS (e)1366 2505 MS (p)1388 2505 MS (r)1413 2505 MS (\351)1430 2505 MS +(s)1452 2505 MS (e)1471 2505 MS (n)1494 2505 MS (t)1518 2505 MS (e)1533 2505 MS ( )1555 2505 MS (l)1568 2505 MS (e)1580 2505 MS ( )1602 2505 MS (c)1615 2505 MS (o)1637 2505 MS (d)1663 2505 MS (e)1688 2505 MS ( )1710 2505 MS (d)1723 2505 MS (e)1748 2505 MS +( )1770 2505 MS (c)1783 2505 MS (a)1805 2505 MS (l)1828 2505 MS (c)1841 2505 MS (u)1863 2505 MS (l)1889 2505 MS ( )1901 2505 MS (q)1914 2505 MS (u)1939 2505 MS (i)1965 2505 MS ( )1978 2505 MS (g)1991 2505 MS (\351)2016 2505 MS (n)2039 2505 MS (\350)2063 2505 MS +(r)2085 2505 MS (e)2102 2505 MS ( )2125 2505 MS +(o)235 2562 MS (u)261 2562 MS ( )286 2562 MS (q)301 2562 MS (u)326 2562 MS (i)351 2562 MS ( )363 2562 MS (r)378 2562 MS (\351)395 2562 MS (c)417 2562 MS (u)439 2562 MS (p)464 2562 MS (\350)489 2562 MS (r)511 2562 MS (e)528 2562 MS ( )550 2562 MS +(u)565 2562 MS (n)590 2562 MS (e)614 2562 MS ( )636 2562 MS (d)651 2562 MS (o)676 2562 MS (n)702 2562 MS (n)727 2562 MS (\351)751 2562 MS (e)773 2562 MS ( )795 2562 MS (d)810 2562 MS (e)835 2562 MS ( )857 2562 MS (t)872 2562 MS (y)888 2562 MS +(p)911 2562 MS (e)936 2562 MS ( )958 2562 MS (v)974 2562 MS (e)998 2562 MS (c)1020 2562 MS (t)1042 2562 MS (e)1057 2562 MS (u)1079 2562 MS (r)1104 2562 MS ( )1121 2562 MS (p)1136 2562 MS (a)1161 2562 MS (r)1183 2562 MS (a)1200 2562 MS (l)1223 2562 MS +(l)1236 2562 MS (\350)1250 2562 MS (l)1273 2562 MS (e)1285 2562 MS (.)1307 2562 MS ( )1320 2562 MS (E)1335 2562 MS (l)1367 2562 MS (l)1380 2562 MS (e)1393 2562 MS ( )1415 2562 MS (p)1430 2562 MS (o)1455 2562 MS (s)1481 2562 MS (s)1500 2562 MS (\350)1519 2562 MS +(d)1541 2562 MS (e)1566 2562 MS ( )1588 2562 MS +(u)1603 2562 MS (n)1629 2562 MS ( )1653 2562 MS (a)1668 2562 MS (t)1690 2562 MS (t)1705 2562 MS (r)1719 2562 MS (i)1736 2562 MS (b)1749 2562 MS (u)1773 2562 MS (t)1798 2562 MS ( )1813 2562 MS (d)1828 2562 MS (e)1853 2562 MS ( )1875 2562 MS (t)1889 2562 MS +(y)1904 2562 MS (p)1927 2562 MS (e)1953 2562 MS ( )1975 2562 MS (P)1990 2562 MS (V)2018 2562 MS (e)2054 2562 MS (c)2076 2562 MS +( )2098 2562 MS +(:)2111 2562 MS ( )2125 2562 MS +(c)235 2620 MS (\222)257 2620 MS (e)273 2620 MS (s)295 2620 MS (t)314 2620 MS ( )329 2620 MS (l)380 2620 MS (a)392 2620 MS ( )415 2620 MS (d)465 2620 MS (o)490 2620 MS (n)516 2620 MS (n)540 2620 MS (\351)565 2620 MS (e)587 2620 MS ( )609 2620 MS +(p)659 2620 MS (a)684 2620 MS (r)706 2620 MS (a)723 2620 MS (l)746 2620 MS (l)760 2620 MS (\350)773 2620 MS (l)796 2620 MS (e)809 2620 MS ( )831 2620 MS (\351)881 2620 MS (c)903 2620 MS (h)926 2620 MS (a)951 2620 MS (n)974 2620 MS (g)998 2620 MS +(\351)1023 2620 MS (e)1045 2620 MS ( )1067 2620 MS ( )1117 2620 MS (a)1167 2620 MS (v)1190 2620 MS (e)1214 2620 MS (c)1237 2620 MS ( )1259 2620 MS (l)1310 2620 MS (e)1322 2620 MS (s)1345 2620 MS ( )1364 2620 MS (a)1414 2620 MS (u)1436 2620 MS (t)1461 2620 MS +(r)1476 2620 MS (e)1493 2620 MS (s)1515 2620 MS ( )1534 2620 MS (c)1584 2620 MS (o)1606 2620 MS (m)1632 2620 MS (p)1669 2620 MS (o)1694 2620 MS (s)1720 2620 MS (a)1739 2620 MS (n)1762 2620 MS (t)1786 2620 MS (s)1801 2620 MS (,)1820 2620 MS ( )1833 2620 MS +(u)1883 2620 MS (n)1908 2620 MS ( )1932 2620 MS (s)1982 2620 MS (e)2001 2620 MS (r)2023 2620 MS (v)2041 2620 MS (i)2066 2620 MS (c)2079 2620 MS (e)2102 2620 MS ( )2125 2620 MS +(S)235 2677 MS (e)263 2677 MS (t)285 2677 MS (F)300 2677 MS (i)328 2677 MS (l)341 2677 MS (e)354 2677 MS (N)376 2677 MS (a)412 2677 MS (m)435 2677 MS (e)473 2677 MS (\()495 2677 MS (f)513 2677 MS (i)529 2677 MS (l)543 2677 MS (e)556 2677 MS +(n)579 2677 MS (a)603 2677 MS (m)626 2677 MS (e)664 2677 MS (\))686 2677 MS ( )703 2677 MS (q)718 2677 MS (u)743 2677 MS (i)769 2677 MS ( )782 2677 MS (p)797 2677 MS (e)822 2677 MS (r)844 2677 MS (m)862 2677 MS (e)900 2677 MS (t)922 2677 MS +( )937 2677 MS (d)952 2677 MS (e)977 2677 MS ( )999 2677 MS (s)1014 2677 MS (p)1033 2677 MS (\351)1058 2677 MS (c)1080 2677 MS (i)1103 2677 MS (f)1117 2677 MS (i)1134 2677 MS (e)1147 2677 MS (r)1169 2677 MS ( )1186 2677 MS (o)1201 2677 MS (\371)1227 2677 MS +( )1252 2677 MS (s)1267 2677 MS (e)1286 2677 MS ( )1308 2677 MS (t)1323 2677 MS (r)1338 2677 MS (o)1354 2677 MS (u)1380 2677 MS (v)1405 2677 MS (e)1429 2677 MS ( )1451 2677 MS (l)1467 2677 MS (a)1480 2677 MS ( )1502 2677 MS (d)1517 2677 MS (o)1542 2677 MS +(n)1568 2677 MS (n)1593 2677 MS (\351)1617 2677 MS (e)1639 2677 MS ( )1661 2677 MS (p)1676 2677 MS (e)1701 2677 MS (r)1723 2677 MS (s)1740 2677 MS (i)1760 2677 MS (s)1773 2677 MS (t)1792 2677 MS (a)1807 2677 MS (n)1830 2677 MS (t)1854 2677 MS (e)1869 2677 MS +(,)1891 2677 MS ( )1904 2677 MS (u)1919 2677 MS (n)1944 2677 MS ( )1968 2677 MS (s)1983 2677 MS (e)2002 2677 MS (r)2024 2677 MS (v)2042 2677 MS (i)2067 2677 MS (c)2080 2677 MS (e)2102 2677 MS ( )2125 2677 MS +(R)235 2735 MS (e)268 2735 MS (a)290 2735 MS (d)312 2735 MS (D)337 2735 MS (a)373 2735 MS (t)395 2735 MS (a)410 2735 MS (F)432 2735 MS (r)459 2735 MS (o)476 2735 MS (m)502 2735 MS (F)540 2735 MS (i)568 2735 MS (l)582 2735 MS (e)595 2735 MS +(\()617 2735 MS (\))634 2735 MS ( )651 2735 MS (q)691 2735 MS (u)716 2735 MS (i)742 2735 MS ( )754 2735 MS (p)794 2735 MS (e)820 2735 MS (r)842 2735 MS (m)860 2735 MS (e)897 2735 MS (t)919 2735 MS ( )934 2735 MS (d)974 2735 MS (e)999 2735 MS +( )1021 2735 MS (c)1061 2735 MS (h)1084 2735 MS (a)1108 2735 MS (r)1130 2735 MS (g)1147 2735 MS (e)1172 2735 MS (r)1194 2735 MS ( )1211 2735 MS (l)1251 2735 MS (a)1264 2735 MS ( )1286 2735 MS (d)1326 2735 MS (o)1351 2735 MS (n)1377 2735 MS (n)1402 2735 MS +(\351)1426 2735 MS (e)1448 2735 MS ( )1471 2735 MS (e)1511 2735 MS (n)1534 2735 MS ( )1558 2735 MS (m)1599 2735 MS (\351)1637 2735 MS (m)1660 2735 MS (o)1697 2735 MS (i)1724 2735 MS (r)1736 2735 MS (e)1753 2735 MS +( )1776 2735 MS (e)1816 2735 MS (t)1838 2735 MS ( )1853 2735 MS (u)1893 2735 MS (n)1918 2735 MS ( )1942 2735 MS (s)1982 2735 MS (e)2001 2735 MS (r)2023 2735 MS (v)2041 2735 MS (i)2066 2735 MS (c)2079 2735 MS (e)2102 2735 MS ( )2125 2735 MS +(S)235 2792 MS (a)263 2792 MS (v)285 2792 MS (e)309 2792 MS (D)331 2792 MS (a)367 2792 MS (t)389 2792 MS (a)404 2792 MS (T)426 2792 MS (o)457 2792 MS (F)483 2792 MS (i)511 2792 MS (l)524 2792 MS (e)537 2792 MS (\()559 2792 MS (\))576 2792 MS +( )593 2792 MS (q)613 2792 MS (u)638 2792 MS (i)664 2792 MS ( )676 2792 MS (p)696 2792 MS (e)721 2792 MS (r)743 2792 MS (m)761 2792 MS (e)799 2792 MS (t)821 2792 MS ( )836 2792 MS (d)856 2792 MS (e)881 2792 MS ( )903 2792 MS (s)923 2792 MS +(a)942 2792 MS (u)964 2792 MS (v)989 2792 MS (e)1014 2792 MS (g)1036 2792 MS (a)1061 2792 MS (r)1083 2792 MS (d)1100 2792 MS (e)1125 2792 MS (r)1147 2792 MS ( )1164 2792 MS (u)1184 2792 MS (n)1209 2792 MS (e)1233 2792 MS ( )1256 2792 MS (d)1276 2792 MS +(o)1301 2792 MS (n)1327 2792 MS (n)1351 2792 MS (\351)1375 2792 MS (e)1397 2792 MS ( )1419 2792 MS (e)1439 2792 MS (n)1462 2792 MS ( )1486 2792 MS (m)1507 2792 MS (\351)1545 2792 MS (m)1568 2792 MS (o)1605 2792 MS (i)1632 2792 MS (r)1645 2792 MS (e)1662 2792 MS +( )1684 2792 MS (d)1704 2792 MS (a)1729 2792 MS (n)1752 2792 MS (s)1777 2792 MS ( )1796 2792 MS (u)1816 2792 MS (n)1842 2792 MS ( )1866 2792 MS (f)1887 2792 MS (i)1903 2792 MS (c)1916 2792 MS (h)1939 2792 MS (i)1964 2792 MS (e)1977 2792 MS (r)1999 2792 MS +(.)2016 2792 MS ( )2029 2792 MS (C)2049 2792 MS (e)2082 2792 MS (s)2105 2792 MS ( )2125 2792 MS +(d)235 2850 MS (e)260 2850 MS (u)282 2850 MS (x)307 2850 MS ( )331 2850 MS (d)353 2850 MS (e)378 2850 MS (r)400 2850 MS (n)418 2850 MS (i)443 2850 MS (e)456 2850 MS (r)478 2850 MS (s)495 2850 MS ( )514 2850 MS (s)536 2850 MS (e)555 2850 MS +(r)577 2850 MS (v)595 2850 MS (i)620 2850 MS (c)633 2850 MS (e)655 2850 MS (s)678 2850 MS ( )697 2850 MS (d)719 2850 MS (o)744 2850 MS (i)770 2850 MS (v)783 2850 MS (e)807 2850 MS (n)830 2850 MS (t)854 2850 MS ( )869 2850 MS (p)891 2850 MS +(o)916 2850 MS (u)942 2850 MS (v)967 2850 MS (o)991 2850 MS (i)1017 2850 MS (r)1029 2850 MS ( )1046 2850 MS (s)1068 2850 MS (\222)1087 2850 MS (e)1104 2850 MS (x)1127 2850 MS (\351)1151 2850 MS (c)1173 2850 MS (u)1195 2850 MS (t)1220 2850 MS (e)1235 2850 MS +(r)1257 2850 MS ( )1274 2850 MS (e)1296 2850 MS (n)1318 2850 MS ( )1342 2850 MS (p)1364 2850 MS (a)1389 2850 MS (r)1411 2850 MS (a)1428 2850 MS (l)1451 2850 MS (l)1464 2850 MS (\350)1477 2850 MS (l)1500 2850 MS (e)1513 2850 MS +( )1535 2850 MS +(:)1548 2850 MS ( )1562 2850 MS (i)1585 2850 MS (l)1598 2850 MS (s)1611 2850 MS ( )1630 2850 MS (s)1653 2850 MS (o)1672 2850 MS (n)1698 2850 MS (t)1722 2850 MS ( )1737 2850 MS (d)1759 2850 MS (o)1784 2850 MS (n)1810 2850 MS (c)1834 2850 MS ( )1856 2850 MS +(a)1878 2850 MS (s)1900 2850 MS (y)1920 2850 MS (n)1944 2850 MS (c)1968 2850 MS (h)1991 2850 MS (r)2015 2850 MS (o)2032 2850 MS (n)2058 2850 MS (e)2082 2850 MS (s)2105 2850 MS ( )2125 2850 MS +(\()235 2907 MS (t)252 2907 MS (y)267 2907 MS (p)290 2907 MS (e)315 2907 MS ( )337 2907 MS (C)361 2907 MS (O)394 2907 MS (R)430 2907 MS (B)463 2907 MS (A)497 2907 MS ( )532 2907 MS (o)556 2907 MS (n)582 2907 MS (e)606 2907 MS (w)628 2907 MS +(a)664 2907 MS (y)687 2907 MS (\))711 2907 MS (.)728 2907 MS ( )741 2907 MS (D)765 2907 MS (e)801 2907 MS ( )823 2907 MS (p)847 2907 MS (l)873 2907 MS (u)885 2907 MS (s)910 2907 MS ( )929 2907 MS (l)954 2907 MS (\222)967 2907 MS (a)984 2907 MS +(t)1006 2907 MS (t)1020 2907 MS (r)1035 2907 MS (i)1052 2907 MS (b)1065 2907 MS (u)1089 2907 MS (t)1114 2907 MS ( )1129 2907 MS (P)1153 2907 MS (V)1181 2907 MS (e)1217 2907 MS (c)1238 2907 MS ( )1260 2907 MS (v)1284 2907 MS (a)1308 2907 MS ( )1330 2907 MS +(g)1354 2907 MS (\351)1379 2907 MS (n)1402 2907 MS (\351)1426 2907 MS (r)1448 2907 MS (e)1465 2907 MS (r)1487 2907 MS ( )1504 2907 MS (d)1528 2907 MS (e)1553 2907 MS (u)1575 2907 MS (x)1600 2907 MS ( )1624 2907 MS (f)1649 2907 MS (o)1664 2907 MS (n)1690 2907 MS +(c)1714 2907 MS (t)1736 2907 MS (i)1752 2907 MS (o)1764 2907 MS (n)1790 2907 MS (s)1815 2907 MS ( )1834 2907 MS (d)1858 2907 MS (e)1883 2907 MS ( )1905 2907 MS (l)1930 2907 MS (e)1942 2907 MS (c)1964 2907 MS (t)1986 2907 MS (u)2001 2907 MS (r)2026 2907 MS +(e)2043 2907 MS ( )2065 2907 MS (e)2089 2907 MS (t)2110 2907 MS ( )2125 2907 MS +(\351)235 2965 MS (c)257 2965 MS (r)279 2965 MS (i)297 2965 MS (t)309 2965 MS (u)324 2965 MS (r)349 2965 MS (e)366 2965 MS ( )388 2965 MS (s)410 2965 MS (y)430 2965 MS (n)454 2965 MS (c)479 2965 MS (h)502 2965 MS (r)526 2965 MS (o)543 2965 MS +(n)569 2965 MS (e)593 2965 MS (s)615 2965 MS (.)634 2965 MS ( )647 2965 MS (P)669 2965 MS (o)697 2965 MS (u)723 2965 MS (r)748 2965 MS ( )765 2965 MS (p)787 2965 MS (o)812 2965 MS (u)838 2965 MS (v)863 2965 MS (o)887 2965 MS (i)913 2965 MS +(r)925 2965 MS ( )942 2965 MS (e)964 2965 MS (x)987 2965 MS (\351)1011 2965 MS (c)1033 2965 MS (u)1055 2965 MS (t)1080 2965 MS (e)1095 2965 MS (r)1117 2965 MS ( )1134 2965 MS (c)1156 2965 MS (e)1178 2965 MS (s)1200 2965 MS ( )1219 2965 MS (s)1242 2965 MS +(e)1261 2965 MS (r)1283 2965 MS (v)1300 2965 MS (i)1325 2965 MS (c)1338 2965 MS (e)1361 2965 MS (s)1383 2965 MS ( )1402 2965 MS (e)1425 2965 MS (n)1448 2965 MS ( )1472 2965 MS (p)1494 2965 MS (a)1519 2965 MS (r)1541 2965 MS (a)1558 2965 MS (l)1581 2965 MS +(l)1595 2965 MS (\350)1608 2965 MS (l)1631 2965 MS (e)1644 2965 MS (s)1666 2965 MS (,)1685 2965 MS ( )1698 2965 MS (i)1721 2965 MS (l)1735 2965 MS ( )1748 2965 MS (e)1771 2965 MS (s)1793 2965 MS (t)1812 2965 MS ( )1827 2965 MS (n)1849 2965 MS (\351)1874 2965 MS +(c)1896 2965 MS (e)1918 2965 MS (s)1940 2965 MS (s)1960 2965 MS (a)1979 2965 MS (i)2002 2965 MS (r)2015 2965 MS (e)2032 2965 MS ( )2054 2965 MS (d)2076 2965 MS (e)2102 2965 MS ( )2125 2965 MS +(d)235 3022 MS (\351)260 3022 MS (f)283 3022 MS (i)299 3022 MS (n)312 3022 MS (i)338 3022 MS (r)350 3022 MS ( )367 3022 MS (d)380 3022 MS (e)405 3022 MS (u)427 3022 MS (x)453 3022 MS ( )477 3022 MS (a)490 3022 MS (u)512 3022 MS (t)537 3022 MS +(r)552 3022 MS (e)569 3022 MS (s)591 3022 MS ( )610 3022 MS (s)623 3022 MS (e)642 3022 MS (r)664 3022 MS (v)681 3022 MS (i)706 3022 MS (c)719 3022 MS (e)741 3022 MS (s)763 3022 MS ( )782 3022 MS (i)796 3022 MS (d)809 3022 MS (e)834 3022 MS +(n)857 3022 MS (t)881 3022 MS (i)897 3022 MS (q)909 3022 MS (u)934 3022 MS (e)959 3022 MS (s)981 3022 MS ( )1000 3022 MS (m)1014 3022 MS (a)1052 3022 MS (i)1075 3022 MS (s)1088 3022 MS ( )1107 3022 MS (a)1120 3022 MS (s)1142 3022 MS (y)1162 3022 MS +(n)1186 3022 MS (c)1211 3022 MS (h)1235 3022 MS (r)1259 3022 MS (o)1276 3022 MS (n)1302 3022 MS (e)1326 3022 MS (s)1348 3022 MS +( )1367 3022 MS +(:)1380 3022 MS ( )1394 3022 MS (g)1407 3022 MS (e)1432 3022 MS (t)1454 3022 MS (_)1469 3022 MS (d)1494 3022 MS (v)1519 3022 MS (e)1543 3022 MS (c)1565 3022 MS (\()1587 3022 MS (\))1604 3022 MS ( )1621 3022 MS (e)1634 3022 MS (t)1655 3022 MS ( )1670 3022 MS +(p)1683 3022 MS (u)1708 3022 MS (t)1732 3022 MS (_)1747 3022 MS (d)1772 3022 MS (v)1797 3022 MS (e)1821 3022 MS (c)1843 3022 MS (\()1865 3022 MS (\))1882 3022 MS (.)1899 3022 MS +( )1912 3022 MS +( )235 3079 MS +showpage +%%Page: 18 18 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (8)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 517 MS (i)260 517 MS (f)285 517 MS (n)310 517 MS (d)335 517 MS (e)360 517 MS (f)385 517 MS ( )410 517 MS (_)435 517 MS (S)460 517 MS (A)485 517 MS (L)510 517 MS (O)535 517 MS (M)560 517 MS (E)585 517 MS (_)610 517 MS +(N)635 517 MS (P)660 517 MS (V)685 517 MS (E)710 517 MS (C)735 517 MS (C)760 517 MS (O)785 517 MS (M)810 517 MS (P)835 517 MS (O)860 517 MS (N)885 517 MS (E)910 517 MS (N)935 517 MS (T)960 517 MS (_)985 517 MS (I)1010 517 MS +(D)1035 517 MS (L)1060 517 MS (_)1085 517 MS +( )1110 517 MS +(#)235 565 MS (d)260 565 MS (e)285 565 MS (f)310 565 MS (i)335 565 MS (n)360 565 MS (e)385 565 MS ( )410 565 MS (_)435 565 MS (S)460 565 MS (A)485 565 MS (L)510 565 MS (O)535 565 MS (M)560 565 MS (E)585 565 MS (_)610 565 MS +(N)635 565 MS (P)660 565 MS (V)685 565 MS (E)710 565 MS +(C)735 565 MS (C)760 565 MS (O)785 565 MS (M)810 565 MS (P)835 565 MS (O)860 565 MS (N)885 565 MS (E)910 565 MS (N)935 565 MS (T)960 565 MS (_)985 565 MS (I)1010 565 MS (D)1035 565 MS (L)1060 565 MS (_)1085 565 MS +( )1110 565 MS +( )235 612 MS +(#)235 659 MS (i)260 659 MS (n)285 659 MS (c)310 659 MS (l)335 659 MS (u)360 659 MS (d)385 659 MS (e)410 659 MS ( )435 659 MS (")460 659 MS (S)485 659 MS (A)510 659 MS (L)535 659 MS (O)560 659 MS (M)585 659 MS (E)610 659 MS +(_)635 659 MS (C)660 659 MS (o)685 659 MS (m)710 659 MS (p)735 659 MS (o)760 659 MS (n)785 659 MS (e)810 659 MS (n)835 659 MS (t)860 659 MS (.)885 659 MS (i)910 659 MS (d)935 659 MS (l)960 659 MS (")985 659 MS +( )1010 659 MS +(#)235 706 MS (i)260 706 MS (n)285 706 MS (c)310 706 MS (l)335 706 MS (u)360 706 MS (d)385 706 MS (e)410 706 MS ( )435 706 MS (")460 706 MS (T)485 706 MS (y)510 706 MS (p)535 706 MS (e)560 706 MS (D)585 706 MS (a)610 706 MS +(t)635 706 MS (a)660 706 MS (.)685 706 MS (i)710 706 MS (d)735 706 MS (l)760 706 MS (")785 706 MS +( )810 706 MS +(#)235 753 MS (i)260 753 MS (n)285 753 MS (c)310 753 MS (l)335 753 MS (u)360 753 MS (d)385 753 MS (e)410 753 MS ( )435 753 MS (")460 753 MS (M)485 753 MS (P)510 753 MS (I)535 753 MS (O)560 753 MS (b)585 753 MS (j)610 753 MS +(e)635 753 MS (c)660 753 MS (t)685 753 MS (.)710 753 MS (i)735 753 MS (d)760 753 MS (l)785 753 MS (")810 753 MS +( )835 753 MS +( )235 801 MS +(m)235 848 MS (o)260 848 MS (d)285 848 MS (u)310 848 MS (l)335 848 MS (e)360 848 MS ( )385 848 MS (E)410 848 MS (n)435 848 MS (g)460 848 MS (i)485 848 MS (n)510 848 MS (e)535 848 MS (s)560 848 MS +( )585 848 MS +({)235 895 MS +( )260 895 MS +( )235 942 MS ( )260 942 MS (/)285 942 MS (/)310 942 MS ( )335 942 MS (D)360 942 MS (e)385 942 MS (f)410 942 MS (i)435 942 MS (n)460 942 MS (i)485 942 MS (t)510 942 MS (i)535 942 MS (o)560 942 MS (n)585 942 MS ( )610 942 MS +(d)635 942 MS (e)660 942 MS ( )685 942 MS (l)710 942 MS (a)735 942 MS ( )760 942 MS (d)785 942 MS (o)810 942 MS (n)835 942 MS (n)860 942 MS (e)885 942 MS (e)910 942 MS ( )935 942 MS (v)960 942 MS (e)985 942 MS (c)1010 942 MS +(t)1035 942 MS (e)1060 942 MS (u)1085 942 MS (r)1110 942 MS ( )1135 942 MS (p)1160 942 MS (a)1185 942 MS (r)1210 942 MS (a)1235 942 MS (l)1260 942 MS (l)1285 942 MS (e)1310 942 MS (l)1335 942 MS (e)1360 942 MS +( )1385 942 MS +( )235 989 MS ( )260 989 MS +(i)285 989 MS (n)310 989 MS (t)335 989 MS (e)360 989 MS (r)385 989 MS (f)410 989 MS (a)435 989 MS (c)460 989 MS (e)485 989 MS ( )510 989 MS (P)535 989 MS (V)560 989 MS (e)585 989 MS (c)610 989 MS ( )635 989 MS (:)660 989 MS +( )685 989 MS (M)710 989 MS (P)735 989 MS (I)760 989 MS (O)785 989 MS (b)810 989 MS (j)835 989 MS (e)860 989 MS (c)885 989 MS (t)910 989 MS +( )935 989 MS +( )235 1037 MS ( )260 1037 MS ({)285 1037 MS +( )310 1037 MS +( )235 1084 MS ( )260 1084 MS ( )285 1084 MS ( )310 1084 MS (r)335 1084 MS (e)360 1084 MS (a)385 1084 MS (d)410 1084 MS (o)435 1084 MS (n)460 1084 MS (l)485 1084 MS (y)510 1084 MS ( )535 1084 MS (a)560 1084 MS (t)585 1084 MS (t)610 1084 MS +(r)635 1084 MS (i)660 1084 MS (b)685 1084 MS (u)710 1084 MS (t)735 1084 MS (e)760 1084 MS ( )785 1084 MS (D)810 1084 MS (o)835 1084 MS (u)860 1084 MS (b)885 1084 MS (l)910 1084 MS (e)935 1084 MS (V)960 1084 MS (e)985 1084 MS (c)1010 1084 MS +( )1035 1084 MS (v)1060 1084 MS (e)1085 1084 MS (c)1110 1084 MS (;)1135 1084 MS +( )1160 1084 MS +( )235 1131 MS +( )235 1178 MS ( )260 1178 MS ( )285 1178 MS ( )310 1178 MS (u)335 1178 MS (n)360 1178 MS (s)385 1178 MS (i)410 1178 MS (g)435 1178 MS (n)460 1178 MS (e)485 1178 MS (d)510 1178 MS ( )535 1178 MS (l)560 1178 MS (o)585 1178 MS (n)610 1178 MS +(g)635 1178 MS ( )660 1178 MS (S)685 1178 MS (i)710 1178 MS (z)735 1178 MS +(e)760 1178 MS (\()785 1178 MS (\))810 1178 MS (;)835 1178 MS +( )860 1178 MS +( )235 1225 MS ( )260 1225 MS ( )285 1225 MS ( )310 1225 MS (v)335 1225 MS (o)360 1225 MS (i)385 1225 MS (d)410 1225 MS ( )435 1225 MS (L)460 1225 MS (V)485 1225 MS (e)510 1225 MS (c)535 1225 MS (\()560 1225 MS (o)585 1225 MS (u)610 1225 MS +(t)635 1225 MS ( )660 1225 MS (u)685 1225 MS (n)710 1225 MS (s)735 1225 MS (i)760 1225 MS (g)785 1225 MS (n)810 1225 MS (e)835 1225 MS (d)860 1225 MS ( )885 1225 MS (l)910 1225 MS (o)935 1225 MS (n)960 1225 MS (g)985 1225 MS ( )1010 1225 MS +(s)1035 1225 MS (t)1060 1225 MS (a)1085 1225 MS (r)1110 1225 MS (t)1135 1225 MS (,)1160 1225 MS ( )1185 1225 MS (o)1210 1225 MS (u)1235 1225 MS (t)1260 1225 MS ( )1285 1225 MS (u)1310 1225 MS (n)1335 1225 MS (s)1360 1225 MS (i)1385 1225 MS (g)1410 1225 MS +(n)1435 1225 MS (e)1460 1225 MS (d)1485 1225 MS ( )1510 1225 MS (l)1535 1225 MS (o)1560 1225 MS (n)1585 1225 MS (g)1610 1225 MS ( )1635 1225 MS (e)1660 1225 MS (n)1685 1225 MS (d)1710 1225 MS (\))1735 1225 MS (;)1760 1225 MS +( )1785 1225 MS +( )235 1273 MS ( )260 1273 MS ( )285 1273 MS ( )310 1273 MS (D)335 1273 MS (o)360 1273 MS (u)385 1273 MS (b)410 1273 MS (l)435 1273 MS (e)460 1273 MS (V)485 1273 MS (e)510 1273 MS (c)535 1273 MS ( )560 1273 MS (n)585 1273 MS (v)610 1273 MS +(e)635 1273 MS (c)660 1273 MS (\()685 1273 MS (i)710 1273 MS (n)735 1273 MS ( )760 1273 MS (u)785 1273 MS (n)810 1273 MS (s)835 1273 MS (i)860 1273 MS (g)885 1273 MS (n)910 1273 MS (e)935 1273 MS (d)960 1273 MS ( )985 1273 MS (l)1010 1273 MS +(o)1035 1273 MS (n)1060 1273 MS (g)1085 1273 MS ( )1110 1273 MS (s)1135 1273 MS (t)1160 1273 MS (a)1185 1273 MS (r)1210 1273 MS (t)1235 1273 MS (,)1260 1273 MS ( )1285 1273 MS (i)1310 1273 MS (n)1335 1273 MS ( )1360 1273 MS (u)1385 1273 MS (n)1410 1273 MS +(s)1435 1273 MS (i)1460 1273 MS (g)1485 1273 MS (n)1510 1273 MS (e)1535 1273 MS (d)1560 1273 MS ( )1585 1273 MS (l)1610 1273 MS (o)1635 1273 MS (n)1660 1273 MS (g)1685 1273 MS ( )1710 1273 MS (e)1735 1273 MS (n)1760 1273 MS (d)1785 1273 MS (\))1810 1273 MS +(;)1835 1273 MS +( )1860 1273 MS +( )235 1320 MS ( )260 1320 MS +(})285 1320 MS (;)310 1320 MS +( )335 1320 MS +( )235 1367 MS +( )235 1414 MS ( )260 1414 MS (/)285 1414 MS (/)310 1414 MS ( )335 1414 MS (D)360 1414 MS (e)385 1414 MS (f)410 1414 MS (i)435 1414 MS (n)460 1414 MS (i)485 1414 MS (t)510 1414 MS (i)535 1414 MS (o)560 1414 MS (n)585 1414 MS ( )610 1414 MS +(d)635 1414 MS (u)660 1414 MS ( )685 1414 MS (c)710 1414 MS (o)735 1414 MS (m)760 1414 MS (p)785 1414 MS (o)810 1414 MS (s)835 1414 MS (a)860 1414 MS (n)885 1414 MS (t)910 1414 MS ( )935 1414 MS (v)960 1414 MS (e)985 1414 MS (c)1010 1414 MS +(t)1035 1414 MS (e)1060 1414 MS (u)1085 1414 MS (r)1110 1414 MS ( )1135 1414 MS (N)1160 1414 MS (P)1185 1414 MS ( )1210 1414 MS (p)1235 1414 MS (a)1260 1414 MS (r)1285 1414 MS (a)1310 1414 MS (l)1335 1414 MS (l)1360 1414 MS (e)1385 1414 MS (l)1410 1414 MS +(e)1435 1414 MS +( )1460 1414 MS +( )235 1461 MS ( )260 1461 MS (i)285 1461 MS (n)310 1461 MS (t)335 1461 MS (e)360 1461 MS (r)385 1461 MS (f)410 1461 MS (a)435 1461 MS (c)460 1461 MS (e)485 1461 MS ( )510 1461 MS (N)535 1461 MS (P)560 1461 MS (V)585 1461 MS (e)610 1461 MS +(c)635 1461 MS (C)660 1461 MS (o)685 1461 MS (m)710 1461 MS (p)735 1461 MS (o)760 1461 MS (n)785 1461 MS (e)810 1461 MS (n)835 1461 MS (t)860 1461 MS (:)885 1461 MS (C)910 1461 MS (o)935 1461 MS (m)960 1461 MS (p)985 1461 MS (o)1010 1461 MS +(n)1035 1461 MS (e)1060 1461 MS (n)1085 1461 MS (t)1110 1461 MS (,)1135 1461 MS (M)1160 1461 MS (P)1185 1461 MS (I)1210 1461 MS (O)1235 1461 MS (b)1260 1461 MS (j)1285 1461 MS (e)1310 1461 MS (c)1335 1461 MS (t)1360 1461 MS +( )1385 1461 MS +( )235 1509 MS ( )260 1509 MS ({)285 1509 MS +( )310 1509 MS +( )235 1556 MS ( )260 1556 MS ( )285 1556 MS ( )310 1556 MS (/)335 1556 MS (/)360 1556 MS ( )385 1556 MS (v)410 1556 MS (e)435 1556 MS (r)460 1556 MS (s)485 1556 MS (i)510 1556 MS (o)535 1556 MS (n)560 1556 MS ( )585 1556 MS +LATENC /_Courier /Courier reencode +[42 0 0 -42 0 0]/_Courier MF +(s)610 1556 MS (y)635 1556 MS (n)660 1556 MS (c)685 1556 MS (h)710 1556 MS (r)735 1556 MS (o)760 1556 MS (n)785 1556 MS (e)810 1556 MS ( )835 1556 MS (d)860 1556 MS (e)885 1556 MS (s)910 1556 MS ( )935 1556 MS (l)960 1556 MS (e)985 1556 MS +(c)1010 1556 MS (t)1035 1556 MS (u)1060 1556 MS (r)1085 1556 MS (e)1110 1556 MS (/)1135 1556 MS (\351)1160 1556 MS (c)1185 1556 MS (r)1210 1556 MS (i)1235 1556 MS (t)1260 1556 MS (u)1285 1556 MS (r)1310 1556 MS (e)1335 1556 MS ( )1360 1556 MS (d)1385 1556 MS +(u)1410 1556 MS ( )1435 1556 MS (v)1460 1556 MS (e)1485 1556 MS (c)1510 1556 MS (t)1535 1556 MS (e)1560 1556 MS (u)1585 1556 MS (r)1610 1556 MS ( )1635 1556 MS (p)1660 1556 MS (a)1685 1556 MS (r)1710 1556 MS (a)1735 1556 MS (l)1760 1556 MS (l)1785 1556 MS +(e)1810 1556 MS (l)1835 1556 MS (e)1860 1556 MS +( )1885 1556 MS +( )235 1603 MS ( )260 1603 MS ( )285 1603 MS ( )310 1603 MS (a)335 1603 MS (t)360 1603 MS (t)385 1603 MS (r)410 1603 MS (i)435 1603 MS (b)460 1603 MS (u)485 1603 MS (t)510 1603 MS (e)535 1603 MS ( )560 1603 MS (P)585 1603 MS (V)610 1603 MS +(e)635 1603 MS (c)660 1603 MS ( )685 1603 MS (d)710 1603 MS (v)735 1603 MS (e)760 1603 MS (c)785 1603 MS (;)810 1603 MS +( )835 1603 MS +( )235 1650 MS ( )260 1650 MS ( )285 1650 MS ( )310 1650 MS (/)335 1650 MS (/)360 1650 MS ( )385 1650 MS (v)410 1650 MS (e)435 1650 MS (r)460 1650 MS (s)485 1650 MS (i)510 1650 MS (o)535 1650 MS (n)560 1650 MS ( )585 1650 MS (a)610 1650 MS +(s)635 1650 MS (y)660 1650 MS (n)685 1650 MS (c)710 1650 MS (h)735 1650 MS (r)760 1650 MS (o)785 1650 MS (n)810 1650 MS (e)835 1650 MS ( )860 1650 MS (d)885 1650 MS (e)910 1650 MS (s)935 1650 MS ( )960 1650 MS (l)985 1650 MS (e)1010 1650 MS +(c)1035 1650 MS (t)1060 1650 MS (u)1085 1650 MS (r)1110 1650 MS (e)1135 1650 MS (/)1160 1650 MS (\351)1185 1650 MS (c)1210 1650 MS (r)1235 1650 MS (i)1260 1650 MS (t)1285 1650 MS (u)1310 1650 MS (r)1335 1650 MS (e)1360 1650 MS ( )1385 1650 MS (d)1410 1650 MS +(u)1435 1650 MS ( )1460 1650 MS (v)1485 1650 MS (e)1510 1650 MS (c)1535 1650 MS (t)1560 1650 MS (e)1585 1650 MS (u)1610 1650 MS (r)1635 1650 MS ( )1660 1650 MS (p)1685 1650 MS (a)1710 1650 MS (r)1735 1650 MS (a)1760 1650 MS (l)1785 1650 MS (l)1810 1650 MS +(e)1835 1650 MS (l)1860 1650 MS (e)1885 1650 MS +( )1910 1650 MS +( )235 1697 MS ( )260 1697 MS ( )285 1697 MS ( )310 1697 MS +(o)335 1697 MS (n)360 1697 MS (e)385 1697 MS (w)410 1697 MS (a)435 1697 MS (y)460 1697 MS ( )485 1697 MS (v)510 1697 MS (o)535 1697 MS (i)560 1697 MS (d)585 1697 MS ( )610 1697 MS (g)635 1697 MS (e)660 1697 MS (t)685 1697 MS (_)710 1697 MS +(d)735 1697 MS (v)760 1697 MS (e)785 1697 MS (c)810 1697 MS (\()835 1697 MS (i)860 1697 MS (n)885 1697 MS ( )910 1697 MS (s)935 1697 MS (t)960 1697 MS (r)985 1697 MS (i)1010 1697 MS (n)1035 1697 MS (g)1060 1697 MS ( )1085 1697 MS (i)1110 1697 MS +(d)1135 1697 MS (_)1160 1697 MS (c)1185 1697 MS (a)1210 1697 MS (l)1235 1697 MS (l)1260 1697 MS (b)1285 1697 MS (a)1310 1697 MS (c)1335 1697 MS (k)1360 1697 MS (\))1385 1697 MS (;)1410 1697 MS +( )1435 1697 MS +( )235 1745 MS ( )260 1745 MS ( )285 1745 MS ( )310 1745 MS (o)335 1745 MS (n)360 1745 MS (e)385 1745 MS (w)410 1745 MS (a)435 1745 MS (y)460 1745 MS ( )485 1745 MS (v)510 1745 MS (o)535 1745 MS (i)560 1745 MS (d)585 1745 MS ( )610 1745 MS +(p)635 1745 MS (u)660 1745 MS (t)685 1745 MS (_)710 1745 MS (d)735 1745 MS (v)760 1745 MS (e)785 1745 MS (c)810 1745 MS (\()835 1745 MS (i)860 1745 MS (n)885 1745 MS ( )910 1745 MS (P)935 1745 MS (V)960 1745 MS (e)985 1745 MS (c)1010 1745 MS +( )1035 1745 MS (v)1060 1745 MS (e)1085 1745 MS (c)1110 1745 MS (,)1135 1745 MS (i)1160 1745 MS (n)1185 1745 MS ( )1210 1745 MS (s)1235 1745 MS (t)1260 1745 MS (r)1285 1745 MS (i)1310 1745 MS (n)1335 1745 MS (g)1360 1745 MS ( )1385 1745 MS (i)1410 1745 MS +(d)1435 1745 MS (_)1460 1745 MS (c)1485 1745 MS (a)1510 1745 MS (l)1535 1745 MS (l)1560 1745 MS (b)1585 1745 MS (a)1610 1745 MS (c)1635 1745 MS (k)1660 1745 MS (\))1685 1745 MS (;)1710 1745 MS +( )1735 1745 MS +( )235 1792 MS +( )235 1839 MS ( )260 1839 MS ( )285 1839 MS ( )310 1839 MS (v)335 1839 MS (o)360 1839 MS (i)385 1839 MS (d)410 1839 MS ( )435 1839 MS (S)460 1839 MS (e)485 1839 MS (t)510 1839 MS (F)535 1839 MS (i)560 1839 MS (l)585 1839 MS (e)610 1839 MS +(N)635 1839 MS (a)660 1839 MS (m)685 1839 MS (e)710 1839 MS (\()735 1839 MS (i)760 1839 MS (n)785 1839 MS ( )810 1839 MS (s)835 1839 MS (t)860 1839 MS (r)885 1839 MS (i)910 1839 MS (n)935 1839 MS (g)960 1839 MS ( )985 1839 MS (f)1010 1839 MS +(i)1035 1839 MS (l)1060 1839 MS (e)1085 1839 MS (n)1110 1839 MS (a)1135 1839 MS (m)1160 1839 MS (e)1185 1839 MS (\))1210 1839 MS (;)1235 1839 MS +( )1260 1839 MS +( )235 1886 MS +( )235 1933 MS ( )260 1933 MS ( )285 1933 MS ( )310 1933 MS (o)335 1933 MS (n)360 1933 MS (e)385 1933 MS (w)410 1933 MS (a)435 1933 MS (y)460 1933 MS ( )485 1933 MS (v)510 1933 MS (o)535 1933 MS (i)560 1933 MS (d)585 1933 MS ( )610 1933 MS +(R)635 1933 MS (e)660 1933 MS (a)685 1933 MS (d)710 1933 MS (D)735 1933 MS (a)760 1933 MS (t)785 1933 MS (a)810 1933 MS (F)835 1933 MS (r)860 1933 MS (o)885 1933 MS (m)910 1933 MS (F)935 1933 MS (i)960 1933 MS (l)985 1933 MS (e)1010 1933 MS +(\()1035 1933 MS (i)1060 1933 MS (n)1085 1933 MS ( )1110 1933 MS (s)1135 1933 MS (t)1160 1933 MS (r)1185 1933 MS (i)1210 1933 MS (n)1235 1933 MS (g)1260 1933 MS ( )1285 1933 MS (i)1310 1933 MS (d)1335 1933 MS (_)1360 1933 MS (c)1385 1933 MS (a)1410 1933 MS +(l)1435 1933 MS (l)1460 1933 MS (b)1485 1933 MS (a)1510 1933 MS (c)1535 1933 MS (k)1560 1933 MS (\))1585 1933 MS (;)1610 1933 MS +( )1635 1933 MS +( )235 1981 MS ( )260 1981 MS ( )285 1981 MS ( )310 1981 MS (o)335 1981 MS (n)360 1981 MS (e)385 1981 MS (w)410 1981 MS (a)435 1981 MS (y)460 1981 MS ( )485 1981 MS (v)510 1981 MS (o)535 1981 MS (i)560 1981 MS (d)585 1981 MS ( )610 1981 MS +(S)635 1981 MS (a)660 1981 MS (v)685 1981 MS (e)710 1981 MS (D)735 1981 MS (a)760 1981 MS (t)785 1981 MS (a)810 1981 MS (T)835 1981 MS (o)860 1981 MS (F)885 1981 MS (i)910 1981 MS (l)935 1981 MS (e)960 1981 MS (\()985 1981 MS (i)1010 1981 MS +(n)1035 1981 MS ( )1060 1981 MS (s)1085 1981 MS (t)1110 1981 MS (r)1135 1981 MS (i)1160 1981 MS (n)1185 1981 MS (g)1210 1981 MS ( )1235 1981 MS (i)1260 1981 MS (d)1285 1981 MS (_)1310 1981 MS (c)1335 1981 MS (a)1360 1981 MS (l)1385 1981 MS (l)1410 1981 MS +(b)1435 1981 MS (a)1460 1981 MS (c)1485 1981 MS (k)1510 1981 MS (\))1535 1981 MS (;)1560 1981 MS +( )1585 1981 MS +( )235 2028 MS +( )235 2075 MS ( )260 2075 MS +(})285 2075 MS ( )310 2075 MS (;)335 2075 MS +( )360 2075 MS +(})235 2122 MS ( )260 2122 MS (;)285 2122 MS +( )310 2122 MS +( )235 2169 MS +( )260 2169 MS +(#)235 2217 MS (e)260 2217 MS (n)285 2217 MS (d)310 2217 MS (i)335 2217 MS (f)360 2217 MS +( )385 2217 MS +( )235 2264 MS +( )235 2311 MS +( )235 2358 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 2415 MS +( )235 2473 MS +( )348 2530 MS +( )235 2588 MS +showpage +%%Page: 19 19 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(1)1868 400 MS (9)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[54 0 0 -54 0 0]/Helvetica-Bold MF +(9)310 580 MS (.)340 580 MS (1)355 580 MS (.)385 580 MS (2)400 580 MS +( )430 580 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[54 0 0 -54 0 0]/_Helvetica-Bold MF +(D)460 580 MS (\351)499 580 MS (f)529 580 MS (i)547 580 MS (n)562 580 MS (i)595 580 MS (t)610 580 MS (i)628 580 MS (o)643 580 MS (n)676 580 MS ( )709 580 MS (d)724 580 MS (e)757 580 MS ( )787 580 MS (l)802 580 MS (\222)817 580 MS +(i)832 580 MS (m)848 580 MS (p)895 580 MS (l)928 580 MS (\351)944 580 MS (m)975 580 MS (e)1022 580 MS (n)1052 580 MS (t)1085 580 MS (a)1103 580 MS (t)1133 580 MS (i)1151 580 MS (o)1166 580 MS (n)1199 580 MS ( )1232 580 MS +( )1247 580 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 652 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 710 MS (\222)378 710 MS (i)395 710 MS (m)409 710 MS (p)447 710 MS (l)473 710 MS (\351)486 710 MS (m)509 710 MS (e)547 710 MS (n)570 710 MS (t)594 710 MS (a)609 710 MS (t)631 710 MS (i)646 710 MS (o)658 710 MS (n)684 710 MS +( )708 710 MS (d)726 710 MS (e)752 710 MS ( )774 710 MS (l)793 710 MS (a)806 710 MS ( )829 710 MS (d)847 710 MS (o)872 710 MS (n)898 710 MS (n)923 710 MS (\351)947 710 MS (e)969 710 MS ( )991 710 MS (v)1010 710 MS (e)1035 710 MS +(c)1057 710 MS (t)1079 710 MS (e)1094 710 MS (u)1116 710 MS (r)1141 710 MS ( )1158 710 MS (p)1176 710 MS (a)1201 710 MS +(r)1223 710 MS (a)1240 710 MS (l)1263 710 MS (l)1276 710 MS (\350)1289 710 MS (l)1312 710 MS (e)1325 710 MS ( )1348 710 MS (d)1367 710 MS (o)1392 710 MS (i)1418 710 MS (t)1430 710 MS ( )1445 710 MS (d)1463 710 MS (o)1488 710 MS (n)1514 710 MS +(c)1538 710 MS ( )1560 710 MS (d)1578 710 MS (\351)1603 710 MS (f)1626 710 MS (i)1643 710 MS (n)1656 710 MS (i)1681 710 MS (r)1694 710 MS ( )1712 710 MS (u)1730 710 MS (n)1756 710 MS (e)1780 710 MS ( )1802 710 MS (f)1821 710 MS (o)1836 710 MS +(n)1863 710 MS (c)1887 710 MS (t)1909 710 MS (i)1925 710 MS (o)1937 710 MS (n)1963 710 MS ( )1987 710 MS (S)2005 710 MS (i)2034 710 MS (z)2047 710 MS (e)2069 710 MS (\()2091 710 MS (\))2108 710 MS ( )2125 710 MS +(q)235 767 MS (u)260 767 MS (i)286 767 MS ( )298 767 MS (r)317 767 MS (e)334 767 MS (n)356 767 MS (v)381 767 MS (o)405 767 MS (i)432 767 MS (e)444 767 MS ( )466 767 MS (l)486 767 MS (a)499 767 MS ( )521 767 MS (t)540 767 MS +(a)555 767 MS (i)577 767 MS (l)590 767 MS (l)604 767 MS (e)617 767 MS ( )639 767 MS (t)658 767 MS (o)673 767 MS (t)698 767 MS (a)713 767 MS (l)735 767 MS (e)747 767 MS ( )769 767 MS (d)788 767 MS (u)813 767 MS ( )838 767 MS +(v)857 767 MS (e)881 767 MS (c)903 767 MS (t)925 767 MS (e)940 767 MS (u)962 767 MS (r)987 767 MS ( )1004 767 MS (d)1023 767 MS (i)1048 767 MS (s)1061 767 MS (t)1080 767 MS (r)1095 767 MS (i)1112 767 MS (b)1125 767 MS (u)1149 767 MS +(\351)1174 767 MS (,)1196 767 MS ( )1209 767 MS (u)1228 767 MS (n)1253 767 MS (e)1277 767 MS ( )1299 767 MS (f)1319 767 MS (o)1334 767 MS (n)1360 767 MS (c)1385 767 MS (t)1407 767 MS (i)1422 767 MS (o)1434 767 MS (n)1460 767 MS ( )1484 767 MS +(L)1503 767 MS (V)1533 767 MS (e)1570 767 MS (c)1592 767 MS (\()1614 767 MS (s)1631 767 MS (t)1650 767 MS (a)1665 767 MS (r)1687 767 MS (t)1704 767 MS (,)1718 767 MS (e)1731 767 MS (n)1753 767 MS (d)1777 767 MS (\))1802 767 MS ( )1819 767 MS +(q)1838 767 MS (u)1863 767 MS (i)1888 767 MS ( )1900 767 MS (r)1919 767 MS (e)1936 767 MS (n)1959 767 MS (v)1984 767 MS (o)2008 767 MS (i)2034 767 MS (e)2047 767 MS ( )2069 767 MS (l)2089 767 MS (a)2102 767 MS ( )2125 767 MS +(d)235 825 MS (i)261 825 MS (s)273 825 MS (t)292 825 MS (r)307 825 MS (i)325 825 MS (b)338 825 MS (u)362 825 MS (t)387 825 MS (i)403 825 MS (o)415 825 MS (n)441 825 MS ( )465 825 MS (l)486 825 MS (o)498 825 MS (c)524 825 MS +(a)546 825 MS (l)569 825 MS (e)582 825 MS ( )604 825 MS (\340)624 825 MS ( )646 825 MS (u)666 825 MS (n)692 825 MS ( )717 825 MS (p)737 825 MS (r)762 825 MS (o)779 825 MS (c)805 825 MS (e)827 825 MS (s)849 825 MS (s)868 825 MS +(e)887 825 MS (u)909 825 MS (r)934 825 MS ( )951 825 MS (d)971 825 MS (u)996 825 MS ( )1021 825 MS (v)1041 825 MS (e)1066 825 MS (c)1088 825 MS (t)1110 825 MS (e)1125 825 MS (u)1147 825 MS (r)1172 825 MS ( )1189 825 MS (p)1209 825 MS +(a)1234 825 MS (r)1256 825 MS (a)1273 825 MS (l)1296 825 MS (l)1309 825 MS (\350)1322 825 MS (l)1345 825 MS (e)1358 825 MS (,)1380 825 MS ( )1393 825 MS (u)1413 825 MS (n)1438 825 MS (e)1463 825 MS ( )1485 825 MS (f)1506 825 MS (o)1521 825 MS +(n)1547 825 MS (c)1572 825 MS (t)1594 825 MS (i)1609 825 MS (o)1621 825 MS (n)1647 825 MS ( )1672 825 MS (v)1692 825 MS (e)1717 825 MS (c)1739 825 MS (\()1761 825 MS (\))1778 825 MS ( )1795 825 MS (q)1815 825 MS (u)1840 825 MS (i)1866 825 MS +( )1878 825 MS (r)1898 825 MS (e)1915 825 MS (n)1938 825 MS (v)1963 825 MS (o)1987 825 MS (i)2014 825 MS (e)2026 825 MS ( )2048 825 MS (l)2069 825 MS (e)2082 825 MS (s)2105 825 MS ( )2125 825 MS +(d)235 882 MS (o)260 882 MS (n)286 882 MS (n)310 882 MS (\351)334 882 MS (e)356 882 MS (s)379 882 MS ( )398 882 MS (l)415 882 MS (o)427 882 MS (c)453 882 MS (a)475 882 MS (l)498 882 MS (e)511 882 MS (s)533 882 MS ( )552 882 MS +(d)568 882 MS (u)593 882 MS ( )618 882 MS (v)634 882 MS (e)659 882 MS (c)681 882 MS +(t)703 882 MS (e)718 882 MS (u)740 882 MS (r)765 882 MS ( )782 882 MS (\340)798 882 MS ( )820 882 MS (u)836 882 MS (n)861 882 MS ( )885 882 MS (p)901 882 MS (r)926 882 MS (o)942 882 MS (c)968 882 MS (e)990 882 MS (s)1012 882 MS +(s)1031 882 MS (e)1050 882 MS (u)1072 882 MS (r)1097 882 MS (.)1114 882 MS ( )1127 882 MS (D)1143 882 MS (e)1179 882 MS ( )1201 882 MS (p)1217 882 MS (l)1242 882 MS (u)1255 882 MS (s)1280 882 MS (,)1299 882 MS ( )1312 882 MS (p)1328 882 MS +(o)1353 882 MS (u)1379 882 MS (r)1403 882 MS ( )1420 882 MS (p)1436 882 MS (e)1461 882 MS (r)1483 882 MS (m)1500 882 MS (e)1537 882 MS (t)1559 882 MS (t)1573 882 MS (r)1588 882 MS (e)1605 882 MS ( )1627 882 MS (u)1643 882 MS (n)1668 882 MS +( )1692 882 MS (t)1707 882 MS (r)1722 882 MS (a)1739 882 MS (n)1761 882 MS (s)1785 882 MS (f)1805 882 MS (e)1821 882 MS (r)1843 882 MS (t)1860 882 MS ( )1875 882 MS (o)1890 882 MS (p)1916 882 MS (t)1940 882 MS (i)1955 882 MS (m)1968 882 MS +(a)2005 882 MS (l)2028 882 MS ( )2041 882 MS (d)2057 882 MS (e)2082 882 MS (s)2105 882 MS ( )2125 882 MS +(d)235 940 MS (o)260 940 MS (n)286 940 MS (n)310 940 MS (\351)334 940 MS (e)356 940 MS (s)379 940 MS ( )398 940 MS (p)412 940 MS (a)437 940 MS (r)459 940 MS (a)476 940 MS (l)499 940 MS (l)513 940 MS (\350)526 940 MS (l)549 940 MS +(e)562 940 MS (s)585 940 MS ( )604 940 MS (d)618 940 MS (\222)644 940 MS (u)660 940 MS (n)686 940 MS ( )710 940 MS (c)725 940 MS (o)747 940 MS (m)773 940 MS (p)810 940 MS (o)835 940 MS (s)861 940 MS (a)880 940 MS (n)903 940 MS +(t)927 940 MS ( )942 940 MS (\340)956 940 MS ( )978 940 MS (u)992 940 MS (n)1018 940 MS ( )1042 940 MS (a)1057 940 MS (u)1079 940 MS (t)1104 940 MS (r)1119 940 MS (e)1136 940 MS ( )1158 940 MS (l)1173 940 MS (o)1185 940 MS (r)1211 940 MS +(s)1228 940 MS (q)1247 940 MS (u)1272 940 MS (e)1297 940 MS ( )1319 940 MS (c)1333 940 MS (e)1355 940 MS (u)1377 940 MS (x)1403 940 MS +(-)1427 940 MS +(c)1444 940 MS (i)1467 940 MS ( )1480 940 MS (s)1495 940 MS (e)1514 940 MS ( )1536 940 MS (t)1550 940 MS (r)1565 940 MS (o)1582 940 MS (u)1608 940 MS (v)1633 940 MS (e)1657 940 MS (n)1679 940 MS (t)1703 940 MS ( )1718 940 MS (d)1732 940 MS +(a)1757 940 MS (n)1779 940 MS (s)1804 940 MS ( )1823 940 MS (d)1837 940 MS (e)1863 940 MS (s)1885 940 MS ( )1904 940 MS (c)1919 940 MS (o)1941 940 MS (n)1967 940 MS (t)1991 940 MS (a)2006 940 MS (i)2029 940 MS (n)2042 940 MS (e)2066 940 MS +(r)2088 940 MS (s)2105 940 MS ( )2125 940 MS +(d)235 997 MS (i)261 997 MS (f)274 997 MS (f)290 997 MS (\351)306 997 MS (r)328 997 MS (e)345 997 MS (n)368 997 MS (t)392 997 MS (s)407 997 MS ( )426 997 MS (e)444 997 MS (t)466 997 MS ( )481 997 MS (s)499 997 MS (u)518 997 MS +(i)544 997 MS (v)557 997 MS (a)581 997 MS (n)604 997 MS (t)628 997 MS ( )643 997 MS (u)661 997 MS (n)686 997 MS ( )710 997 MS (n)728 997 MS (o)752 997 MS (m)779 997 MS (b)817 997 MS (r)841 997 MS (e)858 997 MS ( )880 997 MS +(d)898 997 MS (e)923 997 MS ( )945 997 MS (p)963 997 MS (r)988 997 MS (o)1005 997 MS (c)1031 997 MS (e)1053 997 MS (s)1075 997 MS (s)1094 997 MS (u)1113 997 MS (s)1138 997 MS ( )1157 997 MS (d)1175 997 MS (i)1201 997 MS (f)1215 997 MS +(f)1231 997 MS (\351)1248 997 MS (r)1270 997 MS (e)1287 997 MS (n)1309 997 MS (t)1333 997 MS (s)1348 997 MS (,)1367 997 MS ( )1380 997 MS (i)1399 997 MS (l)1412 997 MS ( )1424 997 MS (e)1443 997 MS (s)1465 997 MS (t)1484 997 MS ( )1499 997 MS +(n)1517 997 MS (\351)1541 997 MS (c)1563 997 MS (e)1585 997 MS (s)1608 997 MS (s)1627 997 MS (a)1646 997 MS (i)1669 997 MS (r)1682 997 MS (e)1699 997 MS ( )1721 997 MS (d)1739 997 MS (\222)1765 997 MS (i)1782 997 MS (m)1795 997 MS (p)1833 997 MS +(l)1859 997 MS (\351)1872 997 MS (m)1895 997 MS (e)1933 997 MS (n)1956 997 MS (t)1980 997 MS (e)1995 997 MS (r)2017 997 MS ( )2034 997 MS (u)2052 997 MS (n)2077 997 MS (e)2102 997 MS +( )2125 997 MS +(f)235 1055 MS (o)250 1055 MS (n)277 1055 MS (c)301 1055 MS (t)323 1055 MS (i)339 1055 MS (o)351 1055 MS (n)377 1055 MS ( )401 1055 MS (n)416 1055 MS (v)441 1055 MS (e)465 1055 MS (c)487 1055 MS (\()509 1055 MS (s)526 1055 MS (t)545 1055 MS +(a)560 1055 MS (r)582 1055 MS (t)599 1055 MS (,)613 1055 MS (e)626 1055 MS (n)648 1055 MS (d)672 1055 MS (\))697 1055 MS ( )714 1055 MS (q)728 1055 MS (u)753 1055 MS (i)779 1055 MS ( )791 1055 MS (r)805 1055 MS (e)822 1055 MS (n)845 1055 MS +(v)870 1055 MS (o)894 1055 MS (i)921 1055 MS (e)933 1055 MS ( )955 1055 MS (u)969 1055 MS (n)995 1055 MS (e)1020 1055 MS ( )1042 1055 MS (p)1056 1055 MS (a)1081 1055 MS (r)1103 1055 MS (t)1120 1055 MS (i)1135 1055 MS (e)1147 1055 MS ( )1170 1055 MS +(s)1184 1055 MS (e)1203 1055 MS (u)1225 1055 MS (l)1251 1055 MS (e)1264 1055 MS (m)1287 1055 MS (e)1325 1055 MS (n)1348 1055 MS (t)1372 1055 MS ( )1387 1055 MS (d)1401 1055 MS (e)1426 1055 MS (s)1448 1055 MS ( )1467 1055 MS (d)1481 1055 MS (o)1506 1055 MS +(n)1532 1055 MS (n)1557 1055 MS (\351)1581 1055 MS (e)1603 1055 MS (s)1626 1055 MS ( )1645 1055 MS (l)1660 1055 MS (o)1672 1055 MS (c)1698 1055 MS (a)1720 1055 MS (l)1743 1055 MS (e)1756 1055 MS (s)1779 1055 MS ( )1798 1055 MS (d)1812 1055 MS (u)1837 1055 MS +( )1862 1055 MS (v)1877 1055 MS (e)1901 1055 MS (c)1923 1055 MS (t)1945 1055 MS (e)1960 1055 MS (u)1982 1055 MS (r)2007 1055 MS ( )2024 1055 MS (\340)2038 1055 MS ( )2060 1055 MS (u)2074 1055 MS (n)2100 1055 MS ( )2125 1055 MS +(p)235 1112 MS (r)260 1112 MS (o)277 1112 MS (c)303 1112 MS (e)325 1112 MS (s)347 1112 MS (s)366 1112 MS (e)385 1112 MS (u)407 1112 MS (r)432 1112 MS (.)449 1112 MS +( )462 1112 MS +( )348 1170 MS +(L)348 1227 MS (\222)378 1227 MS (i)395 1227 MS (m)409 1227 MS (p)447 1227 MS (l)473 1227 MS (\351)486 1227 MS (m)509 1227 MS (e)547 1227 MS (n)570 1227 MS (t)594 1227 MS (a)609 1227 MS (t)631 1227 MS (i)646 1227 MS (o)658 1227 MS (n)684 1227 MS +( )708 1227 MS (d)724 1227 MS (u)749 1227 MS ( )774 1227 MS (c)790 1227 MS (o)812 1227 MS (m)839 1227 MS (p)876 1227 MS (o)901 1227 MS (s)927 1227 MS (a)946 1227 MS (n)968 1227 MS (t)992 1227 MS ( )1007 1227 MS (v)1023 1227 MS (e)1047 1227 MS +(c)1069 1227 MS (t)1091 1227 MS (e)1106 1227 MS (u)1128 1227 MS (r)1153 1227 MS ( )1170 1227 MS (N)1186 1227 MS (u)1222 1227 MS (m)1248 1227 MS (e)1285 1227 MS (r)1307 1227 MS (i)1325 1227 MS (c)1338 1227 MS (a)1361 1227 MS (l)1384 1227 MS ( )1396 1227 MS +(P)1412 1227 MS (l)1441 1227 MS (a)1454 1227 MS (t)1476 1227 MS (o)1491 1227 MS (n)1517 1227 MS ( )1541 1227 MS (e)1557 1227 MS (s)1579 1227 MS (t)1598 1227 MS ( )1613 1227 MS (r)1628 1227 MS (e)1645 1227 MS (p)1667 1227 MS (r)1692 1227 MS (\351)1709 1227 MS +(s)1731 1227 MS (e)1750 1227 MS (n)1772 1227 MS (t)1796 1227 MS (a)1811 1227 MS (t)1833 1227 MS (i)1848 1227 MS (v)1861 1227 MS (e)1885 1227 MS ( )1907 1227 MS (d)1923 1227 MS (\222)1948 1227 MS (u)1964 1227 MS (n)1990 1227 MS ( )2014 1227 MS (c)2030 1227 MS +(o)2052 1227 MS (d)2078 1227 MS (e)2103 1227 MS ( )2125 1227 MS +(d)235 1285 MS (e)260 1285 MS ( )282 1285 MS (c)295 1285 MS (a)317 1285 MS (l)340 1285 MS (c)353 1285 MS (u)375 1285 MS (l)401 1285 MS ( )413 1285 MS (q)426 1285 MS (u)451 1285 MS (i)477 1285 MS ( )490 1285 MS (g)503 1285 MS (\351)528 1285 MS +(n)551 1285 MS (\350)575 1285 MS (r)597 1285 MS (e)614 1285 MS ( )636 1285 MS (u)649 1285 MS (n)675 1285 MS ( )699 1285 MS (o)712 1285 MS (b)738 1285 MS (j)763 1285 MS (e)776 1285 MS (t)798 1285 MS ( )813 1285 MS (d)826 1285 MS (e)851 1285 MS +( )873 1285 MS (t)886 1285 MS (y)901 1285 MS (p)924 1285 MS (e)949 1285 MS ( )971 1285 MS (v)985 1285 MS (e)1009 1285 MS (c)1031 1285 MS (t)1053 1285 MS (e)1068 1285 MS (u)1090 1285 MS (r)1115 1285 MS ( )1132 1285 MS (p)1145 1285 MS (a)1170 1285 MS +(r)1192 1285 MS (a)1209 1285 MS (l)1232 1285 MS (l)1245 1285 MS (\350)1258 1285 MS (l)1281 1285 MS (e)1294 1285 MS (,)1316 1285 MS ( )1329 1285 MS (o)1342 1285 MS (u)1368 1285 MS ( )1393 1285 MS (q)1406 1285 MS (u)1431 1285 MS (i)1456 1285 MS ( )1468 1285 MS +(p)1481 1285 MS (r)1506 1285 MS (e)1523 1285 MS (n)1546 1285 MS (d)1570 1285 MS ( )1595 1285 MS (e)1608 1285 MS (n)1631 1285 MS ( )1655 1285 MS (e)1668 1285 MS (n)1691 1285 MS (t)1715 1285 MS (r)1730 1285 MS (\351)1747 1285 MS (e)1769 1285 MS ( )1791 1285 MS +(d)1804 1285 MS (\222)1829 1285 MS (u)1845 1285 MS (n)1871 1285 MS ( )1895 1285 MS (a)1908 1285 MS (l)1931 1285 MS (g)1943 1285 MS (o)1968 1285 MS (r)1994 1285 MS (i)2012 1285 MS (t)2024 1285 MS (h)2039 1285 MS (m)2064 1285 MS (e)2102 1285 MS ( )2125 1285 MS +(u)235 1342 MS (n)260 1342 MS ( )284 1342 MS (v)308 1342 MS (e)333 1342 MS (c)355 1342 MS (t)377 1342 MS (e)392 1342 MS (u)414 1342 MS (r)439 1342 MS ( )456 1342 MS (p)479 1342 MS (a)504 1342 MS (r)526 1342 MS (a)543 1342 MS (l)566 1342 MS +(l)579 1342 MS (\350)592 1342 MS (l)615 1342 MS (e)628 1342 MS (.)650 1342 MS ( )663 1342 MS (I)686 1342 MS (l)704 1342 MS ( )717 1342 MS (d)740 1342 MS (o)765 1342 MS (i)792 1342 MS (t)804 1342 MS ( )819 1342 MS (d)842 1342 MS (o)867 1342 MS +(n)893 1342 MS (c)917 1342 MS ( )939 1342 MS (d)962 1342 MS (\351)987 1342 MS (f)1010 1342 MS (i)1026 1342 MS (n)1039 1342 MS (i)1065 1342 MS (r)1078 1342 MS ( )1095 1342 MS (u)1118 1342 MS (n)1144 1342 MS (e)1169 1342 MS ( )1191 1342 MS (f)1215 1342 MS +(o)1230 1342 MS (n)1257 1342 MS (c)1281 1342 MS (t)1303 1342 MS (i)1319 1342 MS (o)1331 1342 MS (n)1357 1342 MS ( )1381 1342 MS (d)1404 1342 MS (e)1430 1342 MS ( )1452 1342 MS (l)1476 1342 MS (e)1489 1342 MS (c)1511 1342 MS (t)1533 1342 MS (u)1548 1342 MS +(r)1573 1342 MS (e)1590 1342 MS ( )1612 1342 MS (d)1635 1342 MS (\222)1660 1342 MS (u)1676 1342 MS (n)1702 1342 MS ( )1727 1342 MS (v)1751 1342 MS (e)1775 1342 MS (c)1797 1342 MS (t)1819 1342 MS (e)1834 1342 MS (u)1856 1342 MS (r)1881 1342 MS ( )1898 1342 MS +(d)1921 1342 MS (e)1946 1342 MS (p)1968 1342 MS (u)1993 1342 MS (i)2019 1342 MS (s)2032 1342 MS ( )2051 1342 MS (u)2074 1342 MS (n)2100 1342 MS ( )2125 1342 MS +(f)235 1400 MS (i)252 1400 MS (c)265 1400 MS (h)288 1400 MS (i)313 1400 MS (e)326 1400 MS (r)348 1400 MS +( )365 1400 MS +(:)378 1400 MS ( )392 1400 MS (R)406 1400 MS (e)439 1400 MS (a)461 1400 MS (d)483 1400 MS (D)508 1400 MS (a)544 1400 MS (t)566 1400 MS (a)581 1400 MS (F)603 1400 MS (r)630 1400 MS (o)647 1400 MS (m)674 1400 MS (F)711 1400 MS (i)739 1400 MS +(l)753 1400 MS (e)766 1400 MS (\()788 1400 MS (\))805 1400 MS (,)822 1400 MS ( )835 1400 MS (d)849 1400 MS (\222)874 1400 MS (\351)890 1400 MS (c)913 1400 MS (r)935 1400 MS (i)953 1400 MS (t)965 1400 MS (u)980 1400 MS (r)1005 1400 MS (e)1022 1400 MS +( )1044 1400 MS (d)1058 1400 MS (\222)1083 1400 MS (u)1099 1400 MS (n)1125 1400 MS ( )1149 1400 MS (v)1164 1400 MS (e)1189 1400 MS (c)1211 1400 MS (t)1233 1400 MS (e)1248 1400 MS (u)1270 1400 MS (r)1295 1400 MS ( )1312 1400 MS (d)1326 1400 MS (a)1351 1400 MS +(n)1373 1400 MS (s)1398 1400 MS ( )1417 1400 MS (u)1431 1400 MS (n)1457 1400 MS ( )1482 1400 MS (f)1497 1400 MS (i)1513 1400 MS (c)1526 1400 MS (h)1549 1400 MS (i)1574 1400 MS (e)1587 1400 MS (r)1609 1400 MS +( )1626 1400 MS +(:)1639 1400 MS ( )1653 1400 MS (S)1667 1400 MS (a)1695 1400 MS (v)1718 1400 MS (e)1742 1400 MS (D)1764 1400 MS (a)1800 1400 MS (t)1822 1400 MS (a)1837 1400 MS (T)1859 1400 MS (o)1890 1400 MS (F)1916 1400 MS (i)1944 1400 MS (l)1957 1400 MS (e)1970 1400 MS +(\()1992 1400 MS (\))2009 1400 MS (,)2026 1400 MS ( )2039 1400 MS (u)2053 1400 MS (n)2078 1400 MS (e)2102 1400 MS ( )2125 1400 MS +(f)235 1457 MS (o)250 1457 MS (n)277 1457 MS (c)301 1457 MS (t)323 1457 MS (i)339 1457 MS (o)351 1457 MS (n)377 1457 MS ( )401 1457 MS (q)414 1457 MS (u)439 1457 MS (i)465 1457 MS ( )478 1457 MS (r)491 1457 MS (e)508 1457 MS (n)530 1457 MS +(v)555 1457 MS (o)579 1457 MS (i)606 1457 MS (e)619 1457 MS ( )641 1457 MS (u)654 1457 MS (n)680 1457 MS (e)704 1457 MS ( )726 1457 MS (r)739 1457 MS (\351)756 1457 MS (f)779 1457 MS (\351)795 1457 MS (r)817 1457 MS (e)834 1457 MS (n)856 1457 MS +(c)881 1457 MS (e)903 1457 MS ( )925 1457 MS (C)938 1457 MS (O)971 1457 MS (R)1008 1457 MS (B)1041 1457 MS (A)1075 1457 MS +( )1110 1457 MS (s)1124 1457 MS (u)1143 1457 MS (r)1168 1457 MS ( )1185 1457 MS (u)1198 1457 MS (n)1223 1457 MS ( )1248 1457 MS (o)1261 1457 MS (b)1287 1457 MS (j)1312 1457 MS (e)1324 1457 MS (t)1346 1457 MS ( )1361 1457 MS (v)1374 1457 MS (e)1398 1457 MS +(c)1420 1457 MS (t)1442 1457 MS (e)1457 1457 MS (u)1479 1457 MS (r)1504 1457 MS ( )1521 1457 MS (p)1534 1457 MS (a)1559 1457 MS (r)1581 1457 MS (a)1598 1457 MS (l)1621 1457 MS (l)1634 1457 MS (\350)1647 1457 MS (l)1670 1457 MS (e)1683 1457 MS ( )1705 1457 MS +(d)1718 1457 MS (v)1744 1457 MS (e)1769 1457 MS (c)1791 1457 MS (\()1813 1457 MS (\))1830 1457 MS (,)1847 1457 MS ( )1860 1457 MS (u)1873 1457 MS (n)1898 1457 MS (e)1922 1457 MS ( )1944 1457 MS (f)1958 1457 MS (o)1973 1457 MS (n)2000 1457 MS (c)2024 1457 MS +(t)2046 1457 MS (i)2061 1457 MS (o)2073 1457 MS (n)2100 1457 MS ( )2125 1457 MS +(q)235 1515 MS (u)260 1515 MS (i)286 1515 MS ( )298 1515 MS (p)313 1515 MS (r)338 1515 MS (e)355 1515 MS (n)377 1515 MS (d)401 1515 MS ( )426 1515 MS (e)441 1515 MS (n)464 1515 MS ( )488 1515 MS (e)503 1515 MS (n)526 1515 MS (t)550 1515 MS +(r)565 1515 MS (\351)582 1515 MS (e)604 1515 MS ( )626 1515 MS (u)641 1515 MS (n)666 1515 MS (e)690 1515 MS ( )712 1515 MS (r)727 1515 MS (\351)744 1515 MS (f)767 1515 MS (\351)782 1515 MS (r)804 1515 MS (e)821 1515 MS (n)844 1515 MS (c)868 1515 MS +(e)891 1515 MS ( )913 1515 MS (C)928 1515 MS (O)961 1515 MS (R)997 1515 MS (B)1031 1515 MS (A)1065 1515 MS ( )1100 1515 MS (s)1115 1515 MS (u)1134 1515 MS (r)1159 1515 MS ( )1176 1515 MS (u)1191 1515 MS (n)1216 1515 MS ( )1240 1515 MS (o)1256 1515 MS +(b)1282 1515 MS (j)1307 1515 MS (e)1319 1515 MS (t)1341 1515 MS ( )1356 1515 MS (v)1371 1515 MS (e)1395 1515 MS (c)1417 1515 MS (t)1439 1515 MS (e)1454 1515 MS (u)1476 1515 MS (r)1501 1515 MS ( )1518 1515 MS (p)1533 1515 MS (a)1558 1515 MS (r)1580 1515 MS +(a)1597 1515 MS (l)1619 1515 MS (l)1632 1515 MS (\350)1645 1515 MS (l)1668 1515 MS (e)1681 1515 MS ( )1703 1515 MS (d)1718 1515 MS (v)1744 1515 MS (e)1768 1515 MS (c)1791 1515 MS (\()1813 1515 MS (v)1830 1515 MS (e)1854 1515 MS (c)1877 1515 MS (\))1899 1515 MS +(,)1916 1515 MS ( )1929 1515 MS (a)1944 1515 MS (i)1967 1515 MS (n)1980 1515 MS (s)2004 1515 MS (i)2024 1515 MS ( )2037 1515 MS (q)2052 1515 MS (u)2077 1515 MS (e)2102 1515 MS ( )2125 1515 MS +(l)235 1572 MS (e)248 1572 MS (u)270 1572 MS (r)295 1572 MS ( )312 1572 MS (\351)325 1572 MS (q)347 1572 MS (u)372 1572 MS (i)398 1572 MS (v)411 1572 MS (a)435 1572 MS (l)458 1572 MS (e)471 1572 MS (n)494 1572 MS (t)518 1572 MS ( )533 1572 MS +(e)546 1572 MS (n)568 1572 MS ( )592 1572 MS (a)605 1572 MS (s)627 1572 MS (y)647 1572 MS (n)671 1572 MS (c)696 1572 MS (h)719 1572 MS (r)743 1572 MS (o)760 1572 MS (n)786 1572 MS (e)810 1572 MS +( )832 1572 MS +(:)845 1572 MS ( )859 1572 MS (g)872 1572 MS (e)897 1572 MS (t)919 1572 MS (_)934 1572 MS (d)959 1572 MS (v)984 1572 MS (e)1008 1572 MS (c)1030 1572 MS (\()1052 1572 MS (\))1069 1572 MS ( )1086 1572 MS (e)1099 1572 MS (t)1120 1572 MS ( )1135 1572 MS +(p)1148 1572 MS (u)1173 1572 MS (t)1197 1572 MS (_)1212 1572 MS (d)1236 1572 MS (v)1261 1572 MS (e)1285 1572 MS (c)1307 1572 MS (\()1329 1572 MS (\))1346 1572 MS (.)1363 1572 MS +( )1376 1572 MS +( )348 1630 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 1677 MS (i)260 1677 MS (f)285 1677 MS (n)310 1677 MS (d)335 1677 MS (e)360 1677 MS (f)385 1677 MS ( )410 1677 MS (_)435 1677 MS (N)460 1677 MS (P)485 1677 MS (V)510 1677 MS (E)535 1677 MS (C)560 1677 MS (C)585 1677 MS (O)610 1677 MS +(M)635 1677 MS (P)660 1677 MS (O)685 1677 MS (N)710 1677 MS (E)735 1677 MS (N)760 1677 MS (T)785 1677 MS (_)810 1677 MS +( )835 1677 MS +(#)235 1724 MS (d)260 1724 MS (e)285 1724 MS (f)310 1724 MS (i)335 1724 MS (n)360 1724 MS (e)385 1724 MS ( )410 1724 MS (_)435 1724 MS (N)460 1724 MS (P)485 1724 MS (V)510 1724 MS (E)535 1724 MS (C)560 1724 MS (C)585 1724 MS (O)610 1724 MS +(M)635 1724 MS (P)660 1724 MS (O)685 1724 MS (N)710 1724 MS (E)735 1724 MS (N)760 1724 MS (T)785 1724 MS (_)810 1724 MS +( )835 1724 MS +( )235 1772 MS +(#)235 1819 MS +(i)260 1819 MS (n)285 1819 MS (c)310 1819 MS (l)335 1819 MS (u)360 1819 MS (d)385 1819 MS (e)410 1819 MS ( )435 1819 MS (")460 1819 MS (S)485 1819 MS (A)510 1819 MS (L)535 1819 MS (O)560 1819 MS (M)585 1819 MS (E)610 1819 MS (c)635 1819 MS +(o)660 1819 MS (n)685 1819 MS (f)710 1819 MS (i)735 1819 MS (g)760 1819 MS (.)785 1819 MS (h)810 1819 MS (")835 1819 MS +( )860 1819 MS +(#)235 1866 MS (i)260 1866 MS (n)285 1866 MS (c)310 1866 MS (l)335 1866 MS (u)360 1866 MS (d)385 1866 MS (e)410 1866 MS ( )435 1866 MS (C)460 1866 MS (O)485 1866 MS (R)510 1866 MS (B)535 1866 MS (A)560 1866 MS (_)585 1866 MS (S)610 1866 MS +(E)635 1866 MS (R)660 1866 MS (V)685 1866 MS (E)710 1866 MS (R)735 1866 MS (_)760 1866 MS (H)785 1866 MS (E)810 1866 MS (A)835 1866 MS (D)860 1866 MS (E)885 1866 MS (R)910 1866 MS (\()935 1866 MS (N)960 1866 MS (P)985 1866 MS (V)1010 1866 MS +(e)1035 1866 MS (c)1060 1866 MS (C)1085 1866 MS (o)1110 1866 MS (m)1135 1866 MS (p)1160 1866 MS (o)1185 1866 MS (n)1210 1866 MS (e)1235 1866 MS (n)1260 1866 MS (t)1285 1866 MS (\))1310 1866 MS +( )1335 1866 MS +(#)235 1913 MS (i)260 1913 MS (n)285 1913 MS (c)310 1913 MS (l)335 1913 MS (u)360 1913 MS (d)385 1913 MS (e)410 1913 MS ( )435 1913 MS (")460 1913 MS (S)485 1913 MS (A)510 1913 MS (L)535 1913 MS (O)560 1913 MS (M)585 1913 MS (E)610 1913 MS +(_)635 1913 MS (C)660 1913 MS (o)685 1913 MS (m)710 1913 MS (p)735 1913 MS (o)760 1913 MS (n)785 1913 MS (e)810 1913 MS (n)835 1913 MS (t)860 1913 MS (_)885 1913 MS (i)910 1913 MS (.)935 1913 MS (h)960 1913 MS (x)985 1913 MS (x)1010 1913 MS +(")1035 1913 MS +( )1060 1913 MS +(#)235 1960 MS (i)260 1960 MS (n)285 1960 MS (c)310 1960 MS (l)335 1960 MS (u)360 1960 MS (d)385 1960 MS (e)410 1960 MS ( )435 1960 MS (")460 1960 MS (M)485 1960 MS (P)510 1960 MS (I)535 1960 MS (O)560 1960 MS (b)585 1960 MS (j)610 1960 MS +(e)635 1960 MS (c)660 1960 MS (t)685 1960 MS (_)710 1960 MS (i)735 1960 MS (.)760 1960 MS (h)785 1960 MS (")810 1960 MS +( )835 1960 MS +(#)235 2008 MS (i)260 2008 MS (n)285 2008 MS (c)310 2008 MS (l)335 2008 MS (u)360 2008 MS (d)385 2008 MS (e)410 2008 MS ( )435 2008 MS (")460 2008 MS (n)485 2008 MS (p)510 2008 MS (_)535 2008 MS (v)560 2008 MS (e)585 2008 MS (c)610 2008 MS +(t)635 2008 MS (o)660 2008 MS (r)685 2008 MS (.)710 2008 MS (h)735 2008 MS (h)760 2008 MS (")785 2008 MS +( )810 2008 MS +( )235 2055 MS +(c)235 2102 MS (l)260 2102 MS (a)285 2102 MS (s)310 2102 MS (s)335 2102 MS ( )360 2102 MS (P)385 2102 MS (V)410 2102 MS (e)435 2102 MS (c)460 2102 MS (_)485 2102 MS (i)510 2102 MS (:)535 2102 MS ( )560 2102 MS (p)585 2102 MS (u)610 2102 MS +(b)635 2102 MS (l)660 2102 MS (i)685 2102 MS (c)710 2102 MS ( )735 2102 MS (P)760 2102 MS (O)785 2102 MS (A)810 2102 MS (_)835 2102 MS (E)860 2102 MS (n)885 2102 MS (g)910 2102 MS (i)935 2102 MS (n)960 2102 MS (e)985 2102 MS (s)1010 2102 MS +(:)1035 2102 MS (:)1060 2102 MS (P)1085 2102 MS (V)1110 2102 MS (e)1135 2102 MS (c)1160 2102 MS (,)1185 2102 MS ( )1210 2102 MS +( )1235 2102 MS +( )235 2149 MS +( )382 2149 MS ( )407 2149 MS ( )432 2149 MS ( )457 2149 MS ( )482 2149 MS ( )507 2149 MS (p)532 2149 MS (u)557 2149 MS (b)582 2149 MS (l)607 2149 MS (i)632 2149 MS (c)657 2149 MS ( )682 2149 MS (M)707 2149 MS (P)732 2149 MS (I)757 2149 MS +(O)782 2149 MS (b)807 2149 MS (j)832 2149 MS (e)857 2149 MS (c)882 2149 MS (t)907 2149 MS (_)932 2149 MS (i)957 2149 MS +( )982 2149 MS +( )235 2196 MS +({)235 2244 MS +( )260 2244 MS +(p)235 2291 MS (u)260 2291 MS (b)285 2291 MS (l)310 2291 MS (i)335 2291 MS (c)360 2291 MS (:)385 2291 MS +( )410 2291 MS +( )235 2338 MS ( )260 2338 MS (/)285 2338 MS (/)310 2338 MS ( )335 2338 MS (C)360 2338 MS (o)385 2338 MS (n)410 2338 MS (s)435 2338 MS (t)460 2338 MS (r)485 2338 MS (u)510 2338 MS (c)535 2338 MS (t)560 2338 MS (o)585 2338 MS (r)610 2338 MS +(s)635 2338 MS +( )660 2338 MS +( )235 2385 MS ( )260 2385 MS (P)285 2385 MS (V)310 2385 MS (e)335 2385 MS (c)360 2385 MS +(_)385 2385 MS (i)410 2385 MS (\()435 2385 MS (i)460 2385 MS (n)485 2385 MS (t)510 2385 MS ( )535 2385 MS (n)560 2385 MS (b)585 2385 MS (p)610 2385 MS (r)635 2385 MS (o)660 2385 MS (c)685 2385 MS (,)710 2385 MS ( )735 2385 MS (i)760 2385 MS +(n)785 2385 MS (t)810 2385 MS ( )835 2385 MS (n)860 2385 MS (u)885 2385 MS (m)910 2385 MS (p)935 2385 MS (r)960 2385 MS (o)985 2385 MS (c)1010 2385 MS (,)1035 2385 MS ( )1060 2385 MS (i)1085 2385 MS (n)1110 2385 MS (t)1135 2385 MS ( )1160 2385 MS +(*)1185 2385 MS (l)1210 2385 MS (i)1235 2385 MS (m)1260 2385 MS (,)1285 2385 MS ( )1310 2385 MS (i)1335 2385 MS (n)1360 2385 MS (t)1385 2385 MS ( )1410 2385 MS (s)1435 2385 MS (i)1460 2385 MS (z)1485 2385 MS (e)1510 2385 MS (,)1535 2385 MS ( )1560 2385 MS +(d)1585 2385 MS (o)1610 2385 MS (u)1635 2385 MS (b)1660 2385 MS (l)1685 2385 MS (e)1710 2385 MS ( )1735 2385 MS (*)1760 2385 MS (d)1785 2385 MS (a)1810 2385 MS (t)1835 2385 MS (a)1860 2385 MS (\))1885 2385 MS ( )1910 2385 MS (;)1935 2385 MS +( )1960 2385 MS +( )235 2432 MS ( )260 2432 MS (/)285 2432 MS (/)310 2432 MS ( )335 2432 MS (D)360 2432 MS (e)385 2432 MS (s)410 2432 MS (t)435 2432 MS (r)460 2432 MS (u)485 2432 MS (c)510 2432 MS (t)535 2432 MS (o)560 2432 MS (r)585 2432 MS +( )610 2432 MS +( )235 2480 MS ( )260 2480 MS (~)285 2480 MS (P)310 2480 MS (V)335 2480 MS (e)360 2480 MS (c)385 2480 MS (_)410 2480 MS (i)435 2480 MS (\()460 2480 MS (\))485 2480 MS ( )510 2480 MS (;)535 2480 MS +( )560 2480 MS +( )235 2527 MS ( )260 2527 MS +( )285 2527 MS +( )235 2574 MS ( )260 2574 MS (E)285 2574 MS (n)310 2574 MS (g)335 2574 MS (i)360 2574 MS (n)385 2574 MS (e)410 2574 MS (s)435 2574 MS (:)460 2574 MS (:)485 2574 MS (D)510 2574 MS (o)535 2574 MS (u)560 2574 MS (b)585 2574 MS (l)610 2574 MS +(e)635 2574 MS (V)660 2574 MS (e)685 2574 MS (c)710 2574 MS (*)735 2574 MS ( )760 2574 MS (v)785 2574 MS (e)810 2574 MS (c)835 2574 MS (\()860 2574 MS (\))885 2574 MS (;)910 2574 MS +( )935 2574 MS +( )235 2621 MS ( )260 2621 MS (C)285 2621 MS (O)310 2621 MS (R)335 2621 MS (B)360 2621 MS (A)385 2621 MS (:)410 2621 MS (:)435 2621 MS (U)460 2621 MS (L)485 2621 MS (o)510 2621 MS (n)535 2621 MS (g)560 2621 MS ( )585 2621 MS (S)610 2621 MS +(i)635 2621 MS (z)660 2621 MS (e)685 2621 MS (\()710 2621 MS (\))735 2621 MS ( )760 2621 MS ({)785 2621 MS ( )810 2621 MS (r)835 2621 MS (e)860 2621 MS (t)885 2621 MS (u)910 2621 MS (r)935 2621 MS (n)960 2621 MS ( )985 2621 MS (\()1010 2621 MS +(C)1035 2621 MS (O)1060 2621 MS (R)1085 2621 MS (B)1110 2621 MS (A)1135 2621 MS (:)1160 2621 MS (:)1185 2621 MS (U)1210 2621 MS (L)1235 2621 MS (o)1260 2621 MS (n)1285 2621 MS (g)1310 2621 MS (\))1335 2621 MS (_)1360 2621 MS (s)1385 2621 MS (i)1410 2621 MS +(z)1435 2621 MS (e)1460 2621 MS (;)1485 2621 MS ( )1510 2621 MS (})1535 2621 MS (;)1560 2621 MS +( )1585 2621 MS +( )235 2668 MS ( )260 2668 MS (v)285 2668 MS (o)310 2668 MS (i)335 2668 MS (d)360 2668 MS ( )385 2668 MS (L)410 2668 MS (V)435 2668 MS (e)460 2668 MS (c)485 2668 MS (\()510 2668 MS (C)535 2668 MS (O)560 2668 MS (R)585 2668 MS (B)610 2668 MS +(A)635 2668 MS (:)660 2668 MS (:)685 2668 MS (U)710 2668 MS (L)735 2668 MS (o)760 2668 MS (n)785 2668 MS (g)810 2668 MS (&)835 2668 MS ( )860 2668 MS (s)885 2668 MS (t)910 2668 MS (a)935 2668 MS (r)960 2668 MS (t)985 2668 MS (,)1010 2668 MS +( )1035 2668 MS (C)1060 2668 MS (O)1085 2668 MS (R)1110 2668 MS (B)1135 2668 MS (A)1160 2668 MS (:)1185 2668 MS (:)1210 2668 MS (U)1235 2668 MS (L)1260 2668 MS (o)1285 2668 MS (n)1310 2668 MS (g)1335 2668 MS (&)1360 2668 MS ( )1385 2668 MS (e)1410 2668 MS +(n)1435 2668 MS (d)1460 2668 MS (\))1485 2668 MS ( )1510 2668 MS ({)1535 2668 MS ( )1560 2668 MS (s)1585 2668 MS (t)1610 2668 MS (a)1635 2668 MS (r)1660 2668 MS (t)1685 2668 MS ( )1710 2668 MS (=)1735 2668 MS ( )1760 2668 MS (_)1785 2668 MS (l)1810 2668 MS +(i)1835 2668 MS (m)1860 2668 MS ([)1885 2668 MS (0)1910 2668 MS (])1935 2668 MS (;)1960 2668 MS +( )1985 2668 MS +( )235 2716 MS ( )260 2716 MS ( )285 2716 MS ( )310 2716 MS +( )335 2716 MS ( )360 2716 MS ( )385 2716 MS ( )410 2716 MS ( )435 2716 MS ( )460 2716 MS ( )485 2716 MS ( )510 2716 MS ( )535 2716 MS ( )560 2716 MS ( )585 2716 MS ( )610 2716 MS ( )635 2716 MS ( )660 2716 MS ( )685 2716 MS ( )710 2716 MS +( )735 2716 MS ( )760 2716 MS ( )785 2716 MS ( )810 2716 MS ( )835 2716 MS ( )860 2716 MS ( )885 2716 MS ( )910 2716 MS ( )935 2716 MS ( )960 2716 MS ( )985 2716 MS ( )1010 2716 MS ( )1035 2716 MS ( )1060 2716 MS ( )1085 2716 MS ( )1110 2716 MS +( )1135 2716 MS ( )1160 2716 MS ( )1185 2716 MS ( )1210 2716 MS ( )1235 2716 MS ( )1260 2716 MS ( )1285 2716 MS ( )1310 2716 MS ( )1335 2716 MS ( )1360 2716 MS ( )1385 2716 MS ( )1410 2716 MS ( )1435 2716 MS ( )1460 2716 MS ( )1485 2716 MS ( )1510 2716 MS +( )1535 2716 MS ( )1560 2716 MS (e)1585 2716 MS (n)1610 2716 MS (d)1635 2716 MS ( )1660 2716 MS (=)1685 2716 MS ( )1710 2716 MS (_)1735 2716 MS (l)1760 2716 MS (i)1785 2716 MS (m)1810 2716 MS ([)1835 2716 MS (1)1860 2716 MS (])1885 2716 MS (;)1910 2716 MS +( )1935 2716 MS (})1960 2716 MS (;)1985 2716 MS +( )2010 2716 MS +( )235 2763 MS ( )260 2763 MS (E)285 2763 MS (n)310 2763 MS (g)335 2763 MS (i)360 2763 MS (n)385 2763 MS (e)410 2763 MS (s)435 2763 MS (:)460 2763 MS (:)485 2763 MS (D)510 2763 MS (o)535 2763 MS (u)560 2763 MS (b)585 2763 MS (l)610 2763 MS +(e)635 2763 MS (V)660 2763 MS (e)685 2763 MS (c)710 2763 MS (*)735 2763 MS ( )760 2763 MS (n)785 2763 MS (v)810 2763 MS (e)835 2763 MS (c)860 2763 MS (\()885 2763 MS (C)910 2763 MS (O)935 2763 MS (R)960 2763 MS (B)985 2763 MS (A)1010 2763 MS +(:)1035 2763 MS (:)1060 2763 MS (U)1085 2763 MS (L)1110 2763 MS (o)1135 2763 MS (n)1160 2763 MS (g)1185 2763 MS ( )1210 2763 MS (s)1235 2763 MS (t)1260 2763 MS (a)1285 2763 MS (r)1310 2763 MS (t)1335 2763 MS (,)1360 2763 MS ( )1385 2763 MS (C)1410 2763 MS +(O)1435 2763 MS (R)1460 2763 MS (B)1485 2763 MS (A)1510 2763 MS (:)1535 2763 MS (:)1560 2763 MS (U)1585 2763 MS (L)1610 2763 MS (o)1635 2763 MS (n)1660 2763 MS (g)1685 2763 MS ( )1710 2763 MS (e)1735 2763 MS (n)1760 2763 MS (d)1785 2763 MS (\))1810 2763 MS +(;)1835 2763 MS +( )1860 2763 MS +( )235 2810 MS +( )235 2857 MS +(p)260 2857 MS (r)285 2857 MS (o)310 2857 MS (t)335 2857 MS (e)360 2857 MS (c)385 2857 MS (t)410 2857 MS (e)435 2857 MS (d)460 2857 MS (:)485 2857 MS +( )510 2857 MS +( )235 2904 MS ( )260 2904 MS (E)285 2904 MS (n)310 2904 MS (g)335 2904 MS (i)360 2904 MS (n)385 2904 MS (e)410 2904 MS (s)435 2904 MS (:)460 2904 MS (:)485 2904 MS (D)510 2904 MS (o)535 2904 MS (u)560 2904 MS (b)585 2904 MS (l)610 2904 MS +(e)635 2904 MS (V)660 2904 MS (e)685 2904 MS (c)710 2904 MS (*)735 2904 MS ( )760 2904 MS (_)785 2904 MS (v)810 2904 MS (e)835 2904 MS (c)860 2904 MS (;)885 2904 MS +( )910 2904 MS +( )235 2952 MS ( )260 2952 MS (i)285 2952 MS (n)310 2952 MS (t)335 2952 MS ( )360 2952 MS (_)385 2952 MS (l)410 2952 MS (i)435 2952 MS (m)460 2952 MS ([)485 2952 MS (2)510 2952 MS (])535 2952 MS (;)560 2952 MS +( )585 2952 MS +( )235 2999 MS ( )260 2999 MS (i)285 2999 MS (n)310 2999 MS (t)335 2999 MS ( )360 2999 MS (_)385 2999 MS (s)410 2999 MS (i)435 2999 MS (z)460 2999 MS (e)485 2999 MS (;)510 2999 MS +( )535 2999 MS +( )235 3046 MS ( )260 3046 MS (d)285 3046 MS (o)310 3046 MS (u)335 3046 MS (b)360 3046 MS (l)385 3046 MS (e)410 3046 MS ( )435 3046 MS (*)460 3046 MS (_)485 3046 MS (d)510 3046 MS (a)535 3046 MS (t)560 3046 MS (a)585 3046 MS (;)610 3046 MS +( )635 3046 MS +( )235 3093 MS +(})235 3140 MS ( )260 3140 MS (;)285 3140 MS +( )310 3140 MS +showpage +%%Page: 20 20 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (0)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[42 0 0 -42 0 0]/Courier MF +( )235 517 MS +(c)235 565 MS (l)260 565 MS (a)285 565 MS (s)310 565 MS (s)335 565 MS ( )360 565 MS (N)385 565 MS (P)410 565 MS (V)435 565 MS (e)460 565 MS (c)485 565 MS (C)510 565 MS (o)535 565 MS (m)560 565 MS (p)585 565 MS (o)610 565 MS +(n)635 565 MS (e)660 565 MS (n)685 565 MS (t)710 565 MS (_)735 565 MS (i)760 565 MS (:)785 565 MS ( )810 565 MS (p)835 565 MS (u)860 565 MS (b)885 565 MS (l)910 565 MS (i)935 565 MS (c)960 565 MS +( )985 565 MS (P)1010 565 MS (O)1035 565 MS (A)1060 565 MS (_)1085 565 MS (E)1110 565 MS (n)1135 565 MS (g)1160 565 MS (i)1185 565 MS (n)1210 565 MS (e)1235 565 MS (s)1260 565 MS (:)1285 565 MS (:)1310 565 MS (N)1335 565 MS (P)1360 565 MS +(V)1385 565 MS (e)1410 565 MS (c)1435 565 MS (C)1460 565 MS (o)1485 565 MS (m)1510 565 MS (p)1535 565 MS (o)1560 565 MS (n)1585 565 MS (e)1610 565 MS (n)1635 565 MS (t)1660 565 MS (,)1685 565 MS ( )1710 565 MS +( )1735 565 MS +( )235 612 MS +( )382 612 MS +( )530 612 MS +(p)677 612 MS (u)702 612 MS (b)727 612 MS (l)752 612 MS (i)777 612 MS (c)802 612 MS ( )827 612 MS (E)852 612 MS (n)877 612 MS (g)902 612 MS (i)927 612 MS (n)952 612 MS (e)977 612 MS (s)1002 612 MS (_)1027 612 MS (C)1052 612 MS +(o)1077 612 MS (m)1102 612 MS (p)1127 612 MS (o)1152 612 MS (n)1177 612 MS (e)1202 612 MS (n)1227 612 MS (t)1252 612 MS (_)1277 612 MS (i)1302 612 MS (,)1327 612 MS +( )1352 612 MS +( )235 659 MS +( )382 659 MS +( )530 659 MS +(p)677 659 MS (u)702 659 MS (b)727 659 MS (l)752 659 MS (i)777 659 MS (c)802 659 MS ( )827 659 MS (M)852 659 MS (P)877 659 MS (I)902 659 MS (O)927 659 MS (b)952 659 MS (j)977 659 MS (e)1002 659 MS (c)1027 659 MS (t)1052 659 MS +(_)1077 659 MS (i)1102 659 MS +( )1127 659 MS +( )235 706 MS +({)235 753 MS +( )260 753 MS +(p)235 801 MS (u)260 801 MS (b)285 801 MS (l)310 801 MS (i)335 801 MS (c)360 801 MS (:)385 801 MS +( )410 801 MS +( )235 848 MS ( )260 848 MS (/)285 848 MS (/)310 848 MS ( )335 848 MS (C)360 848 MS (o)385 848 MS (n)410 848 MS (s)435 848 MS (t)460 848 MS (r)485 848 MS (u)510 848 MS (c)535 848 MS (t)560 848 MS (o)585 848 MS (r)610 848 MS +(s)635 848 MS +( )660 848 MS +( )235 895 MS ( )260 895 MS (N)285 895 MS (P)310 895 MS (V)335 895 MS (e)360 895 MS (c)385 895 MS (C)410 895 MS (o)435 895 MS (m)460 895 MS (p)485 895 MS (o)510 895 MS (n)535 895 MS (e)560 895 MS (n)585 895 MS (t)610 895 MS +(_)635 895 MS (i)660 895 MS (\()685 895 MS (\))710 895 MS ( )735 895 MS (;)760 895 MS +( )785 895 MS +( )235 942 MS ( )260 942 MS (N)285 942 MS (P)310 942 MS (V)335 942 MS (e)360 942 MS (c)385 942 MS (C)410 942 MS (o)435 942 MS (m)460 942 MS (p)485 942 MS (o)510 942 MS (n)535 942 MS (e)560 942 MS (n)585 942 MS (t)610 942 MS +(_)635 942 MS (i)660 942 MS (\()685 942 MS ( )710 942 MS (i)735 942 MS (n)760 942 MS (t)785 942 MS ( )810 942 MS (n)835 942 MS (b)860 942 MS (p)885 942 MS (r)910 942 MS (o)935 942 MS (c)960 942 MS (,)985 942 MS ( )1010 942 MS +(i)1035 942 MS (n)1060 942 MS (t)1085 942 MS ( )1110 942 MS (n)1135 942 MS (u)1160 942 MS (m)1185 942 MS (p)1210 942 MS (r)1235 942 MS (o)1260 942 MS (c)1285 942 MS (,)1310 942 MS +( )1335 942 MS +( )235 989 MS +( )382 989 MS +( )530 989 MS ( )555 989 MS ( )580 989 MS ( )605 989 MS (C)630 989 MS (O)655 989 MS (R)680 989 MS (B)705 989 MS (A)730 989 MS (:)755 989 MS (:)780 989 MS (O)805 989 MS (R)830 989 MS (B)855 989 MS (_)880 989 MS (p)905 989 MS +(t)930 989 MS (r)955 989 MS ( )980 989 MS (o)1005 989 MS (r)1030 989 MS (b)1055 989 MS (,)1080 989 MS +( )1105 989 MS +( )235 1037 MS +( )382 1037 MS +( )530 1037 MS ( )555 1037 MS ( )580 1037 MS ( )605 1037 MS (P)630 1037 MS (o)655 1037 MS (r)680 1037 MS (t)705 1037 MS (a)730 1037 MS (b)755 1037 MS (l)780 1037 MS (e)805 1037 MS (S)830 1037 MS (e)855 1037 MS (r)880 1037 MS (v)905 1037 MS +(e)930 1037 MS (r)955 1037 MS (:)980 1037 MS (:)1005 1037 MS (P)1030 1037 MS (O)1055 1037 MS (A)1080 1037 MS (_)1105 1037 MS (p)1130 1037 MS (t)1155 1037 MS (r)1180 1037 MS ( )1205 1037 MS (p)1230 1037 MS (o)1255 1037 MS (a)1280 1037 MS (,)1305 1037 MS +( )1330 1037 MS +( )1355 1037 MS +( )235 1084 MS +( )382 1084 MS +( )530 1084 MS ( )555 1084 MS ( )580 1084 MS ( )605 1084 MS (P)630 1084 MS (o)655 1084 MS (r)680 1084 MS (t)705 1084 MS (a)730 1084 MS (b)755 1084 MS (l)780 1084 MS +(e)805 1084 MS (S)830 1084 MS (e)855 1084 MS (r)880 1084 MS (v)905 1084 MS (e)930 1084 MS (r)955 1084 MS (:)980 1084 MS (:)1005 1084 MS (O)1030 1084 MS (b)1055 1084 MS (j)1080 1084 MS (e)1105 1084 MS (c)1130 1084 MS (t)1155 1084 MS (I)1180 1084 MS +(d)1205 1084 MS ( )1230 1084 MS (*)1255 1084 MS ( )1280 1084 MS (c)1305 1084 MS (o)1330 1084 MS (n)1355 1084 MS (t)1380 1084 MS (I)1405 1084 MS (d)1430 1084 MS (,)1455 1084 MS ( )1480 1084 MS +( )1505 1084 MS +( )235 1131 MS +( )382 1131 MS +( )530 1131 MS ( )555 1131 MS ( )580 1131 MS ( )605 1131 MS (c)630 1131 MS (o)655 1131 MS (n)680 1131 MS (s)705 1131 MS (t)730 1131 MS ( )755 1131 MS (c)780 1131 MS (h)805 1131 MS (a)830 1131 MS (r)855 1131 MS ( )880 1131 MS (*)905 1131 MS +(i)930 1131 MS (n)955 1131 MS (s)980 1131 MS (t)1005 1131 MS (a)1030 1131 MS (n)1055 1131 MS (c)1080 1131 MS (e)1105 1131 MS (N)1130 1131 MS (a)1155 1131 MS (m)1180 1131 MS (e)1205 1131 MS (,)1230 1131 MS +( )1255 1131 MS +( )235 1178 MS +( )382 1178 MS +( )530 1178 MS ( )555 1178 MS ( )580 1178 MS ( )605 1178 MS (c)630 1178 MS (o)655 1178 MS (n)680 1178 MS (s)705 1178 MS (t)730 1178 MS ( )755 1178 MS (c)780 1178 MS (h)805 1178 MS (a)830 1178 MS (r)855 1178 MS ( )880 1178 MS (*)905 1178 MS +(i)930 1178 MS (n)955 1178 MS (t)980 1178 MS (e)1005 1178 MS (r)1030 1178 MS (f)1055 1178 MS (a)1080 1178 MS (c)1105 1178 MS (e)1130 1178 MS (N)1155 1178 MS (a)1180 1178 MS (m)1205 1178 MS (e)1230 1178 MS (\))1255 1178 MS (;)1280 1178 MS +( )1305 1178 MS +( )235 1225 MS ( )260 1225 MS (N)285 1225 MS (P)310 1225 MS (V)335 1225 MS (e)360 1225 MS (c)385 1225 MS (C)410 1225 MS (o)435 1225 MS (m)460 1225 MS (p)485 1225 MS (o)510 1225 MS (n)535 1225 MS (e)560 1225 MS (n)585 1225 MS (t)610 1225 MS +(_)635 1225 MS (i)660 1225 MS (\()685 1225 MS ( )710 1225 MS (i)735 1225 MS (n)760 1225 MS (t)785 1225 MS ( )810 1225 MS (n)835 1225 MS (b)860 1225 MS (p)885 1225 MS (r)910 1225 MS (o)935 1225 MS (c)960 1225 MS (,)985 1225 MS ( )1010 1225 MS +(i)1035 1225 MS (n)1060 1225 MS (t)1085 1225 MS ( )1110 1225 MS (n)1135 1225 MS (u)1160 1225 MS (m)1185 1225 MS (p)1210 1225 MS (r)1235 1225 MS (o)1260 1225 MS (c)1285 1225 MS (,)1310 1225 MS +( )1335 1225 MS +( )235 1273 MS +( )382 1273 MS +( )530 1273 MS ( )555 1273 MS ( )580 1273 MS ( )605 1273 MS (C)630 1273 MS (O)655 1273 MS (R)680 1273 MS (B)705 1273 MS (A)730 1273 MS (:)755 1273 MS (:)780 1273 MS (O)805 1273 MS (R)830 1273 MS (B)855 1273 MS (_)880 1273 MS (p)905 1273 MS +(t)930 1273 MS (r)955 1273 MS ( )980 1273 MS (o)1005 1273 MS (r)1030 1273 MS (b)1055 1273 MS (,)1080 1273 MS +( )1105 1273 MS +( )235 1320 MS +( )382 1320 MS +( )530 1320 MS ( )555 1320 MS ( )580 1320 MS ( )605 1320 MS (P)630 1320 MS (o)655 1320 MS (r)680 1320 MS (t)705 1320 MS (a)730 1320 MS (b)755 1320 MS (l)780 1320 MS (e)805 1320 MS (S)830 1320 MS (e)855 1320 MS (r)880 1320 MS (v)905 1320 MS +(e)930 1320 MS (r)955 1320 MS (:)980 1320 MS (:)1005 1320 MS (P)1030 1320 MS (O)1055 1320 MS (A)1080 1320 MS (_)1105 1320 MS (p)1130 1320 MS (t)1155 1320 MS (r)1180 1320 MS ( )1205 1320 MS (p)1230 1320 MS (o)1255 1320 MS (a)1280 1320 MS (,)1305 1320 MS +( )1330 1320 MS +( )1355 1320 MS +( )235 1367 MS +( )382 1367 MS +( )530 1367 MS ( )555 1367 MS ( )580 1367 MS ( )605 1367 MS (P)630 1367 MS (o)655 1367 MS (r)680 1367 MS (t)705 1367 MS (a)730 1367 MS (b)755 1367 MS (l)780 1367 MS (e)805 1367 MS (S)830 1367 MS (e)855 1367 MS (r)880 1367 MS (v)905 1367 MS +(e)930 1367 MS (r)955 1367 MS (:)980 1367 MS (:)1005 1367 MS (O)1030 1367 MS (b)1055 1367 MS (j)1080 1367 MS (e)1105 1367 MS (c)1130 1367 MS (t)1155 1367 MS (I)1180 1367 MS (d)1205 1367 MS ( )1230 1367 MS (*)1255 1367 MS ( )1280 1367 MS (c)1305 1367 MS +(o)1330 1367 MS (n)1355 1367 MS (t)1380 1367 MS (I)1405 1367 MS (d)1430 1367 MS (,)1455 1367 MS ( )1480 1367 MS +( )1505 1367 MS +( )235 1414 MS +( )382 1414 MS +( )530 1414 MS ( )555 1414 MS ( )580 1414 MS ( )605 1414 MS (c)630 1414 MS (o)655 1414 MS (n)680 1414 MS (s)705 1414 MS (t)730 1414 MS ( )755 1414 MS +(c)780 1414 MS (h)805 1414 MS (a)830 1414 MS (r)855 1414 MS ( )880 1414 MS (*)905 1414 MS (i)930 1414 MS (n)955 1414 MS (s)980 1414 MS (t)1005 1414 MS (a)1030 1414 MS (n)1055 1414 MS (c)1080 1414 MS (e)1105 1414 MS (N)1130 1414 MS (a)1155 1414 MS +(m)1180 1414 MS (e)1205 1414 MS (,)1230 1414 MS +( )1255 1414 MS +( )235 1461 MS +( )382 1461 MS +( )530 1461 MS ( )555 1461 MS ( )580 1461 MS ( )605 1461 MS (c)630 1461 MS (o)655 1461 MS (n)680 1461 MS (s)705 1461 MS (t)730 1461 MS ( )755 1461 MS (c)780 1461 MS (h)805 1461 MS (a)830 1461 MS (r)855 1461 MS ( )880 1461 MS (*)905 1461 MS +(i)930 1461 MS (n)955 1461 MS (t)980 1461 MS (e)1005 1461 MS (r)1030 1461 MS (f)1055 1461 MS (a)1080 1461 MS (c)1105 1461 MS (e)1130 1461 MS (N)1155 1461 MS (a)1180 1461 MS (m)1205 1461 MS (e)1230 1461 MS (,)1255 1461 MS +( )1280 1461 MS +( )235 1509 MS +( )382 1509 MS +( )530 1509 MS ( )555 1509 MS ( )580 1509 MS ( )605 1509 MS (i)630 1509 MS (n)655 1509 MS (t)680 1509 MS ( )705 1509 MS (f)730 1509 MS (l)755 1509 MS (a)780 1509 MS (g)805 1509 MS (\))830 1509 MS (;)855 1509 MS +( )880 1509 MS +( )235 1556 MS ( )260 1556 MS (N)285 1556 MS (P)310 1556 MS (V)335 1556 MS (e)360 1556 MS (c)385 1556 MS (C)410 1556 MS (o)435 1556 MS (m)460 1556 MS (p)485 1556 MS (o)510 1556 MS (n)535 1556 MS (e)560 1556 MS (n)585 1556 MS (t)610 1556 MS +(_)635 1556 MS (i)660 1556 MS (\()685 1556 MS ( )710 1556 MS (i)735 1556 MS (n)760 1556 MS (t)785 1556 MS ( )810 1556 MS (n)835 1556 MS (b)860 1556 MS (p)885 1556 MS (r)910 1556 MS (o)935 1556 MS (c)960 1556 MS (,)985 1556 MS ( )1010 1556 MS +(i)1035 1556 MS (n)1060 1556 MS (t)1085 1556 MS ( )1110 1556 MS (n)1135 1556 MS (u)1160 1556 MS (m)1185 1556 MS (p)1210 1556 MS (r)1235 1556 MS (o)1260 1556 MS (c)1285 1556 MS (,)1310 1556 MS ( )1335 1556 MS (N)1360 1556 MS (P)1385 1556 MS (v)1410 1556 MS +(e)1435 1556 MS (c)1460 1556 MS (t)1485 1556 MS (o)1510 1556 MS (r)1535 1556 MS ( )1560 1556 MS (*)1585 1556 MS (v)1610 1556 MS (e)1635 1556 MS (c)1660 1556 MS (,)1685 1556 MS +( )1710 1556 MS +( )235 1603 MS +( )382 1603 MS +( )530 1603 MS ( )555 1603 MS ( )580 1603 MS ( )605 1603 MS (C)630 1603 MS (O)655 1603 MS (R)680 1603 MS (B)705 1603 MS (A)730 1603 MS (:)755 1603 MS (:)780 1603 MS (O)805 1603 MS (R)830 1603 MS (B)855 1603 MS (_)880 1603 MS (p)905 1603 MS +(t)930 1603 MS (r)955 1603 MS ( )980 1603 MS (o)1005 1603 MS (r)1030 1603 MS (b)1055 1603 MS (,)1080 1603 MS +( )1105 1603 MS +( )235 1650 MS +( )382 1650 MS +( )530 1650 MS ( )555 1650 MS ( )580 1650 MS ( )605 1650 MS (P)630 1650 MS (o)655 1650 MS (r)680 1650 MS (t)705 1650 MS (a)730 1650 MS (b)755 1650 MS (l)780 1650 MS (e)805 1650 MS (S)830 1650 MS (e)855 1650 MS (r)880 1650 MS (v)905 1650 MS +(e)930 1650 MS (r)955 1650 MS (:)980 1650 MS (:)1005 1650 MS (P)1030 1650 MS (O)1055 1650 MS (A)1080 1650 MS (_)1105 1650 MS (p)1130 1650 MS (t)1155 1650 MS (r)1180 1650 MS ( )1205 1650 MS (p)1230 1650 MS (o)1255 1650 MS (a)1280 1650 MS (,)1305 1650 MS +( )1330 1650 MS +( )1355 1650 MS +( )235 1697 MS +( )382 1697 MS +( )530 1697 MS ( )555 1697 MS ( )580 1697 MS ( )605 1697 MS (P)630 1697 MS (o)655 1697 MS (r)680 1697 MS (t)705 1697 MS (a)730 1697 MS (b)755 1697 MS (l)780 1697 MS (e)805 1697 MS (S)830 1697 MS (e)855 1697 MS (r)880 1697 MS (v)905 1697 MS +(e)930 1697 MS (r)955 1697 MS (:)980 1697 MS (:)1005 1697 MS (O)1030 1697 MS (b)1055 1697 MS (j)1080 1697 MS (e)1105 1697 MS (c)1130 1697 MS (t)1155 1697 MS (I)1180 1697 MS (d)1205 1697 MS ( )1230 1697 MS (*)1255 1697 MS ( )1280 1697 MS (c)1305 1697 MS +(o)1330 1697 MS (n)1355 1697 MS (t)1380 1697 MS (I)1405 1697 MS (d)1430 1697 MS (,)1455 1697 MS ( )1480 1697 MS +( )1505 1697 MS +( )235 1745 MS +( )382 1745 MS +( )530 1745 MS ( )555 1745 MS ( )580 1745 MS ( )605 1745 MS (c)630 1745 MS (o)655 1745 MS (n)680 1745 MS (s)705 1745 MS (t)730 1745 MS ( )755 1745 MS (c)780 1745 MS (h)805 1745 MS (a)830 1745 MS (r)855 1745 MS ( )880 1745 MS (*)905 1745 MS +(i)930 1745 MS (n)955 1745 MS (s)980 1745 MS (t)1005 1745 MS +(a)1030 1745 MS (n)1055 1745 MS (c)1080 1745 MS (e)1105 1745 MS (N)1130 1745 MS (a)1155 1745 MS (m)1180 1745 MS (e)1205 1745 MS (,)1230 1745 MS +( )1255 1745 MS +( )235 1792 MS +( )382 1792 MS +( )530 1792 MS ( )555 1792 MS ( )580 1792 MS ( )605 1792 MS (c)630 1792 MS (o)655 1792 MS (n)680 1792 MS (s)705 1792 MS (t)730 1792 MS ( )755 1792 MS (c)780 1792 MS (h)805 1792 MS (a)830 1792 MS (r)855 1792 MS ( )880 1792 MS (*)905 1792 MS +(i)930 1792 MS (n)955 1792 MS (t)980 1792 MS (e)1005 1792 MS (r)1030 1792 MS (f)1055 1792 MS (a)1080 1792 MS (c)1105 1792 MS (e)1130 1792 MS (N)1155 1792 MS (a)1180 1792 MS (m)1205 1792 MS (e)1230 1792 MS (\))1255 1792 MS (;)1280 1792 MS +( )1305 1792 MS +( )235 1839 MS ( )260 1839 MS (/)285 1839 MS (/)310 1839 MS ( )335 1839 MS (D)360 1839 MS (e)385 1839 MS (s)410 1839 MS (t)435 1839 MS (r)460 1839 MS (u)485 1839 MS (c)510 1839 MS (t)535 1839 MS (o)560 1839 MS (r)585 1839 MS +( )610 1839 MS +( )235 1886 MS ( )260 1886 MS (~)285 1886 MS (N)310 1886 MS (P)335 1886 MS (V)360 1886 MS (e)385 1886 MS (c)410 1886 MS (C)435 1886 MS (o)460 1886 MS (m)485 1886 MS (p)510 1886 MS (o)535 1886 MS (n)560 1886 MS (e)585 1886 MS (n)610 1886 MS +(t)635 1886 MS (_)660 1886 MS (i)685 1886 MS (\()710 1886 MS (\))735 1886 MS ( )760 1886 MS (;)785 1886 MS +( )810 1886 MS +( )235 1933 MS ( )260 1933 MS +( )285 1933 MS +( )235 1981 MS ( )260 1981 MS (v)285 1981 MS (o)310 1981 MS (i)335 1981 MS (d)360 1981 MS ( )385 1981 MS (S)410 1981 MS (e)435 1981 MS (t)460 1981 MS (F)485 1981 MS (i)510 1981 MS (l)535 1981 MS (e)560 1981 MS (N)585 1981 MS (a)610 1981 MS +(m)635 1981 MS (e)660 1981 MS (\()685 1981 MS (c)710 1981 MS (o)735 1981 MS (n)760 1981 MS (s)785 1981 MS (t)810 1981 MS ( )835 1981 MS (c)860 1981 MS (h)885 1981 MS (a)910 1981 MS (r)935 1981 MS (*)960 1981 MS (f)985 1981 MS (i)1010 1981 MS +(l)1035 1981 MS (e)1060 1981 MS (N)1085 1981 MS (a)1110 1981 MS (m)1135 1981 MS (e)1160 1981 MS (\))1185 1981 MS (;)1210 1981 MS +( )1235 1981 MS +( )235 2028 MS ( )260 2028 MS (v)285 2028 MS (o)310 2028 MS (i)335 2028 MS (d)360 2028 MS ( )385 2028 MS (R)410 2028 MS (e)435 2028 MS (a)460 2028 MS (d)485 2028 MS (D)510 2028 MS (a)535 2028 MS (t)560 2028 MS (a)585 2028 MS (F)610 2028 MS +(r)635 2028 MS (o)660 2028 MS (m)685 2028 MS (F)710 2028 MS (i)735 2028 MS (l)760 2028 MS (e)785 2028 MS (\()810 2028 MS (c)835 2028 MS (o)860 2028 MS (n)885 2028 MS (s)910 2028 MS (t)935 2028 MS ( )960 2028 MS (c)985 2028 MS (h)1010 2028 MS +(a)1035 2028 MS (r)1060 2028 MS (*)1085 2028 MS ( )1110 2028 MS (i)1135 2028 MS (d)1160 2028 MS (_)1185 2028 MS (c)1210 2028 MS (a)1235 2028 MS (l)1260 2028 MS (l)1285 2028 MS (b)1310 2028 MS (a)1335 2028 MS (c)1360 2028 MS (k)1385 2028 MS (\))1410 2028 MS +( )1435 2028 MS (;)1460 2028 MS +( )1485 2028 MS +( )235 2075 MS ( )260 2075 MS ( )285 2075 MS ( )310 2075 MS +( )335 2075 MS +( )235 2122 MS ( )260 2122 MS (v)285 2122 MS (o)310 2122 MS (i)335 2122 MS (d)360 2122 MS ( )385 2122 MS (S)410 2122 MS (a)435 2122 MS (v)460 2122 MS (e)485 2122 MS (D)510 2122 MS (a)535 2122 MS (t)560 2122 MS (a)585 2122 MS (T)610 2122 MS +(o)635 2122 MS (F)660 2122 MS (i)685 2122 MS (l)710 2122 MS (e)735 2122 MS (\()760 2122 MS (c)785 2122 MS (o)810 2122 MS (n)835 2122 MS (s)860 2122 MS (t)885 2122 MS ( )910 2122 MS (c)935 2122 MS (h)960 2122 MS (a)985 2122 MS (r)1010 2122 MS +(*)1035 2122 MS ( )1060 2122 MS (i)1085 2122 MS (d)1110 2122 MS (_)1135 2122 MS (c)1160 2122 MS (a)1185 2122 MS (l)1210 2122 MS (l)1235 2122 MS (b)1260 2122 MS (a)1285 2122 MS (c)1310 2122 MS (k)1335 2122 MS (\))1360 2122 MS ( )1385 2122 MS (;)1410 2122 MS +( )1435 2122 MS +( )235 2169 MS +( )235 2217 MS ( )260 2217 MS (N)285 2217 MS (P)310 2217 MS (v)335 2217 MS (e)360 2217 MS (c)385 2217 MS (t)410 2217 MS (o)435 2217 MS (r)460 2217 MS ( )485 2217 MS (*)510 2217 MS (G)535 2217 MS (e)560 2217 MS (t)585 2217 MS (D)610 2217 MS +(a)635 2217 MS (t)660 2217 MS (a)685 2217 MS (\()710 2217 MS ( )735 2217 MS (v)760 2217 MS +(o)785 2217 MS (i)810 2217 MS (d)835 2217 MS ( )860 2217 MS (\))885 2217 MS (;)910 2217 MS +( )935 2217 MS +( )235 2264 MS ( )260 2264 MS (E)285 2264 MS (n)310 2264 MS (g)335 2264 MS (i)360 2264 MS (n)385 2264 MS (e)410 2264 MS (s)435 2264 MS (:)460 2264 MS (:)485 2264 MS (P)510 2264 MS (V)535 2264 MS (e)560 2264 MS (c)585 2264 MS (_)610 2264 MS +(p)635 2264 MS (t)660 2264 MS (r)685 2264 MS ( )710 2264 MS (d)735 2264 MS (v)760 2264 MS (e)785 2264 MS (c)810 2264 MS (\()835 2264 MS (\))860 2264 MS (;)885 2264 MS +( )910 2264 MS +( )235 2311 MS ( )260 2311 MS (v)285 2311 MS (o)310 2311 MS (i)335 2311 MS (d)360 2311 MS ( )385 2311 MS (d)410 2311 MS (v)435 2311 MS (e)460 2311 MS (c)485 2311 MS (\()510 2311 MS (E)535 2311 MS (n)560 2311 MS (g)585 2311 MS (i)610 2311 MS +(n)635 2311 MS (e)660 2311 MS (s)685 2311 MS (:)710 2311 MS (:)735 2311 MS (P)760 2311 MS (V)785 2311 MS (e)810 2311 MS (c)835 2311 MS (_)860 2311 MS (p)885 2311 MS (t)910 2311 MS (r)935 2311 MS ( )960 2311 MS (v)985 2311 MS (e)1010 2311 MS +(c)1035 2311 MS (\))1060 2311 MS (;)1085 2311 MS +( )1110 2311 MS +( )235 2358 MS ( )260 2358 MS (v)285 2358 MS (o)310 2358 MS (i)335 2358 MS (d)360 2358 MS ( )385 2358 MS (g)410 2358 MS (e)435 2358 MS (t)460 2358 MS (_)485 2358 MS (d)510 2358 MS (v)535 2358 MS (e)560 2358 MS (c)585 2358 MS (\()610 2358 MS +(c)635 2358 MS (o)660 2358 MS (n)685 2358 MS (s)710 2358 MS (t)735 2358 MS ( )760 2358 MS (c)785 2358 MS (h)810 2358 MS (a)835 2358 MS (r)860 2358 MS (*)885 2358 MS ( )910 2358 MS (i)935 2358 MS (d)960 2358 MS (_)985 2358 MS (c)1010 2358 MS +(a)1035 2358 MS (l)1060 2358 MS (l)1085 2358 MS (b)1110 2358 MS (a)1135 2358 MS (c)1160 2358 MS (k)1185 2358 MS (\))1210 2358 MS (;)1235 2358 MS +( )1260 2358 MS +( )235 2405 MS ( )260 2405 MS (v)285 2405 MS (o)310 2405 MS (i)335 2405 MS (d)360 2405 MS ( )385 2405 MS (p)410 2405 MS (u)435 2405 MS (t)460 2405 MS (_)485 2405 MS (d)510 2405 MS (v)535 2405 MS (e)560 2405 MS (c)585 2405 MS (\()610 2405 MS +(E)635 2405 MS (n)660 2405 MS (g)685 2405 MS (i)710 2405 MS (n)735 2405 MS (e)760 2405 MS (s)785 2405 MS (:)810 2405 MS (:)835 2405 MS (P)860 2405 MS (V)885 2405 MS (e)910 2405 MS (c)935 2405 MS (_)960 2405 MS (p)985 2405 MS (t)1010 2405 MS +(r)1035 2405 MS ( )1060 2405 MS (v)1085 2405 MS (e)1110 2405 MS (c)1135 2405 MS (,)1160 2405 MS (c)1185 2405 MS (o)1210 2405 MS (n)1235 2405 MS (s)1260 2405 MS (t)1285 2405 MS ( )1310 2405 MS (c)1335 2405 MS (h)1360 2405 MS (a)1385 2405 MS (r)1410 2405 MS +(*)1435 2405 MS ( )1460 2405 MS (i)1485 2405 MS (d)1510 2405 MS (_)1535 2405 MS (c)1560 2405 MS (a)1585 2405 MS (l)1610 2405 MS (l)1635 2405 MS (b)1660 2405 MS (a)1685 2405 MS (c)1710 2405 MS (k)1735 2405 MS (\))1760 2405 MS (;)1785 2405 MS +( )1810 2405 MS +( )235 2453 MS +(p)235 2500 MS (r)260 2500 MS (o)285 2500 MS (t)310 2500 MS (e)335 2500 MS (c)360 2500 MS (t)385 2500 MS (e)410 2500 MS (d)435 2500 MS (:)460 2500 MS +( )485 2500 MS +( )235 2547 MS ( )260 2547 MS (/)285 2547 MS (/)310 2547 MS ( )335 2547 MS (f)360 2547 MS (i)385 2547 MS (l)410 2547 MS (e)435 2547 MS (n)460 2547 MS (a)485 2547 MS (m)510 2547 MS (e)535 2547 MS +( )560 2547 MS +( )235 2594 MS ( )260 2594 MS (s)285 2594 MS (t)310 2594 MS (r)335 2594 MS (i)360 2594 MS (n)385 2594 MS (g)410 2594 MS ( )435 2594 MS (_)460 2594 MS (f)485 2594 MS (i)510 2594 MS (l)535 2594 MS (e)560 2594 MS (N)585 2594 MS (a)610 2594 MS +(m)635 2594 MS (e)660 2594 MS (;)685 2594 MS +( )710 2594 MS +( )235 2641 MS ( )260 2641 MS (/)285 2641 MS (/)310 2641 MS ( )335 2641 MS (N)360 2641 MS (P)385 2641 MS ( )410 2641 MS (v)435 2641 MS (e)460 2641 MS (c)485 2641 MS (t)510 2641 MS (o)535 2641 MS (r)560 2641 MS ( )585 2641 MS (p)610 2641 MS +(o)635 2641 MS (i)660 2641 MS (n)685 2641 MS (t)710 2641 MS (e)735 2641 MS (r)760 2641 MS +( )785 2641 MS +( )235 2689 MS ( )260 2689 MS (N)285 2689 MS (P)310 2689 MS (v)335 2689 MS (e)360 2689 MS (c)385 2689 MS (t)410 2689 MS (o)435 2689 MS (r)460 2689 MS +( )485 2689 MS (*)510 2689 MS (_)535 2689 MS (v)560 2689 MS (e)585 2689 MS (c)610 2689 MS (;)635 2689 MS +( )660 2689 MS +( )235 2736 MS ( )260 2736 MS (/)285 2736 MS (/)310 2736 MS ( )335 2736 MS (G)360 2736 MS (e)385 2736 MS (t)410 2736 MS ( )435 2736 MS (L)460 2736 MS (o)485 2736 MS (c)510 2736 MS (a)535 2736 MS (l)560 2736 MS ( )585 2736 MS (D)610 2736 MS +(a)635 2736 MS (t)660 2736 MS (a)685 2736 MS +( )710 2736 MS +( )235 2783 MS ( )260 2783 MS +(E)285 2783 MS (n)310 2783 MS (g)335 2783 MS (i)360 2783 MS (n)385 2783 MS (e)410 2783 MS (s)435 2783 MS (:)460 2783 MS (:)485 2783 MS (P)510 2783 MS (V)535 2783 MS (e)560 2783 MS (c)585 2783 MS (_)610 2783 MS (p)635 2783 MS (t)660 2783 MS +(r)685 2783 MS ( )710 2783 MS (G)735 2783 MS (e)760 2783 MS (t)785 2783 MS (L)810 2783 MS (o)835 2783 MS (c)860 2783 MS (a)885 2783 MS (l)910 2783 MS (D)935 2783 MS (a)960 2783 MS (t)985 2783 MS (a)1010 2783 MS (\()1035 2783 MS (v)1060 2783 MS +(o)1085 2783 MS (i)1110 2783 MS (d)1135 2783 MS (\))1160 2783 MS (;)1185 2783 MS +( )1210 2783 MS +(})235 2830 MS ( )260 2830 MS (;)285 2830 MS +( )310 2830 MS +( )235 2877 MS +(#)235 2925 MS (e)260 2925 MS (n)285 2925 MS (d)310 2925 MS (i)335 2925 MS (f)360 2925 MS +( )385 2925 MS +( )235 2972 MS +( )235 3019 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )348 3076 MS +showpage +%%Page: 21 21 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (1)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +(9)310 577 MS (.)338 577 MS (2)352 577 MS +( )380 577 MS +LATENC /_Helvetica-BoldOblique /Helvetica-BoldOblique reencode +[50 0 0 -50 0 0]/_Helvetica-BoldOblique MF +(L)430 577 MS (e)461 577 MS ( )489 577 MS (c)503 577 MS (o)531 577 MS (m)562 577 MS (p)606 577 MS (o)636 577 MS (s)667 577 MS (a)695 577 MS (n)722 577 MS (t)753 577 MS ( )770 577 MS (e)784 577 MS (t)811 577 MS ( )828 577 MS +(l)842 577 MS (a)856 577 MS ( )884 577 MS (d)897 577 MS (o)928 577 MS (n)958 577 MS (n)989 577 MS (\351)1020 577 MS (e)1047 577 MS ( )1075 577 MS (m)1089 577 MS (a)1133 577 MS (t)1161 577 MS (r)1178 577 MS (i)1197 577 MS (c)1211 577 MS +(e)1239 577 MS ( )1267 577 MS (p)1281 577 MS (a)1311 577 MS (r)1339 577 MS (a)1358 577 MS (l)1386 577 MS (l)1400 577 MS (\350)1414 577 MS (l)1441 577 MS (e)1455 577 MS +( )1483 577 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 647 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 705 MS (e)378 705 MS ( )400 705 MS (c)415 705 MS (o)437 705 MS (m)464 705 MS (p)501 705 MS (o)526 705 MS (s)552 705 MS (a)571 705 MS (n)594 705 MS (t)618 705 MS ( )633 705 MS (p)648 705 MS (a)673 705 MS (r)695 705 MS +(a)712 705 MS (l)735 705 MS (l)748 705 MS (\350)761 705 MS (l)784 705 MS (e)797 705 MS ( )820 705 MS (m)836 705 MS (a)874 705 MS (t)896 705 MS (r)911 705 MS (i)928 705 MS (c)940 705 MS (e)963 705 MS ( )985 705 MS (N)1000 705 MS +(u)1036 705 MS (m)1062 705 MS (e)1100 705 MS (r)1122 705 MS (i)1140 705 MS (c)1153 705 MS (a)1175 705 MS (l)1198 705 MS ( )1211 705 MS (P)1226 705 MS (l)1255 705 MS (a)1268 705 MS (t)1290 705 MS (o)1305 705 MS (n)1331 705 MS ( )1355 705 MS +(e)1371 705 MS (s)1393 705 MS (t)1412 705 MS ( )1427 705 MS (c)1442 705 MS (e)1464 705 MS (n)1486 705 MS (s)1511 705 MS (\351)1530 705 MS ( )1552 705 MS (\352)1568 705 MS (t)1590 705 MS (r)1605 705 MS (e)1622 705 MS ( )1644 705 MS (r)1659 705 MS +(e)1676 705 MS (p)1698 705 MS (r)1723 705 MS (\351)1740 705 MS (s)1762 705 MS (e)1781 705 MS (n)1803 705 MS (t)1827 705 MS (a)1842 705 MS (t)1864 705 MS (i)1879 705 MS (f)1892 705 MS ( )1908 705 MS (d)1923 705 MS (\222)1949 705 MS (u)1965 705 MS +(n)1991 705 MS ( )2015 705 MS (c)2030 705 MS (o)2052 705 MS (d)2078 705 MS (e)2103 705 MS ( )2125 705 MS +(d)235 762 MS (e)260 762 MS ( )282 762 MS (c)296 762 MS (a)318 762 MS (l)341 762 MS (c)354 762 MS (u)376 762 MS (l)402 762 MS ( )415 762 MS (q)429 762 MS (u)454 762 MS (i)480 762 MS ( )493 762 MS (g)507 762 MS (\351)532 762 MS +(n)555 762 MS (\350)580 762 MS (r)602 762 MS (e)619 762 MS ( )641 762 MS (u)655 762 MS (n)681 762 MS ( )705 762 MS (r)719 762 MS (\351)736 762 MS (s)758 762 MS (u)777 762 MS (l)803 762 MS (t)815 762 MS (a)830 762 MS (t)852 762 MS +( )867 762 MS (d)881 762 MS (e)906 762 MS ( )928 762 MS (t)942 762 MS (y)958 762 MS (p)981 762 MS (e)1006 762 MS +( )1028 762 MS (o)1042 762 MS (b)1068 762 MS (j)1093 762 MS (e)1106 762 MS (t)1128 762 MS ( )1143 762 MS (m)1158 762 MS (a)1195 762 MS (t)1217 762 MS (r)1232 762 MS (i)1249 762 MS (c)1262 762 MS (e)1284 762 MS ( )1307 762 MS (p)1321 762 MS +(a)1346 762 MS (r)1368 762 MS (a)1385 762 MS (l)1408 762 MS (l)1421 762 MS (\350)1434 762 MS (l)1457 762 MS (e)1470 762 MS (.)1492 762 MS ( )1505 762 MS (I)1519 762 MS (l)1537 762 MS ( )1550 762 MS (f)1565 762 MS (a)1581 762 MS (u)1603 762 MS +(t)1628 762 MS ( )1643 762 MS (b)1657 762 MS (i)1682 762 MS (e)1695 762 MS (n)1718 762 MS ( )1742 762 MS (f)1757 762 MS (a)1773 762 MS (i)1796 762 MS (r)1809 762 MS (e)1826 762 MS ( )1848 762 MS (l)1863 762 MS (a)1876 762 MS ( )1899 762 MS +(d)1913 762 MS (i)1939 762 MS (s)1952 762 MS (t)1971 762 MS (i)1987 762 MS (n)2000 762 MS (c)2024 762 MS (t)2046 762 MS (i)2062 762 MS (o)2074 762 MS (n)2100 762 MS ( )2125 762 MS +(e)235 820 MS (n)257 820 MS (t)281 820 MS (r)296 820 MS (e)313 820 MS ( )335 820 MS (l)358 820 MS (e)370 820 MS ( )392 820 MS (c)415 820 MS (o)437 820 MS (m)464 820 MS (p)501 820 MS (o)526 820 MS (s)552 820 MS (a)571 820 MS +(n)593 820 MS (t)617 820 MS ( )632 820 MS (e)654 820 MS (t)676 820 MS ( )691 820 MS (l)714 820 MS (a)726 820 MS ( )748 820 MS (d)770 820 MS (o)795 820 MS (n)821 820 MS (n)846 820 MS (\351)870 820 MS (e)892 820 MS (,)914 820 MS +( )927 820 MS (m)950 820 MS (\352)988 820 MS (m)1011 820 MS (e)1049 820 MS ( )1071 820 MS (s)1094 820 MS (i)1114 820 MS ( )1127 820 MS (t)1149 820 MS (o)1164 820 MS (u)1190 820 MS (s)1215 820 MS ( )1234 820 MS (l)1256 820 MS (e)1269 820 MS +(s)1292 820 MS ( )1311 820 MS (d)1333 820 MS (e)1358 820 MS (u)1380 820 MS (x)1406 820 MS ( )1430 820 MS (s)1453 820 MS (o)1472 820 MS (n)1498 820 MS (t)1522 820 MS ( )1537 820 MS (r)1559 820 MS (e)1576 820 MS (p)1598 820 MS (r)1623 820 MS +(\351)1640 820 MS (s)1662 820 MS (e)1681 820 MS (n)1703 820 MS (t)1727 820 MS (\351)1742 820 MS (s)1764 820 MS ( )1783 820 MS (d)1805 820 MS (a)1830 820 MS (n)1853 820 MS (s)1877 820 MS ( )1897 820 MS (l)1920 820 MS (\222)1933 820 MS (i)1950 820 MS +(n)1963 820 MS (t)1987 820 MS (e)2002 820 MS (r)2024 820 MS (f)2042 820 MS (a)2058 820 MS (c)2080 820 MS (e)2102 820 MS ( )2125 820 MS +(C)235 877 MS (O)268 877 MS (R)304 877 MS (B)337 877 MS (A)371 877 MS ( )406 877 MS (c)419 877 MS (o)441 877 MS (m)468 877 MS (m)506 877 MS (e)544 877 MS ( )566 877 MS (u)579 877 MS (n)604 877 MS (e)629 877 MS ( )651 877 MS +(\253)664 877 MS +( )688 877 MS +(i)702 877 MS (n)715 877 MS (t)739 877 MS (e)754 877 MS (r)776 877 MS (f)794 877 MS (a)809 877 MS (c)831 877 MS (e)853 877 MS +( )875 877 MS +(\273)889 877 MS (.)913 877 MS ( )926 877 MS (S)939 877 MS (i)968 877 MS ( )980 877 MS (l)994 877 MS (a)1006 877 MS ( )1028 877 MS (d)1041 877 MS (o)1066 877 MS (n)1092 877 MS (n)1117 877 MS (\351)1141 877 MS (e)1163 877 MS ( )1185 877 MS +(m)1199 877 MS (a)1238 877 MS (t)1260 877 MS (r)1275 877 MS (i)1292 877 MS (c)1304 877 MS (e)1326 877 MS ( )1348 877 MS (e)1361 877 MS (s)1383 877 MS (t)1402 877 MS ( )1417 877 MS (u)1430 877 MS (n)1455 877 MS (e)1479 877 MS ( )1501 877 MS +(i)1515 877 MS (n)1528 877 MS (t)1552 877 MS (e)1567 877 MS (r)1589 877 MS (f)1607 877 MS (a)1622 877 MS (c)1644 877 MS (e)1666 877 MS ( )1688 877 MS (e)1701 877 MS (t)1723 877 MS ( )1738 877 MS (n)1751 877 MS (o)1775 877 MS (n)1801 877 MS +( )1825 877 MS (s)1838 877 MS (e)1857 877 MS (u)1879 877 MS (l)1905 877 MS (e)1917 877 MS (m)1940 877 MS (e)1978 877 MS (n)2001 877 MS (t)2025 877 MS ( )2040 877 MS (u)2053 877 MS (n)2078 877 MS (e)2102 877 MS ( )2125 877 MS +(s)235 935 MS (t)254 935 MS (r)269 935 MS (u)286 935 MS (c)311 935 MS (t)332 935 MS (u)347 935 MS (r)372 935 MS (e)389 935 MS ( )410 935 MS (C)438 935 MS (S)471 935 MS (R)499 935 MS (,)532 935 MS ( )545 935 MS (c)573 935 MS +(\222)595 935 MS (e)611 935 MS (s)633 935 MS (t)652 935 MS ( )667 935 MS (p)695 935 MS (o)719 935 MS (u)745 935 MS (r)770 935 MS ( )786 935 MS (p)814 935 MS (e)839 935 MS (r)861 935 MS (m)878 935 MS (e)915 935 MS (t)937 935 MS +(t)952 935 MS (r)966 935 MS (e)983 935 MS ( )1005 935 MS (d)1033 935 MS (\222)1058 935 MS (u)1074 935 MS (n)1099 935 MS (e)1123 935 MS ( )1145 935 MS (p)1173 935 MS (a)1198 935 MS (r)1220 935 MS (t)1237 935 MS ( )1251 935 MS (d)1279 935 MS +(e)1304 935 MS ( )1326 935 MS (t)1353 935 MS (r)1368 935 MS (a)1385 935 MS (n)1407 935 MS (s)1431 935 MS (m)1451 935 MS (e)1489 935 MS (t)1511 935 MS (t)1525 935 MS (r)1540 935 MS (e)1557 935 MS ( )1579 935 MS (u)1607 935 MS (n)1632 935 MS +(i)1657 935 MS (q)1669 935 MS (u)1694 935 MS (e)1719 935 MS (m)1742 935 MS (e)1780 935 MS (n)1803 935 MS (t)1827 935 MS ( )1842 935 MS (s)1870 935 MS (a)1889 935 MS ( )1911 935 MS (r)1939 935 MS (\351)1956 935 MS (f)1978 935 MS (\351)1993 935 MS +(r)2015 935 MS (e)2032 935 MS (n)2055 935 MS (c)2079 935 MS (e)2102 935 MS ( )2125 935 MS +(C)235 992 MS (O)268 992 MS (R)304 992 MS (B)337 992 MS (A)371 992 MS ( )407 992 MS (e)426 992 MS (n)449 992 MS ( )473 992 MS (a)493 992 MS (r)515 992 MS (g)532 992 MS (u)557 992 MS (m)583 992 MS (e)620 992 MS (n)643 992 MS +(t)667 992 MS ( )682 992 MS (d)701 992 MS (e)726 992 MS ( )748 992 MS (s)768 992 MS (e)787 992 MS (r)809 992 MS (v)827 992 MS (i)852 992 MS (c)865 992 MS (e)887 992 MS ( )909 992 MS (e)928 992 MS (t)950 992 MS ( )965 992 MS +(n)985 992 MS (o)1009 992 MS (n)1035 992 MS ( )1059 992 MS (p)1078 992 MS (a)1103 992 MS (s)1126 992 MS ( )1145 992 MS (l)1165 992 MS (\222)1178 992 MS (e)1195 992 MS (n)1218 992 MS (s)1243 992 MS (e)1262 992 MS (m)1285 992 MS (b)1323 992 MS +(l)1348 992 MS (e)1361 992 MS ( )1384 992 MS (d)1403 992 MS (e)1428 992 MS ( )1451 992 MS (l)1471 992 MS (a)1484 992 MS ( )1506 992 MS (m)1526 992 MS (a)1564 992 MS (t)1586 992 MS (r)1601 992 MS (i)1619 992 MS (c)1631 992 MS (e)1653 992 MS +(,)1675 992 MS ( )1688 992 MS (e)1707 992 MS (t)1729 992 MS ( )1744 992 MS (d)1763 992 MS (\222)1788 992 MS (a)1804 992 MS (u)1826 992 MS (t)1851 992 MS (r)1866 992 MS (e)1883 992 MS ( )1905 992 MS (p)1924 992 MS (a)1949 992 MS (r)1971 992 MS +(t)1988 992 MS ( )2003 992 MS (d)2022 992 MS (e)2047 992 MS ( )2069 992 MS (l)2089 992 MS (e)2102 992 MS ( )2125 992 MS +(d)235 1050 MS (\351)260 1050 MS (f)283 1050 MS (i)299 1050 MS (n)312 1050 MS (i)338 1050 MS (r)350 1050 MS ( )368 1050 MS (e)387 1050 MS (n)410 1050 MS ( )434 1050 MS (t)453 1050 MS (a)468 1050 MS (n)490 1050 MS (t)514 1050 MS ( )529 1050 MS +(q)548 1050 MS (u)573 1050 MS (e)598 1050 MS ( )621 1050 MS (d)640 1050 MS (o)665 1050 MS (n)691 1050 MS (n)716 1050 MS (\351)740 1050 MS (e)762 1050 MS ( )784 1050 MS (p)803 1050 MS (a)829 1050 MS (r)851 1050 MS (a)868 1050 MS (l)891 1050 MS +(l)904 1050 MS (\350)917 1050 MS (l)940 1050 MS (e)953 1050 MS +( )975 1050 MS +(:)988 1050 MS ( )1002 1050 MS (c)1022 1050 MS (\222)1044 1050 MS (e)1060 1050 MS (s)1083 1050 MS (t)1102 1050 MS ( )1117 1050 MS (\340)1136 1050 MS ( )1158 1050 MS (d)1177 1050 MS (i)1203 1050 MS (r)1215 1050 MS (e)1233 1050 MS ( )1256 1050 MS (q)1275 1050 MS +(u)1300 1050 MS (e)1325 1050 MS ( )1347 1050 MS (l)1367 1050 MS (\222)1380 1050 MS (i)1398 1050 MS (n)1411 1050 MS (t)1435 1050 MS (e)1450 1050 MS (r)1472 1050 MS (f)1490 1050 MS (a)1505 1050 MS (c)1527 1050 MS (e)1550 1050 MS ( )1572 1050 MS (P)1591 1050 MS +(M)1619 1050 MS (a)1663 1050 MS (t)1685 1050 MS ( )1700 1050 MS (h)1720 1050 MS (\351)1744 1050 MS (r)1766 1050 MS (i)1784 1050 MS (t)1796 1050 MS (e)1811 1050 MS ( )1833 1050 MS (d)1852 1050 MS (e)1877 1050 MS ( )1900 1050 MS (l)1920 1050 MS (\222)1933 1050 MS +(i)1950 1050 MS (n)1963 1050 MS (t)1987 1050 MS (e)2002 1050 MS (r)2024 1050 MS (f)2042 1050 MS (a)2058 1050 MS (c)2080 1050 MS (e)2102 1050 MS ( )2125 1050 MS +(g)235 1107 MS (\351)260 1107 MS (n)282 1107 MS +(\351)306 1107 MS (r)328 1107 MS (i)346 1107 MS (q)359 1107 MS (u)384 1107 MS (e)409 1107 MS ( )431 1107 MS (M)444 1107 MS (P)488 1107 MS (I)516 1107 MS (O)533 1107 MS (b)570 1107 MS (j)595 1107 MS (e)608 1107 MS (c)630 1107 MS (t)652 1107 MS +(.)667 1107 MS +( )680 1107 MS +( )235 1165 MS +[54 0 0 -54 0 0]/Helvetica-Bold MF +(9)310 1275 MS (.)340 1275 MS (2)355 1275 MS (.)385 1275 MS (1)400 1275 MS +( )430 1275 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[54 0 0 -54 0 0]/_Helvetica-Bold MF +(D)460 1275 MS (\351)499 1275 MS (f)529 1275 MS (i)547 1275 MS (n)562 1275 MS (i)595 1275 MS (t)610 1275 MS (i)628 1275 MS (o)643 1275 MS (n)676 1275 MS ( )709 1275 MS (d)724 1275 MS (e)757 1275 MS ( )787 1275 MS (l)802 1275 MS (\222)817 1275 MS +(i)832 1275 MS (n)847 1275 MS (t)880 1275 MS (e)898 1275 MS (r)928 1275 MS (f)949 1275 MS (a)968 1275 MS (c)998 1275 MS (e)1028 1275 MS ( )1058 1275 MS (C)1073 1275 MS (O)1112 1275 MS (R)1154 1275 MS (B)1193 1275 MS (A)1233 1275 MS +( )1271 1275 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 1347 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(D)348 1405 MS (a)384 1405 MS (n)406 1405 MS (s)431 1405 MS ( )450 1405 MS (l)483 1405 MS (\222)496 1405 MS (e)512 1405 MS (x)535 1405 MS (e)560 1405 MS (m)583 1405 MS (p)620 1405 MS (l)646 1405 MS (e)659 1405 MS ( )682 1405 MS (c)714 1405 MS +(i)737 1405 MS +(-)749 1405 MS +(d)766 1405 MS (e)791 1405 MS (s)814 1405 MS (s)833 1405 MS (o)852 1405 MS (u)878 1405 MS (s)903 1405 MS (,)922 1405 MS ( )935 1405 MS (o)967 1405 MS (n)993 1405 MS ( )1017 1405 MS (d)1049 1405 MS (\351)1074 1405 MS (f)1097 1405 MS (i)1113 1405 MS +(n)1126 1405 MS (i)1152 1405 MS (t)1164 1405 MS ( )1179 1405 MS (d)1211 1405 MS (e)1236 1405 MS (u)1258 1405 MS (x)1284 1405 MS ( )1308 1405 MS (i)1341 1405 MS (n)1355 1405 MS (t)1379 1405 MS (e)1394 1405 MS (r)1416 1405 MS (f)1433 1405 MS (a)1449 1405 MS +(c)1471 1405 MS (e)1493 1405 MS (s)1515 1405 MS (.)1534 1405 MS ( )1547 1405 MS (C)1579 1405 MS (e)1612 1405 MS (s)1635 1405 MS ( )1654 1405 MS (d)1686 1405 MS (e)1711 1405 MS (u)1733 1405 MS (x)1759 1405 MS ( )1783 1405 MS (i)1816 1405 MS (n)1829 1405 MS +(t)1853 1405 MS (e)1868 1405 MS (r)1890 1405 MS (f)1908 1405 MS (a)1923 1405 MS (c)1946 1405 MS (e)1968 1405 MS (s)1990 1405 MS ( )2009 1405 MS (s)2042 1405 MS (o)2061 1405 MS (n)2087 1405 MS (t)2111 1405 MS ( )2125 1405 MS +(p)235 1462 MS (a)260 1462 MS (r)282 1462 MS (a)299 1462 MS (l)322 1462 MS (l)335 1462 MS (\350)348 1462 MS (l)371 1462 MS (e)384 1462 MS (s)407 1462 MS ( )426 1462 MS (c)439 1462 MS (a)461 1462 MS (r)483 1462 MS ( )500 1462 MS (e)513 1462 MS +(l)536 1462 MS (l)549 1462 MS (e)562 1462 MS (s)584 1462 MS ( )603 1462 MS (h)617 1462 MS (\351)641 1462 MS (r)663 1462 MS (i)681 1462 MS (t)693 1462 MS (e)708 1462 MS (n)730 1462 MS (t)754 1462 MS ( )769 1462 MS (d)782 1462 MS (e)807 1462 MS +( )829 1462 MS (l)842 1462 MS (\222)855 1462 MS (i)872 1462 MS (n)885 1462 MS (t)909 1462 MS (e)924 1462 MS (r)946 1462 MS (f)964 1462 MS (a)980 1462 MS (c)1002 1462 MS (e)1024 1462 MS ( )1046 1462 MS (g)1059 1462 MS (\351)1084 1462 MS (n)1107 1462 MS +(\351)1131 1462 MS (r)1153 1462 MS (i)1171 1462 MS (q)1183 1462 MS (u)1208 1462 MS (e)1233 1462 MS ( )1256 1462 MS (p)1269 1462 MS (a)1294 1462 MS (r)1316 1462 MS (a)1333 1462 MS (l)1355 1462 MS (l)1368 1462 MS (\350)1381 1462 MS (l)1404 1462 MS (e)1417 1462 MS +( )1439 1462 MS +(:)1452 1462 MS ( )1466 1462 MS (M)1479 1462 MS (P)1523 1462 MS (I)1551 1462 MS (O)1568 1462 MS (b)1604 1462 MS (j)1629 1462 MS (e)1642 1462 MS (c)1665 1462 MS (t)1687 1462 MS (.)1702 1462 MS ( )1715 1462 MS +( )1728 1462 MS +(L)348 1520 MS (a)378 1520 MS ( )400 1520 MS (p)429 1520 MS (r)454 1520 MS (e)471 1520 MS (m)494 1520 MS (i)532 1520 MS (\350)545 1520 MS (r)567 1520 MS (e)584 1520 MS ( )607 1520 MS (i)637 1520 MS (n)650 1520 MS (t)674 1520 MS (e)689 1520 MS +(r)711 1520 MS (f)729 1520 MS (a)744 1520 MS (c)766 1520 MS (e)788 1520 MS ( )810 1520 MS (n)840 1520 MS (o)864 1520 MS (m)891 1520 MS (m)929 1520 MS (\351)967 1520 MS (e)990 1520 MS ( )1012 1520 MS (P)1041 1520 MS (M)1069 1520 MS (a)1113 1520 MS +(t)1135 1520 MS ( )1150 1520 MS (r)1179 1520 MS (e)1196 1520 MS (p)1218 1520 MS (r)1243 1520 MS (\351)1260 1520 MS (s)1282 1520 MS (e)1301 1520 MS (n)1323 1520 MS (t)1347 1520 MS (e)1362 1520 MS ( )1384 1520 MS +(l)1414 1520 MS (a)1426 1520 MS ( )1448 1520 MS (d)1477 1520 MS (o)1502 1520 MS (n)1528 1520 MS (n)1553 1520 MS (\351)1578 1520 MS (e)1600 1520 MS ( )1622 1520 MS (m)1652 1520 MS (a)1690 1520 MS (t)1712 1520 MS (r)1727 1520 MS (i)1744 1520 MS (c)1757 1520 MS +(e)1779 1520 MS ( )1801 1520 MS (p)1830 1520 MS (a)1855 1520 MS (r)1877 1520 MS (a)1894 1520 MS (l)1917 1520 MS (l)1931 1520 MS (\350)1944 1520 MS (l)1967 1520 MS (e)1980 1520 MS (.)2002 1520 MS ( )2015 1520 MS (E)2044 1520 MS (l)2076 1520 MS (l)2089 1520 MS +(e)2102 1520 MS ( )2125 1520 MS +(c)235 1577 MS (o)257 1577 MS (n)283 1577 MS (t)307 1577 MS (i)322 1577 MS (e)334 1577 MS (n)357 1577 MS (t)381 1577 MS ( )396 1577 MS (u)419 1577 MS (n)444 1577 MS ( )469 1577 MS (a)492 1577 MS (t)514 1577 MS (t)529 1577 MS (r)543 1577 MS +(i)560 1577 MS (b)573 1577 MS (u)597 1577 MS (t)622 1577 MS ( )637 1577 MS (d)660 1577 MS (e)685 1577 MS ( )707 1577 MS (t)730 1577 MS (y)746 1577 MS (p)769 1577 MS (e)794 1577 MS ( )816 1577 MS (s)840 1577 MS (t)859 1577 MS (r)874 1577 MS +(u)891 1577 MS (c)916 1577 MS (t)937 1577 MS (u)952 1577 MS (r)977 1577 MS (e)994 1577 MS ( )1016 1577 MS (C)1039 1577 MS (S)1072 1577 MS (R)1100 1577 MS ( )1133 1577 MS (d)1156 1577 MS (\351)1181 1577 MS (f)1204 1577 MS (i)1220 1577 MS (n)1234 1577 MS +(i)1259 1577 MS (e)1272 1577 MS ( )1294 1577 MS (d)1317 1577 MS (a)1343 1577 MS (n)1366 1577 MS (s)1390 1577 MS ( )1409 1577 MS (l)1433 1577 MS (e)1446 1577 MS ( )1469 1577 MS (f)1493 1577 MS (i)1509 1577 MS (c)1522 1577 MS (h)1545 1577 MS (i)1570 1577 MS +(e)1583 1577 MS (r)1605 1577 MS ( )1622 1577 MS (\253)1646 1577 MS +( )1670 1577 MS +(T)1683 1577 MS (y)1715 1577 MS (p)1738 1577 MS (e)1764 1577 MS (D)1786 1577 MS (a)1822 1577 MS (t)1844 1577 MS (a)1859 1577 MS (.)1881 1577 MS (i)1894 1577 MS (d)1906 1577 MS (l)1932 1577 MS +( )1945 1577 MS +(\273)1959 1577 MS (.)1983 1577 MS ( )1996 1577 MS (C)2019 1577 MS (e)2052 1577 MS (t)2074 1577 MS (t)2089 1577 MS (e)2104 1577 MS ( )2125 1577 MS +(s)235 1635 MS (t)254 1635 MS (r)269 1635 MS (u)286 1635 MS (c)311 1635 MS (t)332 1635 MS (u)347 1635 MS (r)372 1635 MS (e)389 1635 MS ( )411 1635 MS (r)440 1635 MS (e)457 1635 MS (p)479 1635 MS (r)504 1635 MS (\351)521 1635 MS (s)543 1635 MS +(e)562 1635 MS (n)584 1635 MS (t)608 1635 MS (e)623 1635 MS ( )645 1635 MS (l)675 1635 MS (e)687 1635 MS (s)710 1635 MS ( )729 1635 MS (d)758 1635 MS (o)783 1635 MS (n)809 1635 MS (n)834 1635 MS (\351)858 1635 MS (e)880 1635 MS (s)903 1635 MS +( )922 1635 MS (l)952 1635 MS (o)964 1635 MS (c)990 1635 MS (a)1013 1635 MS (l)1036 1635 MS (e)1049 1635 MS (s)1071 1635 MS ( )1091 1635 MS (\340)1120 1635 MS ( )1142 1635 MS (u)1171 1635 MS (n)1197 1635 MS ( )1222 1635 MS (p)1252 1635 MS (r)1277 1635 MS +(o)1294 1635 MS (c)1320 1635 MS (e)1342 1635 MS (s)1364 1635 MS (s)1383 1635 MS (e)1402 1635 MS (u)1424 1635 MS (r)1449 1635 MS (,)1466 1635 MS ( )1479 1635 MS (e)1508 1635 MS (t)1530 1635 MS ( )1545 1635 MS (c)1574 1635 MS (o)1595 1635 MS (n)1621 1635 MS +(s)1645 1635 MS (t)1664 1635 MS (i)1680 1635 MS (t)1692 1635 MS (u)1707 1635 MS (e)1732 1635 MS ( )1754 1635 MS (d)1783 1635 MS (o)1808 1635 MS (n)1834 1635 MS (c)1858 1635 MS ( )1880 1635 MS (u)1909 1635 MS (n)1935 1635 MS (e)1959 1635 MS ( )1981 1635 MS +(p)2010 1635 MS (a)2035 1635 MS (r)2057 1635 MS (t)2074 1635 MS (i)2090 1635 MS (e)2102 1635 MS ( )2125 1635 MS +(s)235 1692 MS (e)254 1692 MS (u)276 1692 MS (l)302 1692 MS (e)315 1692 MS (m)338 1692 MS (e)376 1692 MS (n)399 1692 MS (t)423 1692 MS ( )438 1692 MS (d)451 1692 MS (e)476 1692 MS ( )498 1692 MS (l)512 1692 MS (\222)524 1692 MS (o)540 1692 MS +(b)566 1692 MS (j)591 1692 MS (e)604 1692 MS (t)626 1692 MS ( )641 1692 MS (m)655 1692 MS (a)692 1692 MS (t)714 1692 MS (r)729 1692 MS (i)747 1692 MS (c)759 1692 MS (e)781 1692 MS ( )803 1692 MS (d)816 1692 MS (i)842 1692 MS (s)855 1692 MS +(t)874 1692 MS (r)889 1692 MS (i)907 1692 MS (b)920 1692 MS (u)944 1692 MS (\351)969 1692 MS (.)991 1692 MS ( )1004 1692 MS (C)1017 1692 MS (e)1050 1692 MS (t)1072 1692 MS (t)1087 1692 MS +(e)1102 1692 MS ( )1124 1692 MS (i)1137 1692 MS (n)1150 1692 MS (t)1174 1692 MS (e)1189 1692 MS (r)1211 1692 MS (f)1228 1692 MS (a)1244 1692 MS (c)1266 1692 MS (e)1288 1692 MS ( )1310 1692 MS (p)1323 1692 MS (o)1348 1692 MS (s)1374 1692 MS (s)1393 1692 MS +(\350)1412 1692 MS (d)1434 1692 MS (e)1459 1692 MS ( )1481 1692 MS (d)1494 1692 MS (e)1519 1692 MS ( )1541 1692 MS (p)1554 1692 MS (l)1580 1692 MS (u)1593 1692 MS (s)1618 1692 MS ( )1637 1692 MS (u)1650 1692 MS (n)1676 1692 MS (e)1700 1692 MS ( )1722 1692 MS +(f)1736 1692 MS (o)1751 1692 MS (n)1778 1692 MS (c)1802 1692 MS (t)1824 1692 MS (i)1840 1692 MS (o)1852 1692 MS (n)1878 1692 MS ( )1902 1692 MS (N)1915 1692 MS (b)1952 1692 MS (R)1976 1692 MS (o)2009 1692 MS (w)2035 1692 MS (s)2071 1692 MS (\()2090 1692 MS +(\))2107 1692 MS ( )2125 1692 MS +(q)235 1750 MS (u)260 1750 MS (i)286 1750 MS ( )298 1750 MS (r)322 1750 MS (e)339 1750 MS (n)362 1750 MS (v)387 1750 MS (o)411 1750 MS (i)437 1750 MS (e)450 1750 MS ( )472 1750 MS (l)497 1750 MS (e)510 1750 MS ( )532 1750 MS (n)556 1750 MS +(o)580 1750 MS (m)607 1750 MS (b)645 1750 MS (r)669 1750 MS (e)686 1750 MS ( )708 1750 MS (t)732 1750 MS (o)747 1750 MS (t)772 1750 MS (a)787 1750 MS (l)809 1750 MS ( )821 1750 MS (d)845 1750 MS (e)870 1750 MS ( )892 1750 MS (l)917 1750 MS +(i)930 1750 MS (g)943 1750 MS (n)969 1750 MS (e)994 1750 MS (s)1016 1750 MS ( )1035 1750 MS (d)1059 1750 MS (e)1084 1750 MS ( )1106 1750 MS (l)1131 1750 MS (a)1144 1750 MS ( )1166 1750 MS (m)1191 1750 MS (a)1229 1750 MS (t)1252 1750 MS (r)1267 1750 MS +(i)1284 1750 MS (c)1296 1750 MS (e)1318 1750 MS ( )1340 1750 MS (s)1364 1750 MS (u)1383 1750 MS (r)1408 1750 MS ( )1425 1750 MS (l)1450 1750 MS (\222)1463 1750 MS (e)1479 1750 MS (n)1502 1750 MS (s)1527 1750 MS (e)1546 1750 MS (m)1569 1750 MS (b)1607 1750 MS +(l)1633 1750 MS (e)1646 1750 MS ( )1668 1750 MS (d)1692 1750 MS (e)1717 1750 MS (s)1739 1750 MS ( )1758 1750 MS (p)1782 1750 MS (r)1807 1750 MS (o)1824 1750 MS (c)1850 1750 MS (e)1872 1750 MS (s)1894 1750 MS (s)1913 1750 MS (e)1932 1750 MS (u)1954 1750 MS +(r)1979 1750 MS (s)1996 1750 MS (,)2015 1750 MS ( )2028 1750 MS (u)2052 1750 MS (n)2078 1750 MS (e)2102 1750 MS ( )2125 1750 MS +(f)235 1807 MS (o)250 1807 MS (n)277 1807 MS (c)301 1807 MS (t)323 1807 MS (i)339 1807 MS (o)351 1807 MS (n)377 1807 MS ( )401 1807 MS (N)418 1807 MS (b)455 1807 MS (C)479 1807 MS (o)512 1807 MS (l)539 1807 MS (s)552 1807 MS (\()571 1807 MS +(\))588 1807 MS ( )605 1807 MS (q)622 1807 MS (u)647 1807 MS (i)673 1807 MS ( )685 1807 MS (r)702 1807 MS (e)719 1807 MS (n)742 1807 MS (v)767 1807 MS (o)791 1807 MS (i)818 1807 MS (e)830 1807 MS ( )852 1807 MS (l)870 1807 MS (e)883 1807 MS +( )905 1807 MS (n)923 1807 MS (o)947 1807 MS (m)974 1807 MS (b)1012 1807 MS (r)1036 1807 MS (e)1053 1807 MS ( )1075 1807 MS (t)1092 1807 MS (o)1107 1807 MS (t)1132 1807 MS (a)1147 1807 MS (l)1169 1807 MS ( )1181 1807 MS (d)1198 1807 MS (e)1224 1807 MS +( )1247 1807 MS (c)1264 1807 MS (o)1286 1807 MS (l)1312 1807 MS (o)1324 1807 MS (n)1350 1807 MS (n)1375 1807 MS (e)1399 1807 MS (s)1422 1807 MS ( )1441 1807 MS (d)1458 1807 MS (e)1483 1807 MS ( )1505 1807 MS (l)1523 1807 MS (a)1536 1807 MS ( )1559 1807 MS +(m)1577 1807 MS (a)1615 1807 MS (t)1637 1807 MS (r)1652 1807 MS (i)1669 1807 MS (c)1681 1807 MS (e)1704 1807 MS ( )1726 1807 MS (s)1743 1807 MS (u)1762 1807 MS (r)1787 1807 MS ( )1804 1807 MS (l)1822 1807 MS (\222)1835 1807 MS (e)1852 1807 MS (n)1875 1807 MS +(s)1899 1807 MS (e)1918 1807 MS (m)1941 1807 MS (b)1979 1807 MS (l)2005 1807 MS (e)2018 1807 MS ( )2041 1807 MS (d)2058 1807 MS (e)2083 1807 MS (s)2105 1807 MS ( )2125 1807 MS +(p)235 1865 MS (r)260 1865 MS (o)277 1865 MS (c)303 1865 MS (e)325 1865 MS (s)347 1865 MS (s)366 1865 MS (e)385 1865 MS (u)407 1865 MS (r)432 1865 MS (s)449 1865 MS ( )468 1865 MS (e)482 1865 MS (t)504 1865 MS ( )519 1865 MS (u)533 1865 MS +(n)558 1865 MS (e)582 1865 MS ( )604 1865 MS (f)619 1865 MS (o)634 1865 MS (n)660 1865 MS (c)685 1865 MS (t)707 1865 MS (i)722 1865 MS (o)734 1865 MS (n)760 1865 MS +( )784 1865 MS (L)799 1865 MS (M)829 1865 MS (a)874 1865 MS (t)896 1865 MS (\()911 1865 MS (s)928 1865 MS (t)947 1865 MS (a)962 1865 MS (r)983 1865 MS (t)999 1865 MS (,)1014 1865 MS (e)1027 1865 MS (n)1049 1865 MS (d)1073 1865 MS (\))1098 1865 MS +( )1115 1865 MS (q)1129 1865 MS (u)1154 1865 MS (i)1180 1865 MS ( )1192 1865 MS (r)1206 1865 MS (e)1223 1865 MS (n)1245 1865 MS (v)1270 1865 MS (o)1294 1865 MS (i)1321 1865 MS (e)1333 1865 MS ( )1355 1865 MS (l)1370 1865 MS (e)1383 1865 MS (s)1406 1865 MS +( )1425 1865 MS (i)1440 1865 MS (n)1453 1865 MS (d)1478 1865 MS (i)1504 1865 MS (c)1517 1865 MS (e)1539 1865 MS (s)1561 1865 MS ( )1580 1865 MS (d)1594 1865 MS (e)1620 1865 MS ( )1642 1865 MS (l)1657 1865 MS (i)1671 1865 MS (g)1684 1865 MS (n)1710 1865 MS +(e)1734 1865 MS ( )1756 1865 MS (d)1770 1865 MS (e)1795 1865 MS ( )1817 1865 MS (d)1831 1865 MS (\351)1856 1865 MS (b)1879 1865 MS (u)1903 1865 MS (t)1928 1865 MS ( )1943 1865 MS (e)1957 1865 MS (t)1979 1865 MS ( )1994 1865 MS (d)2008 1865 MS (e)2033 1865 MS +( )2055 1865 MS (f)2069 1865 MS (i)2085 1865 MS (n)2099 1865 MS ( )2125 1865 MS +(c)235 1922 MS (o)257 1922 MS (r)283 1922 MS (r)299 1922 MS (e)316 1922 MS (s)338 1922 MS (p)357 1922 MS (o)382 1922 MS (n)408 1922 MS (d)432 1922 MS (a)457 1922 MS (n)479 1922 MS (t)503 1922 MS ( )518 1922 MS (\340)545 1922 MS ( )567 1922 MS +(l)595 1922 MS (a)608 1922 MS ( )630 1922 MS (p)657 1922 MS (a)682 1922 MS (r)704 1922 MS (t)721 1922 MS (i)737 1922 MS (e)749 1922 MS ( )771 1922 MS (l)799 1922 MS (o)811 1922 MS (c)837 1922 MS (a)859 1922 MS (l)882 1922 MS (e)895 1922 MS +( )918 1922 MS (d)945 1922 MS (e)970 1922 MS ( )992 1922 MS (l)1020 1922 MS (a)1033 1922 MS ( )1056 1922 MS (m)1084 1922 MS (a)1122 1922 MS (t)1144 1922 MS (r)1159 1922 MS (i)1176 1922 MS (c)1188 1922 MS (e)1210 1922 MS ( )1233 1922 MS (s)1260 1922 MS +(u)1279 1922 MS (r)1304 1922 MS ( )1321 1922 MS (c)1348 1922 MS (h)1371 1922 MS (a)1395 1922 MS (q)1417 1922 MS (u)1442 1922 MS (e)1467 1922 MS ( )1489 1922 MS (p)1516 1922 MS (r)1541 1922 MS (o)1558 1922 MS (c)1584 1922 MS (e)1606 1922 MS (s)1628 1922 MS +(s)1647 1922 MS (e)1666 1922 MS (u)1688 1922 MS (r)1713 1922 MS ( )1730 1922 MS (\253)1758 1922 MS +( )1782 1922 MS +(s)1795 1922 MS (e)1814 1922 MS (r)1836 1922 MS (v)1854 1922 MS (e)1878 1922 MS (u)1900 1922 MS (r)1925 1922 MS +( )1942 1922 MS +(\273)1955 1922 MS ( )1980 1922 MS (p)2007 1922 MS (a)2032 1922 MS (r)2054 1922 MS (m)2072 1922 MS (i)2111 1922 MS ( )2125 1922 MS +(l)235 1980 MS (\222)248 1980 MS (e)265 1980 MS (n)288 1980 MS (s)312 1980 MS (e)331 1980 MS (m)354 1980 MS (b)392 1980 MS (l)418 1980 MS (e)431 1980 MS ( )453 1980 MS (d)471 1980 MS (e)496 1980 MS ( )518 1980 MS (l)537 1980 MS (a)550 1980 MS +( )572 1980 MS (m)591 1980 MS (a)628 1980 MS (t)650 1980 MS (r)665 1980 MS (i)683 1980 MS (c)695 1980 MS (e)717 1980 MS ( )739 1980 MS (\()757 1980 MS (o)774 1980 MS (n)800 1980 MS ( )824 1980 MS (s)842 1980 MS (u)861 1980 MS (p)886 1980 MS +(p)911 1980 MS (o)936 1980 MS (s)962 1980 MS (e)981 1980 MS ( )1003 1980 MS (d)1021 1980 MS (a)1046 1980 MS (n)1068 1980 MS (s)1092 1980 MS ( )1111 1980 MS (c)1129 1980 MS (e)1151 1980 MS (t)1173 1980 MS ( )1188 1980 MS (e)1206 1980 MS (x)1228 1980 MS +(e)1252 1980 MS (m)1275 1980 MS (p)1312 1980 MS (l)1338 1980 MS (e)1351 1980 MS ( )1373 1980 MS (q)1391 1980 MS (u)1416 1980 MS (e)1441 1980 MS ( )1463 1980 MS (l)1482 1980 MS (a)1494 1980 MS ( )1516 1980 MS (m)1535 1980 MS (a)1573 1980 MS (t)1595 1980 MS +(r)1610 1980 MS (i)1627 1980 MS (c)1640 1980 MS (e)1662 1980 MS ( )1684 1980 MS (e)1702 1980 MS (s)1724 1980 MS (t)1743 1980 MS ( )1758 1980 MS (d)1776 1980 MS (i)1801 1980 MS (s)1814 1980 MS (t)1833 1980 MS (r)1848 1980 MS (i)1865 1980 MS (b)1878 1980 MS +(u)1902 1980 MS (\351)1927 1980 MS (e)1950 1980 MS ( )1972 1980 MS (s)1990 1980 MS (u)2009 1980 MS (r)2034 1980 MS ( )2051 1980 MS (l)2070 1980 MS (e)2082 1980 MS (s)2105 1980 MS ( )2125 1980 MS +(d)235 2037 MS (i)261 2037 MS (f)274 2037 MS (f)290 2037 MS (\351)306 2037 MS (r)328 2037 MS (e)345 2037 MS (n)368 2037 MS +(t)392 2037 MS (s)407 2037 MS ( )426 2037 MS (p)471 2037 MS (r)496 2037 MS (o)513 2037 MS (c)539 2037 MS (e)561 2037 MS (s)583 2037 MS (s)602 2037 MS (e)621 2037 MS (u)643 2037 MS (r)668 2037 MS (s)685 2037 MS ( )704 2037 MS (s)749 2037 MS +(u)768 2037 MS (i)794 2037 MS (v)807 2037 MS (a)832 2037 MS (n)855 2037 MS (t)879 2037 MS ( )894 2037 MS (d)939 2037 MS (e)964 2037 MS (s)986 2037 MS ( )1005 2037 MS (b)1050 2037 MS (l)1075 2037 MS (o)1087 2037 MS (c)1113 2037 MS (s)1135 2037 MS +( )1154 2037 MS (d)1199 2037 MS (e)1224 2037 MS ( )1247 2037 MS (l)1293 2037 MS (i)1306 2037 MS (g)1319 2037 MS (n)1345 2037 MS (e)1369 2037 MS (s)1391 2037 MS ( )1410 2037 MS (e)1455 2037 MS (n)1478 2037 MS (t)1502 2037 MS (i)1518 2037 MS (\350)1530 2037 MS +(r)1552 2037 MS (e)1569 2037 MS (s)1591 2037 MS (\))1610 2037 MS (.)1627 2037 MS ( )1640 2037 MS (E)1685 2037 MS (n)1716 2037 MS (f)1741 2037 MS (i)1757 2037 MS (n)1770 2037 MS ( )1795 2037 MS (u)1840 2037 MS (n)1866 2037 MS (e)1890 2037 MS ( )1912 2037 MS +(f)1958 2037 MS (o)1973 2037 MS (n)2000 2037 MS (c)2024 2037 MS (t)2046 2037 MS (i)2062 2037 MS (o)2074 2037 MS (n)2100 2037 MS ( )2125 2037 MS +(n)235 2095 MS (c)259 2095 MS (s)282 2095 MS (r)301 2095 MS (m)319 2095 MS (a)356 2095 MS (t)378 2095 MS (\()393 2095 MS (s)410 2095 MS (t)429 2095 MS (a)444 2095 MS (r)466 2095 MS (t)482 2095 MS (,)496 2095 MS (e)509 2095 MS (n)531 2095 MS +(d)555 2095 MS (\))580 2095 MS ( )597 2095 MS (p)619 2095 MS (e)644 2095 MS (r)666 2095 MS (m)684 2095 MS (e)721 2095 MS (t)743 2095 MS ( )758 2095 MS (\340)780 2095 MS ( )802 2095 MS (u)824 2095 MS (n)850 2095 MS ( )874 2095 MS (p)896 2095 MS +(r)921 2095 MS (o)938 2095 MS (c)964 2095 MS (e)986 2095 MS (s)1008 2095 MS (s)1027 2095 MS (u)1046 2095 MS (s)1072 2095 MS ( )1091 2095 MS (\253)1114 2095 MS +( )1138 2095 MS +(c)1151 2095 MS (l)1174 2095 MS (i)1187 2095 MS (e)1200 2095 MS (n)1223 2095 MS (t)1249 2095 MS +( )1263 2095 MS +(\273)1276 2095 MS ( )1300 2095 MS (d)1322 2095 MS (e)1347 2095 MS ( )1369 2095 MS (r)1391 2095 MS (\351)1408 2095 MS (c)1430 2095 MS (u)1452 2095 MS (p)1477 2095 MS (\351)1502 2095 MS (r)1524 2095 MS (e)1541 2095 MS (r)1563 2095 MS ( )1580 2095 MS (u)1602 2095 MS +(n)1628 2095 MS (e)1652 2095 MS ( )1674 2095 MS (p)1696 2095 MS (a)1722 2095 MS (r)1744 2095 MS (t)1761 2095 MS (i)1776 2095 MS (e)1788 2095 MS ( )1811 2095 MS (s)1833 2095 MS (e)1852 2095 MS (u)1874 2095 MS (l)1900 2095 MS (e)1913 2095 MS (m)1936 2095 MS +(e)1974 2095 MS (n)1997 2095 MS (t)2021 2095 MS ( )2036 2095 MS (d)2058 2095 MS (e)2083 2095 MS (s)2105 2095 MS ( )2125 2095 MS +(d)235 2152 MS (o)260 2152 MS (n)286 2152 MS (n)310 2152 MS (\351)334 2152 MS (e)356 2152 MS (s)379 2152 MS ( )398 2152 MS (l)421 2152 MS (o)433 2152 MS (c)459 2152 MS (a)481 2152 MS (l)504 2152 MS (e)517 2152 MS (s)539 2152 MS ( )558 2152 MS +(a)580 2152 MS (u)602 2152 MS ( )627 2152 MS (p)649 2152 MS (r)674 2152 MS (o)691 2152 MS (c)717 2152 MS (e)739 2152 MS (s)761 2152 MS (s)780 2152 MS (e)799 2152 MS (u)821 2152 MS (r)846 2152 MS ( )863 2152 MS (\253)885 2152 MS +( )909 2152 MS +(s)922 2152 MS (e)941 2152 MS (r)963 2152 MS (v)981 2152 MS (e)1005 2152 MS (u)1027 2152 MS (r)1052 2152 MS +( )1069 2152 MS +(\273)1082 2152 MS (.)1106 2152 MS ( )1119 2152 MS (C)1141 2152 MS (e)1174 2152 MS (t)1196 2152 MS (t)1211 2152 MS (e)1226 2152 MS ( )1247 2152 MS (d)1269 2152 MS (e)1294 2152 MS (r)1316 2152 MS (n)1333 2152 MS (i)1358 2152 MS (\350)1371 2152 MS (r)1393 2152 MS +(e)1410 2152 MS ( )1432 2152 MS (f)1455 2152 MS (o)1470 2152 MS (n)1496 2152 MS (c)1520 2152 MS (t)1542 2152 MS (i)1558 2152 MS (o)1570 2152 MS (n)1596 2152 MS ( )1620 2152 MS (e)1642 2152 MS (s)1664 2152 MS (t)1683 2152 MS ( )1698 2152 MS (i)1720 2152 MS +(m)1733 2152 MS (p)1771 2152 MS (o)1796 2152 MS (r)1822 2152 MS (t)1839 2152 MS (a)1854 2152 MS (n)1876 2152 MS (t)1900 2152 MS (e)1915 2152 MS (,)1936 2152 MS ( )1949 2152 MS (c)1971 2152 MS (a)1993 2152 MS (r)2015 2152 MS ( )2032 2152 MS (e)2054 2152 MS +(l)2076 2152 MS (l)2089 2152 MS (e)2102 2152 MS ( )2125 2152 MS +(p)235 2210 MS +(e)260 2210 MS (r)282 2210 MS (m)300 2210 MS (e)337 2210 MS (t)359 2210 MS ( )374 2210 MS (\340)389 2210 MS ( )411 2210 MS (c)426 2210 MS (h)449 2210 MS (a)473 2210 MS (q)495 2210 MS (u)520 2210 MS (e)545 2210 MS ( )567 2210 MS (p)582 2210 MS +(r)607 2210 MS (o)624 2210 MS (c)650 2210 MS (e)672 2210 MS (s)694 2210 MS (s)713 2210 MS (u)732 2210 MS (s)758 2210 MS ( )777 2210 MS (d)792 2210 MS (\222)818 2210 MS (u)834 2210 MS (n)860 2210 MS ( )884 2210 MS (\253)900 2210 MS +( )924 2210 MS +(c)937 2210 MS (l)960 2210 MS (i)974 2210 MS (e)987 2210 MS (n)1010 2210 MS (t)1034 2210 MS +( )1049 2210 MS +(\273)1062 2210 MS ( )1086 2210 MS (p)1101 2210 MS (a)1126 2210 MS (r)1148 2210 MS (a)1165 2210 MS (l)1188 2210 MS (l)1201 2210 MS (\350)1214 2210 MS (l)1237 2210 MS (e)1251 2210 MS (,)1273 2210 MS ( )1286 2210 MS (d)1301 2210 MS (e)1326 2210 MS ( )1348 2210 MS +(r)1363 2210 MS (\351)1380 2210 MS (c)1402 2210 MS (u)1424 2210 MS (p)1449 2210 MS (\351)1474 2210 MS (r)1496 2210 MS (e)1513 2210 MS (r)1535 2210 MS ( )1552 2210 MS (s)1567 2210 MS (u)1586 2210 MS (r)1611 2210 MS ( )1628 2210 MS (l)1644 2210 MS (e)1657 2210 MS +(s)1679 2210 MS ( )1699 2210 MS (p)1714 2210 MS (r)1739 2210 MS (o)1756 2210 MS (c)1782 2210 MS (e)1804 2210 MS (s)1826 2210 MS (s)1845 2210 MS (u)1864 2210 MS (s)1889 2210 MS ( )1908 2210 MS (c)1924 2210 MS (o)1946 2210 MS (n)1972 2210 MS (c)1996 2210 MS +(e)2018 2210 MS (r)2040 2210 MS (n)2058 2210 MS (\351)2082 2210 MS (s)2105 2210 MS ( )2125 2210 MS +(d)235 2267 MS (u)260 2267 MS ( )285 2267 MS (\253)299 2267 MS +( )323 2267 MS +(s)336 2267 MS (e)355 2267 MS (r)377 2267 MS (v)395 2267 MS (e)419 2267 MS (u)441 2267 MS (r)466 2267 MS +( )483 2267 MS +(\273)496 2267 MS ( )520 2267 MS (p)534 2267 MS (a)559 2267 MS (r)581 2267 MS (a)598 2267 MS (l)621 2267 MS (l)635 2267 MS (\350)648 2267 MS (l)671 2267 MS (e)684 2267 MS (,)706 2267 MS ( )719 2267 MS (u)733 2267 MS (n)759 2267 MS (i)784 2267 MS +(q)797 2267 MS (u)822 2267 MS (e)847 2267 MS (m)870 2267 MS (e)908 2267 MS (n)931 2267 MS (t)955 2267 MS ( )970 2267 MS (s)984 2267 MS (e)1003 2267 MS (s)1025 2267 MS ( )1044 2267 MS (p)1058 2267 MS (r)1083 2267 MS (o)1100 2267 MS (p)1126 2267 MS +(r)1151 2267 MS (e)1168 2267 MS (s)1190 2267 MS ( )1209 2267 MS (d)1223 2267 MS (o)1248 2267 MS (n)1274 2267 MS (n)1298 2267 MS (\351)1322 2267 MS (e)1344 2267 MS (s)1367 2267 MS ( )1386 2267 MS (l)1401 2267 MS (o)1413 2267 MS (c)1439 2267 MS (a)1461 2267 MS +(l)1484 2267 MS (e)1497 2267 MS (s)1520 2267 MS (.)1539 2267 MS ( )1552 2267 MS (L)1566 2267 MS (e)1596 2267 MS (s)1618 2267 MS ( )1637 2267 MS (t)1651 2267 MS (r)1666 2267 MS (a)1683 2267 MS (n)1705 2267 MS (s)1730 2267 MS (f)1750 2267 MS (e)1765 2267 MS +(r)1787 2267 MS (t)1804 2267 MS (s)1819 2267 MS ( )1838 2267 MS (d)1852 2267 MS (\222)1877 2267 MS (u)1893 2267 MS (n)1919 2267 MS (e)1943 2267 MS ( )1965 2267 MS (d)1979 2267 MS (o)2004 2267 MS (n)2030 2267 MS (n)2055 2267 MS (\351)2080 2267 MS (e)2102 2267 MS +( )2125 2267 MS +(p)235 2325 MS (a)260 2325 MS (r)282 2325 MS (a)299 2325 MS (l)322 2325 MS (l)335 2325 MS (\350)348 2325 MS (l)371 2325 MS (e)384 2325 MS ( )406 2325 MS (e)428 2325 MS (s)451 2325 MS (t)470 2325 MS ( )485 2325 MS (d)507 2325 MS (o)532 2325 MS +(n)558 2325 MS (c)582 2325 MS ( )604 2325 MS (o)626 2325 MS (p)652 2325 MS (t)676 2325 MS (i)691 2325 MS (m)704 2325 MS (i)742 2325 MS (s)755 2325 MS (\351)775 2325 MS (e)797 2325 MS ( )819 2325 MS (s)842 2325 MS (u)861 2325 MS (r)886 2325 MS +( )903 2325 MS (l)926 2325 MS (e)939 2325 MS ( )961 2325 MS (r)983 2325 MS (\351)1000 2325 MS (s)1022 2325 MS (e)1041 2325 MS (a)1063 2325 MS (u)1085 2325 MS +( )1110 2325 MS +(:)1123 2325 MS ( )1137 2325 MS (c)1159 2325 MS (h)1182 2325 MS (a)1206 2325 MS (q)1228 2325 MS (u)1254 2325 MS (e)1279 2325 MS ( )1301 2325 MS (c)1323 2325 MS (o)1345 2325 MS (m)1371 2325 MS (p)1408 2325 MS (o)1433 2325 MS (s)1459 2325 MS (a)1478 2325 MS +(n)1501 2325 MS (t)1525 2325 MS (e)1540 2325 MS ( )1562 2325 MS (d)1584 2325 MS (e)1609 2325 MS ( )1631 2325 MS (l)1654 2325 MS (a)1666 2325 MS ( )1688 2325 MS +(m)1711 2325 MS (a)1749 2325 MS (t)1771 2325 MS (r)1786 2325 MS (i)1804 2325 MS (c)1816 2325 MS (e)1838 2325 MS ( )1860 2325 MS (p)1882 2325 MS (a)1908 2325 MS (r)1930 2325 MS (a)1947 2325 MS (l)1970 2325 MS (l)1983 2325 MS (\350)1996 2325 MS (l)2019 2325 MS +(e)2032 2325 MS ( )2054 2325 MS (n)2077 2325 MS (e)2102 2325 MS ( )2125 2325 MS +(t)235 2382 MS (r)250 2382 MS (a)267 2382 MS (n)289 2382 MS (s)313 2382 MS (i)333 2382 MS (t)345 2382 MS (e)360 2382 MS ( )382 2382 MS (q)401 2382 MS (u)426 2382 MS (\222)451 2382 MS (u)467 2382 MS (n)493 2382 MS (e)517 2382 MS ( )540 2382 MS +(s)559 2382 MS (e)578 2382 MS (u)600 2382 MS (l)626 2382 MS (e)639 2382 MS ( )662 2382 MS (f)682 2382 MS (o)697 2382 MS (i)724 2382 MS (s)737 2382 MS ( )756 2382 MS (s)776 2382 MS (u)795 2382 MS (r)820 2382 MS ( )837 2382 MS (l)857 2382 MS +(e)870 2382 MS ( )892 2382 MS (r)911 2382 MS (\351)928 2382 MS (s)950 2382 MS (e)970 2382 MS (a)992 2382 MS (u)1014 2382 MS ( )1039 2382 MS (e)1058 2382 MS (t)1080 2382 MS ( )1095 2382 MS (a)1114 2382 MS (r)1136 2382 MS (r)1153 2382 MS (i)1171 2382 MS +(v)1184 2382 MS (e)1208 2382 MS ( )1230 2382 MS (d)1250 2382 MS (i)1276 2382 MS (r)1288 2382 MS (e)1305 2382 MS (c)1327 2382 MS (t)1349 2382 MS (e)1364 2382 MS (m)1387 2382 MS (e)1424 2382 MS (n)1447 2382 MS (t)1471 2382 MS ( )1486 2382 MS (s)1505 2382 MS +(u)1524 2382 MS (r)1549 2382 MS ( )1566 2382 MS (l)1586 2382 MS (e)1599 2382 MS ( )1621 2382 MS (p)1640 2382 MS (r)1665 2382 MS (o)1682 2382 MS (c)1708 2382 MS (e)1730 2382 MS (s)1752 2382 MS (s)1771 2382 MS (u)1790 2382 MS (s)1816 2382 MS ( )1835 2382 MS +(\253)1855 2382 MS +( )1879 2382 MS +(c)1892 2382 MS (l)1915 2382 MS (i)1928 2382 MS (e)1941 2382 MS (n)1964 2382 MS (t)1988 2382 MS +( )2003 2382 MS +(\273)2016 2382 MS ( )2040 2382 MS (q)2059 2382 MS (u)2084 2382 MS (i)2111 2382 MS ( )2125 2382 MS +(l)235 2440 MS (\222)248 2440 MS (h)265 2440 MS (\351)290 2440 MS (b)313 2440 MS (e)337 2440 MS (r)359 2440 MS (g)376 2440 MS (e)401 2440 MS ( )423 2440 MS (e)442 2440 MS (n)465 2440 MS ( )490 2440 MS (l)510 2440 MS (o)522 2440 MS (c)548 2440 MS +(a)570 2440 MS (l)593 2440 MS (.)606 2440 MS ( )619 2440 MS (I)638 2440 MS (l)656 2440 MS ( )669 2440 MS (n)689 2440 MS (\222)714 2440 MS (y)731 2440 MS ( )755 2440 MS (a)774 2440 MS ( )797 2440 MS (p)816 2440 MS (a)841 2440 MS (s)863 2440 MS +( )883 2440 MS (d)902 2440 MS (e)927 2440 MS ( )950 2440 MS (g)969 2440 MS (o)994 2440 MS (u)1020 2440 MS (l)1045 2440 MS (o)1057 2440 MS (t)1083 2440 MS ( )1098 2440 MS (d)1117 2440 MS (\222)1142 2440 MS (\351)1158 2440 MS (t)1180 2440 MS (r)1195 2440 MS +(a)1212 2440 MS (n)1234 2440 MS (g)1258 2440 MS (l)1284 2440 MS (e)1296 2440 MS (m)1319 2440 MS (e)1357 2440 MS (n)1380 2440 MS (t)1404 2440 MS ( )1419 2440 MS (l)1439 2440 MS (o)1451 2440 MS (g)1477 2440 MS (i)1503 2440 MS (c)1515 2440 MS (i)1538 2440 MS +(e)1551 2440 MS (l)1574 2440 MS ( )1587 2440 MS (c)1607 2440 MS (a)1629 2440 MS (r)1651 2440 MS ( )1668 2440 MS (l)1688 2440 MS (e)1701 2440 MS ( )1724 2440 MS (t)1743 2440 MS (r)1758 2440 MS (a)1775 2440 MS (n)1797 2440 MS (s)1821 2440 MS (f)1841 2440 MS +(e)1857 2440 MS (r)1879 2440 MS (t)1896 2440 MS ( )1911 2440 MS (s)1930 2440 MS (e)1949 2440 MS ( )1971 2440 MS (f)1991 2440 MS (a)2007 2440 MS (i)2030 2440 MS (t)2042 2440 MS ( )2057 2440 MS (e)2076 2440 MS (n)2100 2440 MS ( )2125 2440 MS +(p)235 2497 MS (a)260 2497 MS (r)282 2497 MS (a)299 2497 MS (l)322 2497 MS (l)335 2497 MS (\350)348 2497 MS (l)371 2497 MS (e)384 2497 MS ( )406 2497 MS (s)433 2497 MS (u)452 2497 MS (r)477 2497 MS ( )494 2497 MS (c)521 2497 MS (h)544 2497 MS +(a)568 2497 MS (c)590 2497 MS (u)612 2497 MS (n)638 2497 MS ( )662 2497 MS (d)689 2497 MS (e)715 2497 MS (s)737 2497 MS ( )756 2497 MS (c)783 2497 MS (o)805 2497 MS (u)831 2497 MS (p)856 2497 MS (l)882 2497 MS (e)894 2497 MS (s)917 2497 MS +( )936 2497 MS (p)963 2497 MS (r)988 2497 MS (o)1005 2497 MS (c)1031 2497 MS (e)1053 2497 MS (s)1075 2497 MS (s)1094 2497 MS (u)1113 2497 MS (s)1138 2497 MS ( )1157 2497 MS (\253)1185 2497 MS +( )1209 2497 MS +(c)1222 2497 MS (l)1245 2497 MS (i)1258 2497 MS (e)1271 2497 MS (n)1294 2497 MS (t)1318 2497 MS (/)1333 2497 MS (s)1347 2497 MS (e)1366 2497 MS (r)1388 2497 MS (v)1405 2497 MS (e)1429 2497 MS (u)1451 2497 MS (r)1476 2497 MS +( )1493 2497 MS +(\273)1506 2497 MS ( )1530 2497 MS (c)1558 2497 MS (o)1580 2497 MS (n)1606 2497 MS (c)1630 2497 MS (e)1652 2497 MS (r)1674 2497 MS (n)1692 2497 MS (\351)1716 2497 MS (s)1738 2497 MS (,)1757 2497 MS ( )1770 2497 MS (e)1797 2497 MS (t)1819 2497 MS ( )1834 2497 MS +(i)1861 2497 MS (l)1874 2497 MS ( )1887 2497 MS (n)1915 2497 MS (\222)1940 2497 MS (y)1957 2497 MS ( )1981 2497 MS (a)2008 2497 MS ( )2030 2497 MS (p)2057 2497 MS (a)2082 2497 MS (s)2105 2497 MS ( )2125 2497 MS +(r)235 2555 MS (e)252 2555 MS (d)274 2555 MS (i)300 2555 MS (s)312 2555 MS (t)331 2555 MS (r)346 2555 MS (i)364 2555 MS (b)377 2555 MS (u)401 2555 MS (t)426 2555 MS (i)441 2555 MS (o)453 2555 MS (n)479 2555 MS ( )504 2555 MS (d)518 2555 MS +(e)543 2555 MS (s)565 2555 MS ( )585 2555 MS (d)599 2555 MS (o)624 2555 MS (n)650 2555 MS (n)675 2555 MS (\351)699 2555 MS (e)721 2555 MS (s)744 2555 MS (,)763 2555 MS ( )776 2555 MS (u)790 2555 MS (n)816 2555 MS (e)840 2555 MS ( )862 2555 MS +(f)877 2555 MS (o)892 2555 MS (i)919 2555 MS (s)932 2555 MS ( )952 2555 MS (q)966 2555 MS (u)991 2555 MS (e)1016 2555 MS ( )1038 2555 MS (c)1052 2555 MS (e)1075 2555 MS (l)1098 2555 MS (l)1111 2555 MS (e)1124 2555 MS (s)1147 2555 MS +(-)1166 2555 MS +(c)1183 2555 MS (i)1206 2555 MS ( )1219 2555 MS (s)1234 2555 MS (o)1254 2555 MS (n)1280 2555 MS (t)1304 2555 MS ( )1319 2555 MS (a)1333 2555 MS (r)1355 2555 MS (r)1372 2555 MS (i)1389 2555 MS (v)1402 2555 MS (\351)1426 2555 MS (e)1448 2555 MS (s)1471 2555 MS +( )1490 2555 MS (s)1504 2555 MS (u)1523 2555 MS (r)1548 2555 MS ( )1565 2555 MS (l)1580 2555 MS (e)1593 2555 MS (s)1616 2555 MS ( )1635 2555 MS (p)1649 2555 MS (r)1674 2555 MS (o)1691 2555 MS (c)1717 2555 MS (e)1739 2555 MS (s)1761 2555 MS (s)1780 2555 MS +(u)1799 2555 MS (s)1825 2555 MS ( )1844 2555 MS (\253)1859 2555 MS +( )1883 2555 MS +(c)1896 2555 MS (l)1919 2555 MS (i)1933 2555 MS (e)1946 2555 MS (n)1969 2555 MS (t)1993 2555 MS +( )2008 2555 MS +(\273)2021 2555 MS (.)2045 2555 MS ( )2058 2555 MS (L)2072 2555 MS (e)2102 2555 MS ( )2125 2555 MS +(s)235 2612 MS (e)254 2612 MS (u)276 2612 MS (l)302 2612 MS ( )314 2612 MS (g)327 2612 MS (o)352 2612 MS (u)378 2612 MS (l)404 2612 MS (o)416 2612 MS (t)442 2612 MS ( )456 2612 MS (d)469 2612 MS (\222)494 2612 MS (\351)510 2612 MS (t)532 2612 MS +(r)547 2612 MS (a)564 2612 MS (n)586 2612 MS (g)610 2612 MS (l)636 2612 MS (e)648 2612 MS (m)671 2612 MS (e)709 2612 MS (n)732 2612 MS (t)756 2612 MS ( )771 2612 MS (e)784 2612 MS (s)806 2612 MS (t)825 2612 MS ( )839 2612 MS (l)852 2612 MS +(e)864 2612 MS ( )886 2612 MS (d)899 2612 MS (\351)924 2612 MS (b)947 2612 MS (i)972 2612 MS (t)984 2612 MS ( )999 2612 MS (d)1012 2612 MS (u)1037 2612 MS ( )1062 2612 MS (r)1075 2612 MS (\351)1092 2612 MS (s)1114 2612 MS (e)1133 2612 MS (a)1155 2612 MS +(u)1177 2612 MS ( )1202 2612 MS (u)1215 2612 MS (t)1240 2612 MS (i)1254 2612 MS (l)1268 2612 MS (i)1282 2612 MS (s)1295 2612 MS (\351)1314 2612 MS (.)1336 2612 MS +( )1349 2612 MS +(L)235 2670 MS (a)265 2670 MS ( )287 2670 MS (s)302 2670 MS (e)321 2670 MS (c)344 2670 MS (o)366 2670 MS (n)392 2670 MS (d)416 2670 MS (e)441 2670 MS ( )463 2670 MS (i)479 2670 MS (n)492 2670 MS (t)516 2670 MS (e)531 2670 MS (r)553 2670 MS +(f)571 2670 MS (a)586 2670 MS (c)608 2670 MS (e)631 2670 MS ( )653 2670 MS (n)668 2670 MS (o)692 2670 MS (m)719 2670 MS (m)757 2670 MS (\351)795 2670 MS (e)818 2670 MS ( )840 2670 MS (N)855 2670 MS (P)891 2670 MS (M)919 2670 MS (a)963 2670 MS +(t)985 2670 MS (C)1000 2670 MS (o)1033 2670 MS (m)1059 2670 MS (p)1096 2670 MS (o)1121 2670 MS (n)1147 2670 MS (e)1171 2670 MS (n)1194 2670 MS (t)1218 2670 MS ( )1233 2670 MS (r)1248 2670 MS (e)1265 2670 MS (p)1287 2670 MS (r)1312 2670 MS (\351)1329 2670 MS +(s)1351 2670 MS (e)1370 2670 MS (n)1392 2670 MS (t)1416 2670 MS (e)1431 2670 MS ( )1453 2670 MS (l)1469 2670 MS +(e)1481 2670 MS ( )1503 2670 MS (c)1519 2670 MS (o)1541 2670 MS (d)1567 2670 MS (e)1592 2670 MS ( )1614 2670 MS (d)1629 2670 MS (e)1654 2670 MS ( )1676 2670 MS (c)1691 2670 MS (a)1713 2670 MS (l)1736 2670 MS (c)1748 2670 MS (u)1770 2670 MS (l)1796 2670 MS +( )1809 2670 MS (q)1824 2670 MS (u)1849 2670 MS (i)1875 2670 MS ( )1888 2670 MS (g)1903 2670 MS (\351)1928 2670 MS (n)1951 2670 MS (\350)1975 2670 MS (r)1997 2670 MS (e)2014 2670 MS ( )2036 2670 MS (u)2051 2670 MS (n)2077 2670 MS (e)2102 2670 MS ( )2125 2670 MS +(d)235 2727 MS (o)260 2727 MS (n)286 2727 MS (n)310 2727 MS (\351)334 2727 MS (e)356 2727 MS ( )378 2727 MS (d)400 2727 MS (e)425 2727 MS ( )447 2727 MS (t)469 2727 MS (y)485 2727 MS (p)508 2727 MS (e)533 2727 MS ( )555 2727 MS (m)578 2727 MS +(a)615 2727 MS (t)637 2727 MS (r)652 2727 MS (i)670 2727 MS (c)682 2727 MS (e)704 2727 MS ( )726 2727 MS (p)748 2727 MS (a)773 2727 MS (r)795 2727 MS (a)812 2727 MS (l)835 2727 MS (l)848 2727 MS (\350)861 2727 MS (l)885 2727 MS (e)898 2727 MS +(.)920 2727 MS ( )933 2727 MS (E)955 2727 MS (l)986 2727 MS (l)999 2727 MS (e)1012 2727 MS ( )1034 2727 MS (p)1056 2727 MS (o)1081 2727 MS (s)1107 2727 MS (s)1126 2727 MS (\350)1145 2727 MS (d)1167 2727 MS (e)1192 2727 MS ( )1214 2727 MS (u)1237 2727 MS +(n)1262 2727 MS ( )1286 2727 MS (a)1308 2727 MS (t)1330 2727 MS (t)1345 2727 MS (r)1359 2727 MS (i)1376 2727 MS (b)1389 2727 MS (u)1413 2727 MS (t)1438 2727 MS ( )1453 2727 MS (d)1475 2727 MS (e)1500 2727 MS ( )1522 2727 MS (t)1543 2727 MS (y)1558 2727 MS +(p)1581 2727 MS (e)1606 2727 MS ( )1628 2727 MS (P)1650 2727 MS (M)1678 2727 MS (a)1722 2727 MS (t)1744 2727 MS +( )1759 2727 MS +(:)1772 2727 MS ( )1786 2727 MS (c)1808 2727 MS (\222)1830 2727 MS (e)1846 2727 MS (s)1868 2727 MS (t)1887 2727 MS ( )1902 2727 MS (l)1924 2727 MS (a)1936 2727 MS ( )1958 2727 MS (d)1980 2727 MS (o)2005 2727 MS (n)2031 2727 MS (n)2056 2727 MS (\351)2080 2727 MS +(e)2102 2727 MS ( )2125 2727 MS +(p)235 2785 MS (a)260 2785 MS (r)282 2785 MS (a)299 2785 MS (l)322 2785 MS (l)335 2785 MS (\350)348 2785 MS (l)371 2785 MS (e)384 2785 MS ( )406 2785 MS (\351)420 2785 MS (c)442 2785 MS (h)465 2785 MS (a)490 2785 MS (n)513 2785 MS (g)537 2785 MS +(\351)562 2785 MS (e)584 2785 MS ( )606 2785 MS ( )620 2785 MS (a)634 2785 MS (v)657 2785 MS (e)681 2785 MS (c)703 2785 MS ( )725 2785 MS (l)740 2785 MS (e)753 2785 MS (s)776 2785 MS ( )795 2785 MS (a)809 2785 MS (u)831 2785 MS (t)856 2785 MS +(r)871 2785 MS (e)888 2785 MS (s)910 2785 MS ( )929 2785 MS (c)943 2785 MS (o)965 2785 MS (m)991 2785 MS (p)1028 2785 MS (o)1053 2785 MS (s)1079 2785 MS (a)1098 2785 MS (n)1121 2785 MS (t)1145 2785 MS (s)1160 2785 MS (,)1179 2785 MS ( )1192 2785 MS +(u)1206 2785 MS (n)1231 2785 MS ( )1256 2785 MS (s)1270 2785 MS (e)1289 2785 MS (r)1311 2785 MS (v)1328 2785 MS (i)1353 2785 MS (c)1366 2785 MS (e)1388 2785 MS ( )1410 2785 MS (S)1424 2785 MS (e)1452 2785 MS (t)1474 2785 MS (F)1489 2785 MS (i)1517 2785 MS +(l)1531 2785 MS (e)1544 2785 MS (N)1566 2785 MS (a)1602 2785 MS (m)1625 2785 MS (e)1663 2785 MS (\()1685 2785 MS (f)1703 2785 MS (i)1720 2785 MS (l)1734 2785 MS (e)1747 2785 MS (n)1770 2785 MS (a)1794 2785 MS (m)1817 2785 MS (e)1855 2785 MS (\))1877 2785 MS +( )1894 2785 MS (q)1908 2785 MS (u)1933 2785 MS (i)1959 2785 MS ( )1971 2785 MS (p)1985 2785 MS (e)2011 2785 MS (r)2033 2785 MS (m)2051 2785 MS (e)2088 2785 MS (t)2110 2785 MS ( )2125 2785 MS +(d)235 2842 MS (e)260 2842 MS ( )282 2842 MS (s)296 2842 MS (p)315 2842 MS (\351)340 2842 MS (c)362 2842 MS (i)385 2842 MS (f)399 2842 MS (i)416 2842 MS (e)429 2842 MS (r)451 2842 MS ( )468 2842 MS (o)482 2842 MS (\371)508 2842 MS ( )533 2842 MS +(s)547 2842 MS (e)566 2842 MS ( )588 2842 MS (t)602 2842 MS (r)617 2842 MS (o)634 2842 MS (u)660 2842 MS (v)685 2842 MS (e)709 2842 MS ( )731 2842 MS (l)746 2842 MS (a)758 2842 MS ( )781 2842 MS (d)795 2842 MS (o)820 2842 MS (n)846 2842 MS +(n)871 2842 MS (\351)895 2842 MS (e)917 2842 MS ( )939 2842 MS (p)953 2842 MS (e)979 2842 MS (r)1001 2842 MS (s)1018 2842 MS (i)1038 2842 MS (s)1051 2842 MS +(t)1070 2842 MS (a)1085 2842 MS (n)1107 2842 MS (t)1131 2842 MS (e)1146 2842 MS (,)1168 2842 MS ( )1181 2842 MS (u)1195 2842 MS (n)1220 2842 MS ( )1245 2842 MS (s)1259 2842 MS (e)1278 2842 MS (r)1300 2842 MS (v)1318 2842 MS (i)1343 2842 MS (c)1356 2842 MS +(e)1378 2842 MS ( )1400 2842 MS (R)1415 2842 MS (e)1448 2842 MS (a)1470 2842 MS (d)1492 2842 MS (D)1517 2842 MS (a)1553 2842 MS (t)1575 2842 MS (a)1590 2842 MS (F)1612 2842 MS (r)1639 2842 MS (o)1656 2842 MS (m)1683 2842 MS (F)1720 2842 MS (i)1748 2842 MS +(l)1762 2842 MS (e)1775 2842 MS (\()1797 2842 MS (\))1814 2842 MS ( )1831 2842 MS (q)1845 2842 MS (u)1870 2842 MS (i)1896 2842 MS ( )1909 2842 MS (p)1923 2842 MS (e)1948 2842 MS (r)1970 2842 MS (m)1988 2842 MS (e)2026 2842 MS (t)2048 2842 MS ( )2063 2842 MS +(d)2077 2842 MS (e)2102 2842 MS ( )2125 2842 MS +(c)235 2900 MS (h)257 2900 MS (a)281 2900 MS (r)303 2900 MS (g)320 2900 MS (e)345 2900 MS (r)367 2900 MS ( )384 2900 MS (l)399 2900 MS (a)412 2900 MS ( )434 2900 MS (d)448 2900 MS (o)473 2900 MS (n)499 2900 MS (n)524 2900 MS (\351)549 2900 MS +(e)571 2900 MS ( )593 2900 MS (e)607 2900 MS (n)630 2900 MS ( )654 2900 MS (m)669 2900 MS (\351)707 2900 MS (m)730 2900 MS (o)767 2900 MS (i)794 2900 MS (r)807 2900 MS (e)824 2900 MS ( )846 2900 MS (e)861 2900 MS (t)883 2900 MS ( )898 2900 MS +(u)912 2900 MS (n)937 2900 MS ( )961 2900 MS (s)975 2900 MS (e)995 2900 MS (r)1017 2900 MS (v)1034 2900 MS (i)1059 2900 MS (c)1072 2900 MS (e)1095 2900 MS ( )1117 2900 MS (S)1131 2900 MS (a)1159 2900 MS (v)1182 2900 MS (e)1206 2900 MS (D)1229 2900 MS +(a)1265 2900 MS (t)1287 2900 MS (a)1302 2900 MS (T)1324 2900 MS (o)1354 2900 MS (F)1380 2900 MS (i)1408 2900 MS (l)1421 2900 MS (e)1434 2900 MS (\()1456 2900 MS (\))1473 2900 MS ( )1490 2900 MS (q)1504 2900 MS (u)1529 2900 MS (i)1555 2900 MS ( )1567 2900 MS +(p)1581 2900 MS (e)1607 2900 MS (r)1629 2900 MS (m)1647 2900 MS (e)1684 2900 MS (t)1706 2900 MS ( )1721 2900 MS (d)1735 2900 MS (e)1760 2900 MS ( )1782 2900 MS (s)1796 2900 MS (a)1815 2900 MS (u)1837 2900 MS (v)1863 2900 MS (e)1888 2900 MS (g)1910 2900 MS +(a)1935 2900 MS (r)1957 2900 MS (d)1974 2900 MS (e)1999 2900 MS (r)2021 2900 MS ( )2038 2900 MS (u)2052 2900 MS (n)2078 2900 MS (e)2102 2900 MS ( )2125 2900 MS +(d)235 2957 MS (o)260 2957 MS (n)286 2957 MS (n)310 2957 MS (\351)334 2957 MS (e)356 2957 MS ( )378 2957 MS (e)395 2957 MS (n)418 2957 MS ( )442 2957 MS (m)460 2957 MS (\351)498 2957 MS (m)521 2957 MS (o)558 2957 MS (i)585 2957 MS (r)598 2957 MS +(e)615 2957 MS ( )637 2957 MS (d)654 2957 MS (a)679 2957 MS (n)702 2957 MS (s)726 2957 MS ( )745 2957 MS (u)762 2957 MS (n)788 2957 MS ( )812 2957 MS (f)830 2957 MS (i)846 2957 MS (c)859 2957 MS (h)882 2957 MS (i)907 2957 MS (e)920 2957 MS +(r)942 2957 MS (.)959 2957 MS ( )972 2957 MS (.)989 2957 MS ( )1002 2957 MS (C)1019 2957 MS (e)1052 2957 MS (s)1074 2957 MS ( )1093 2957 MS (d)1110 2957 MS (e)1135 2957 MS (u)1157 2957 MS (x)1183 2957 MS ( )1207 2957 MS (d)1224 2957 MS (e)1250 2957 MS +(r)1272 2957 MS (n)1289 2957 MS (i)1314 2957 MS (e)1327 2957 MS (r)1349 2957 MS (s)1366 2957 MS ( )1385 2957 MS (s)1402 2957 MS (e)1421 2957 MS (r)1443 2957 MS (v)1461 2957 MS (i)1486 2957 MS (c)1499 2957 MS (e)1521 2957 MS (s)1544 2957 MS ( )1563 2957 MS +(d)1580 2957 MS (o)1605 2957 MS (i)1631 2957 MS (v)1644 2957 MS (e)1669 2957 MS (n)1692 2957 MS (t)1716 2957 MS ( )1731 2957 MS (p)1748 2957 MS (o)1772 2957 MS (u)1798 2957 MS (v)1823 2957 MS (o)1847 2957 MS (i)1873 2957 MS (r)1885 2957 MS ( )1902 2957 MS +(s)1919 2957 MS (\222)1939 2957 MS (e)1955 2957 MS (x)1978 2957 MS (\351)2002 2957 MS (c)2024 2957 MS (u)2046 2957 MS (t)2071 2957 MS (e)2086 2957 MS (r)2108 2957 MS ( )2125 2957 MS +(e)235 3015 MS (n)257 3015 MS ( )281 3015 MS (p)317 3015 MS (a)342 3015 MS (r)364 3015 MS (a)381 3015 MS (l)404 3015 MS (l)418 3015 MS (\350)431 3015 MS (l)454 3015 MS (e)467 3015 MS +( )489 3015 MS +(:)502 3015 MS ( )516 3015 MS (i)553 3015 MS (l)566 3015 MS (s)579 3015 MS ( )598 3015 MS (s)635 3015 MS (o)654 3015 MS (n)680 3015 MS (t)704 3015 MS ( )719 3015 MS +(d)755 3015 MS (o)779 3015 MS (n)805 3015 MS (c)829 3015 MS ( )851 3015 MS (a)887 3015 MS (s)909 3015 MS (y)929 3015 MS (n)953 3015 MS (c)978 3015 MS (h)1001 3015 MS (r)1025 3015 MS (o)1042 3015 MS (n)1068 3015 MS (e)1092 3015 MS (s)1114 3015 MS +( )1133 3015 MS (\()1169 3015 MS (t)1186 3015 MS (y)1201 3015 MS (p)1224 3015 MS (e)1250 3015 MS ( )1272 3015 MS (C)1308 3015 MS (O)1341 3015 MS (R)1377 3015 MS (B)1410 3015 MS (A)1444 3015 MS ( )1479 3015 MS (o)1515 3015 MS (n)1541 3015 MS (e)1565 3015 MS +(w)1587 3015 MS (a)1623 3015 MS (y)1646 3015 MS (\))1670 3015 MS (.)1687 3015 MS ( )1700 3015 MS (D)1736 3015 MS (e)1772 3015 MS ( )1794 3015 MS (p)1830 3015 MS (l)1856 3015 MS (u)1868 3015 MS (s)1894 3015 MS ( )1913 3015 MS (l)1950 3015 MS (\222)1963 3015 MS +(a)1979 3015 MS (t)2001 3015 MS (t)2016 3015 MS (r)2030 3015 MS (i)2047 3015 MS (b)2060 3015 MS (u)2084 3015 MS (t)2109 3015 MS ( )2125 3015 MS +(\253)235 3072 MS +( )259 3072 MS +(r)272 3072 MS (e)289 3072 MS (a)311 3072 MS (d)333 3072 MS (o)358 3072 MS (n)384 3072 MS (l)409 3072 MS (y)422 3072 MS +( )446 3072 MS +(\273)460 3072 MS ( )484 3072 MS (P)498 3072 MS (C)526 3072 MS (S)559 3072 MS (R)587 3072 MS (M)620 3072 MS (a)664 3072 MS (t)686 3072 MS ( )701 3072 MS (v)715 3072 MS (a)739 3072 MS ( )761 3072 MS (g)775 3072 MS (\351)800 3072 MS (n)823 3072 MS +(\351)847 3072 MS (r)869 3072 MS (e)886 3072 MS (r)908 3072 MS ( )925 3072 MS (u)939 3072 MS (n)964 3072 MS (e)989 3072 MS ( )1011 3072 MS (f)1026 3072 MS (o)1041 3072 MS (n)1067 3072 MS (c)1091 3072 MS (t)1113 3072 MS (i)1129 3072 MS (o)1141 3072 MS +(n)1167 3072 MS ( )1191 3072 MS (d)1205 3072 MS (e)1230 3072 MS ( )1253 3072 MS (l)1268 3072 MS (e)1280 3072 MS (c)1302 3072 MS (t)1324 3072 MS (u)1339 3072 MS (r)1364 3072 MS (e)1381 3072 MS ( )1403 3072 MS (s)1417 3072 MS (y)1437 3072 MS (n)1461 3072 MS +(c)1485 3072 MS (h)1508 3072 MS (r)1532 3072 MS (o)1549 3072 MS (n)1575 3072 MS (e)1599 3072 MS (.)1621 3072 MS ( )1634 3072 MS (P)1648 3072 MS (o)1676 3072 MS (u)1702 3072 MS (r)1726 3072 MS ( )1743 3072 MS (p)1757 3072 MS (o)1781 3072 MS (u)1807 3072 MS +(v)1832 3072 MS (o)1856 3072 MS (i)1882 3072 MS (r)1894 3072 MS ( )1911 3072 MS (l)1926 3072 MS (\222)1939 3072 MS (e)1955 3072 MS (x)1978 3072 MS (\351)2002 3072 MS (c)2024 3072 MS (u)2046 3072 MS (t)2071 3072 MS (e)2086 3072 MS (r)2108 3072 MS ( )2125 3072 MS +(e)235 3129 MS (n)257 3129 MS ( )281 3129 MS (p)294 3129 MS (a)319 3129 MS (r)341 3129 MS (a)358 3129 MS (l)381 3129 MS (l)394 3129 MS (\350)407 3129 MS (l)431 3129 MS (e)444 3129 MS (,)466 3129 MS ( )479 3129 MS (i)493 3129 MS (l)506 3129 MS +( )518 3129 MS (e)531 3129 MS (s)554 3129 MS (t)573 3129 MS ( )588 3129 MS (n)601 3129 MS (\351)625 3129 MS (c)647 3129 MS (e)669 3129 MS (s)691 3129 MS (s)711 3129 MS (a)730 3129 MS (i)753 3129 MS (r)765 3129 MS (e)782 3129 MS ( )804 3129 MS +(d)817 3129 MS (e)842 3129 MS ( )864 3129 MS (d)877 3129 MS (\351)902 3129 MS (f)925 3129 MS (i)941 3129 MS (n)954 3129 MS (i)980 3129 MS (r)993 3129 MS ( )1010 3129 MS (u)1023 3129 MS (n)1048 3129 MS ( )1072 3129 MS (a)1085 3129 MS (u)1107 3129 MS +(t)1132 3129 MS (r)1147 3129 MS (e)1164 3129 MS ( )1186 3129 MS (s)1199 3129 MS (e)1218 3129 MS (r)1240 3129 MS (v)1257 3129 MS (i)1282 3129 MS (c)1295 3129 MS (e)1317 3129 MS ( )1339 3129 MS (i)1353 3129 MS (d)1366 3129 MS (e)1391 3129 MS (n)1414 3129 MS +(t)1438 3129 MS (i)1454 3129 MS (q)1466 3129 MS (u)1491 3129 MS (e)1516 3129 MS ( )1538 3129 MS (m)1552 3129 MS (a)1589 3129 MS (i)1612 3129 MS (s)1625 3129 MS ( )1644 3129 MS (a)1657 3129 MS (s)1680 3129 MS (y)1700 3129 MS (n)1724 3129 MS (c)1749 3129 MS +(h)1772 3129 MS (r)1796 3129 MS (o)1813 3129 MS (n)1839 3129 MS (e)1863 3129 MS +( )1885 3129 MS +(:)1898 3129 MS ( )1912 3129 MS (g)1925 3129 MS (e)1950 3129 MS (t)1972 3129 MS (_)1987 3129 MS (d)2012 3129 MS (m)2037 3129 MS (a)2074 3129 MS (t)2096 3129 MS (.)2111 3129 MS +( )2124 3129 MS +showpage +%%Page: 22 22 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (2)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +( )235 527 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 575 MS (i)260 575 MS (f)285 575 MS (n)310 575 MS (d)335 575 MS (e)360 575 MS (f)385 575 MS ( )410 575 MS (_)435 575 MS +(S)460 575 MS (A)485 575 MS (L)510 575 MS (O)535 575 MS (M)560 575 MS (E)585 575 MS (_)610 575 MS (N)635 575 MS (P)660 575 MS (M)685 575 MS (A)710 575 MS (T)735 575 MS (C)760 575 MS (O)785 575 MS (M)810 575 MS (P)835 575 MS +(O)860 575 MS (N)885 575 MS (E)910 575 MS (N)935 575 MS (T)960 575 MS (_)985 575 MS (I)1010 575 MS (D)1035 575 MS (L)1060 575 MS (_)1085 575 MS +( )1110 575 MS +(#)235 622 MS (d)260 622 MS (e)285 622 MS (f)310 622 MS (i)335 622 MS (n)360 622 MS (e)385 622 MS ( )410 622 MS (_)435 622 MS (S)460 622 MS (A)485 622 MS (L)510 622 MS (O)535 622 MS (M)560 622 MS (E)585 622 MS (_)610 622 MS +(N)635 622 MS (P)660 622 MS (M)685 622 MS (A)710 622 MS (T)735 622 MS (C)760 622 MS (O)785 622 MS (M)810 622 MS (P)835 622 MS (O)860 622 MS (N)885 622 MS (E)910 622 MS (N)935 622 MS (T)960 622 MS (_)985 622 MS (I)1010 622 MS +(D)1035 622 MS (L)1060 622 MS (_)1085 622 MS +( )1110 622 MS +( )235 669 MS +(#)235 717 MS (i)260 717 MS (n)285 717 MS (c)310 717 MS (l)335 717 MS (u)360 717 MS (d)385 717 MS (e)410 717 MS ( )435 717 MS (")460 717 MS (S)485 717 MS (A)510 717 MS (L)535 717 MS (O)560 717 MS (M)585 717 MS (E)610 717 MS +(_)635 717 MS (C)660 717 MS (o)685 717 MS (m)710 717 MS (p)735 717 MS (o)760 717 MS (n)785 717 MS (e)810 717 MS (n)835 717 MS (t)860 717 MS (.)885 717 MS (i)910 717 MS (d)935 717 MS (l)960 717 MS (")985 717 MS +( )1010 717 MS +(#)235 764 MS (i)260 764 MS (n)285 764 MS (c)310 764 MS (l)335 764 MS (u)360 764 MS (d)385 764 MS (e)410 764 MS ( )435 764 MS (")460 764 MS (T)485 764 MS (y)510 764 MS (p)535 764 MS (e)560 764 MS (D)585 764 MS (a)610 764 MS +(t)635 764 MS (a)660 764 MS (.)685 764 MS (i)710 764 MS (d)735 764 MS (l)760 764 MS (")785 764 MS +( )810 764 MS +(#)235 811 MS (i)260 811 MS (n)285 811 MS (c)310 811 MS (l)335 811 MS (u)360 811 MS (d)385 811 MS (e)410 811 MS ( )435 811 MS (")460 811 MS (M)485 811 MS (P)510 811 MS (I)535 811 MS (O)560 811 MS (b)585 811 MS (j)610 811 MS +(e)635 811 MS (c)660 811 MS (t)685 811 MS (.)710 811 MS (i)735 811 MS (d)760 811 MS (l)785 811 MS (")810 811 MS +( )835 811 MS +( )235 858 MS +(m)235 905 MS (o)260 905 MS (d)285 905 MS (u)310 905 MS (l)335 905 MS (e)360 905 MS ( )385 905 MS (E)410 905 MS (n)435 905 MS (g)460 905 MS (i)485 905 MS (n)510 905 MS (e)535 905 MS (s)560 905 MS +( )585 905 MS +({)235 953 MS +( )260 953 MS +( )235 1000 MS ( )260 1000 MS (/)285 1000 MS (/)310 1000 MS ( )335 1000 MS (D)360 1000 MS (e)385 1000 MS (f)410 1000 MS (i)435 1000 MS (n)460 1000 MS (i)485 1000 MS (t)510 1000 MS (i)535 1000 MS (o)560 1000 MS (n)585 1000 MS ( )610 1000 MS +(d)635 1000 MS (e)660 1000 MS ( )685 1000 MS (l)710 1000 MS (a)735 1000 MS ( )760 1000 MS (d)785 1000 MS (o)810 1000 MS (n)835 1000 MS (n)860 1000 MS (e)885 1000 MS (e)910 1000 MS ( )935 1000 MS (m)960 1000 MS (a)985 1000 MS (t)1010 1000 MS +(r)1035 1000 MS (i)1060 1000 MS (c)1085 1000 MS (e)1110 1000 MS ( )1135 1000 MS (p)1160 1000 MS (a)1185 1000 MS (r)1210 1000 MS (a)1235 1000 MS (l)1260 1000 MS (l)1285 1000 MS (e)1310 1000 MS (l)1335 1000 MS (e)1360 1000 MS +( )1385 1000 MS +( )235 1047 MS ( )260 1047 MS +(i)285 1047 MS (n)310 1047 MS (t)335 1047 MS (e)360 1047 MS (r)385 1047 MS (f)410 1047 MS (a)435 1047 MS (c)460 1047 MS (e)485 1047 MS ( )510 1047 MS (P)535 1047 MS (C)560 1047 MS (S)585 1047 MS (R)610 1047 MS (M)635 1047 MS (a)660 1047 MS +(t)685 1047 MS ( )710 1047 MS (:)735 1047 MS ( )760 1047 MS (M)785 1047 MS (P)810 1047 MS (I)835 1047 MS (O)860 1047 MS (b)885 1047 MS (j)910 1047 MS (e)935 1047 MS (c)960 1047 MS (t)985 1047 MS +( )1010 1047 MS +( )235 1094 MS ( )260 1094 MS ({)285 1094 MS +( )310 1094 MS +( )235 1141 MS ( )260 1141 MS ( )285 1141 MS ( )310 1141 MS (r)335 1141 MS (e)360 1141 MS (a)385 1141 MS (d)410 1141 MS (o)435 1141 MS (n)460 1141 MS +(l)485 1141 MS (y)510 1141 MS ( )535 1141 MS (a)560 1141 MS (t)585 1141 MS (t)610 1141 MS (r)635 1141 MS (i)660 1141 MS (b)685 1141 MS (u)710 1141 MS (t)735 1141 MS (e)760 1141 MS ( )785 1141 MS (C)810 1141 MS (S)835 1141 MS (R)860 1141 MS +(M)885 1141 MS (a)910 1141 MS (t)935 1141 MS (S)960 1141 MS (t)985 1141 MS (r)1010 1141 MS (u)1035 1141 MS (c)1060 1141 MS (t)1085 1141 MS ( )1110 1141 MS (c)1135 1141 MS (s)1160 1141 MS (r)1185 1141 MS (m)1210 1141 MS (a)1235 1141 MS (t)1260 1141 MS +(;)1285 1141 MS +( )1310 1141 MS +( )235 1189 MS +( )235 1236 MS ( )260 1236 MS ( )285 1236 MS ( )310 1236 MS (u)335 1236 MS (n)360 1236 MS (s)385 1236 MS (i)410 1236 MS (g)435 1236 MS (n)460 1236 MS (e)485 1236 MS (d)510 1236 MS ( )535 1236 MS (l)560 1236 MS (o)585 1236 MS (n)610 1236 MS +(g)635 1236 MS ( )660 1236 MS (N)685 1236 MS (b)710 1236 MS (R)735 1236 MS (o)760 1236 MS (w)785 1236 MS (s)810 1236 MS (\()835 1236 MS (\))860 1236 MS (;)885 1236 MS +( )910 1236 MS +( )235 1283 MS ( )260 1283 MS ( )285 1283 MS ( )310 1283 MS (u)335 1283 MS (n)360 1283 MS (s)385 1283 MS (i)410 1283 MS (g)435 1283 MS (n)460 1283 MS (e)485 1283 MS (d)510 1283 MS ( )535 1283 MS (l)560 1283 MS (o)585 1283 MS (n)610 1283 MS +(g)635 1283 MS ( )660 1283 MS (N)685 1283 MS (b)710 1283 MS (C)735 1283 MS (o)760 1283 MS (l)785 1283 MS (s)810 1283 MS (\()835 1283 MS (\))860 1283 MS (;)885 1283 MS +( )910 1283 MS +( )235 1330 MS ( )260 1330 MS ( )285 1330 MS ( )310 1330 MS (v)335 1330 MS (o)360 1330 MS (i)385 1330 MS (d)410 1330 MS ( )435 1330 MS (L)460 1330 MS (M)485 1330 MS (a)510 1330 MS (t)535 1330 MS (\()560 1330 MS (o)585 1330 MS (u)610 1330 MS +(t)635 1330 MS ( )660 1330 MS (u)685 1330 MS (n)710 1330 MS (s)735 1330 MS (i)760 1330 MS (g)785 1330 MS (n)810 1330 MS (e)835 1330 MS (d)860 1330 MS ( )885 1330 MS (l)910 1330 MS (o)935 1330 MS (n)960 1330 MS (g)985 1330 MS ( )1010 1330 MS +(s)1035 1330 MS (t)1060 1330 MS (a)1085 1330 MS (r)1110 1330 MS (t)1135 1330 MS (,)1160 1330 MS ( )1185 1330 MS (o)1210 1330 MS (u)1235 1330 MS (t)1260 1330 MS ( )1285 1330 MS (u)1310 1330 MS (n)1335 1330 MS (s)1360 1330 MS (i)1385 1330 MS (g)1410 1330 MS +(n)1435 1330 MS (e)1460 1330 MS (d)1485 1330 MS ( )1510 1330 MS (l)1535 1330 MS (o)1560 1330 MS (n)1585 1330 MS (g)1610 1330 MS ( )1635 1330 MS (e)1660 1330 MS (n)1685 1330 MS (d)1710 1330 MS (\))1735 1330 MS (;)1760 1330 MS +( )1785 1330 MS +( )235 1377 MS ( )260 1377 MS ( )285 1377 MS ( )310 1377 MS (C)335 1377 MS (S)360 1377 MS (R)385 1377 MS (M)410 1377 MS (a)435 1377 MS (t)460 1377 MS (S)485 1377 MS (t)510 1377 MS (r)535 1377 MS (u)560 1377 MS (c)585 1377 MS (t)610 1377 MS +( )635 1377 MS (n)660 1377 MS (c)685 1377 MS (s)710 1377 MS (r)735 1377 MS (m)760 1377 MS (a)785 1377 MS (t)810 1377 MS (\()835 1377 MS (i)860 1377 MS (n)885 1377 MS ( )910 1377 MS (u)935 1377 MS (n)960 1377 MS (s)985 1377 MS (i)1010 1377 MS +(g)1035 1377 MS (n)1060 1377 MS (e)1085 1377 MS (d)1110 1377 MS ( )1135 1377 MS (l)1160 1377 MS (o)1185 1377 MS (n)1210 1377 MS (g)1235 1377 MS ( )1260 1377 MS (s)1285 1377 MS (t)1310 1377 MS (a)1335 1377 MS (r)1360 1377 MS (t)1385 1377 MS (,)1410 1377 MS +( )1435 1377 MS (i)1460 1377 MS (n)1485 1377 MS ( )1510 1377 MS (u)1535 1377 MS (n)1560 1377 MS (s)1585 1377 MS (i)1610 1377 MS (g)1635 1377 MS (n)1660 1377 MS (e)1685 1377 MS (d)1710 1377 MS ( )1735 1377 MS (l)1760 1377 MS (o)1785 1377 MS (n)1810 1377 MS +(g)1835 1377 MS ( )1860 1377 MS (e)1885 1377 MS (n)1910 1377 MS (d)1935 1377 MS (\))1960 1377 MS (;)1985 1377 MS +( )2010 1377 MS +( )235 1425 MS ( )260 1425 MS (})285 1425 MS (;)310 1425 MS +( )335 1425 MS +( )235 1472 MS +( )235 1519 MS ( )260 1519 MS (/)285 1519 MS (/)310 1519 MS ( )335 1519 MS (D)360 1519 MS (e)385 1519 MS (f)410 1519 MS (i)435 1519 MS (n)460 1519 MS (i)485 1519 MS (t)510 1519 MS (i)535 1519 MS (o)560 1519 MS (n)585 1519 MS ( )610 1519 MS +(d)635 1519 MS (u)660 1519 MS ( )685 1519 MS (c)710 1519 MS (o)735 1519 MS (m)760 1519 MS (p)785 1519 MS (o)810 1519 MS +(s)835 1519 MS (a)860 1519 MS (n)885 1519 MS (t)910 1519 MS ( )935 1519 MS (m)960 1519 MS (a)985 1519 MS (t)1010 1519 MS (r)1035 1519 MS (i)1060 1519 MS (c)1085 1519 MS (e)1110 1519 MS ( )1135 1519 MS (N)1160 1519 MS (P)1185 1519 MS ( )1210 1519 MS +(p)1235 1519 MS (a)1260 1519 MS (r)1285 1519 MS (a)1310 1519 MS (l)1335 1519 MS (l)1360 1519 MS (e)1385 1519 MS (l)1410 1519 MS (e)1435 1519 MS +( )1460 1519 MS +( )235 1566 MS ( )260 1566 MS +(i)285 1566 MS (n)310 1566 MS (t)335 1566 MS (e)360 1566 MS (r)385 1566 MS (f)410 1566 MS (a)435 1566 MS (c)460 1566 MS (e)485 1566 MS ( )510 1566 MS (N)535 1566 MS (P)560 1566 MS (M)585 1566 MS (a)610 1566 MS (t)635 1566 MS (C)660 1566 MS +(o)685 1566 MS (m)710 1566 MS (p)735 1566 MS (o)760 1566 MS (n)785 1566 MS (e)810 1566 MS (n)835 1566 MS (t)860 1566 MS (:)885 1566 MS (C)910 1566 MS (o)935 1566 MS (m)960 1566 MS (p)985 1566 MS (o)1010 1566 MS (n)1035 1566 MS (e)1060 1566 MS +(n)1085 1566 MS (t)1110 1566 MS (,)1135 1566 MS (M)1160 1566 MS (P)1185 1566 MS (I)1210 1566 MS (O)1235 1566 MS (b)1260 1566 MS (j)1285 1566 MS (e)1310 1566 MS (c)1335 1566 MS (t)1360 1566 MS +( )1385 1566 MS +( )235 1613 MS ( )260 1613 MS ({)285 1613 MS +( )310 1613 MS +( )235 1661 MS +( )235 1708 MS ( )260 1708 MS ( )285 1708 MS ( )310 1708 MS (/)335 1708 MS (/)360 1708 MS ( )385 1708 MS (l)410 1708 MS (e)435 1708 MS (c)460 1708 MS (t)485 1708 MS (u)510 1708 MS (r)535 1708 MS (e)560 1708 MS ( )585 1708 MS (d)610 1708 MS +(e)635 1708 MS ( )660 1708 MS (l)685 1708 MS (a)710 1708 MS ( )735 1708 MS (d)760 1708 MS (o)785 1708 MS (n)810 1708 MS (n)835 1708 MS (e)860 1708 MS (e)885 1708 MS ( )910 1708 MS (m)935 1708 MS (a)960 1708 MS (t)985 1708 MS (r)1010 1708 MS +(i)1035 1708 MS (c)1060 1708 MS (e)1085 1708 MS ( )1110 1708 MS (p)1135 1708 MS (a)1160 1708 MS (r)1185 1708 MS (a)1210 1708 MS (l)1235 1708 MS (l)1260 1708 MS (e)1285 1708 MS (l)1310 1708 MS (e)1335 1708 MS +( )1360 1708 MS +( )235 1755 MS ( )260 1755 MS ( )285 1755 MS ( )310 1755 MS +(r)335 1755 MS (e)360 1755 MS (a)385 1755 MS (d)410 1755 MS (o)435 1755 MS (n)460 1755 MS (l)485 1755 MS (y)510 1755 MS ( )535 1755 MS (a)560 1755 MS (t)585 1755 MS (t)610 1755 MS (r)635 1755 MS (i)660 1755 MS (b)685 1755 MS (u)710 1755 MS +(t)735 1755 MS (e)760 1755 MS ( )785 1755 MS (P)810 1755 MS (C)835 1755 MS (S)860 1755 MS (R)885 1755 MS (M)910 1755 MS (a)935 1755 MS (t)960 1755 MS ( )985 1755 MS (d)1010 1755 MS (m)1035 1755 MS (a)1060 1755 MS (t)1085 1755 MS (;)1110 1755 MS +( )1135 1755 MS +( )235 1802 MS ( )260 1802 MS ( )285 1802 MS ( )310 1802 MS (/)335 1802 MS (/)360 1802 MS ( )385 1802 MS (v)410 1802 MS (e)435 1802 MS (r)460 1802 MS (s)485 1802 MS (i)510 1802 MS (o)535 1802 MS (n)560 1802 MS ( )585 1802 MS (a)610 1802 MS +(s)635 1802 MS (y)660 1802 MS (n)685 1802 MS (c)710 1802 MS (h)735 1802 MS (r)760 1802 MS (o)785 1802 MS (n)810 1802 MS (e)835 1802 MS ( )860 1802 MS (d)885 1802 MS (e)910 1802 MS ( )935 1802 MS (l)960 1802 MS (e)985 1802 MS (c)1010 1802 MS +(t)1035 1802 MS (u)1060 1802 MS (r)1085 1802 MS (e)1110 1802 MS ( )1135 1802 MS (d)1160 1802 MS (e)1185 1802 MS ( )1210 1802 MS (l)1235 1802 MS (a)1260 1802 MS ( )1285 1802 MS (m)1310 1802 MS (a)1335 1802 MS (t)1360 1802 MS (r)1385 1802 MS (i)1410 1802 MS +(c)1435 1802 MS (e)1460 1802 MS ( )1485 1802 MS (p)1510 1802 MS (a)1535 1802 MS (r)1560 1802 MS (a)1585 1802 MS (l)1610 1802 MS (l)1635 1802 MS (e)1660 1802 MS (l)1685 1802 MS (e)1710 1802 MS +( )1735 1802 MS +( )235 1849 MS ( )260 1849 MS ( )285 1849 MS ( )310 1849 MS +(o)335 1849 MS (n)360 1849 MS (e)385 1849 MS (w)410 1849 MS (a)435 1849 MS (y)460 1849 MS ( )485 1849 MS (v)510 1849 MS (o)535 1849 MS (i)560 1849 MS (d)585 1849 MS ( )610 1849 MS (g)635 1849 MS (e)660 1849 MS (t)685 1849 MS (_)710 1849 MS +(d)735 1849 MS (m)760 1849 MS (a)785 1849 MS (t)810 1849 MS (\()835 1849 MS (i)860 1849 MS (n)885 1849 MS ( )910 1849 MS (s)935 1849 MS (t)960 1849 MS (r)985 1849 MS (i)1010 1849 MS (n)1035 1849 MS (g)1060 1849 MS +( )1085 1849 MS (i)1110 1849 MS (d)1135 1849 MS (_)1160 1849 MS (c)1185 1849 MS (a)1210 1849 MS (l)1235 1849 MS (l)1260 1849 MS (b)1285 1849 MS (a)1310 1849 MS (c)1335 1849 MS (k)1360 1849 MS (\))1385 1849 MS (;)1410 1849 MS +( )1435 1849 MS +( )235 1897 MS +( )235 1944 MS ( )260 1944 MS ( )285 1944 MS ( )310 1944 MS (v)335 1944 MS (o)360 1944 MS (i)385 1944 MS (d)410 1944 MS ( )435 1944 MS (S)460 1944 MS (e)485 1944 MS (t)510 1944 MS (F)535 1944 MS (i)560 1944 MS (l)585 1944 MS (e)610 1944 MS +(N)635 1944 MS (a)660 1944 MS (m)685 1944 MS (e)710 1944 MS (\()735 1944 MS (i)760 1944 MS (n)785 1944 MS ( )810 1944 MS (s)835 1944 MS (t)860 1944 MS (r)885 1944 MS (i)910 1944 MS (n)935 1944 MS (g)960 1944 MS ( )985 1944 MS (f)1010 1944 MS +(i)1035 1944 MS (l)1060 1944 MS (e)1085 1944 MS (n)1110 1944 MS (a)1135 1944 MS (m)1160 1944 MS (e)1185 1944 MS (\))1210 1944 MS (;)1235 1944 MS +( )1260 1944 MS +( )235 1991 MS +( )235 2038 MS ( )260 2038 MS ( )285 2038 MS ( )310 2038 MS (o)335 2038 MS (n)360 2038 MS (e)385 2038 MS (w)410 2038 MS (a)435 2038 MS (y)460 2038 MS ( )485 2038 MS (v)510 2038 MS (o)535 2038 MS (i)560 2038 MS (d)585 2038 MS ( )610 2038 MS +(R)635 2038 MS (e)660 2038 MS (a)685 2038 MS (d)710 2038 MS (D)735 2038 MS (a)760 2038 MS (t)785 2038 MS (a)810 2038 MS (F)835 2038 MS (r)860 2038 MS (o)885 2038 MS (m)910 2038 MS (F)935 2038 MS (i)960 2038 MS (l)985 2038 MS (e)1010 2038 MS +(\()1035 2038 MS (i)1060 2038 MS (n)1085 2038 MS ( )1110 2038 MS (s)1135 2038 MS (t)1160 2038 MS (r)1185 2038 MS (i)1210 2038 MS (n)1235 2038 MS (g)1260 2038 MS ( )1285 2038 MS (i)1310 2038 MS (d)1335 2038 MS (_)1360 2038 MS (c)1385 2038 MS (a)1410 2038 MS +(l)1435 2038 MS (l)1460 2038 MS (b)1485 2038 MS (a)1510 2038 MS (c)1535 2038 MS (k)1560 2038 MS (\))1585 2038 MS (;)1610 2038 MS +( )1635 2038 MS +( )235 2085 MS ( )260 2085 MS ( )285 2085 MS ( )310 2085 MS (o)335 2085 MS (n)360 2085 MS (e)385 2085 MS (w)410 2085 MS (a)435 2085 MS (y)460 2085 MS ( )485 2085 MS (v)510 2085 MS (o)535 2085 MS (i)560 2085 MS (d)585 2085 MS ( )610 2085 MS +(S)635 2085 MS (a)660 2085 MS (v)685 2085 MS (e)710 2085 MS (D)735 2085 MS (a)760 2085 MS (t)785 2085 MS (a)810 2085 MS (T)835 2085 MS (o)860 2085 MS (F)885 2085 MS (i)910 2085 MS (l)935 2085 MS (e)960 2085 MS (\()985 2085 MS (i)1010 2085 MS +(n)1035 2085 MS ( )1060 2085 MS (s)1085 2085 MS (t)1110 2085 MS (r)1135 2085 MS (i)1160 2085 MS (n)1185 2085 MS (g)1210 2085 MS ( )1235 2085 MS (i)1260 2085 MS (d)1285 2085 MS (_)1310 2085 MS (c)1335 2085 MS (a)1360 2085 MS (l)1385 2085 MS (l)1410 2085 MS +(b)1435 2085 MS (a)1460 2085 MS (c)1485 2085 MS (k)1510 2085 MS (\))1535 2085 MS (;)1560 2085 MS +( )1585 2085 MS +( )235 2133 MS +( )235 2180 MS ( )260 2180 MS +(})285 2180 MS ( )310 2180 MS (;)335 2180 MS +( )360 2180 MS +(})235 2227 MS ( )260 2227 MS (;)285 2227 MS +( )310 2227 MS +( )235 2274 MS +(#)235 2321 MS (e)260 2321 MS (n)285 2321 MS (d)310 2321 MS (i)335 2321 MS (f)360 2321 MS +( )385 2321 MS +( )235 2369 MS +( )235 2416 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 2473 MS +showpage +%%Page: 23 23 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (3)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[54 0 0 -54 0 0]/Helvetica-Bold MF +(9)310 580 MS (.)340 580 MS (2)355 580 MS (.)385 580 MS (2)400 580 MS +( )430 580 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[54 0 0 -54 0 0]/_Helvetica-Bold MF +(D)460 580 MS (\351)499 580 MS (f)529 580 MS (i)547 580 MS (n)562 580 MS (i)595 580 MS (t)610 580 MS (i)628 580 MS (o)643 580 MS (n)676 580 MS ( )709 580 MS (d)724 580 MS (e)757 580 MS ( )787 580 MS (l)802 580 MS (\222)817 580 MS +(i)832 580 MS (m)848 580 MS (p)895 580 MS (l)928 580 MS (\351)944 580 MS (m)975 580 MS (e)1022 580 MS (n)1052 580 MS (t)1085 580 MS (a)1103 580 MS (t)1133 580 MS (i)1151 580 MS (o)1166 580 MS (n)1199 580 MS ( )1232 580 MS +( )1247 580 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 652 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 710 MS (\222)378 710 MS (i)395 710 MS (m)409 710 MS (p)447 710 MS (l)473 710 MS (\351)486 710 MS (m)509 710 MS (e)547 710 MS (n)570 710 MS (t)594 710 MS (a)609 710 MS (t)631 710 MS (i)646 710 MS (o)658 710 MS (n)684 710 MS +( )708 710 MS (d)740 710 MS (e)765 710 MS ( )787 710 MS (l)820 710 MS (a)833 710 MS ( )855 710 MS (d)887 710 MS (o)912 710 MS (n)938 710 MS (n)963 710 MS (\351)987 710 MS (e)1009 710 MS +( )1031 710 MS (m)1064 710 MS (a)1102 710 MS (t)1124 710 MS (r)1139 710 MS (i)1157 710 MS (c)1169 710 MS (e)1191 710 MS ( )1213 710 MS (p)1245 710 MS (a)1271 710 MS (r)1293 710 MS (a)1310 710 MS (l)1333 710 MS (l)1346 710 MS (\350)1360 710 MS +(l)1383 710 MS (e)1395 710 MS ( )1417 710 MS (d)1449 710 MS (o)1474 710 MS (i)1501 710 MS (t)1513 710 MS ( )1528 710 MS (d)1560 710 MS (o)1585 710 MS (n)1611 710 MS (c)1635 710 MS ( )1657 710 MS (d)1689 710 MS (\351)1714 710 MS (f)1737 710 MS +(i)1753 710 MS (n)1766 710 MS (i)1792 710 MS (r)1804 710 MS ( )1821 710 MS (u)1853 710 MS (n)1879 710 MS (e)1904 710 MS ( )1926 710 MS (f)1959 710 MS (o)1974 710 MS (n)2000 710 MS (c)2024 710 MS (t)2046 710 MS (i)2062 710 MS (o)2074 710 MS +(n)2100 710 MS ( )2125 710 MS +(N)235 767 MS (b)271 767 MS (R)295 767 MS (o)328 767 MS (w)354 767 MS (s)390 767 MS (\()409 767 MS (\))426 767 MS ( )443 767 MS (q)467 767 MS (u)492 767 MS (i)518 767 MS ( )531 767 MS (r)555 767 MS (e)572 767 MS (n)595 767 MS +(v)620 767 MS (o)644 767 MS (i)671 767 MS (e)683 767 MS ( )705 767 MS (l)730 767 MS (e)743 767 MS ( )766 767 MS (n)791 767 MS (o)815 767 MS (m)842 767 MS (b)880 767 MS (r)904 767 MS (e)921 767 MS ( )943 767 MS ( )967 767 MS +(t)991 767 MS (o)1006 767 MS (t)1031 767 MS (a)1046 767 MS (l)1068 767 MS ( )1081 767 MS (d)1105 767 MS (e)1130 767 MS ( )1152 767 MS (l)1177 767 MS (i)1191 767 MS (g)1204 767 MS (n)1230 767 MS (e)1255 767 MS (s)1277 767 MS ( )1296 767 MS +(d)1320 767 MS (e)1345 767 MS ( )1368 767 MS (l)1393 767 MS (a)1406 767 MS ( )1428 767 MS (m)1453 767 MS (a)1491 767 MS (t)1513 767 MS (r)1528 767 MS (i)1546 767 MS (c)1558 767 MS (e)1580 767 MS ( )1602 767 MS (d)1626 767 MS (i)1652 767 MS +(s)1665 767 MS (t)1684 767 MS (r)1699 767 MS (i)1717 767 MS (b)1730 767 MS (u)1754 767 MS (\351)1779 767 MS (e)1802 767 MS (,)1824 767 MS ( )1837 767 MS (u)1861 767 MS (n)1886 767 MS (e)1911 767 MS ( )1933 767 MS (f)1958 767 MS (o)1973 767 MS +(n)2000 767 MS (c)2024 767 MS (t)2046 767 MS (i)2062 767 MS (o)2074 767 MS (n)2100 767 MS ( )2125 767 MS +(N)235 825 MS (b)271 825 MS (C)295 825 MS (o)328 825 MS (l)355 825 MS (s)368 825 MS (\()387 825 MS (\))404 825 MS ( )421 825 MS (q)443 825 MS (u)468 825 MS (i)494 825 MS ( )506 825 MS (r)528 825 MS (e)545 825 MS (n)567 825 MS +(v)592 825 MS (o)616 825 MS (i)643 825 MS (e)656 825 MS ( )678 825 MS (l)701 825 MS (e)713 825 MS ( )735 825 MS (n)758 825 MS (o)782 825 MS (m)809 825 MS (b)847 825 MS (r)871 825 MS (e)888 825 MS ( )910 825 MS ( )932 825 MS +(t)954 825 MS (o)969 825 MS (t)994 825 MS (a)1009 825 MS (l)1031 825 MS ( )1043 825 MS (d)1065 825 MS (e)1090 825 MS ( )1112 825 MS (c)1134 825 MS (o)1156 825 MS (l)1182 825 MS (o)1194 825 MS (n)1220 825 MS (n)1245 825 MS (e)1269 825 MS +(s)1292 825 MS ( )1311 825 MS (d)1333 825 MS (e)1358 825 MS ( )1380 825 MS (l)1403 825 MS (a)1416 825 MS ( )1438 825 MS (m)1461 825 MS (a)1498 825 MS (t)1520 825 MS (r)1535 825 MS (i)1553 825 MS (c)1565 825 MS (e)1587 825 MS ( )1609 825 MS +(d)1631 825 MS (i)1657 825 MS (s)1670 825 MS (t)1689 825 MS (r)1704 825 MS (i)1722 825 MS (b)1735 825 MS (u)1759 825 MS (\351)1784 825 MS (e)1806 825 MS (,)1828 825 MS ( )1841 825 MS (u)1863 825 MS (n)1889 825 MS (e)1913 825 MS ( )1935 825 MS +(f)1958 825 MS (o)1973 825 MS (n)1999 825 MS (c)2023 825 MS (t)2045 825 MS (i)2061 825 MS (o)2073 825 MS (n)2100 825 MS ( )2125 825 MS +(L)235 882 MS (M)265 882 MS (a)309 882 MS (t)331 882 MS (\()346 882 MS (s)363 882 MS (t)382 882 MS (a)397 882 MS (r)419 882 MS (t)435 882 MS (,)449 882 MS (e)462 882 MS (n)484 882 MS (d)508 882 MS (\))533 882 MS ( )550 882 MS +(q)565 882 MS (u)590 882 MS (i)616 882 MS ( )629 882 MS (r)644 882 MS (e)661 882 MS (n)683 882 MS (v)708 882 MS (o)732 882 MS (i)759 882 MS (e)772 882 MS ( )794 882 MS (l)810 882 MS (a)823 882 MS +( )845 882 MS (d)860 882 MS (i)886 882 MS (s)899 882 MS (t)918 882 MS (r)933 882 MS (i)951 882 MS (b)964 882 MS (u)988 882 MS (t)1013 882 MS (i)1029 882 MS (o)1041 882 MS (n)1067 882 MS ( )1091 882 MS (l)1107 882 MS (o)1119 882 MS +(c)1145 882 MS (a)1167 882 MS (l)1190 882 MS (e)1203 882 MS ( )1226 882 MS (\340)1242 882 MS ( )1264 882 MS (u)1279 882 MS (n)1304 882 MS ( )1329 882 MS (p)1344 882 MS (r)1369 882 MS (o)1386 882 MS (c)1412 882 MS (e)1434 882 MS (s)1456 882 MS +(s)1475 882 MS (e)1494 882 MS (u)1516 882 MS (r)1541 882 MS ( )1558 882 MS (d)1573 882 MS (e)1598 882 MS ( )1620 882 MS (l)1636 882 MS (a)1649 882 MS ( )1672 882 MS (m)1688 882 MS (a)1726 882 MS (t)1748 882 MS (r)1763 882 MS (i)1780 882 MS +(c)1792 882 MS (e)1815 882 MS ( )1837 882 MS (p)1852 882 MS (a)1877 882 MS (r)1899 882 MS (a)1916 882 MS (l)1939 882 MS (l)1953 882 MS (\350)1966 882 MS (l)1989 882 MS (e)2002 882 MS (,)2024 882 MS ( )2037 882 MS (u)2052 882 MS (n)2078 882 MS +(e)2102 882 MS ( )2125 882 MS +(f)235 940 MS (o)250 940 MS (n)277 940 MS (c)301 940 MS (t)323 940 MS (i)339 940 MS (o)351 940 MS (n)377 940 MS ( )401 940 MS (c)415 940 MS (s)437 940 MS (r)456 940 MS (m)474 940 MS (a)512 940 MS (t)534 940 MS (\()549 940 MS +(\))566 940 MS ( )583 940 MS (q)597 940 MS (u)622 940 MS (i)647 940 MS ( )659 940 MS (r)673 940 MS (e)690 940 MS (n)712 940 MS (v)737 940 MS (o)761 940 MS (i)788 940 MS (e)800 940 MS ( )822 940 MS (l)837 940 MS (e)850 940 MS +(s)873 940 MS ( )892 940 MS (d)906 940 MS (o)931 940 MS (n)957 940 MS (n)982 940 MS (\351)1006 940 MS (e)1028 940 MS (s)1050 940 MS ( )1069 940 MS (l)1084 940 MS (o)1096 940 MS (c)1122 940 MS (a)1144 940 MS (l)1167 940 MS (e)1180 940 MS +(s)1203 940 MS ( )1222 940 MS (d)1237 940 MS (e)1262 940 MS ( )1284 940 MS (l)1299 940 MS (a)1311 940 MS ( )1333 940 MS (m)1348 940 MS (a)1386 940 MS (t)1408 940 MS (r)1423 940 MS (i)1440 940 MS (c)1453 940 MS (e)1475 940 MS ( )1497 940 MS +(\340)1511 940 MS ( )1533 940 MS (u)1547 940 MS (n)1573 940 MS ( )1597 940 MS (p)1611 940 MS (r)1636 940 MS (o)1653 940 MS (c)1679 940 MS (e)1701 940 MS (s)1723 940 MS (s)1742 940 MS (e)1761 940 MS (u)1783 940 MS (r)1808 940 MS (.)1825 940 MS +( )1838 940 MS (D)1852 940 MS (e)1888 940 MS ( )1910 940 MS (p)1924 940 MS (l)1949 940 MS (u)1961 940 MS (s)1987 940 MS (,)2006 940 MS ( )2019 940 MS (p)2033 940 MS (o)2058 940 MS (u)2084 940 MS (r)2109 940 MS ( )2125 940 MS +(p)235 997 MS (e)260 997 MS (r)282 997 MS (m)300 997 MS (e)337 997 MS (t)359 997 MS (t)374 997 MS (r)388 997 MS (e)405 997 MS ( )427 997 MS (u)440 997 MS (n)465 997 MS ( )489 997 MS (t)502 997 MS (r)517 997 MS (a)534 997 MS +(n)556 997 MS (s)580 997 MS (f)600 997 MS (e)615 997 MS (r)637 997 MS (t)654 997 MS ( )669 997 MS (o)682 997 MS (p)708 997 MS (t)732 997 MS (i)747 997 MS (m)760 997 MS (a)798 997 MS (l)821 997 MS ( )834 997 MS (d)847 997 MS +(e)872 997 MS (s)894 997 MS ( )913 997 MS (d)926 997 MS (o)951 997 MS (n)977 997 MS (n)1002 997 MS (\351)1026 997 MS (e)1049 997 MS (s)1071 997 MS ( )1090 997 MS (p)1103 997 MS (a)1128 997 MS (r)1150 997 MS (a)1167 997 MS (l)1190 997 MS +(l)1204 997 MS (\350)1217 997 MS (l)1240 997 MS (e)1254 997 MS (s)1276 997 MS ( )1295 997 MS (d)1308 997 MS (\222)1333 997 MS (u)1349 997 MS (n)1375 997 MS ( )1399 997 MS (c)1412 997 MS (o)1434 997 MS (m)1461 997 MS (p)1498 997 MS (o)1523 997 MS +(s)1549 997 MS (a)1568 997 MS (n)1591 997 MS (t)1615 997 MS ( )1630 997 MS (\340)1643 997 MS ( )1665 997 MS (u)1678 997 MS (n)1703 997 MS ( )1727 997 MS (a)1740 997 MS (u)1762 997 MS (t)1787 997 MS (r)1802 997 MS (e)1819 997 MS ( )1841 997 MS +(l)1855 997 MS (o)1867 997 MS (r)1893 997 MS (s)1910 997 MS (q)1929 997 MS (u)1954 997 MS (e)1979 997 MS ( )2001 997 MS (c)2014 997 MS (e)2036 997 MS (u)2058 997 MS (x)2083 997 MS +(-)2107 997 MS +(c)235 1055 MS (i)258 1055 MS +( )270 1055 MS (s)287 1055 MS (e)306 1055 MS ( )328 1055 MS (t)345 1055 MS (r)360 1055 MS (o)377 1055 MS (u)403 1055 MS (v)428 1055 MS (e)452 1055 MS (n)474 1055 MS (t)498 1055 MS ( )513 1055 MS (d)530 1055 MS (a)555 1055 MS (n)577 1055 MS +(s)601 1055 MS ( )620 1055 MS (d)637 1055 MS (e)662 1055 MS (s)684 1055 MS ( )703 1055 MS (c)720 1055 MS (o)742 1055 MS (n)768 1055 MS (t)792 1055 MS (a)807 1055 MS (i)830 1055 MS (n)843 1055 MS (e)867 1055 MS (r)889 1055 MS (s)906 1055 MS +( )925 1055 MS (d)942 1055 MS (i)968 1055 MS (f)982 1055 MS (f)998 1055 MS (\351)1014 1055 MS (r)1036 1055 MS (e)1053 1055 MS (n)1076 1055 MS (t)1100 1055 MS (s)1115 1055 MS ( )1134 1055 MS (e)1151 1055 MS (t)1173 1055 MS ( )1188 1055 MS (s)1205 1055 MS +(u)1224 1055 MS (i)1249 1055 MS (v)1262 1055 MS (a)1287 1055 MS (n)1310 1055 MS (t)1334 1055 MS ( )1349 1055 MS (u)1366 1055 MS (n)1391 1055 MS ( )1415 1055 MS (n)1432 1055 MS (o)1456 1055 MS (m)1483 1055 MS (b)1521 1055 MS (r)1545 1055 MS (e)1562 1055 MS +( )1584 1055 MS (d)1601 1055 MS (e)1626 1055 MS ( )1648 1055 MS (p)1665 1055 MS (r)1690 1055 MS (o)1707 1055 MS (c)1733 1055 MS (e)1755 1055 MS (s)1777 1055 MS (s)1796 1055 MS (u)1815 1055 MS (s)1840 1055 MS ( )1859 1055 MS (d)1876 1055 MS (i)1902 1055 MS +(f)1915 1055 MS (f)1932 1055 MS (\351)1948 1055 MS (r)1970 1055 MS (e)1987 1055 MS (n)2010 1055 MS (t)2034 1055 MS (s)2049 1055 MS (,)2068 1055 MS ( )2081 1055 MS (i)2098 1055 MS (l)2111 1055 MS ( )2125 1055 MS +(e)235 1112 MS (s)257 1112 MS (t)276 1112 MS ( )291 1112 MS (n)304 1112 MS (\351)328 1112 MS (c)350 1112 MS (e)372 1112 MS (s)395 1112 MS (s)414 1112 MS (a)433 1112 MS (i)456 1112 MS (r)469 1112 MS (e)486 1112 MS ( )508 1112 MS (d)521 1112 MS +(\222)547 1112 MS (i)564 1112 MS (m)578 1112 MS (p)616 1112 MS (l)642 1112 MS (\351)655 1112 MS (m)678 1112 MS (e)716 1112 MS (n)739 1112 MS (t)763 1112 MS (e)778 1112 MS (r)800 1112 MS ( )817 1112 MS (u)830 1112 MS (n)855 1112 MS (e)879 1112 MS +( )901 1112 MS (f)915 1112 MS (o)930 1112 MS (n)956 1112 MS (c)981 1112 MS (t)1003 1112 MS (i)1018 1112 MS (o)1030 1112 MS (n)1056 1112 MS ( )1080 1112 MS (n)1094 1112 MS (c)1119 1112 MS (s)1141 1112 MS (r)1160 1112 MS (m)1178 1112 MS (a)1216 1112 MS +(t)1238 1112 MS (\()1253 1112 MS (s)1270 1112 MS (t)1289 1112 MS (a)1304 1112 MS (r)1326 1112 MS (t)1342 1112 MS (,)1356 1112 MS (e)1369 1112 MS (n)1391 1112 MS (d)1415 1112 MS (\))1440 1112 MS ( )1457 1112 MS (q)1470 1112 MS (u)1495 1112 MS (i)1521 1112 MS +( )1533 1112 MS (r)1546 1112 MS (e)1563 1112 MS (n)1586 1112 MS (v)1611 1112 MS (o)1635 1112 MS (i)1662 1112 MS (e)1674 1112 MS ( )1696 1112 MS (u)1709 1112 MS (n)1735 1112 MS (e)1759 1112 MS ( )1781 1112 MS (p)1794 1112 MS (a)1820 1112 MS (r)1842 1112 MS +(t)1859 1112 MS (i)1874 1112 MS (e)1886 1112 MS ( )1908 1112 MS (s)1922 1112 MS (e)1941 1112 MS (u)1963 1112 MS (l)1989 1112 MS (e)2002 1112 MS (m)2025 1112 MS (e)2063 1112 MS (n)2086 1112 MS (t)2110 1112 MS ( )2125 1112 MS +(d)235 1170 MS (e)260 1170 MS (s)282 1170 MS ( )301 1170 MS (d)314 1170 MS (o)339 1170 MS (n)365 1170 MS (n)389 1170 MS (\351)413 1170 MS (e)436 1170 MS (s)458 1170 MS ( )477 1170 MS (l)491 1170 MS (o)503 1170 MS (c)529 1170 MS (a)551 1170 MS +(l)574 1170 MS (e)587 1170 MS (s)609 1170 MS ( )628 1170 MS (d)641 1170 MS (e)666 1170 MS ( )688 1170 MS (l)702 1170 MS (a)715 1170 MS ( )737 1170 MS (m)751 1170 MS (a)788 1170 MS (t)810 1170 MS (r)825 1170 MS (i)843 1170 MS (c)855 1170 MS +(e)877 1170 MS ( )899 1170 MS (\340)912 1170 MS ( )934 1170 MS (u)947 1170 MS (n)972 1170 MS ( )996 1170 MS (p)1009 1170 MS (r)1034 1170 MS (o)1051 1170 MS (c)1077 1170 MS (e)1099 1170 MS (s)1121 1170 MS (s)1140 1170 MS (e)1159 1170 MS (u)1181 1170 MS +(r)1206 1170 MS (.)1223 1170 MS +( )1236 1170 MS +( )348 1227 MS +(L)235 1285 MS (\222)265 1285 MS (i)282 1285 MS (m)296 1285 MS (p)334 1285 MS (l)360 1285 MS (\351)373 1285 MS (m)396 1285 MS (e)434 1285 MS (n)457 1285 MS (t)481 1285 MS (a)496 1285 MS (t)518 1285 MS (i)533 1285 MS (o)545 1285 MS (n)571 1285 MS +( )595 1285 MS +(d)615 1285 MS (u)640 1285 MS ( )666 1285 MS (c)686 1285 MS (o)708 1285 MS (m)735 1285 MS (p)772 1285 MS (o)797 1285 MS (s)823 1285 MS (a)842 1285 MS (n)865 1285 MS (t)889 1285 MS ( )904 1285 MS (m)925 1285 MS (a)962 1285 MS (t)984 1285 MS +(r)999 1285 MS (i)1016 1285 MS (c)1029 1285 MS (e)1051 1285 MS ( )1073 1285 MS (N)1093 1285 MS (u)1129 1285 MS (m)1155 1285 MS (e)1193 1285 MS (r)1215 1285 MS (i)1233 1285 MS (c)1247 1285 MS (a)1269 1285 MS (l)1292 1285 MS ( )1305 1285 MS (P)1325 1285 MS +(l)1354 1285 MS (a)1367 1285 MS (t)1389 1285 MS (o)1403 1285 MS (n)1429 1285 MS ( )1453 1285 MS (e)1473 1285 MS (s)1496 1285 MS (t)1515 1285 MS ( )1530 1285 MS (r)1550 1285 MS (e)1567 1285 MS (p)1589 1285 MS (r)1614 1285 MS (\351)1631 1285 MS (s)1653 1285 MS +(e)1672 1285 MS (n)1694 1285 MS (t)1718 1285 MS (a)1733 1285 MS (t)1755 1285 MS (i)1770 1285 MS (v)1783 1285 MS (e)1807 1285 MS ( )1830 1285 MS (d)1850 1285 MS (\222)1875 1285 MS (u)1891 1285 MS (n)1917 1285 MS ( )1942 1285 MS (c)1962 1285 MS (o)1984 1285 MS +(d)2010 1285 MS (e)2035 1285 MS ( )2057 1285 MS (d)2077 1285 MS (e)2102 1285 MS ( )2125 1285 MS +(c)235 1342 MS (a)257 1342 MS (l)280 1342 MS (c)292 1342 MS (u)314 1342 MS (l)340 1342 MS ( )353 1342 MS (q)375 1342 MS (u)400 1342 MS (i)426 1342 MS ( )439 1342 MS (g)461 1342 MS (\351)487 1342 MS (n)510 1342 MS (\350)534 1342 MS (r)556 1342 MS +(e)573 1342 MS ( )595 1342 MS (u)617 1342 MS (n)643 1342 MS ( )667 1342 MS (o)689 1342 MS (b)715 1342 MS (j)740 1342 MS (e)753 1342 MS (t)775 1342 MS ( )790 1342 MS (d)812 1342 MS (e)837 1342 MS ( )859 1342 MS (t)881 1342 MS (y)896 1342 MS +(p)919 1342 MS (e)944 1342 MS ( )966 1342 MS (m)989 1342 MS (a)1027 1342 MS (t)1049 1342 MS (r)1064 1342 MS (i)1082 1342 MS (c)1094 1342 MS (e)1116 1342 MS ( )1138 1342 MS (p)1160 1342 MS (a)1185 1342 MS (r)1207 1342 MS (a)1224 1342 MS (l)1247 1342 MS +(l)1261 1342 MS (\350)1274 1342 MS (l)1297 1342 MS (e)1310 1342 MS (.)1332 1342 MS ( )1345 1342 MS (I)1367 1342 MS (l)1385 1342 MS ( )1397 1342 MS (d)1419 1342 MS (o)1444 1342 MS (i)1471 1342 MS (t)1483 1342 MS ( )1498 1342 MS (d)1520 1342 MS (o)1545 1342 MS +(n)1571 1342 MS (c)1595 1342 MS ( )1617 1342 MS (d)1639 1342 MS (\351)1664 1342 MS (f)1687 1342 MS (i)1703 1342 MS (n)1716 1342 MS (i)1742 1342 MS (r)1755 1342 MS ( )1772 1342 MS (u)1794 1342 MS (n)1820 1342 MS (e)1844 1342 MS ( )1866 1342 MS (f)1889 1342 MS +(o)1904 1342 MS (n)1930 1342 MS (c)1955 1342 MS (t)1977 1342 MS (i)1992 1342 MS (o)2004 1342 MS (n)2030 1342 MS ( )2054 1342 MS (d)2076 1342 MS (e)2102 1342 MS ( )2125 1342 MS +(l)235 1400 MS (e)248 1400 MS (c)270 1400 MS (t)292 1400 MS (u)307 1400 MS (r)332 1400 MS (e)349 1400 MS ( )371 1400 MS (d)388 1400 MS (\222)413 1400 MS (u)429 1400 MS (n)455 1400 MS (e)479 1400 MS ( )502 1400 MS (m)520 1400 MS (a)558 1400 MS +(t)580 1400 MS (r)595 1400 MS (i)612 1400 MS (c)624 1400 MS (e)647 1400 MS ( )669 1400 MS (d)686 1400 MS (e)711 1400 MS (p)733 1400 MS (u)758 1400 MS (i)784 1400 MS (s)797 1400 MS ( )817 1400 MS (u)834 1400 MS (n)860 1400 MS ( )884 1400 MS +(f)902 1400 MS (i)919 1400 MS (c)932 1400 MS (h)955 1400 MS (i)980 1400 MS (e)993 1400 MS (r)1015 1400 MS +( )1032 1400 MS +(:)1045 1400 MS ( )1059 1400 MS (R)1076 1400 MS (e)1109 1400 MS (a)1131 1400 MS (d)1153 1400 MS (D)1178 1400 MS (a)1214 1400 MS (t)1236 1400 MS (a)1251 1400 MS (F)1273 1400 MS (r)1300 1400 MS (o)1317 1400 MS (m)1344 1400 MS (F)1381 1400 MS (i)1409 1400 MS +(l)1423 1400 MS (e)1436 1400 MS (\()1458 1400 MS (\))1475 1400 MS (,)1492 1400 MS ( )1505 1400 MS (d)1522 1400 MS (\222)1547 1400 MS (\351)1563 1400 MS (c)1586 1400 MS (r)1608 1400 MS (i)1626 1400 MS (t)1638 1400 MS (u)1653 1400 MS (r)1678 1400 MS (e)1695 1400 MS +( )1717 1400 MS (d)1734 1400 MS (\222)1759 1400 MS (u)1775 1400 MS (n)1801 1400 MS (e)1825 1400 MS ( )1847 1400 MS (m)1865 1400 MS (a)1903 1400 MS (t)1925 1400 MS (r)1940 1400 MS (i)1958 1400 MS (c)1970 1400 MS (e)1992 1400 MS ( )2015 1400 MS (d)2032 1400 MS +(a)2057 1400 MS (n)2080 1400 MS (s)2105 1400 MS ( )2125 1400 MS +(u)235 1457 MS (n)260 1457 MS ( )284 1457 MS +(f)303 1457 MS (i)320 1457 MS (c)333 1457 MS (h)356 1457 MS (i)381 1457 MS (e)394 1457 MS (r)416 1457 MS +( )433 1457 MS +(:)446 1457 MS ( )460 1457 MS (S)478 1457 MS (a)506 1457 MS (v)528 1457 MS (e)552 1457 MS (D)574 1457 MS (a)611 1457 MS (t)633 1457 MS (a)648 1457 MS (T)670 1457 MS (o)700 1457 MS (F)726 1457 MS (i)754 1457 MS (l)767 1457 MS (e)780 1457 MS +(\()802 1457 MS (\))819 1457 MS (,)836 1457 MS ( )849 1457 MS (u)867 1457 MS (n)892 1457 MS (e)916 1457 MS ( )938 1457 MS (f)957 1457 MS (o)972 1457 MS (n)999 1457 MS (c)1023 1457 MS (t)1045 1457 MS (i)1061 1457 MS (o)1073 1457 MS (n)1099 1457 MS +( )1123 1457 MS (q)1141 1457 MS (u)1166 1457 MS (i)1192 1457 MS ( )1205 1457 MS (r)1223 1457 MS (e)1241 1457 MS (n)1263 1457 MS (v)1288 1457 MS (o)1312 1457 MS (i)1339 1457 MS (e)1351 1457 MS ( )1373 1457 MS (u)1391 1457 MS (n)1417 1457 MS (e)1442 1457 MS +( )1464 1457 MS (r)1482 1457 MS (\351)1499 1457 MS (f)1522 1457 MS (\351)1537 1457 MS (r)1559 1457 MS (e)1576 1457 MS (n)1599 1457 MS (c)1624 1457 MS (e)1646 1457 MS ( )1668 1457 MS (C)1686 1457 MS (O)1719 1457 MS (R)1756 1457 MS (B)1789 1457 MS (A)1823 1457 MS +( )1858 1457 MS (s)1877 1457 MS (u)1896 1457 MS (r)1921 1457 MS ( )1938 1457 MS (u)1956 1457 MS (n)1982 1457 MS ( )2006 1457 MS (o)2024 1457 MS (b)2050 1457 MS (j)2075 1457 MS (e)2088 1457 MS (t)2110 1457 MS ( )2125 1457 MS +(m)235 1515 MS (a)273 1515 MS (t)295 1515 MS (r)310 1515 MS (i)328 1515 MS (c)340 1515 MS (e)362 1515 MS ( )384 1515 MS (p)397 1515 MS (a)422 1515 MS (r)444 1515 MS (a)461 1515 MS (l)484 1515 MS (l)497 1515 MS (\350)510 1515 MS (l)533 1515 MS +(e)546 1515 MS ( )568 1515 MS (d)581 1515 MS (m)607 1515 MS (a)645 1515 MS (t)667 1515 MS (\()682 1515 MS (\))699 1515 MS (,)716 1515 MS ( )728 1515 MS (a)741 1515 MS (i)763 1515 MS (n)776 1515 MS (s)801 1515 MS (i)821 1515 MS ( )833 1515 MS +(q)846 1515 MS (u)871 1515 MS (e)896 1515 MS ( )918 1515 MS (s)931 1515 MS (o)950 1515 MS (n)976 1515 MS ( )1000 1515 MS (\351)1013 1515 MS (q)1035 1515 MS (u)1060 1515 MS (i)1086 1515 MS (v)1099 1515 MS (a)1124 1515 MS (l)1147 1515 MS (e)1160 1515 MS +(n)1183 1515 MS (t)1207 1515 MS ( )1222 1515 MS (e)1235 1515 MS (n)1257 1515 MS ( )1281 1515 MS (a)1294 1515 MS (s)1316 1515 MS (y)1336 1515 MS (n)1360 1515 MS (c)1385 1515 MS (h)1408 1515 MS (r)1432 1515 MS (o)1449 1515 MS (n)1475 1515 MS (e)1499 1515 MS +( )1521 1515 MS +(:)1534 1515 MS ( )1548 1515 MS (g)1561 1515 MS (e)1586 1515 MS (t)1608 1515 MS (_)1623 1515 MS (d)1648 1515 MS (m)1673 1515 MS (a)1710 1515 MS (t)1732 1515 MS (\()1747 1515 MS (\))1764 1515 MS (.)1781 1515 MS +( )1794 1515 MS +[42 0 0 -42 0 0]/Courier MF +( )235 1562 MS +(#)235 1609 MS (i)260 1609 MS (f)285 1609 MS (n)310 1609 MS (d)335 1609 MS (e)360 1609 MS (f)385 1609 MS ( )410 1609 MS (_)435 1609 MS (N)460 1609 MS (P)485 1609 MS (M)510 1609 MS (A)535 1609 MS (T)560 1609 MS (C)585 1609 MS (O)610 1609 MS +(M)635 1609 MS (P)660 1609 MS (O)685 1609 MS (N)710 1609 MS (E)735 1609 MS (N)760 1609 MS (T)785 1609 MS (_)810 1609 MS +( )835 1609 MS +(#)235 1657 MS (d)260 1657 MS (e)285 1657 MS (f)310 1657 MS (i)335 1657 MS (n)360 1657 MS (e)385 1657 MS ( )410 1657 MS (_)435 1657 MS (N)460 1657 MS (P)485 1657 MS (M)510 1657 MS (A)535 1657 MS (T)560 1657 MS (C)585 1657 MS (O)610 1657 MS +(M)635 1657 MS (P)660 1657 MS (O)685 1657 MS (N)710 1657 MS (E)735 1657 MS (N)760 1657 MS (T)785 1657 MS (_)810 1657 MS +( )835 1657 MS +( )235 1704 MS +(#)235 1751 MS (i)260 1751 MS (n)285 1751 MS (c)310 1751 MS (l)335 1751 MS (u)360 1751 MS (d)385 1751 MS (e)410 1751 MS ( )435 1751 MS (")460 1751 MS (S)485 1751 MS (A)510 1751 MS (L)535 1751 MS (O)560 1751 MS (M)585 1751 MS (E)610 1751 MS +(c)635 1751 MS (o)660 1751 MS (n)685 1751 MS (f)710 1751 MS (i)735 1751 MS (g)760 1751 MS (.)785 1751 MS (h)810 1751 MS (")835 1751 MS +( )860 1751 MS +(#)235 1798 MS (i)260 1798 MS (n)285 1798 MS (c)310 1798 MS (l)335 1798 MS (u)360 1798 MS (d)385 1798 MS (e)410 1798 MS ( )435 1798 MS (C)460 1798 MS (O)485 1798 MS (R)510 1798 MS (B)535 1798 MS +(A)560 1798 MS (_)585 1798 MS (S)610 1798 MS (E)635 1798 MS (R)660 1798 MS (V)685 1798 MS (E)710 1798 MS (R)735 1798 MS (_)760 1798 MS (H)785 1798 MS (E)810 1798 MS (A)835 1798 MS (D)860 1798 MS (E)885 1798 MS (R)910 1798 MS (\()935 1798 MS +(N)960 1798 MS (P)985 1798 MS (M)1010 1798 MS (a)1035 1798 MS (t)1060 1798 MS (C)1085 1798 MS (o)1110 1798 MS (m)1135 1798 MS (p)1160 1798 MS (o)1185 1798 MS (n)1210 1798 MS (e)1235 1798 MS (n)1260 1798 MS (t)1285 1798 MS (\))1310 1798 MS +( )1335 1798 MS +(#)235 1845 MS (i)260 1845 MS (n)285 1845 MS (c)310 1845 MS (l)335 1845 MS (u)360 1845 MS (d)385 1845 MS (e)410 1845 MS ( )435 1845 MS (")460 1845 MS (S)485 1845 MS (A)510 1845 MS (L)535 1845 MS (O)560 1845 MS (M)585 1845 MS (E)610 1845 MS +(_)635 1845 MS (C)660 1845 MS (o)685 1845 MS (m)710 1845 MS (p)735 1845 MS (o)760 1845 MS (n)785 1845 MS (e)810 1845 MS (n)835 1845 MS (t)860 1845 MS (_)885 1845 MS (i)910 1845 MS (.)935 1845 MS (h)960 1845 MS (x)985 1845 MS (x)1010 1845 MS +(")1035 1845 MS +( )1060 1845 MS +(#)235 1893 MS (i)260 1893 MS (n)285 1893 MS (c)310 1893 MS (l)335 1893 MS (u)360 1893 MS (d)385 1893 MS (e)410 1893 MS ( )435 1893 MS (")460 1893 MS (M)485 1893 MS (P)510 1893 MS (I)535 1893 MS (O)560 1893 MS (b)585 1893 MS (j)610 1893 MS +(e)635 1893 MS (c)660 1893 MS (t)685 1893 MS (_)710 1893 MS (i)735 1893 MS (.)760 1893 MS (h)785 1893 MS (")810 1893 MS +( )835 1893 MS +(#)235 1940 MS (i)260 1940 MS (n)285 1940 MS (c)310 1940 MS (l)335 1940 MS (u)360 1940 MS (d)385 1940 MS (e)410 1940 MS ( )435 1940 MS (")460 1940 MS (n)485 1940 MS (p)510 1940 MS (_)535 1940 MS (m)560 1940 MS (a)585 1940 MS (t)610 1940 MS +(r)635 1940 MS (i)660 1940 MS (x)685 1940 MS (.)710 1940 MS (h)735 1940 MS (h)760 1940 MS (")785 1940 MS +( )810 1940 MS +( )235 1987 MS +(c)235 2034 MS (l)260 2034 MS (a)285 2034 MS (s)310 2034 MS (s)335 2034 MS ( )360 2034 MS (P)385 2034 MS (C)410 2034 MS (S)435 2034 MS (R)460 2034 MS (M)485 2034 MS (a)510 2034 MS (t)535 2034 MS (_)560 2034 MS (i)585 2034 MS (:)610 2034 MS +( )635 2034 MS (p)660 2034 MS (u)685 2034 MS (b)710 2034 MS (l)735 2034 MS (i)760 2034 MS (c)785 2034 MS ( )810 2034 MS (P)835 2034 MS (O)860 2034 MS (A)885 2034 MS (_)910 2034 MS (E)935 2034 MS (n)960 2034 MS (g)985 2034 MS (i)1010 2034 MS +(n)1035 2034 MS (e)1060 2034 MS (s)1085 2034 MS (:)1110 2034 MS (:)1135 2034 MS (P)1160 2034 MS (C)1185 2034 MS (S)1210 2034 MS (R)1235 2034 MS (M)1260 2034 MS (a)1285 2034 MS (t)1310 2034 MS (,)1335 2034 MS ( )1360 2034 MS +( )1385 2034 MS +( )235 2081 MS +( )382 2081 MS +( )530 2081 MS ( )555 2081 MS (p)580 2081 MS (u)605 2081 MS (b)630 2081 MS (l)655 2081 MS (i)680 2081 MS (c)705 2081 MS ( )730 2081 MS (M)755 2081 MS (P)780 2081 MS (I)805 2081 MS (O)830 2081 MS (b)855 2081 MS (j)880 2081 MS (e)905 2081 MS +(c)930 2081 MS (t)955 2081 MS (_)980 2081 MS (i)1005 2081 MS +( )1030 2081 MS +( )235 2129 MS +({)235 2176 MS +( )260 2176 MS +(p)235 2223 MS (u)260 2223 MS (b)285 2223 MS (l)310 2223 MS (i)335 2223 MS (c)360 2223 MS (:)385 2223 MS +( )410 2223 MS +( )235 2270 MS ( )260 2270 MS (/)285 2270 MS (/)310 2270 MS ( )335 2270 MS (C)360 2270 MS (o)385 2270 MS (n)410 2270 MS (s)435 2270 MS (t)460 2270 MS (r)485 2270 MS (u)510 2270 MS (c)535 2270 MS (t)560 2270 MS (o)585 2270 MS (r)610 2270 MS +(s)635 2270 MS +( )660 2270 MS +( )235 2317 MS ( )260 2317 MS (P)285 2317 MS (C)310 2317 MS (S)335 2317 MS (R)360 2317 MS (M)385 2317 MS (a)410 2317 MS (t)435 2317 MS (_)460 2317 MS (i)485 2317 MS (\()510 2317 MS (i)535 2317 MS (n)560 2317 MS (t)585 2317 MS ( )610 2317 MS +(n)635 2317 MS (b)660 2317 MS (p)685 2317 MS (r)710 2317 MS (o)735 2317 MS (c)760 2317 MS (,)785 2317 MS ( )810 2317 MS (i)835 2317 MS (n)860 2317 MS (t)885 2317 MS ( )910 2317 MS (n)935 2317 MS (u)960 2317 MS (m)985 2317 MS (p)1010 2317 MS +(r)1035 2317 MS (o)1060 2317 MS (c)1085 2317 MS (,)1110 2317 MS ( )1135 2317 MS (i)1160 2317 MS (n)1185 2317 MS (t)1210 2317 MS ( )1235 2317 MS +(*)1260 2317 MS (l)1285 2317 MS (i)1310 2317 MS (m)1335 2317 MS (,)1360 2317 MS ( )1385 2317 MS (i)1410 2317 MS (n)1435 2317 MS (t)1460 2317 MS ( )1485 2317 MS (n)1510 2317 MS (b)1535 2317 MS (r)1560 2317 MS (o)1585 2317 MS (w)1610 2317 MS (s)1635 2317 MS +(,)1660 2317 MS ( )1685 2317 MS (i)1710 2317 MS (n)1735 2317 MS (t)1760 2317 MS ( )1785 2317 MS (n)1810 2317 MS (b)1835 2317 MS (c)1860 2317 MS (o)1885 2317 MS (l)1910 2317 MS (s)1935 2317 MS (,)1960 2317 MS ( )1985 2317 MS +(N)235 2365 MS (P)260 2365 MS (_)285 2365 MS (c)310 2365 MS (s)335 2365 MS (r)360 2365 MS ( )385 2365 MS (*)410 2365 MS (c)435 2365 MS (s)460 2365 MS (r)485 2365 MS (\))510 2365 MS ( )535 2365 MS (;)560 2365 MS +( )585 2365 MS +( )235 2412 MS ( )260 2412 MS (/)285 2412 MS (/)310 2412 MS ( )335 2412 MS (D)360 2412 MS (e)385 2412 MS (s)410 2412 MS (t)435 2412 MS (r)460 2412 MS (u)485 2412 MS (c)510 2412 MS (t)535 2412 MS (o)560 2412 MS (r)585 2412 MS +( )610 2412 MS +( )235 2459 MS ( )260 2459 MS (~)285 2459 MS (P)310 2459 MS (C)335 2459 MS (S)360 2459 MS (R)385 2459 MS (M)410 2459 MS (a)435 2459 MS (t)460 2459 MS (_)485 2459 MS (i)510 2459 MS (\()535 2459 MS (\))560 2459 MS ( )585 2459 MS (;)610 2459 MS +( )635 2459 MS +( )235 2506 MS ( )260 2506 MS +( )285 2506 MS +( )235 2553 MS ( )260 2553 MS (E)285 2553 MS (n)310 2553 MS (g)335 2553 MS (i)360 2553 MS (n)385 2553 MS (e)410 2553 MS (s)435 2553 MS (:)460 2553 MS (:)485 2553 MS (C)510 2553 MS (S)535 2553 MS (R)560 2553 MS (M)585 2553 MS (a)610 2553 MS +(t)635 2553 MS (S)660 2553 MS (t)685 2553 MS (r)710 2553 MS (u)735 2553 MS (c)760 2553 MS (t)785 2553 MS (*)810 2553 MS ( )835 2553 MS (c)860 2553 MS (s)885 2553 MS (r)910 2553 MS (m)935 2553 MS (a)960 2553 MS (t)985 2553 MS (\()1010 2553 MS +(\))1035 2553 MS (;)1060 2553 MS +( )1085 2553 MS +( )235 2601 MS ( )260 2601 MS (C)285 2601 MS (O)310 2601 MS (R)335 2601 MS (B)360 2601 MS (A)385 2601 MS (:)410 2601 MS (:)435 2601 MS (U)460 2601 MS (L)485 2601 MS (o)510 2601 MS (n)535 2601 MS (g)560 2601 MS ( )585 2601 MS (N)610 2601 MS +(b)635 2601 MS (R)660 2601 MS (o)685 2601 MS (w)710 2601 MS (s)735 2601 MS (\()760 2601 MS (\))785 2601 MS ( )810 2601 MS ({)835 2601 MS ( )860 2601 MS (r)885 2601 MS (e)910 2601 MS (t)935 2601 MS (u)960 2601 MS (r)985 2601 MS (n)1010 2601 MS +( )1035 2601 MS (\()1060 2601 MS (C)1085 2601 MS (O)1110 2601 MS (R)1135 2601 MS (B)1160 2601 MS (A)1185 2601 MS (:)1210 2601 MS (:)1235 2601 MS (U)1260 2601 MS (L)1285 2601 MS (o)1310 2601 MS (n)1335 2601 MS (g)1360 2601 MS (\))1385 2601 MS (_)1410 2601 MS +(n)1435 2601 MS (b)1460 2601 MS (r)1485 2601 MS (o)1510 2601 MS (w)1535 2601 MS (s)1560 2601 MS (;)1585 2601 MS ( )1610 2601 MS (})1635 2601 MS (;)1660 2601 MS +( )1685 2601 MS +( )235 2648 MS ( )260 2648 MS (C)285 2648 MS (O)310 2648 MS (R)335 2648 MS (B)360 2648 MS (A)385 2648 MS (:)410 2648 MS (:)435 2648 MS (U)460 2648 MS (L)485 2648 MS (o)510 2648 MS (n)535 2648 MS (g)560 2648 MS ( )585 2648 MS (N)610 2648 MS +(b)635 2648 MS (C)660 2648 MS (o)685 2648 MS (l)710 2648 MS (s)735 2648 MS (\()760 2648 MS (\))785 2648 MS ( )810 2648 MS ({)835 2648 MS ( )860 2648 MS (r)885 2648 MS (e)910 2648 MS (t)935 2648 MS (u)960 2648 MS (r)985 2648 MS (n)1010 2648 MS +( )1035 2648 MS (\()1060 2648 MS (C)1085 2648 MS (O)1110 2648 MS (R)1135 2648 MS (B)1160 2648 MS (A)1185 2648 MS (:)1210 2648 MS (:)1235 2648 MS (U)1260 2648 MS (L)1285 2648 MS (o)1310 2648 MS (n)1335 2648 MS (g)1360 2648 MS (\))1385 2648 MS (_)1410 2648 MS +(n)1435 2648 MS (b)1460 2648 MS (c)1485 2648 MS (o)1510 2648 MS (l)1535 2648 MS (s)1560 2648 MS (;)1585 2648 MS ( )1610 2648 MS (})1635 2648 MS (;)1660 2648 MS +( )1685 2648 MS +( )235 2695 MS ( )260 2695 MS (v)285 2695 MS (o)310 2695 MS (i)335 2695 MS (d)360 2695 MS ( )385 2695 MS (L)410 2695 MS (M)435 2695 MS (a)460 2695 MS (t)485 2695 MS (\()510 2695 MS (C)535 2695 MS (O)560 2695 MS (R)585 2695 MS (B)610 2695 MS +(A)635 2695 MS (:)660 2695 MS (:)685 2695 MS (U)710 2695 MS (L)735 2695 MS (o)760 2695 MS +(n)785 2695 MS (g)810 2695 MS (&)835 2695 MS ( )860 2695 MS (s)885 2695 MS (t)910 2695 MS (a)935 2695 MS (r)960 2695 MS (t)985 2695 MS (,)1010 2695 MS ( )1035 2695 MS (C)1060 2695 MS (O)1085 2695 MS (R)1110 2695 MS (B)1135 2695 MS (A)1160 2695 MS +(:)1185 2695 MS (:)1210 2695 MS (U)1235 2695 MS (L)1260 2695 MS (o)1285 2695 MS (n)1310 2695 MS (g)1335 2695 MS (&)1360 2695 MS ( )1385 2695 MS (e)1410 2695 MS (n)1435 2695 MS (d)1460 2695 MS (\))1485 2695 MS ( )1510 2695 MS ({)1535 2695 MS ( )1560 2695 MS +(s)1585 2695 MS (t)1610 2695 MS (a)1635 2695 MS (r)1660 2695 MS (t)1685 2695 MS ( )1710 2695 MS (=)1735 2695 MS ( )1760 2695 MS (_)1785 2695 MS (l)1810 2695 MS (i)1835 2695 MS (m)1860 2695 MS ([)1885 2695 MS (0)1910 2695 MS (])1935 2695 MS (;)1960 2695 MS +( )1985 2695 MS +( )235 2742 MS ( )260 2742 MS ( )285 2742 MS ( )310 2742 MS ( )335 2742 MS ( )360 2742 MS ( )385 2742 MS ( )410 2742 MS ( )435 2742 MS ( )460 2742 MS ( )485 2742 MS ( )510 2742 MS ( )535 2742 MS ( )560 2742 MS ( )585 2742 MS ( )610 2742 MS +( )635 2742 MS ( )660 2742 MS ( )685 2742 MS ( )710 2742 MS ( )735 2742 MS ( )760 2742 MS ( )785 2742 MS ( )810 2742 MS ( )835 2742 MS ( )860 2742 MS ( )885 2742 MS ( )910 2742 MS ( )935 2742 MS ( )960 2742 MS ( )985 2742 MS ( )1010 2742 MS +( )1035 2742 MS ( )1060 2742 MS ( )1085 2742 MS ( )1110 2742 MS ( )1135 2742 MS ( )1160 2742 MS ( )1185 2742 MS ( )1210 2742 MS ( )1235 2742 MS ( )1260 2742 MS ( )1285 2742 MS ( )1310 2742 MS ( )1335 2742 MS ( )1360 2742 MS ( )1385 2742 MS ( )1410 2742 MS +( )1435 2742 MS ( )1460 2742 MS ( )1485 2742 MS ( )1510 2742 MS ( )1535 2742 MS ( )1560 2742 MS (e)1585 2742 MS (n)1610 2742 MS (d)1635 2742 MS ( )1660 2742 MS (=)1685 2742 MS ( )1710 2742 MS (_)1735 2742 MS (l)1760 2742 MS (i)1785 2742 MS (m)1810 2742 MS +([)1835 2742 MS (1)1860 2742 MS (])1885 2742 MS (;)1910 2742 MS ( )1935 2742 MS (})1960 2742 MS (;)1985 2742 MS +( )2010 2742 MS +( )235 2789 MS ( )260 2789 MS (E)285 2789 MS (n)310 2789 MS (g)335 2789 MS (i)360 2789 MS (n)385 2789 MS (e)410 2789 MS (s)435 2789 MS (:)460 2789 MS (:)485 2789 MS (C)510 2789 MS (S)535 2789 MS (R)560 2789 MS (M)585 2789 MS (a)610 2789 MS +(t)635 2789 MS (S)660 2789 MS (t)685 2789 MS (r)710 2789 MS (u)735 2789 MS (c)760 2789 MS (t)785 2789 MS (*)810 2789 MS ( )835 2789 MS (n)860 2789 MS (c)885 2789 MS (s)910 2789 MS (r)935 2789 MS (m)960 2789 MS (a)985 2789 MS (t)1010 2789 MS +(\()1035 2789 MS (C)1060 2789 MS (O)1085 2789 MS (R)1110 2789 MS (B)1135 2789 MS (A)1160 2789 MS (:)1185 2789 MS (:)1210 2789 MS (U)1235 2789 MS (L)1260 2789 MS (o)1285 2789 MS (n)1310 2789 MS (g)1335 2789 MS ( )1360 2789 MS (s)1385 2789 MS (t)1410 2789 MS +(a)1435 2789 MS (r)1460 2789 MS (t)1485 2789 MS (,)1510 2789 MS ( )1535 2789 MS (C)1560 2789 MS (O)1585 2789 MS (R)1610 2789 MS (B)1635 2789 MS (A)1660 2789 MS (:)1685 2789 MS (:)1710 2789 MS (U)1735 2789 MS (L)1760 2789 MS (o)1785 2789 MS (n)1810 2789 MS +(g)1835 2789 MS ( )1860 2789 MS (e)1885 2789 MS (n)1910 2789 MS (d)1935 2789 MS (\))1960 2789 MS (;)1985 2789 MS +( )2010 2789 MS +( )235 2837 MS +( )235 2884 MS (p)260 2884 MS (r)285 2884 MS (o)310 2884 MS (t)335 2884 MS (e)360 2884 MS (c)385 2884 MS (t)410 2884 MS (e)435 2884 MS (d)460 2884 MS (:)485 2884 MS +( )510 2884 MS +( )235 2931 MS ( )260 2931 MS (E)285 2931 MS (n)310 2931 MS (g)335 2931 MS (i)360 2931 MS (n)385 2931 MS (e)410 2931 MS (s)435 2931 MS (:)460 2931 MS (:)485 2931 MS (C)510 2931 MS (S)535 2931 MS (R)560 2931 MS (M)585 2931 MS (a)610 2931 MS +(t)635 2931 MS (S)660 2931 MS (t)685 2931 MS (r)710 2931 MS (u)735 2931 MS (c)760 2931 MS (t)785 2931 MS (_)810 2931 MS (v)835 2931 MS (a)860 2931 MS (r)885 2931 MS ( )910 2931 MS (_)935 2931 MS (c)960 2931 MS (s)985 2931 MS (r)1010 2931 MS +(m)1035 2931 MS (a)1060 2931 MS (t)1085 2931 MS (;)1110 2931 MS +( )1135 2931 MS +( )235 2978 MS ( )260 2978 MS (i)285 2978 MS (n)310 2978 MS (t)335 2978 MS ( )360 2978 MS (_)385 2978 MS (l)410 2978 MS (i)435 2978 MS (m)460 2978 MS ([)485 2978 MS (2)510 2978 MS (])535 2978 MS +(;)560 2978 MS +( )585 2978 MS +( )235 3025 MS ( )260 3025 MS (i)285 3025 MS (n)310 3025 MS (t)335 3025 MS ( )360 3025 MS (_)385 3025 MS (n)410 3025 MS (b)435 3025 MS (r)460 3025 MS (o)485 3025 MS (w)510 3025 MS (s)535 3025 MS (;)560 3025 MS +( )585 3025 MS +( )235 3073 MS ( )260 3073 MS (i)285 3073 MS (n)310 3073 MS (t)335 3073 MS ( )360 3073 MS (_)385 3073 MS (n)410 3073 MS (b)435 3073 MS (c)460 3073 MS (o)485 3073 MS (l)510 3073 MS (s)535 3073 MS (;)560 3073 MS +( )585 3073 MS +( )235 3120 MS ( )260 3120 MS (N)285 3120 MS (P)310 3120 MS (_)335 3120 MS (c)360 3120 MS (s)385 3120 MS (r)410 3120 MS ( )435 3120 MS (*)460 3120 MS (_)485 3120 MS (c)510 3120 MS (s)535 3120 MS (r)560 3120 MS (;)585 3120 MS +( )610 3120 MS +showpage +%%Page: 24 24 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (4)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[42 0 0 -42 0 0]/Courier MF +( )235 517 MS +(})235 565 MS ( )260 565 MS (;)285 565 MS +( )310 565 MS +( )235 612 MS +(c)235 659 MS (l)260 659 MS (a)285 659 MS (s)310 659 MS (s)335 659 MS ( )360 659 MS (N)385 659 MS (P)410 659 MS (M)435 659 MS (a)460 659 MS (t)485 659 MS (C)510 659 MS (o)535 659 MS (m)560 659 MS (p)585 659 MS (o)610 659 MS +(n)635 659 MS (e)660 659 MS (n)685 659 MS (t)710 659 MS (_)735 659 MS (i)760 659 MS (:)785 659 MS ( )810 659 MS (p)835 659 MS (u)860 659 MS (b)885 659 MS (l)910 659 MS (i)935 659 MS (c)960 659 MS ( )985 659 MS (P)1010 659 MS +(O)1035 659 MS (A)1060 659 MS (_)1085 659 MS (E)1110 659 MS (n)1135 659 MS (g)1160 659 MS (i)1185 659 MS (n)1210 659 MS (e)1235 659 MS (s)1260 659 MS (:)1285 659 MS (:)1310 659 MS (N)1335 659 MS (P)1360 659 MS (M)1385 659 MS (a)1410 659 MS +(t)1435 659 MS (C)1460 659 MS (o)1485 659 MS (m)1510 659 MS (p)1535 659 MS (o)1560 659 MS (n)1585 659 MS (e)1610 659 MS (n)1635 659 MS (t)1660 659 MS (,)1685 659 MS +( )1710 659 MS +( )235 706 MS +( )382 706 MS +( )530 706 MS +(p)677 706 MS (u)702 706 MS (b)727 706 MS (l)752 706 MS (i)777 706 MS (c)802 706 MS ( )827 706 MS (E)852 706 MS (n)877 706 MS (g)902 706 MS (i)927 706 MS (n)952 706 MS (e)977 706 MS (s)1002 706 MS (_)1027 706 MS (C)1052 706 MS +(o)1077 706 MS (m)1102 706 MS (p)1127 706 MS (o)1152 706 MS (n)1177 706 MS (e)1202 706 MS (n)1227 706 MS (t)1252 706 MS (_)1277 706 MS (i)1302 706 MS (,)1327 706 MS +( )1352 706 MS +( )235 753 MS +( )382 753 MS +( )530 753 MS +(p)677 753 MS (u)702 753 MS (b)727 753 MS (l)752 753 MS (i)777 753 MS (c)802 753 MS ( )827 753 MS (M)852 753 MS (P)877 753 MS (I)902 753 MS (O)927 753 MS (b)952 753 MS (j)977 753 MS (e)1002 753 MS (c)1027 753 MS (t)1052 753 MS +(_)1077 753 MS (i)1102 753 MS +( )1127 753 MS +( )235 801 MS +({)235 848 MS +( )260 848 MS +(p)235 895 MS (u)260 895 MS (b)285 895 MS (l)310 895 MS (i)335 895 MS (c)360 895 MS (:)385 895 MS +( )410 895 MS +( )235 942 MS ( )260 942 MS (/)285 942 MS (/)310 942 MS ( )335 942 MS (C)360 942 MS (o)385 942 MS (n)410 942 MS (s)435 942 MS (t)460 942 MS (r)485 942 MS (u)510 942 MS (c)535 942 MS (t)560 942 MS (o)585 942 MS (r)610 942 MS +(s)635 942 MS +( )660 942 MS +( )235 989 MS ( )260 989 MS (N)285 989 MS (P)310 989 MS (M)335 989 MS (a)360 989 MS (t)385 989 MS (C)410 989 MS (o)435 989 MS (m)460 989 MS (p)485 989 MS (o)510 989 MS (n)535 989 MS (e)560 989 MS (n)585 989 MS (t)610 989 MS +(_)635 989 MS (i)660 989 MS (\()685 989 MS (\))710 989 MS ( )735 989 MS (;)760 989 MS +( )785 989 MS +( )235 1037 MS ( )260 1037 MS (N)285 1037 MS (P)310 1037 MS (M)335 1037 MS (a)360 1037 MS (t)385 1037 MS (C)410 1037 MS (o)435 1037 MS (m)460 1037 MS (p)485 1037 MS (o)510 1037 MS (n)535 1037 MS (e)560 1037 MS (n)585 1037 MS (t)610 1037 MS +(_)635 1037 MS (i)660 1037 MS (\()685 1037 MS ( )710 1037 MS (i)735 1037 MS (n)760 1037 MS (t)785 1037 MS ( )810 1037 MS (n)835 1037 MS (b)860 1037 MS (p)885 1037 MS (r)910 1037 MS (o)935 1037 MS (c)960 1037 MS (,)985 1037 MS ( )1010 1037 MS +(i)1035 1037 MS (n)1060 1037 MS (t)1085 1037 MS ( )1110 1037 MS (n)1135 1037 MS +(u)1160 1037 MS (m)1185 1037 MS (p)1210 1037 MS (r)1235 1037 MS (o)1260 1037 MS (c)1285 1037 MS (,)1310 1037 MS +( )1335 1037 MS +( )235 1084 MS +( )382 1084 MS +( )530 1084 MS ( )555 1084 MS ( )580 1084 MS ( )605 1084 MS (C)630 1084 MS (O)655 1084 MS (R)680 1084 MS (B)705 1084 MS (A)730 1084 MS (:)755 1084 MS (:)780 1084 MS (O)805 1084 MS (R)830 1084 MS (B)855 1084 MS (_)880 1084 MS (p)905 1084 MS +(t)930 1084 MS (r)955 1084 MS ( )980 1084 MS (o)1005 1084 MS (r)1030 1084 MS (b)1055 1084 MS (,)1080 1084 MS +( )1105 1084 MS +( )235 1131 MS +( )382 1131 MS +( )530 1131 MS ( )555 1131 MS ( )580 1131 MS ( )605 1131 MS (P)630 1131 MS (o)655 1131 MS (r)680 1131 MS (t)705 1131 MS (a)730 1131 MS (b)755 1131 MS (l)780 1131 MS (e)805 1131 MS (S)830 1131 MS (e)855 1131 MS (r)880 1131 MS (v)905 1131 MS +(e)930 1131 MS (r)955 1131 MS (:)980 1131 MS (:)1005 1131 MS (P)1030 1131 MS (O)1055 1131 MS (A)1080 1131 MS (_)1105 1131 MS (p)1130 1131 MS (t)1155 1131 MS (r)1180 1131 MS ( )1205 1131 MS (p)1230 1131 MS (o)1255 1131 MS (a)1280 1131 MS (,)1305 1131 MS +( )1330 1131 MS +( )1355 1131 MS +( )235 1178 MS +( )382 1178 MS +( )530 1178 MS ( )555 1178 MS ( )580 1178 MS ( )605 1178 MS (P)630 1178 MS (o)655 1178 MS (r)680 1178 MS (t)705 1178 MS (a)730 1178 MS (b)755 1178 MS (l)780 1178 MS (e)805 1178 MS (S)830 1178 MS (e)855 1178 MS (r)880 1178 MS (v)905 1178 MS +(e)930 1178 MS (r)955 1178 MS (:)980 1178 MS (:)1005 1178 MS (O)1030 1178 MS (b)1055 1178 MS (j)1080 1178 MS (e)1105 1178 MS (c)1130 1178 MS (t)1155 1178 MS (I)1180 1178 MS (d)1205 1178 MS ( )1230 1178 MS (*)1255 1178 MS ( )1280 1178 MS (c)1305 1178 MS +(o)1330 1178 MS (n)1355 1178 MS (t)1380 1178 MS (I)1405 1178 MS (d)1430 1178 MS (,)1455 1178 MS ( )1480 1178 MS +( )1505 1178 MS +( )235 1225 MS +( )382 1225 MS +( )530 1225 MS ( )555 1225 MS ( )580 1225 MS ( )605 1225 MS (c)630 1225 MS (o)655 1225 MS (n)680 1225 MS (s)705 1225 MS (t)730 1225 MS ( )755 1225 MS (c)780 1225 MS (h)805 1225 MS (a)830 1225 MS (r)855 1225 MS ( )880 1225 MS (*)905 1225 MS +(i)930 1225 MS (n)955 1225 MS (s)980 1225 MS (t)1005 1225 MS (a)1030 1225 MS (n)1055 1225 MS (c)1080 1225 MS (e)1105 1225 MS (N)1130 1225 MS (a)1155 1225 MS (m)1180 1225 MS (e)1205 1225 MS (,)1230 1225 MS +( )1255 1225 MS +( )235 1273 MS +( )382 1273 MS +( )530 1273 MS ( )555 1273 MS ( )580 1273 MS ( )605 1273 MS (c)630 1273 MS (o)655 1273 MS (n)680 1273 MS (s)705 1273 MS (t)730 1273 MS ( )755 1273 MS (c)780 1273 MS (h)805 1273 MS (a)830 1273 MS (r)855 1273 MS ( )880 1273 MS (*)905 1273 MS +(i)930 1273 MS (n)955 1273 MS (t)980 1273 MS (e)1005 1273 MS (r)1030 1273 MS (f)1055 1273 MS (a)1080 1273 MS (c)1105 1273 MS (e)1130 1273 MS (N)1155 1273 MS (a)1180 1273 MS (m)1205 1273 MS (e)1230 1273 MS (\))1255 1273 MS (;)1280 1273 MS +( )1305 1273 MS +( )235 1320 MS ( )260 1320 MS (N)285 1320 MS (P)310 1320 MS (M)335 1320 MS (a)360 1320 MS (t)385 1320 MS (C)410 1320 MS (o)435 1320 MS (m)460 1320 MS (p)485 1320 MS (o)510 1320 MS (n)535 1320 MS (e)560 1320 MS (n)585 1320 MS (t)610 1320 MS +(_)635 1320 MS (i)660 1320 MS (\()685 1320 MS ( )710 1320 MS (i)735 1320 MS (n)760 1320 MS (t)785 1320 MS ( )810 1320 MS (n)835 1320 MS (b)860 1320 MS (p)885 1320 MS (r)910 1320 MS (o)935 1320 MS (c)960 1320 MS (,)985 1320 MS ( )1010 1320 MS +(i)1035 1320 MS (n)1060 1320 MS (t)1085 1320 MS ( )1110 1320 MS (n)1135 1320 MS (u)1160 1320 MS (m)1185 1320 MS (p)1210 1320 MS (r)1235 1320 MS (o)1260 1320 MS (c)1285 1320 MS (,)1310 1320 MS +( )1335 1320 MS +( )235 1367 MS +( )382 1367 MS +( )530 1367 MS ( )555 1367 MS ( )580 1367 MS ( )605 1367 MS (C)630 1367 MS (O)655 1367 MS (R)680 1367 MS (B)705 1367 MS (A)730 1367 MS (:)755 1367 MS (:)780 1367 MS (O)805 1367 MS (R)830 1367 MS (B)855 1367 MS (_)880 1367 MS (p)905 1367 MS +(t)930 1367 MS (r)955 1367 MS ( )980 1367 MS (o)1005 1367 MS (r)1030 1367 MS (b)1055 1367 MS (,)1080 1367 MS +( )1105 1367 MS +( )235 1414 MS +( )382 1414 MS +( )530 1414 MS ( )555 1414 MS ( )580 1414 MS ( )605 1414 MS (P)630 1414 MS +(o)655 1414 MS (r)680 1414 MS (t)705 1414 MS (a)730 1414 MS (b)755 1414 MS (l)780 1414 MS (e)805 1414 MS (S)830 1414 MS (e)855 1414 MS (r)880 1414 MS (v)905 1414 MS (e)930 1414 MS (r)955 1414 MS (:)980 1414 MS (:)1005 1414 MS (P)1030 1414 MS +(O)1055 1414 MS (A)1080 1414 MS (_)1105 1414 MS (p)1130 1414 MS (t)1155 1414 MS (r)1180 1414 MS ( )1205 1414 MS (p)1230 1414 MS (o)1255 1414 MS (a)1280 1414 MS (,)1305 1414 MS ( )1330 1414 MS +( )1355 1414 MS +( )235 1461 MS +( )382 1461 MS +( )530 1461 MS ( )555 1461 MS ( )580 1461 MS ( )605 1461 MS (P)630 1461 MS (o)655 1461 MS (r)680 1461 MS (t)705 1461 MS (a)730 1461 MS (b)755 1461 MS (l)780 1461 MS (e)805 1461 MS (S)830 1461 MS (e)855 1461 MS (r)880 1461 MS (v)905 1461 MS +(e)930 1461 MS (r)955 1461 MS (:)980 1461 MS (:)1005 1461 MS (O)1030 1461 MS (b)1055 1461 MS (j)1080 1461 MS (e)1105 1461 MS (c)1130 1461 MS (t)1155 1461 MS (I)1180 1461 MS (d)1205 1461 MS ( )1230 1461 MS (*)1255 1461 MS ( )1280 1461 MS (c)1305 1461 MS +(o)1330 1461 MS (n)1355 1461 MS (t)1380 1461 MS (I)1405 1461 MS (d)1430 1461 MS (,)1455 1461 MS ( )1480 1461 MS +( )1505 1461 MS +( )235 1509 MS +( )382 1509 MS +( )530 1509 MS ( )555 1509 MS ( )580 1509 MS ( )605 1509 MS (c)630 1509 MS (o)655 1509 MS (n)680 1509 MS (s)705 1509 MS (t)730 1509 MS ( )755 1509 MS (c)780 1509 MS (h)805 1509 MS (a)830 1509 MS (r)855 1509 MS ( )880 1509 MS (*)905 1509 MS +(i)930 1509 MS (n)955 1509 MS (s)980 1509 MS (t)1005 1509 MS (a)1030 1509 MS (n)1055 1509 MS (c)1080 1509 MS (e)1105 1509 MS (N)1130 1509 MS (a)1155 1509 MS (m)1180 1509 MS (e)1205 1509 MS (,)1230 1509 MS +( )1255 1509 MS +( )235 1556 MS +( )382 1556 MS +( )530 1556 MS ( )555 1556 MS ( )580 1556 MS ( )605 1556 MS (c)630 1556 MS (o)655 1556 MS (n)680 1556 MS (s)705 1556 MS (t)730 1556 MS ( )755 1556 MS (c)780 1556 MS (h)805 1556 MS (a)830 1556 MS (r)855 1556 MS ( )880 1556 MS (*)905 1556 MS +(i)930 1556 MS (n)955 1556 MS (t)980 1556 MS (e)1005 1556 MS (r)1030 1556 MS (f)1055 1556 MS (a)1080 1556 MS (c)1105 1556 MS (e)1130 1556 MS (N)1155 1556 MS (a)1180 1556 MS (m)1205 1556 MS (e)1230 1556 MS (,)1255 1556 MS +( )1280 1556 MS +( )235 1603 MS +( )382 1603 MS +( )530 1603 MS ( )555 1603 MS ( )580 1603 MS ( )605 1603 MS (i)630 1603 MS (n)655 1603 MS (t)680 1603 MS ( )705 1603 MS (f)730 1603 MS (l)755 1603 MS (a)780 1603 MS (g)805 1603 MS (\))830 1603 MS (;)855 1603 MS +( )880 1603 MS +( )235 1650 MS ( )260 1650 MS (N)285 1650 MS (P)310 1650 MS (M)335 1650 MS (a)360 1650 MS (t)385 1650 MS (C)410 1650 MS (o)435 1650 MS (m)460 1650 MS (p)485 1650 MS (o)510 1650 MS (n)535 1650 MS (e)560 1650 MS (n)585 1650 MS (t)610 1650 MS +(_)635 1650 MS (i)660 1650 MS (\()685 1650 MS ( )710 1650 MS (i)735 1650 MS (n)760 1650 MS (t)785 1650 MS ( )810 1650 MS (n)835 1650 MS (b)860 1650 MS (p)885 1650 MS (r)910 1650 MS (o)935 1650 MS (c)960 1650 MS (,)985 1650 MS ( )1010 1650 MS +(i)1035 1650 MS (n)1060 1650 MS (t)1085 1650 MS ( )1110 1650 MS (n)1135 1650 MS (u)1160 1650 MS (m)1185 1650 MS (p)1210 1650 MS (r)1235 1650 MS (o)1260 1650 MS (c)1285 1650 MS (,)1310 1650 MS ( )1335 1650 MS (N)1360 1650 MS (P)1385 1650 MS (m)1410 1650 MS +(a)1435 1650 MS (t)1460 1650 MS (r)1485 1650 MS (i)1510 1650 MS (x)1535 1650 MS ( )1560 1650 MS (*)1585 1650 MS (m)1610 1650 MS (a)1635 1650 MS (t)1660 1650 MS (,)1685 1650 MS +( )1710 1650 MS +( )235 1697 MS +( )382 1697 MS +( )530 1697 MS ( )555 1697 MS ( )580 1697 MS ( )605 1697 MS (C)630 1697 MS (O)655 1697 MS (R)680 1697 MS (B)705 1697 MS (A)730 1697 MS (:)755 1697 MS (:)780 1697 MS (O)805 1697 MS (R)830 1697 MS (B)855 1697 MS (_)880 1697 MS (p)905 1697 MS +(t)930 1697 MS (r)955 1697 MS ( )980 1697 MS (o)1005 1697 MS (r)1030 1697 MS (b)1055 1697 MS (,)1080 1697 MS +( )1105 1697 MS +( )235 1745 MS +( )382 1745 MS +( )530 1745 MS ( )555 1745 MS ( )580 1745 MS ( )605 1745 MS +(P)630 1745 MS (o)655 1745 MS (r)680 1745 MS (t)705 1745 MS (a)730 1745 MS (b)755 1745 MS (l)780 1745 MS (e)805 1745 MS (S)830 1745 MS (e)855 1745 MS (r)880 1745 MS +(v)905 1745 MS (e)930 1745 MS (r)955 1745 MS (:)980 1745 MS (:)1005 1745 MS (P)1030 1745 MS (O)1055 1745 MS (A)1080 1745 MS (_)1105 1745 MS (p)1130 1745 MS (t)1155 1745 MS (r)1180 1745 MS ( )1205 1745 MS (p)1230 1745 MS (o)1255 1745 MS (a)1280 1745 MS +(,)1305 1745 MS ( )1330 1745 MS +( )1355 1745 MS +( )235 1792 MS +( )382 1792 MS +( )530 1792 MS ( )555 1792 MS ( )580 1792 MS ( )605 1792 MS (P)630 1792 MS (o)655 1792 MS (r)680 1792 MS (t)705 1792 MS (a)730 1792 MS (b)755 1792 MS (l)780 1792 MS (e)805 1792 MS (S)830 1792 MS (e)855 1792 MS (r)880 1792 MS (v)905 1792 MS +(e)930 1792 MS (r)955 1792 MS (:)980 1792 MS (:)1005 1792 MS (O)1030 1792 MS (b)1055 1792 MS (j)1080 1792 MS (e)1105 1792 MS (c)1130 1792 MS (t)1155 1792 MS (I)1180 1792 MS (d)1205 1792 MS ( )1230 1792 MS (*)1255 1792 MS ( )1280 1792 MS (c)1305 1792 MS +(o)1330 1792 MS (n)1355 1792 MS (t)1380 1792 MS (I)1405 1792 MS (d)1430 1792 MS (,)1455 1792 MS ( )1480 1792 MS +( )1505 1792 MS +( )235 1839 MS +( )382 1839 MS +( )530 1839 MS ( )555 1839 MS ( )580 1839 MS ( )605 1839 MS (c)630 1839 MS (o)655 1839 MS (n)680 1839 MS (s)705 1839 MS (t)730 1839 MS ( )755 1839 MS (c)780 1839 MS (h)805 1839 MS (a)830 1839 MS (r)855 1839 MS ( )880 1839 MS (*)905 1839 MS +(i)930 1839 MS (n)955 1839 MS (s)980 1839 MS (t)1005 1839 MS (a)1030 1839 MS (n)1055 1839 MS (c)1080 1839 MS (e)1105 1839 MS (N)1130 1839 MS (a)1155 1839 MS (m)1180 1839 MS (e)1205 1839 MS (,)1230 1839 MS +( )1255 1839 MS +( )235 1886 MS +( )382 1886 MS +( )530 1886 MS ( )555 1886 MS ( )580 1886 MS ( )605 1886 MS (c)630 1886 MS (o)655 1886 MS (n)680 1886 MS (s)705 1886 MS (t)730 1886 MS ( )755 1886 MS (c)780 1886 MS (h)805 1886 MS (a)830 1886 MS (r)855 1886 MS ( )880 1886 MS (*)905 1886 MS +(i)930 1886 MS (n)955 1886 MS (t)980 1886 MS (e)1005 1886 MS (r)1030 1886 MS (f)1055 1886 MS (a)1080 1886 MS (c)1105 1886 MS (e)1130 1886 MS (N)1155 1886 MS (a)1180 1886 MS (m)1205 1886 MS (e)1230 1886 MS (\))1255 1886 MS (;)1280 1886 MS +( )1305 1886 MS +( )235 1933 MS ( )260 1933 MS (/)285 1933 MS (/)310 1933 MS ( )335 1933 MS (D)360 1933 MS (e)385 1933 MS (s)410 1933 MS (t)435 1933 MS (r)460 1933 MS (u)485 1933 MS (c)510 1933 MS (t)535 1933 MS (o)560 1933 MS (r)585 1933 MS +( )610 1933 MS +( )235 1981 MS ( )260 1981 MS (~)285 1981 MS (N)310 1981 MS (P)335 1981 MS (M)360 1981 MS (a)385 1981 MS (t)410 1981 MS (C)435 1981 MS (o)460 1981 MS (m)485 1981 MS (p)510 1981 MS (o)535 1981 MS (n)560 1981 MS (e)585 1981 MS (n)610 1981 MS +(t)635 1981 MS (_)660 1981 MS (i)685 1981 MS (\()710 1981 MS (\))735 1981 MS ( )760 1981 MS (;)785 1981 MS +( )810 1981 MS +( )235 2028 MS +( )235 2075 MS ( )260 2075 MS (v)285 2075 MS (o)310 2075 MS (i)335 2075 MS (d)360 2075 MS ( )385 2075 MS (S)410 2075 MS (e)435 2075 MS (t)460 2075 MS (F)485 2075 MS (i)510 2075 MS (l)535 2075 MS (e)560 2075 MS (N)585 2075 MS (a)610 2075 MS +(m)635 2075 MS (e)660 2075 MS (\()685 2075 MS (c)710 2075 MS (o)735 2075 MS (n)760 2075 MS (s)785 2075 MS (t)810 2075 MS ( )835 2075 MS (c)860 2075 MS (h)885 2075 MS (a)910 2075 MS (r)935 2075 MS (*)960 2075 MS (f)985 2075 MS (i)1010 2075 MS +(l)1035 2075 MS (e)1060 2075 MS (N)1085 2075 MS (a)1110 2075 MS (m)1135 2075 MS (e)1160 2075 MS (\))1185 2075 MS (;)1210 2075 MS +( )1235 2075 MS +( )235 2122 MS ( )260 2122 MS (v)285 2122 MS (o)310 2122 MS (i)335 2122 MS (d)360 2122 MS ( )385 2122 MS (R)410 2122 MS (e)435 2122 MS (a)460 2122 MS (d)485 2122 MS (D)510 2122 MS (a)535 2122 MS (t)560 2122 MS (a)585 2122 MS (F)610 2122 MS +(r)635 2122 MS (o)660 2122 MS (m)685 2122 MS (F)710 2122 MS (i)735 2122 MS (l)760 2122 MS (e)785 2122 MS (\()810 2122 MS (c)835 2122 MS (o)860 2122 MS (n)885 2122 MS (s)910 2122 MS (t)935 2122 MS ( )960 2122 MS (c)985 2122 MS (h)1010 2122 MS +(a)1035 2122 MS (r)1060 2122 MS (*)1085 2122 MS ( )1110 2122 MS (i)1135 2122 MS (d)1160 2122 MS (_)1185 2122 MS (c)1210 2122 MS (a)1235 2122 MS (l)1260 2122 MS (l)1285 2122 MS (b)1310 2122 MS (a)1335 2122 MS (c)1360 2122 MS (k)1385 2122 MS +(\))1410 2122 MS ( )1435 2122 MS (;)1460 2122 MS +( )1485 2122 MS +( )235 2169 MS ( )260 2169 MS ( )285 2169 MS ( )310 2169 MS +( )335 2169 MS +( )235 2217 MS ( )260 2217 MS (v)285 2217 MS (o)310 2217 MS (i)335 2217 MS (d)360 2217 MS ( )385 2217 MS (S)410 2217 MS (a)435 2217 MS (v)460 2217 MS (e)485 2217 MS (D)510 2217 MS (a)535 2217 MS (t)560 2217 MS (a)585 2217 MS (T)610 2217 MS +(o)635 2217 MS (F)660 2217 MS (i)685 2217 MS (l)710 2217 MS (e)735 2217 MS (\()760 2217 MS (c)785 2217 MS (o)810 2217 MS (n)835 2217 MS (s)860 2217 MS (t)885 2217 MS ( )910 2217 MS (c)935 2217 MS (h)960 2217 MS (a)985 2217 MS (r)1010 2217 MS +(*)1035 2217 MS ( )1060 2217 MS (i)1085 2217 MS (d)1110 2217 MS (_)1135 2217 MS (c)1160 2217 MS (a)1185 2217 MS (l)1210 2217 MS (l)1235 2217 MS (b)1260 2217 MS (a)1285 2217 MS (c)1310 2217 MS (k)1335 2217 MS (\))1360 2217 MS ( )1385 2217 MS (;)1410 2217 MS +( )1435 2217 MS +( )235 2264 MS ( )260 2264 MS +( )285 2264 MS +( )235 2311 MS ( )260 2311 MS +(N)285 2311 MS (P)310 2311 MS (m)335 2311 MS (a)360 2311 MS (t)385 2311 MS (r)410 2311 MS (i)435 2311 MS (x)460 2311 MS ( )485 2311 MS (*)510 2311 MS (G)535 2311 MS (e)560 2311 MS (t)585 2311 MS (D)610 2311 MS (a)635 2311 MS (t)660 2311 MS +(a)685 2311 MS (\()710 2311 MS ( )735 2311 MS (v)760 2311 MS (o)785 2311 MS (i)810 2311 MS (d)835 2311 MS ( )860 2311 MS (\))885 2311 MS (;)910 2311 MS +( )935 2311 MS +( )235 2358 MS ( )260 2358 MS (E)285 2358 MS (n)310 2358 MS (g)335 2358 MS (i)360 2358 MS (n)385 2358 MS (e)410 2358 MS (s)435 2358 MS (:)460 2358 MS (:)485 2358 MS (P)510 2358 MS (C)535 2358 MS (S)560 2358 MS (R)585 2358 MS (M)610 2358 MS +(a)635 2358 MS (t)660 2358 MS (_)685 2358 MS (p)710 2358 MS (t)735 2358 MS (r)760 2358 MS ( )785 2358 MS (d)810 2358 MS (m)835 2358 MS (a)860 2358 MS (t)885 2358 MS (\()910 2358 MS (\))935 2358 MS (;)960 2358 MS +( )985 2358 MS +( )235 2405 MS ( )260 2405 MS (v)285 2405 MS (o)310 2405 MS (i)335 2405 MS (d)360 2405 MS ( )385 2405 MS (g)410 2405 MS (e)435 2405 MS (t)460 2405 MS (_)485 2405 MS (d)510 2405 MS (m)535 2405 MS (a)560 2405 MS (t)585 2405 MS (\()610 2405 MS +(c)635 2405 MS (o)660 2405 MS (n)685 2405 MS (s)710 2405 MS (t)735 2405 MS ( )760 2405 MS (c)785 2405 MS (h)810 2405 MS (a)835 2405 MS (r)860 2405 MS (*)885 2405 MS ( )910 2405 MS (i)935 2405 MS (d)960 2405 MS (_)985 2405 MS (c)1010 2405 MS +(a)1035 2405 MS (l)1060 2405 MS (l)1085 2405 MS (b)1110 2405 MS (a)1135 2405 MS (c)1160 2405 MS (k)1185 2405 MS (\))1210 2405 MS (;)1235 2405 MS +( )1260 2405 MS +( )235 2453 MS +(p)235 2500 MS (r)260 2500 MS (o)285 2500 MS (t)310 2500 MS (e)335 2500 MS (c)360 2500 MS (t)385 2500 MS (e)410 2500 MS (d)435 2500 MS (:)460 2500 MS +( )485 2500 MS +( )235 2547 MS ( )260 2547 MS (/)285 2547 MS (/)310 2547 MS ( )335 2547 MS (f)360 2547 MS (i)385 2547 MS (l)410 2547 MS (e)435 2547 MS (n)460 2547 MS (a)485 2547 MS (m)510 2547 MS (e)535 2547 MS +( )560 2547 MS +( )235 2594 MS ( )260 2594 MS (s)285 2594 MS (t)310 2594 MS (r)335 2594 MS (i)360 2594 MS (n)385 2594 MS (g)410 2594 MS ( )435 2594 MS (_)460 2594 MS (f)485 2594 MS (i)510 2594 MS (l)535 2594 MS (e)560 2594 MS (N)585 2594 MS (a)610 2594 MS +(m)635 2594 MS (e)660 2594 MS (;)685 2594 MS +( )710 2594 MS +( )235 2641 MS ( )260 2641 MS +(/)285 2641 MS (/)310 2641 MS ( )335 2641 MS (N)360 2641 MS (P)385 2641 MS ( )410 2641 MS (m)435 2641 MS (a)460 2641 MS (t)485 2641 MS (r)510 2641 MS (i)535 2641 MS (x)560 2641 MS ( )585 2641 MS (p)610 2641 MS (o)635 2641 MS (i)660 2641 MS +(n)685 2641 MS (t)710 2641 MS (e)735 2641 MS (r)760 2641 MS +( )785 2641 MS +( )235 2689 MS ( )260 2689 MS +(N)285 2689 MS (P)310 2689 MS (m)335 2689 MS (a)360 2689 MS (t)385 2689 MS (r)410 2689 MS (i)435 2689 MS (x)460 2689 MS ( )485 2689 MS (*)510 2689 MS (_)535 2689 MS (m)560 2689 MS (a)585 2689 MS (t)610 2689 MS (;)635 2689 MS +( )660 2689 MS +( )235 2736 MS ( )260 2736 MS (/)285 2736 MS (/)310 2736 MS ( )335 2736 MS (G)360 2736 MS +(e)385 2736 MS (t)410 2736 MS ( )435 2736 MS (L)460 2736 MS (o)485 2736 MS (c)510 2736 MS (a)535 2736 MS (l)560 2736 MS ( )585 2736 MS (D)610 2736 MS (a)635 2736 MS (t)660 2736 MS (a)685 2736 MS +( )710 2736 MS +( )235 2783 MS ( )260 2783 MS (E)285 2783 MS (n)310 2783 MS (g)335 2783 MS (i)360 2783 MS (n)385 2783 MS (e)410 2783 MS (s)435 2783 MS (:)460 2783 MS (:)485 2783 MS (P)510 2783 MS (C)535 2783 MS (S)560 2783 MS (R)585 2783 MS (M)610 2783 MS +(a)635 2783 MS (t)660 2783 MS (_)685 2783 MS (p)710 2783 MS (t)735 2783 MS (r)760 2783 MS ( )785 2783 MS (G)810 2783 MS (e)835 2783 MS (t)860 2783 MS (L)885 2783 MS (o)910 2783 MS (c)935 2783 MS (a)960 2783 MS (l)985 2783 MS (D)1010 2783 MS +(a)1035 2783 MS (t)1060 2783 MS (a)1085 2783 MS (\()1110 2783 MS (v)1135 2783 MS (o)1160 2783 MS (i)1185 2783 MS (d)1210 2783 MS (\))1235 2783 MS (;)1260 2783 MS +( )1285 2783 MS +(})235 2830 MS ( )260 2830 MS (;)285 2830 MS +( )310 2830 MS +( )235 2877 MS +(#)235 2925 MS (e)260 2925 MS (n)285 2925 MS (d)310 2925 MS (i)335 2925 MS (f)360 2925 MS +( )385 2925 MS +( )235 2972 MS +showpage +%%Page: 25 25 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (5)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +(9)310 577 MS (.)338 577 MS (3)352 577 MS +( )380 577 MS +LATENC /_Helvetica-BoldOblique /Helvetica-BoldOblique reencode +[50 0 0 -50 0 0]/_Helvetica-BoldOblique MF +(L)430 577 MS (e)461 577 MS ( )489 577 MS (c)503 577 MS (o)531 577 MS (m)562 577 MS (p)606 577 MS (o)636 577 MS (s)667 577 MS (a)695 577 MS (n)722 577 MS (t)753 577 MS ( )770 577 MS (s)784 577 MS (o)811 577 MS (l)842 577 MS +(v)856 577 MS (e)884 577 MS (u)911 577 MS (r)942 577 MS ( )961 577 MS (e)975 577 MS (t)1003 577 MS ( )1020 577 MS (l)1034 577 MS (a)1048 577 MS ( )1075 577 MS (d)1089 577 MS (o)1119 577 MS (n)1150 577 MS (n)1181 577 MS (\351)1211 577 MS +(e)1239 577 MS ( )1267 577 MS (v)1281 577 MS (e)1309 577 MS (c)1336 577 MS (t)1364 577 MS (e)1381 577 MS (u)1408 577 MS (r)1438 577 MS ( )1457 577 MS (r)1471 577 MS (\351)1490 577 MS (s)1518 577 MS (u)1546 577 MS (l)1577 577 MS (t)1591 577 MS +(a)1608 577 MS (t)1636 577 MS ( )1653 577 MS (p)1666 577 MS (a)1697 577 MS (r)1725 577 MS (a)1744 577 MS (l)1772 577 MS (l)1786 577 MS (\350)1800 577 MS (l)1828 577 MS (e)1842 577 MS +( )1870 577 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 647 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 705 MS (e)378 705 MS ( )400 705 MS (c)416 705 MS (o)438 705 MS (m)464 705 MS (p)501 705 MS (o)526 705 MS (s)552 705 MS (a)571 705 MS (n)594 705 MS (t)618 705 MS ( )633 705 MS (p)649 705 MS (a)674 705 MS (r)696 705 MS +(a)713 705 MS (l)736 705 MS (l)749 705 MS (\350)762 705 MS (l)785 705 MS (e)798 705 MS ( )820 705 MS (s)836 705 MS (o)855 705 MS (l)882 705 MS (v)895 705 MS (e)919 705 MS (u)941 705 MS (r)966 705 MS ( )983 705 MS (N)999 705 MS +(u)1035 705 MS (m)1061 705 MS (e)1099 705 MS (r)1121 705 MS (i)1139 705 MS (c)1151 705 MS (a)1173 705 MS (l)1196 705 MS ( )1209 705 MS (P)1225 705 MS (l)1254 705 MS (a)1267 705 MS (t)1289 705 MS (o)1304 705 MS (n)1330 705 MS ( )1354 705 MS +(e)1369 705 MS (s)1391 705 MS (t)1410 705 MS ( )1425 705 MS (c)1441 705 MS (e)1463 705 MS (n)1485 705 MS (s)1509 705 MS (\351)1528 705 MS ( )1550 705 MS (\352)1566 705 MS (t)1588 705 MS (r)1603 705 MS (e)1620 705 MS ( )1642 705 MS (r)1658 705 MS +(e)1675 705 MS (p)1697 705 MS (r)1722 705 MS (\351)1739 705 MS (s)1761 705 MS (e)1780 705 MS (n)1802 705 MS (t)1826 705 MS (a)1841 705 MS (t)1863 705 MS (i)1878 705 MS (f)1891 705 MS ( )1906 705 MS (d)1922 705 MS (\222)1948 705 MS (u)1964 705 MS +(n)1990 705 MS ( )2014 705 MS (c)2030 705 MS (o)2052 705 MS (d)2078 705 MS (e)2103 705 MS ( )2125 705 MS +(d)235 762 MS (e)260 762 MS ( )282 762 MS (c)295 762 MS (a)317 762 MS (l)340 762 MS (c)352 762 MS (u)374 762 MS (l)400 762 MS ( )413 762 MS (q)426 762 MS (u)451 762 MS (i)477 762 MS ( )489 762 MS (r)502 762 MS (\351)519 762 MS +(s)541 762 MS (o)560 762 MS (u)586 762 MS (d)611 762 MS ( )636 762 MS (u)649 762 MS (n)674 762 MS ( )698 762 MS (s)711 762 MS (y)731 762 MS (s)755 762 MS (t)774 762 MS (\350)789 762 MS (m)812 762 MS (e)849 762 MS ( )871 762 MS +(l)885 762 MS (i)899 762 MS (n)912 762 MS (\351)937 762 MS +(a)959 762 MS (i)982 762 MS (r)994 762 MS (e)1012 762 MS ( )1034 762 MS (e)1047 762 MS (n)1069 762 MS ( )1093 762 MS (p)1106 762 MS (a)1131 762 MS (r)1153 762 MS (a)1170 762 MS (l)1193 762 MS (l)1207 762 MS (\350)1220 762 MS (l)1243 762 MS +(e)1257 762 MS (.)1279 762 MS +( )1292 762 MS +( )348 820 MS +[54 0 0 -54 0 0]/Helvetica-Bold MF +(9)310 930 MS (.)340 930 MS (3)355 930 MS (.)385 930 MS (1)400 930 MS +( )430 930 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[54 0 0 -54 0 0]/_Helvetica-Bold MF +(D)460 930 MS (\351)499 930 MS (f)529 930 MS (i)547 930 MS (n)562 930 MS (i)595 930 MS (t)610 930 MS (i)628 930 MS (o)643 930 MS (n)676 930 MS ( )709 930 MS (d)724 930 MS (e)757 930 MS ( )787 930 MS (l)802 930 MS (\222)817 930 MS +(i)832 930 MS (n)847 930 MS (t)880 930 MS (e)898 930 MS (r)928 930 MS (f)949 930 MS (a)968 930 MS (c)998 930 MS (e)1028 930 MS ( )1058 930 MS (C)1073 930 MS (O)1112 930 MS (R)1154 930 MS (B)1193 930 MS (A)1233 930 MS +( )1271 930 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 1002 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(C)348 1060 MS (e)381 1060 MS ( )403 1060 MS (c)428 1060 MS (o)450 1060 MS (m)476 1060 MS (p)513 1060 MS (o)538 1060 MS (s)564 1060 MS (a)583 1060 MS (n)606 1060 MS (t)630 1060 MS ( )645 1060 MS (p)670 1060 MS (o)694 1060 MS (s)720 1060 MS +(s)739 1060 MS (\350)758 1060 MS (d)780 1060 MS (e)805 1060 MS ( )827 1060 MS (u)852 1060 MS (n)877 1060 MS ( )901 1060 MS (s)926 1060 MS (e)945 1060 MS (r)967 1060 MS (v)985 1060 MS (i)1010 1060 MS (c)1023 1060 MS (e)1045 1060 MS ( )1067 1060 MS +(S)1092 1060 MS (o)1120 1060 MS (l)1146 1060 MS (v)1159 1060 MS (e)1184 1060 MS (\()1206 1060 MS (\))1223 1060 MS ( )1240 1060 MS (q)1265 1060 MS (u)1290 1060 MS (i)1315 1060 MS ( )1327 1060 MS (p)1353 1060 MS (r)1378 1060 MS (e)1395 1060 MS (n)1417 1060 MS +(d)1441 1060 MS ( )1466 1060 MS (e)1491 1060 MS (n)1514 1060 MS ( )1538 1060 MS (e)1563 1060 MS (n)1585 1060 MS (t)1609 1060 MS (r)1624 1060 MS (\351)1641 1060 MS (e)1663 1060 MS ( )1685 1060 MS (u)1710 1060 MS (n)1735 1060 MS (e)1759 1060 MS ( )1781 1060 MS +(d)1806 1060 MS (o)1831 1060 MS (n)1857 1060 MS (n)1882 1060 MS (\351)1906 1060 MS (e)1928 1060 MS ( )1950 1060 MS (m)1976 1060 MS (a)2014 1060 MS (t)2036 1060 MS (r)2051 1060 MS (i)2068 1060 MS (c)2080 1060 MS (e)2102 1060 MS ( )2125 1060 MS +(p)235 1117 MS (a)260 1117 MS (r)282 1117 MS (a)299 1117 MS (l)322 1117 MS (l)335 1117 MS (\350)348 1117 MS (l)371 1117 MS (e)384 1117 MS ( )406 1117 MS (e)419 1117 MS (t)441 1117 MS ( )456 1117 MS (u)469 1117 MS (n)494 1117 MS (e)519 1117 MS +( )541 1117 MS (d)554 1117 MS (o)579 1117 MS (n)605 1117 MS (n)630 1117 MS (\351)654 1117 MS (e)676 1117 MS ( )698 1117 MS (v)712 1117 MS (e)736 1117 MS (c)758 1117 MS (t)780 1117 MS (e)795 1117 MS (u)817 1117 MS (r)842 1117 MS ( )859 1117 MS +(p)872 1117 MS (a)897 1117 MS (r)919 1117 MS (a)936 1117 MS (l)959 1117 MS (l)972 1117 MS (\350)985 1117 MS (l)1008 1117 MS (e)1021 1117 MS (.)1043 1117 MS ( )1056 1117 MS (I)1069 1117 MS (l)1087 1117 MS ( )1100 1117 MS (d)1113 1117 MS (o)1138 1117 MS +(n)1164 1117 MS (n)1189 1117 MS (e)1213 1117 MS ( )1235 1117 MS (e)1249 1117 MS (n)1271 1117 MS ( )1295 1117 MS (s)1309 1117 MS (o)1328 1117 MS (r)1354 1117 MS (t)1370 1117 MS (i)1385 1117 MS (e)1397 1117 MS ( )1419 1117 MS (u)1432 1117 MS (n)1458 1117 MS +(e)1483 1117 MS ( )1505 1117 MS (d)1518 1117 MS (o)1543 1117 MS (n)1569 1117 MS (n)1594 1117 MS (\351)1618 1117 MS (e)1640 1117 MS ( )1662 1117 MS (v)1676 1117 MS (e)1700 1117 MS (c)1723 1117 MS (t)1745 1117 MS (e)1760 1117 MS (u)1782 1117 MS (r)1807 1117 MS +( )1824 1117 MS (p)1837 1117 MS (a)1862 1117 MS (r)1884 1117 MS (a)1901 1117 MS (l)1923 1117 MS (l)1936 1117 MS (\350)1949 1117 MS (l)1972 1117 MS (e)1985 1117 MS (.)2007 1117 MS ( )2020 1117 MS (I)2033 1117 MS (l)2051 1117 MS ( )2064 1117 MS (n)2078 1117 MS +(e)2102 1117 MS ( )2125 1117 MS +(p)235 1175 MS (e)260 1175 MS (u)282 1175 MS (t)307 1175 MS ( )322 1175 MS (d)346 1175 MS (o)370 1175 MS (n)396 1175 MS (c)420 1175 MS ( )442 1175 MS (p)466 1175 MS (a)491 1175 MS (s)514 1175 MS ( )533 1175 MS (\352)557 1175 MS (t)579 1175 MS +(r)594 1175 MS (e)611 1175 MS ( )633 1175 MS (a)657 1175 MS (s)679 1175 MS (y)699 1175 MS (n)723 1175 MS (c)748 1175 MS (h)771 1175 MS (r)795 1175 MS +(o)812 1175 MS (n)838 1175 MS (e)862 1175 MS (.)884 1175 MS ( )897 1175 MS (P)921 1175 MS (o)949 1175 MS (u)975 1175 MS (r)1000 1175 MS ( )1017 1175 MS (q)1041 1175 MS (u)1066 1175 MS (e)1091 1175 MS ( )1113 1175 MS (l)1138 1175 MS (a)1150 1175 MS +( )1173 1175 MS (r)1197 1175 MS (\351)1214 1175 MS (s)1236 1175 MS (o)1256 1175 MS (l)1282 1175 MS (u)1294 1175 MS (t)1319 1175 MS (i)1335 1175 MS (o)1347 1175 MS (n)1373 1175 MS ( )1397 1175 MS (d)1421 1175 MS (u)1446 1175 MS ( )1471 1175 MS (s)1496 1175 MS +(y)1516 1175 MS (s)1540 1175 MS (t)1559 1175 MS (\350)1574 1175 MS (m)1597 1175 MS (e)1634 1175 MS ( )1657 1175 MS (l)1682 1175 MS (i)1696 1175 MS (n)1709 1175 MS (\351)1734 1175 MS (a)1756 1175 MS (i)1779 1175 MS (r)1792 1175 MS (e)1809 1175 MS ( )1831 1175 MS +(s)1856 1175 MS (\222)1875 1175 MS (e)1891 1175 MS (f)1914 1175 MS (f)1931 1175 MS (e)1947 1175 MS (c)1969 1175 MS (t)1991 1175 MS (u)2006 1175 MS (e)2031 1175 MS ( )2053 1175 MS (e)2077 1175 MS (n)2100 1175 MS ( )2125 1175 MS +(p)235 1232 MS (a)260 1232 MS (r)282 1232 MS (a)299 1232 MS (l)322 1232 MS (l)335 1232 MS (\350)348 1232 MS (l)371 1232 MS (e)384 1232 MS (,)406 1232 MS ( )419 1232 MS (i)435 1232 MS (l)448 1232 MS ( )461 1232 MS (e)476 1232 MS (s)499 1232 MS +(t)518 1232 MS ( )533 1232 MS (n)548 1232 MS (\351)572 1232 MS (c)594 1232 MS (e)616 1232 MS (s)639 1232 MS (s)658 1232 MS (a)677 1232 MS (i)700 1232 MS (r)713 1232 MS (e)730 1232 MS ( )752 1232 MS (d)767 1232 MS (e)792 1232 MS ( )814 1232 MS +(d)829 1232 MS (\351)854 1232 MS (f)877 1232 MS (i)894 1232 MS (n)907 1232 MS (i)932 1232 MS (r)945 1232 MS ( )962 1232 MS (u)977 1232 MS (n)1003 1232 MS ( )1027 1232 MS (s)1042 1232 MS (e)1062 1232 MS (c)1084 1232 MS (o)1106 1232 MS (n)1132 1232 MS +(d)1156 1232 MS ( )1181 1232 MS (s)1196 1232 MS (e)1215 1232 MS (r)1237 1232 MS (v)1255 1232 MS (i)1280 1232 MS (c)1293 1232 MS (e)1315 1232 MS ( )1337 1232 MS (a)1352 1232 MS (s)1375 1232 MS (y)1395 1232 MS (n)1419 1232 MS (c)1444 1232 MS (h)1467 1232 MS +(r)1491 1232 MS (o)1508 1232 MS (n)1534 1232 MS (e)1558 1232 MS ( )1580 1232 MS (d)1595 1232 MS (e)1620 1232 MS ( )1642 1232 MS (t)1657 1232 MS (y)1673 1232 MS (p)1696 1232 MS (e)1721 1232 MS ( )1743 1232 MS (\253)1759 1232 MS +( )1783 1232 MS +(o)1796 1232 MS (n)1822 1232 MS (e)1846 1232 MS (w)1868 1232 MS (a)1904 1232 MS (y)1927 1232 MS +( )1950 1232 MS +(\273)1964 1232 MS +( )1988 1232 MS +(:)2001 1232 MS ( )2015 1232 MS (c)2030 1232 MS (\222)2052 1232 MS (e)2068 1232 MS (s)2091 1232 MS (t)2110 1232 MS ( )2125 1232 MS +(l)235 1290 MS (e)248 1290 MS ( )270 1290 MS (s)286 1290 MS (e)305 1290 MS (r)327 1290 MS (v)345 1290 MS (i)370 1290 MS (c)383 1290 MS (e)405 1290 MS ( )427 1290 MS (S)443 1290 MS (P)471 1290 MS (S)499 1290 MS (o)527 1290 MS (l)553 1290 MS +(v)566 1290 MS (e)590 1290 MS (\()612 1290 MS (\))629 1290 MS (.)646 1290 MS ( )659 1290 MS (L)675 1290 MS (e)705 1290 MS ( )727 1290 MS (c)743 1290 MS (l)766 1290 MS (i)779 1290 MS (e)792 1290 MS (n)815 1290 MS (t)839 1290 MS ( )854 1290 MS +(q)870 1290 MS (u)895 1290 MS (i)921 1290 MS ( )933 1290 MS (v)950 1290 MS (e)974 1290 MS (u)996 1290 MS (t)1021 1290 MS ( )1036 1290 MS (i)1052 1290 MS (n)1065 1290 MS (v)1090 1290 MS (o)1114 1290 MS (q)1140 1290 MS (u)1165 1290 MS (e)1190 1290 MS +(r)1212 1290 MS ( )1229 1290 MS (l)1245 1290 MS (e)1258 1290 MS ( )1280 1290 MS (s)1296 1290 MS (e)1315 1290 MS (r)1337 1290 MS (v)1355 1290 MS (i)1380 1290 MS (c)1393 1290 MS (e)1415 1290 MS ( )1437 1290 MS (d)1453 1290 MS (e)1478 1290 MS ( )1500 1290 MS +(r)1516 1290 MS (\351)1533 1290 MS (s)1555 1290 MS (o)1574 1290 MS (l)1601 1290 MS (u)1613 1290 MS (t)1638 1290 MS (i)1654 1290 MS (o)1666 1290 MS (n)1692 1290 MS ( )1716 1290 MS (d)1732 1290 MS (u)1757 1290 MS ( )1782 1290 MS (s)1798 1290 MS (y)1818 1290 MS +(s)1842 1290 MS (t)1861 1290 MS (\350)1876 1290 MS (m)1899 1290 MS (e)1936 1290 MS ( )1958 1290 MS (l)1975 1290 MS (i)1989 1290 MS (n)2002 1290 MS (\351)2027 1290 MS (a)2049 1290 MS (i)2072 1290 MS (r)2085 1290 MS (e)2102 1290 MS ( )2125 1290 MS +(f)235 1347 MS (e)251 1347 MS (r)273 1347 MS +(a)290 1347 MS ( )312 1347 MS (a)330 1347 MS (p)352 1347 MS (p)377 1347 MS (e)402 1347 MS (l)425 1347 MS ( )437 1347 MS (a)455 1347 MS (u)477 1347 MS ( )502 1347 MS (s)520 1347 MS (e)540 1347 MS (r)562 1347 MS (v)579 1347 MS (i)604 1347 MS +(c)617 1347 MS (e)640 1347 MS ( )662 1347 MS (S)680 1347 MS (o)708 1347 MS (l)734 1347 MS (v)747 1347 MS (e)771 1347 MS (\()793 1347 MS (\))810 1347 MS ( )827 1347 MS (s)845 1347 MS (u)864 1347 MS (r)889 1347 MS ( )906 1347 MS (l)925 1347 MS +(e)937 1347 MS ( )959 1347 MS (p)977 1347 MS (r)1002 1347 MS (o)1019 1347 MS (c)1045 1347 MS (e)1067 1347 MS (s)1089 1347 MS (s)1108 1347 MS (u)1127 1347 MS (s)1152 1347 MS ( )1171 1347 MS (0)1189 1347 MS ( )1214 1347 MS (d)1232 1347 MS (u)1257 1347 MS +( )1282 1347 MS (s)1300 1347 MS (e)1319 1347 MS (r)1341 1347 MS (v)1358 1347 MS (e)1382 1347 MS (u)1404 1347 MS (r)1429 1347 MS ( )1446 1347 MS (q)1464 1347 MS (u)1489 1347 MS (i)1515 1347 MS ( )1527 1347 MS (a)1545 1347 MS (b)1568 1347 MS (r)1592 1347 MS +(i)1610 1347 MS (t)1622 1347 MS (e)1637 1347 MS ( )1659 1347 MS (l)1678 1347 MS (e)1690 1347 MS ( )1712 1347 MS (c)1730 1347 MS (o)1752 1347 MS (m)1779 1347 MS (p)1816 1347 MS (o)1841 1347 MS (s)1867 1347 MS (a)1886 1347 MS (n)1909 1347 MS (t)1933 1347 MS +( )1948 1347 MS (s)1966 1347 MS (o)1985 1347 MS (l)2011 1347 MS (v)2023 1347 MS (e)2048 1347 MS (u)2070 1347 MS (r)2095 1347 MS (.)2112 1347 MS ( )2125 1347 MS +(P)235 1405 MS (u)263 1405 MS (i)289 1405 MS (s)301 1405 MS (,)320 1405 MS ( )333 1405 MS (l)352 1405 MS (e)364 1405 MS ( )386 1405 MS (s)405 1405 MS (e)424 1405 MS (r)446 1405 MS (v)464 1405 MS (i)489 1405 MS (c)502 1405 MS (e)524 1405 MS +( )546 1405 MS (S)564 1405 MS (o)592 1405 MS (l)618 1405 MS (v)631 1405 MS (e)655 1405 MS (\()677 1405 MS (\))694 1405 MS ( )711 1405 MS (a)729 1405 MS (c)751 1405 MS (t)773 1405 MS (i)789 1405 MS (v)802 1405 MS (e)826 1405 MS (r)848 1405 MS +(a)865 1405 MS ( )887 1405 MS (l)906 1405 MS (e)919 1405 MS ( )941 1405 MS (s)959 1405 MS (e)978 1405 MS (r)1000 1405 MS (v)1018 1405 MS (i)1043 1405 MS (c)1056 1405 MS (e)1078 1405 MS ( )1100 1405 MS (S)1118 1405 MS (P)1146 1405 MS (S)1174 1405 MS +(o)1202 1405 MS (l)1228 1405 MS (v)1241 1405 MS (e)1265 1405 MS (\()1287 1405 MS (\))1304 1405 MS ( )1321 1405 MS (s)1339 1405 MS (u)1358 1405 MS (r)1383 1405 MS ( )1400 1405 MS (t)1418 1405 MS (o)1432 1405 MS (u)1458 1405 MS (s)1483 1405 MS ( )1502 1405 MS +(l)1520 1405 MS (e)1532 1405 MS (s)1555 1405 MS ( )1574 1405 MS (a)1592 1405 MS (u)1614 1405 MS (t)1639 1405 MS (r)1654 1405 MS (e)1671 1405 MS (s)1693 1405 MS ( )1712 1405 MS (p)1730 1405 MS (r)1755 1405 MS (o)1771 1405 MS (c)1797 1405 MS (e)1819 1405 MS +(s)1841 1405 MS (s)1860 1405 MS (u)1879 1405 MS (s)1904 1405 MS (.)1923 1405 MS ( )1936 1405 MS (D)1954 1405 MS (e)1990 1405 MS ( )2012 1405 MS (c)2030 1405 MS (e)2052 1405 MS (t)2074 1405 MS (t)2089 1405 MS (e)2104 1405 MS ( )2125 1405 MS +(m)235 1462 MS (a)273 1462 MS (n)296 1462 MS (i)321 1462 MS (\350)334 1462 MS (r)356 1462 MS (e)373 1462 MS ( )395 1462 MS (l)409 1462 MS (a)422 1462 MS ( )444 1462 MS (r)457 1462 MS (\351)474 1462 MS (s)496 1462 MS (o)515 1462 MS (l)541 1462 MS +(u)553 1462 MS (t)578 1462 MS (i)594 1462 MS (o)606 1462 MS (n)632 1462 MS ( )656 1462 MS (d)669 1462 MS (u)694 1462 MS ( )719 1462 MS (s)732 1462 MS (y)752 1462 MS (s)776 1462 MS (t)795 1462 MS (\350)810 1462 MS (m)833 1462 MS (e)870 1462 MS +( )892 1462 MS (s)905 1462 MS (e)924 1462 MS (r)946 1462 MS (a)963 1462 MS ( )985 1462 MS (b)999 1462 MS (i)1024 1462 MS (e)1037 1462 MS (n)1060 1462 MS ( )1084 1462 MS (p)1097 1462 MS (a)1122 1462 MS (r)1144 1462 MS (a)1161 1462 MS (l)1184 1462 MS +(l)1197 1462 MS (\351)1210 1462 MS (l)1233 1462 MS (i)1247 1462 MS (s)1260 1462 MS (\351)1280 1462 MS (e)1302 1462 MS (.)1324 1462 MS +( )1337 1462 MS +( )235 1520 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 1567 MS (i)260 1567 MS (f)285 1567 MS (n)310 1567 MS (d)335 1567 MS (e)360 1567 MS (f)385 1567 MS ( )410 1567 MS (_)435 1567 MS (S)460 1567 MS (A)485 1567 MS (L)510 1567 MS (O)535 1567 MS +(M)560 1567 MS (E)585 1567 MS (_)610 1567 MS (N)635 1567 MS (P)660 1567 MS (S)685 1567 MS (O)710 1567 MS (L)735 1567 MS (V)760 1567 MS (E)785 1567 MS (C)810 1567 MS (O)835 1567 MS (M)860 1567 MS (P)885 1567 MS (O)910 1567 MS (N)935 1567 MS +(E)960 1567 MS (N)985 1567 MS (T)1010 1567 MS (_)1035 1567 MS (I)1060 1567 MS (D)1085 1567 MS (L)1110 1567 MS (_)1135 1567 MS +( )1160 1567 MS +(#)235 1614 MS (d)260 1614 MS (e)285 1614 MS (f)310 1614 MS (i)335 1614 MS (n)360 1614 MS (e)385 1614 MS ( )410 1614 MS (_)435 1614 MS (S)460 1614 MS (A)485 1614 MS (L)510 1614 MS (O)535 1614 MS (M)560 1614 MS (E)585 1614 MS (_)610 1614 MS +(N)635 1614 MS (P)660 1614 MS (S)685 1614 MS (O)710 1614 MS (L)735 1614 MS (V)760 1614 MS (E)785 1614 MS (C)810 1614 MS (O)835 1614 MS (M)860 1614 MS (P)885 1614 MS (O)910 1614 MS (N)935 1614 MS (E)960 1614 MS (N)985 1614 MS (T)1010 1614 MS +(_)1035 1614 MS (I)1060 1614 MS (D)1085 1614 MS (L)1110 1614 MS (_)1135 1614 MS +( )1160 1614 MS +( )235 1662 MS +(#)235 1709 MS (i)260 1709 MS (n)285 1709 MS (c)310 1709 MS (l)335 1709 MS (u)360 1709 MS (d)385 1709 MS (e)410 1709 MS ( )435 1709 MS (")460 1709 MS (S)485 1709 MS (A)510 1709 MS (L)535 1709 MS (O)560 1709 MS (M)585 1709 MS (E)610 1709 MS +(_)635 1709 MS (C)660 1709 MS (o)685 1709 MS (m)710 1709 MS (p)735 1709 MS (o)760 1709 MS (n)785 1709 MS (e)810 1709 MS (n)835 1709 MS (t)860 1709 MS (.)885 1709 MS (i)910 1709 MS (d)935 1709 MS (l)960 1709 MS (")985 1709 MS +( )1010 1709 MS +(#)235 1756 MS (i)260 1756 MS (n)285 1756 MS (c)310 1756 MS (l)335 1756 MS (u)360 1756 MS (d)385 1756 MS (e)410 1756 MS ( )435 1756 MS (")460 1756 MS (T)485 1756 MS (y)510 1756 MS (p)535 1756 MS (e)560 1756 MS (D)585 1756 MS (a)610 1756 MS +(t)635 1756 MS (a)660 1756 MS (.)685 1756 MS (i)710 1756 MS (d)735 1756 MS (l)760 1756 MS (")785 1756 MS +( )810 1756 MS +(#)235 1803 MS (i)260 1803 MS (n)285 1803 MS (c)310 1803 MS (l)335 1803 MS (u)360 1803 MS (d)385 1803 MS (e)410 1803 MS ( )435 1803 MS (")460 1803 MS (M)485 1803 MS (P)510 1803 MS (I)535 1803 MS (O)560 1803 MS (b)585 1803 MS (j)610 1803 MS +(e)635 1803 MS (c)660 1803 MS (t)685 1803 MS (.)710 1803 MS (i)735 1803 MS (d)760 1803 MS (l)785 1803 MS (")810 1803 MS +( )835 1803 MS +(#)235 1850 MS (i)260 1850 MS (n)285 1850 MS (c)310 1850 MS (l)335 1850 MS (u)360 1850 MS (d)385 1850 MS (e)410 1850 MS ( )435 1850 MS (")460 1850 MS (N)485 1850 MS (P)510 1850 MS (V)535 1850 MS (e)560 1850 MS (c)585 1850 MS (C)610 1850 MS +(o)635 1850 MS (m)660 1850 MS (p)685 1850 MS (o)710 1850 MS (n)735 1850 MS (e)760 1850 MS (n)785 1850 MS (t)810 1850 MS (.)835 1850 MS (i)860 1850 MS (d)885 1850 MS (l)910 1850 MS (")935 1850 MS +( )960 1850 MS +(#)235 1898 MS (i)260 1898 MS (n)285 1898 MS (c)310 1898 MS (l)335 1898 MS (u)360 1898 MS (d)385 1898 MS (e)410 1898 MS ( )435 1898 MS (")460 1898 MS (N)485 1898 MS (P)510 1898 MS (M)535 1898 MS (a)560 1898 MS (t)585 1898 MS (C)610 1898 MS +(o)635 1898 MS (m)660 1898 MS (p)685 1898 MS (o)710 1898 MS (n)735 1898 MS (e)760 1898 MS (n)785 1898 MS (t)810 1898 MS (.)835 1898 MS (i)860 1898 MS (d)885 1898 MS (l)910 1898 MS (")935 1898 MS +( )960 1898 MS +( )235 1945 MS +(m)235 1992 MS (o)260 1992 MS (d)285 1992 MS (u)310 1992 MS (l)335 1992 MS (e)360 1992 MS ( )385 1992 MS (E)410 1992 MS (n)435 1992 MS (g)460 1992 MS (i)485 1992 MS (n)510 1992 MS (e)535 1992 MS (s)560 1992 MS +( )585 1992 MS +({)235 2039 MS +( )260 2039 MS +( )235 2086 MS ( )260 2086 MS (i)285 2086 MS (n)310 2086 MS (t)335 2086 MS (e)360 2086 MS (r)385 2086 MS (f)410 2086 MS (a)435 2086 MS (c)460 2086 MS (e)485 2086 MS ( )510 2086 MS (N)535 2086 MS (P)560 2086 MS (S)585 2086 MS (o)610 2086 MS +(l)635 2086 MS (v)660 2086 MS (e)685 2086 MS (C)710 2086 MS (o)735 2086 MS (m)760 2086 MS (p)785 2086 MS (o)810 2086 MS (n)835 2086 MS (e)860 2086 MS (n)885 2086 MS (t)910 2086 MS (:)935 2086 MS (C)960 2086 MS (o)985 2086 MS (m)1010 2086 MS +(p)1035 2086 MS +(o)1060 2086 MS (n)1085 2086 MS (e)1110 2086 MS (n)1135 2086 MS (t)1160 2086 MS (,)1185 2086 MS (M)1210 2086 MS (P)1235 2086 MS (I)1260 2086 MS (O)1285 2086 MS (b)1310 2086 MS (j)1335 2086 MS (e)1360 2086 MS (c)1385 2086 MS (t)1410 2086 MS +( )1435 2086 MS +( )235 2134 MS ( )260 2134 MS ({)285 2134 MS +( )310 2134 MS +( )235 2181 MS ( )260 2181 MS ( )285 2181 MS ( )310 2181 MS (v)335 2181 MS (o)360 2181 MS (i)385 2181 MS (d)410 2181 MS ( )435 2181 MS (S)460 2181 MS (o)485 2181 MS (l)510 2181 MS (v)535 2181 MS (e)560 2181 MS (\()585 2181 MS ( )610 2181 MS +(i)635 2181 MS (n)660 2181 MS ( )685 2181 MS (P)710 2181 MS (C)735 2181 MS (S)760 2181 MS (R)785 2181 MS (M)810 2181 MS (a)835 2181 MS (t)860 2181 MS ( )885 2181 MS (A)910 2181 MS (,)935 2181 MS ( )960 2181 MS (i)985 2181 MS (n)1010 2181 MS +( )1035 2181 MS (P)1060 2181 MS (V)1085 2181 MS (e)1110 2181 MS (c)1135 2181 MS ( )1160 2181 MS (b)1185 2181 MS (,)1210 2181 MS ( )1235 2181 MS (o)1260 2181 MS (u)1285 2181 MS (t)1310 2181 MS ( )1335 2181 MS (P)1360 2181 MS (V)1385 2181 MS (e)1410 2181 MS +(c)1435 2181 MS ( )1460 2181 MS (x)1485 2181 MS ( )1510 2181 MS (\))1535 2181 MS (;)1560 2181 MS +( )1585 2181 MS +( )235 2228 MS ( )260 2228 MS ( )285 2228 MS ( )310 2228 MS (o)335 2228 MS (n)360 2228 MS (e)385 2228 MS (w)410 2228 MS (a)435 2228 MS (y)460 2228 MS ( )485 2228 MS (v)510 2228 MS (o)535 2228 MS (i)560 2228 MS (d)585 2228 MS ( )610 2228 MS +(S)635 2228 MS (P)660 2228 MS (S)685 2228 MS (o)710 2228 MS (l)735 2228 MS (v)760 2228 MS (e)785 2228 MS (\()810 2228 MS ( )835 2228 MS (i)860 2228 MS (n)885 2228 MS ( )910 2228 MS (P)935 2228 MS (C)960 2228 MS (S)985 2228 MS (R)1010 2228 MS +(M)1035 2228 MS (a)1060 2228 MS (t)1085 2228 MS ( )1110 2228 MS (A)1135 2228 MS (,)1160 2228 MS ( )1185 2228 MS (i)1210 2228 MS (n)1235 2228 MS ( )1260 2228 MS (P)1285 2228 MS (V)1310 2228 MS (e)1335 2228 MS (c)1360 2228 MS ( )1385 2228 MS (b)1410 2228 MS +(,)1435 2228 MS ( )1460 2228 MS (i)1485 2228 MS (n)1510 2228 MS ( )1535 2228 MS (s)1560 2228 MS (t)1585 2228 MS (r)1610 2228 MS (i)1635 2228 MS (n)1660 2228 MS (g)1685 2228 MS ( )1710 2228 MS (i)1735 2228 MS (d)1760 2228 MS (_)1785 2228 MS (c)1810 2228 MS +(a)1835 2228 MS (l)1860 2228 MS (l)1885 2228 MS (b)1910 2228 MS (a)1935 2228 MS (c)1960 2228 MS (k)1985 2228 MS ( )2010 2228 MS (\))2035 2228 MS (;)2060 2228 MS +( )2085 2228 MS +( )235 2275 MS ( )260 2275 MS +(})285 2275 MS ( )310 2275 MS (;)335 2275 MS +( )360 2275 MS +(})235 2322 MS ( )260 2322 MS (;)285 2322 MS +( )310 2322 MS +( )235 2370 MS +(#)235 2417 MS (e)260 2417 MS (n)285 2417 MS (d)310 2417 MS (i)335 2417 MS (f)360 2417 MS +( )385 2417 MS +( )235 2464 MS +( )235 2511 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )235 2568 MS +showpage +%%Page: 26 26 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (6)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[54 0 0 -54 0 0]/Helvetica-Bold MF +(9)310 580 MS (.)340 580 MS (3)355 580 MS (.)385 580 MS (2)400 580 MS +( )430 580 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[54 0 0 -54 0 0]/_Helvetica-Bold MF +(D)460 580 MS (\351)499 580 MS (f)529 580 MS (i)547 580 MS (n)562 580 MS (i)595 580 MS (t)610 580 MS (i)628 580 MS (o)643 580 MS (n)676 580 MS ( )709 580 MS (d)724 580 MS (e)757 580 MS ( )787 580 MS (l)802 580 MS (\222)817 580 MS +(i)832 580 MS (m)848 580 MS (p)895 580 MS (l)928 580 MS (\351)944 580 MS (m)975 580 MS (e)1022 580 MS (n)1052 580 MS (t)1085 580 MS (a)1103 580 MS (t)1133 580 MS (i)1151 580 MS (o)1166 580 MS (n)1199 580 MS +( )1232 580 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 652 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 710 MS (\222)378 710 MS (i)395 710 MS (m)409 710 MS (p)447 710 MS (l)473 710 MS (\351)486 710 MS (m)509 710 MS (e)547 710 MS (n)570 710 MS (t)594 710 MS (a)609 710 MS (t)631 710 MS (i)646 710 MS (o)658 710 MS (n)684 710 MS +( )708 710 MS (d)721 710 MS (u)746 710 MS ( )771 710 MS (c)784 710 MS (o)806 710 MS (m)833 710 MS (p)870 710 MS (o)895 710 MS (s)921 710 MS (a)940 710 MS (n)962 710 MS (t)986 710 MS ( )1001 710 MS (s)1014 710 MS (o)1033 710 MS +(l)1059 710 MS (v)1072 710 MS (e)1096 710 MS (u)1118 710 MS (r)1143 710 MS ( )1160 710 MS (p)1173 710 MS (a)1198 710 MS (r)1220 710 MS (a)1237 710 MS (l)1260 710 MS (l)1274 710 MS (\350)1287 710 MS (l)1310 710 MS (e)1323 710 MS ( )1345 710 MS +(d)1359 710 MS (o)1384 710 MS (i)1410 710 MS (t)1422 710 MS +( )1437 710 MS (d)1450 710 MS (o)1475 710 MS (n)1501 710 MS (c)1525 710 MS ( )1547 710 MS (d)1560 710 MS (\351)1585 710 MS (f)1607 710 MS (i)1623 710 MS (n)1636 710 MS (i)1662 710 MS (r)1675 710 MS ( )1692 710 MS (l)1706 710 MS (e)1719 710 MS +(s)1741 710 MS ( )1760 710 MS (m)1774 710 MS (\351)1812 710 MS (t)1834 710 MS (h)1849 710 MS (o)1873 710 MS (d)1899 710 MS (e)1924 710 MS (s)1946 710 MS ( )1965 710 MS (S)1978 710 MS (o)2006 710 MS (l)2032 710 MS (v)2045 710 MS (e)2069 710 MS +(\()2091 710 MS (\))2108 710 MS ( )2125 710 MS +(e)235 767 MS (t)257 767 MS ( )272 767 MS (S)288 767 MS (P)315 767 MS (S)343 767 MS (o)370 767 MS (l)396 767 MS (v)409 767 MS (e)433 767 MS (\()455 767 MS (\))472 767 MS (.)489 767 MS ( )502 767 MS (C)518 767 MS (o)551 767 MS +(m)577 767 MS (m)615 767 MS (e)653 767 MS ( )675 767 MS (e)691 767 MS (l)714 767 MS (l)728 767 MS (e)741 767 MS (s)763 767 MS ( )782 767 MS (s)799 767 MS (o)818 767 MS (n)844 767 MS (t)868 767 MS ( )883 767 MS (q)899 767 MS +(u)924 767 MS (a)949 767 MS (s)971 767 MS (i)991 767 MS (m)1004 767 MS (e)1042 767 MS (n)1065 767 MS (t)1089 767 MS ( )1104 767 MS (i)1120 767 MS (d)1132 767 MS (e)1157 767 MS (n)1180 767 MS (t)1204 767 MS (i)1220 767 MS (q)1232 767 MS +(u)1258 767 MS (e)1283 767 MS (s)1305 767 MS (,)1324 767 MS ( )1337 767 MS (l)1354 767 MS (a)1366 767 MS ( )1388 767 MS (r)1404 767 MS (\351)1421 767 MS (s)1443 767 MS (o)1462 767 MS (l)1489 767 MS (u)1501 767 MS (t)1526 767 MS (i)1542 767 MS +(o)1554 767 MS (n)1580 767 MS ( )1604 767 MS (d)1620 767 MS (u)1645 767 MS ( )1670 767 MS (s)1686 767 MS (y)1706 767 MS (s)1730 767 MS (t)1749 767 MS (\350)1764 767 MS (m)1787 767 MS (e)1824 767 MS ( )1846 767 MS (l)1863 767 MS (i)1877 767 MS +(n)1890 767 MS (\351)1915 767 MS (a)1937 767 MS (i)1960 767 MS (r)1972 767 MS (e)1990 767 MS ( )2012 767 MS (\340)2028 767 MS ( )2050 767 MS (\351)2066 767 MS (t)2088 767 MS (\351)2103 767 MS ( )2125 767 MS +(f)235 825 MS (a)251 825 MS (c)273 825 MS (t)295 825 MS (o)310 825 MS (r)336 825 MS (i)353 825 MS (s)365 825 MS (\351)384 825 MS (e)406 825 MS ( )428 825 MS (d)441 825 MS (a)466 825 MS (n)489 825 MS (s)513 825 MS ( )532 825 MS +(l)546 825 MS (a)559 825 MS ( )581 825 MS (m)595 825 MS (\351)633 825 MS (t)655 825 MS (h)670 825 MS (o)694 825 MS (d)720 825 MS (e)745 825 MS ( )767 825 MS (L)780 825 MS (S)810 825 MS (o)837 825 MS (l)863 825 MS (v)876 825 MS +(e)901 825 MS (\()923 825 MS (\))940 825 MS (.)957 825 MS +( )970 825 MS +( )235 882 MS +[42 0 0 -42 0 0]/Courier MF +(#)235 930 MS (i)260 930 MS (f)285 930 MS (n)310 930 MS (d)335 930 MS (e)360 930 MS (f)385 930 MS ( )410 930 MS (_)435 930 MS (_)460 930 MS (N)485 930 MS (P)510 930 MS (S)535 930 MS (O)560 930 MS (L)585 930 MS (V)610 930 MS +(E)635 930 MS (C)660 930 MS (O)685 930 MS (M)710 930 MS (P)735 930 MS (O)760 930 MS (N)785 930 MS (E)810 930 MS (N)835 930 MS (T)860 930 MS (_)885 930 MS (_)910 930 MS +( )935 930 MS +(#)235 977 MS (d)260 977 MS (e)285 977 MS (f)310 977 MS (i)335 977 MS (n)360 977 MS (e)385 977 MS ( )410 977 MS (_)435 977 MS (_)460 977 MS (N)485 977 MS (P)510 977 MS (S)535 977 MS (O)560 977 MS (L)585 977 MS (V)610 977 MS +(E)635 977 MS (C)660 977 MS (O)685 977 MS (M)710 977 MS (P)735 977 MS (O)760 977 MS (N)785 977 MS (E)810 977 MS (N)835 977 MS (T)860 977 MS (_)885 977 MS (_)910 977 MS +( )935 977 MS +( )235 1024 MS +(#)235 1071 MS (i)260 1071 MS (n)285 1071 MS (c)310 1071 MS (l)335 1071 MS (u)360 1071 MS (d)385 1071 MS (e)410 1071 MS ( )435 1071 MS (")460 1071 MS (S)485 1071 MS (A)510 1071 MS (L)535 1071 MS (O)560 1071 MS (M)585 1071 MS (E)610 1071 MS +(c)635 1071 MS (o)660 1071 MS (n)685 1071 MS (f)710 1071 MS (i)735 1071 MS (g)760 1071 MS (.)785 1071 MS (h)810 1071 MS (")835 1071 MS +( )860 1071 MS +(#)235 1118 MS (i)260 1118 MS (n)285 1118 MS (c)310 1118 MS (l)335 1118 MS +(u)360 1118 MS (d)385 1118 MS (e)410 1118 MS ( )435 1118 MS (C)460 1118 MS (O)485 1118 MS (R)510 1118 MS (B)535 1118 MS (A)560 1118 MS (_)585 1118 MS (S)610 1118 MS (E)635 1118 MS (R)660 1118 MS (V)685 1118 MS (E)710 1118 MS (R)735 1118 MS +(_)760 1118 MS (H)785 1118 MS (E)810 1118 MS (A)835 1118 MS (D)860 1118 MS (E)885 1118 MS (R)910 1118 MS (\()935 1118 MS (N)960 1118 MS (P)985 1118 MS (S)1010 1118 MS (o)1035 1118 MS (l)1060 1118 MS (v)1085 1118 MS (e)1110 1118 MS (C)1135 1118 MS +(o)1160 1118 MS (m)1185 1118 MS (p)1210 1118 MS (o)1235 1118 MS (n)1260 1118 MS (e)1285 1118 MS (n)1310 1118 MS (t)1335 1118 MS (\))1360 1118 MS +( )1385 1118 MS +(#)235 1166 MS (i)260 1166 MS (n)285 1166 MS (c)310 1166 MS (l)335 1166 MS (u)360 1166 MS (d)385 1166 MS (e)410 1166 MS ( )435 1166 MS (")460 1166 MS (M)485 1166 MS (P)510 1166 MS (I)535 1166 MS (O)560 1166 MS (b)585 1166 MS (j)610 1166 MS +(e)635 1166 MS (c)660 1166 MS (t)685 1166 MS (_)710 1166 MS (i)735 1166 MS (.)760 1166 MS (h)785 1166 MS (")810 1166 MS +( )835 1166 MS +(#)235 1213 MS (i)260 1213 MS (n)285 1213 MS (c)310 1213 MS (l)335 1213 MS (u)360 1213 MS (d)385 1213 MS (e)410 1213 MS ( )435 1213 MS (")460 1213 MS (S)485 1213 MS (A)510 1213 MS (L)535 1213 MS (O)560 1213 MS (M)585 1213 MS (E)610 1213 MS +(_)635 1213 MS (C)660 1213 MS (o)685 1213 MS (m)710 1213 MS (p)735 1213 MS (o)760 1213 MS (n)785 1213 MS (e)810 1213 MS (n)835 1213 MS (t)860 1213 MS (_)885 1213 MS (i)910 1213 MS (.)935 1213 MS (h)960 1213 MS (x)985 1213 MS (x)1010 1213 MS +(")1035 1213 MS +( )1060 1213 MS +(#)235 1260 MS (i)260 1260 MS (n)285 1260 MS (c)310 1260 MS (l)335 1260 MS (u)360 1260 MS (d)385 1260 MS (e)410 1260 MS ( )435 1260 MS (")460 1260 MS (n)485 1260 MS (p)510 1260 MS (_)535 1260 MS (v)560 1260 MS (e)585 1260 MS (c)610 1260 MS +(t)635 1260 MS (o)660 1260 MS (r)685 1260 MS (.)710 1260 MS (h)735 1260 MS (h)760 1260 MS (")785 1260 MS +( )810 1260 MS +(#)235 1307 MS (i)260 1307 MS (n)285 1307 MS (c)310 1307 MS (l)335 1307 MS (u)360 1307 MS (d)385 1307 MS (e)410 1307 MS ( )435 1307 MS (")460 1307 MS (n)485 1307 MS (p)510 1307 MS (_)535 1307 MS (m)560 1307 MS (a)585 1307 MS (t)610 1307 MS +(r)635 1307 MS (i)660 1307 MS (x)685 1307 MS (.)710 1307 MS (h)735 1307 MS (h)760 1307 MS (")785 1307 MS +( )810 1307 MS +(#)235 1354 MS (i)260 1354 MS (n)285 1354 MS (c)310 1354 MS (l)335 1354 MS (u)360 1354 MS (d)385 1354 MS (e)410 1354 MS ( )435 1354 MS (")460 1354 MS (n)485 1354 MS (p)510 1354 MS (_)535 1354 MS (p)560 1354 MS (r)585 1354 MS (e)610 1354 MS +(c)635 1354 MS (o)660 1354 MS (n)685 1354 MS (d)710 1354 MS (.)735 1354 MS (h)760 1354 MS (h)785 1354 MS (")810 1354 MS +( )835 1354 MS +(#)235 1402 MS (i)260 1402 MS (n)285 1402 MS (c)310 1402 MS (l)335 1402 MS (u)360 1402 MS (d)385 1402 MS (e)410 1402 MS ( )435 1402 MS (")460 1402 MS (n)485 1402 MS (p)510 1402 MS (_)535 1402 MS (s)560 1402 MS (o)585 1402 MS (l)610 1402 MS +(v)635 1402 MS (e)660 1402 MS (r)685 1402 MS (.)710 1402 MS (h)735 1402 MS (h)760 1402 MS (")785 1402 MS +( )810 1402 MS +( )235 1449 MS +(c)235 1496 MS (l)260 1496 MS (a)285 1496 MS (s)310 1496 MS (s)335 1496 MS ( )360 1496 MS (N)385 1496 MS (P)410 1496 MS (S)435 1496 MS (o)460 1496 MS (l)485 1496 MS (v)510 1496 MS (e)535 1496 MS (C)560 1496 MS (o)585 1496 MS (m)610 1496 MS +(p)635 1496 MS (o)660 1496 MS (n)685 1496 MS (e)710 1496 MS (n)735 1496 MS (t)760 1496 MS (_)785 1496 MS (i)810 1496 MS ( )835 1496 MS (:)860 1496 MS ( )885 1496 MS (p)910 1496 MS (u)935 1496 MS (b)960 1496 MS (l)985 1496 MS (i)1010 1496 MS +(c)1035 1496 MS ( )1060 1496 MS (P)1085 1496 MS (O)1110 1496 MS (A)1135 1496 MS (_)1160 1496 MS (E)1185 1496 MS (n)1210 1496 MS (g)1235 1496 MS (i)1260 1496 MS (n)1285 1496 MS (e)1310 1496 MS (s)1335 1496 MS (:)1360 1496 MS (:)1385 1496 MS (N)1410 1496 MS +(P)1435 1496 MS (S)1460 1496 MS (o)1485 1496 MS (l)1510 1496 MS (v)1535 1496 MS (e)1560 1496 MS (C)1585 1496 MS (o)1610 1496 MS (m)1635 1496 MS +(p)1660 1496 MS (o)1685 1496 MS (n)1710 1496 MS (e)1735 1496 MS (n)1760 1496 MS (t)1785 1496 MS (,)1810 1496 MS +( )1835 1496 MS +( )235 1543 MS +( )382 1543 MS +( )530 1543 MS +( )677 1543 MS ( )702 1543 MS ( )727 1543 MS (p)752 1543 MS (u)777 1543 MS (b)802 1543 MS (l)827 1543 MS (i)852 1543 MS (c)877 1543 MS ( )902 1543 MS (E)927 1543 MS (n)952 1543 MS (g)977 1543 MS (i)1002 1543 MS (n)1027 1543 MS (e)1052 1543 MS +(s)1077 1543 MS (_)1102 1543 MS (C)1127 1543 MS (o)1152 1543 MS (m)1177 1543 MS (p)1202 1543 MS (o)1227 1543 MS (n)1252 1543 MS (e)1277 1543 MS (n)1302 1543 MS (t)1327 1543 MS (_)1352 1543 MS (i)1377 1543 MS (,)1402 1543 MS +( )1427 1543 MS +( )235 1590 MS +( )382 1590 MS +( )530 1590 MS +( )677 1590 MS ( )702 1590 MS ( )727 1590 MS (p)752 1590 MS (u)777 1590 MS (b)802 1590 MS (l)827 1590 MS (i)852 1590 MS (c)877 1590 MS ( )902 1590 MS (M)927 1590 MS (P)952 1590 MS (I)977 1590 MS (O)1002 1590 MS (b)1027 1590 MS (j)1052 1590 MS +(e)1077 1590 MS (c)1102 1590 MS (t)1127 1590 MS (_)1152 1590 MS (i)1177 1590 MS +( )1202 1590 MS +({)235 1638 MS +( )260 1638 MS +( )235 1685 MS +( )235 1732 MS (p)260 1732 MS (u)285 1732 MS (b)310 1732 MS (l)335 1732 MS (i)360 1732 MS (c)385 1732 MS (:)410 1732 MS +( )435 1732 MS +( )235 1779 MS ( )260 1779 MS (/)285 1779 MS (/)310 1779 MS ( )335 1779 MS (C)360 1779 MS (o)385 1779 MS (n)410 1779 MS (s)435 1779 MS (t)460 1779 MS (r)485 1779 MS (u)510 1779 MS (c)535 1779 MS (t)560 1779 MS (o)585 1779 MS (r)610 1779 MS +( )635 1779 MS +( )235 1826 MS ( )260 1826 MS (N)285 1826 MS (P)310 1826 MS (S)335 1826 MS (o)360 1826 MS (l)385 1826 MS (v)410 1826 MS (e)435 1826 MS (C)460 1826 MS (o)485 1826 MS (m)510 1826 MS (p)535 1826 MS (o)560 1826 MS (n)585 1826 MS (e)610 1826 MS +(n)635 1826 MS (t)660 1826 MS (_)685 1826 MS (i)710 1826 MS (\()735 1826 MS (\))760 1826 MS (;)785 1826 MS +( )810 1826 MS +( )235 1874 MS ( )260 1874 MS (N)285 1874 MS (P)310 1874 MS (S)335 1874 MS (o)360 1874 MS (l)385 1874 MS (v)410 1874 MS (e)435 1874 MS (C)460 1874 MS (o)485 1874 MS (m)510 1874 MS (p)535 1874 MS (o)560 1874 MS (n)585 1874 MS (e)610 1874 MS +(n)635 1874 MS (t)660 1874 MS (_)685 1874 MS (i)710 1874 MS (\()735 1874 MS ( )760 1874 MS (i)785 1874 MS (n)810 1874 MS (t)835 1874 MS ( )860 1874 MS (n)885 1874 MS (b)910 1874 MS (p)935 1874 MS (r)960 1874 MS (o)985 1874 MS (c)1010 1874 MS +(,)1035 1874 MS ( )1060 1874 MS (i)1085 1874 MS (n)1110 1874 MS (t)1135 1874 MS ( )1160 1874 MS (n)1185 1874 MS (u)1210 1874 MS (m)1235 1874 MS (p)1260 1874 MS (r)1285 1874 MS (o)1310 1874 MS (c)1335 1874 MS (,)1360 1874 MS +( )1385 1874 MS +( )235 1921 MS +( )382 1921 MS +( )530 1921 MS ( )555 1921 MS ( )580 1921 MS ( )605 1921 MS ( )630 1921 MS ( )655 1921 MS (C)680 1921 MS (O)705 1921 MS (R)730 1921 MS (B)755 1921 MS (A)780 1921 MS (:)805 1921 MS (:)830 1921 MS (O)855 1921 MS (R)880 1921 MS (B)905 1921 MS +(_)930 1921 MS (p)955 1921 MS (t)980 1921 MS (r)1005 1921 MS ( )1030 1921 MS (o)1055 1921 MS (r)1080 1921 MS (b)1105 1921 MS (,)1130 1921 MS +( )1155 1921 MS +( )235 1968 MS +( )382 1968 MS +( )530 1968 MS ( )555 1968 MS ( )580 1968 MS ( )605 1968 MS ( )630 1968 MS ( )655 1968 MS (P)680 1968 MS (o)705 1968 MS (r)730 1968 MS (t)755 1968 MS (a)780 1968 MS (b)805 1968 MS (l)830 1968 MS (e)855 1968 MS (S)880 1968 MS (e)905 1968 MS +(r)930 1968 MS (v)955 1968 MS (e)980 1968 MS (r)1005 1968 MS (:)1030 1968 MS (:)1055 1968 MS (P)1080 1968 MS (O)1105 1968 MS (A)1130 1968 MS (_)1155 1968 MS (p)1180 1968 MS (t)1205 1968 MS (r)1230 1968 MS ( )1255 1968 MS (p)1280 1968 MS (o)1305 1968 MS +(a)1330 1968 MS (,)1355 1968 MS ( )1380 1968 MS +( )1405 1968 MS +( )235 2015 MS +( )382 2015 MS +( )530 2015 MS ( )555 2015 MS ( )580 2015 MS ( )605 2015 MS ( )630 2015 MS ( )655 2015 MS (P)680 2015 MS (o)705 2015 MS (r)730 2015 MS (t)755 2015 MS (a)780 2015 MS (b)805 2015 MS (l)830 2015 MS (e)855 2015 MS (S)880 2015 MS (e)905 2015 MS +(r)930 2015 MS (v)955 2015 MS (e)980 2015 MS (r)1005 2015 MS (:)1030 2015 MS +(:)1055 2015 MS (O)1080 2015 MS (b)1105 2015 MS (j)1130 2015 MS (e)1155 2015 MS (c)1180 2015 MS (t)1205 2015 MS (I)1230 2015 MS (d)1255 2015 MS ( )1280 2015 MS (*)1305 2015 MS ( )1330 2015 MS (c)1355 2015 MS (o)1380 2015 MS (n)1405 2015 MS (t)1430 2015 MS +(I)1455 2015 MS (d)1480 2015 MS (,)1505 2015 MS ( )1530 2015 MS +( )1555 2015 MS +( )235 2062 MS +( )382 2062 MS +( )530 2062 MS ( )555 2062 MS ( )580 2062 MS ( )605 2062 MS ( )630 2062 MS ( )655 2062 MS (c)680 2062 MS (o)705 2062 MS (n)730 2062 MS (s)755 2062 MS (t)780 2062 MS ( )805 2062 MS (c)830 2062 MS (h)855 2062 MS (a)880 2062 MS (r)905 2062 MS +( )930 2062 MS (*)955 2062 MS (i)980 2062 MS (n)1005 2062 MS (s)1030 2062 MS (t)1055 2062 MS (a)1080 2062 MS (n)1105 2062 MS (c)1130 2062 MS (e)1155 2062 MS (N)1180 2062 MS (a)1205 2062 MS (m)1230 2062 MS (e)1255 2062 MS (,)1280 2062 MS +( )1305 2062 MS +( )235 2110 MS +( )382 2110 MS +( )530 2110 MS ( )555 2110 MS ( )580 2110 MS ( )605 2110 MS ( )630 2110 MS ( )655 2110 MS (c)680 2110 MS (o)705 2110 MS (n)730 2110 MS (s)755 2110 MS (t)780 2110 MS ( )805 2110 MS (c)830 2110 MS (h)855 2110 MS (a)880 2110 MS (r)905 2110 MS +( )930 2110 MS (*)955 2110 MS (i)980 2110 MS (n)1005 2110 MS (t)1030 2110 MS (e)1055 2110 MS (r)1080 2110 MS (f)1105 2110 MS (a)1130 2110 MS (c)1155 2110 MS (e)1180 2110 MS (N)1205 2110 MS (a)1230 2110 MS (m)1255 2110 MS (e)1280 2110 MS (\))1305 2110 MS +(;)1330 2110 MS +( )1355 2110 MS +( )235 2157 MS ( )260 2157 MS (N)285 2157 MS (P)310 2157 MS (S)335 2157 MS (o)360 2157 MS (l)385 2157 MS (v)410 2157 MS (e)435 2157 MS (C)460 2157 MS (o)485 2157 MS (m)510 2157 MS (p)535 2157 MS (o)560 2157 MS (n)585 2157 MS (e)610 2157 MS +(n)635 2157 MS (t)660 2157 MS (_)685 2157 MS (i)710 2157 MS (\()735 2157 MS ( )760 2157 MS (i)785 2157 MS (n)810 2157 MS (t)835 2157 MS ( )860 2157 MS (n)885 2157 MS (b)910 2157 MS (p)935 2157 MS (r)960 2157 MS (o)985 2157 MS (c)1010 2157 MS +(,)1035 2157 MS ( )1060 2157 MS (i)1085 2157 MS (n)1110 2157 MS (t)1135 2157 MS ( )1160 2157 MS (n)1185 2157 MS (u)1210 2157 MS (m)1235 2157 MS (p)1260 2157 MS (r)1285 2157 MS (o)1310 2157 MS (c)1335 2157 MS (,)1360 2157 MS +( )1385 2157 MS +( )235 2204 MS +( )382 2204 MS +( )530 2204 MS ( )555 2204 MS ( )580 2204 MS ( )605 2204 MS ( )630 2204 MS ( )655 2204 MS (C)680 2204 MS (O)705 2204 MS (R)730 2204 MS (B)755 2204 MS (A)780 2204 MS (:)805 2204 MS (:)830 2204 MS (O)855 2204 MS (R)880 2204 MS (B)905 2204 MS +(_)930 2204 MS (p)955 2204 MS (t)980 2204 MS (r)1005 2204 MS ( )1030 2204 MS (o)1055 2204 MS (r)1080 2204 MS (b)1105 2204 MS (,)1130 2204 MS +( )1155 2204 MS +( )235 2251 MS +( )382 2251 MS +( )530 2251 MS ( )555 2251 MS ( )580 2251 MS ( )605 2251 MS ( )630 2251 MS ( )655 2251 MS (P)680 2251 MS (o)705 2251 MS (r)730 2251 MS (t)755 2251 MS (a)780 2251 MS (b)805 2251 MS (l)830 2251 MS (e)855 2251 MS (S)880 2251 MS (e)905 2251 MS +(r)930 2251 MS (v)955 2251 MS (e)980 2251 MS (r)1005 2251 MS (:)1030 2251 MS (:)1055 2251 MS (P)1080 2251 MS (O)1105 2251 MS (A)1130 2251 MS (_)1155 2251 MS (p)1180 2251 MS (t)1205 2251 MS (r)1230 2251 MS ( )1255 2251 MS (p)1280 2251 MS (o)1305 2251 MS +(a)1330 2251 MS (,)1355 2251 MS ( )1380 2251 MS +( )1405 2251 MS +( )235 2298 MS +( )382 2298 MS +( )530 2298 MS ( )555 2298 MS ( )580 2298 MS ( )605 2298 MS ( )630 2298 MS ( )655 2298 MS (P)680 2298 MS (o)705 2298 MS (r)730 2298 MS (t)755 2298 MS (a)780 2298 MS (b)805 2298 MS (l)830 2298 MS (e)855 2298 MS (S)880 2298 MS (e)905 2298 MS +(r)930 2298 MS (v)955 2298 MS (e)980 2298 MS (r)1005 2298 MS (:)1030 2298 MS (:)1055 2298 MS (O)1080 2298 MS (b)1105 2298 MS (j)1130 2298 MS (e)1155 2298 MS (c)1180 2298 MS (t)1205 2298 MS (I)1230 2298 MS (d)1255 2298 MS ( )1280 2298 MS (*)1305 2298 MS +( )1330 2298 MS (c)1355 2298 MS (o)1380 2298 MS (n)1405 2298 MS (t)1430 2298 MS (I)1455 2298 MS (d)1480 2298 MS (,)1505 2298 MS ( )1530 2298 MS +( )1555 2298 MS +( )235 2346 MS +( )382 2346 MS +( )530 2346 MS ( )555 2346 MS ( )580 2346 MS ( )605 2346 MS ( )630 2346 MS ( )655 2346 MS +(c)680 2346 MS (o)705 2346 MS (n)730 2346 MS (s)755 2346 MS (t)780 2346 MS ( )805 2346 MS (c)830 2346 MS (h)855 2346 MS (a)880 2346 MS (r)905 2346 MS ( )930 2346 MS (*)955 2346 MS (i)980 2346 MS (n)1005 2346 MS (s)1030 2346 MS (t)1055 2346 MS +(a)1080 2346 MS (n)1105 2346 MS (c)1130 2346 MS (e)1155 2346 MS (N)1180 2346 MS (a)1205 2346 MS (m)1230 2346 MS (e)1255 2346 MS (,)1280 2346 MS +( )1305 2346 MS +( )235 2393 MS +( )382 2393 MS +( )530 2393 MS ( )555 2393 MS ( )580 2393 MS ( )605 2393 MS ( )630 2393 MS ( )655 2393 MS (c)680 2393 MS (o)705 2393 MS (n)730 2393 MS (s)755 2393 MS (t)780 2393 MS ( )805 2393 MS (c)830 2393 MS (h)855 2393 MS (a)880 2393 MS (r)905 2393 MS +( )930 2393 MS (*)955 2393 MS (i)980 2393 MS (n)1005 2393 MS (t)1030 2393 MS (e)1055 2393 MS (r)1080 2393 MS (f)1105 2393 MS (a)1130 2393 MS (c)1155 2393 MS (e)1180 2393 MS (N)1205 2393 MS (a)1230 2393 MS (m)1255 2393 MS (e)1280 2393 MS (,)1305 2393 MS +( )1330 2393 MS +( )235 2440 MS +( )382 2440 MS +( )530 2440 MS ( )555 2440 MS ( )580 2440 MS ( )605 2440 MS ( )630 2440 MS ( )655 2440 MS (i)680 2440 MS (n)705 2440 MS (t)730 2440 MS ( )755 2440 MS (f)780 2440 MS (l)805 2440 MS (a)830 2440 MS (g)855 2440 MS (\))880 2440 MS (;)905 2440 MS +( )930 2440 MS +( )235 2487 MS ( )260 2487 MS (/)285 2487 MS (/)310 2487 MS ( )335 2487 MS (D)360 2487 MS (e)385 2487 MS (s)410 2487 MS (t)435 2487 MS (r)460 2487 MS (u)485 2487 MS (c)510 2487 MS (t)535 2487 MS (o)560 2487 MS (r)585 2487 MS +( )610 2487 MS +( )235 2534 MS ( )260 2534 MS (~)285 2534 MS (N)310 2534 MS (P)335 2534 MS (S)360 2534 MS (o)385 2534 MS (l)410 2534 MS (v)435 2534 MS (e)460 2534 MS (C)485 2534 MS (o)510 2534 MS (m)535 2534 MS (p)560 2534 MS (o)585 2534 MS (n)610 2534 MS +(e)635 2534 MS (n)660 2534 MS (t)685 2534 MS (_)710 2534 MS (i)735 2534 MS (\()760 2534 MS (\))785 2534 MS (;)810 2534 MS +( )835 2534 MS +( )235 2582 MS +( )235 2629 MS ( )260 2629 MS (/)285 2629 MS (/)310 2629 MS ( )335 2629 MS (S)360 2629 MS (o)385 2629 MS (l)410 2629 MS (v)435 2629 MS (e)460 2629 MS ( )485 2629 MS (s)510 2629 MS (e)535 2629 MS (r)560 2629 MS (v)585 2629 MS (i)610 2629 MS +(c)635 2629 MS (e)660 2629 MS +( )685 2629 MS +( )235 2676 MS ( )260 2676 MS (v)285 2676 MS (o)310 2676 MS (i)335 2676 MS (d)360 2676 MS ( )385 2676 MS (S)410 2676 MS (o)435 2676 MS (l)460 2676 MS (v)485 2676 MS (e)510 2676 MS (\()535 2676 MS ( )560 2676 MS (E)585 2676 MS (n)610 2676 MS +(g)635 2676 MS (i)660 2676 MS (n)685 2676 MS (e)710 2676 MS (s)735 2676 MS (:)760 2676 MS (:)785 2676 MS (P)810 2676 MS (C)835 2676 MS (S)860 2676 MS (R)885 2676 MS (M)910 2676 MS (a)935 2676 MS (t)960 2676 MS (_)985 2676 MS (p)1010 2676 MS +(t)1035 2676 MS (r)1060 2676 MS ( )1085 2676 MS (A)1110 2676 MS (,)1135 2676 MS ( )1160 2676 MS (E)1185 2676 MS (n)1210 2676 MS (g)1235 2676 MS (i)1260 2676 MS (n)1285 2676 MS (e)1310 2676 MS (s)1335 2676 MS (:)1360 2676 MS (:)1385 2676 MS (P)1410 2676 MS +(V)1435 2676 MS (e)1460 2676 MS (c)1485 2676 MS (_)1510 2676 MS (p)1535 2676 MS (t)1560 2676 MS (r)1585 2676 MS ( )1610 2676 MS (b)1635 2676 MS (,)1660 2676 MS +( )1685 2676 MS +( )235 2723 MS +( )382 2723 MS ( )407 2723 MS ( )432 2723 MS ( )457 2723 MS ( )482 2723 MS ( )507 2723 MS (E)532 2723 MS (n)557 2723 MS (g)582 2723 MS (i)607 2723 MS (n)632 2723 MS (e)657 2723 MS (s)682 2723 MS (:)707 2723 MS (:)732 2723 MS (P)757 2723 MS +(V)782 2723 MS (e)807 2723 MS (c)832 2723 MS (_)857 2723 MS (o)882 2723 MS (u)907 2723 MS (t)932 2723 MS ( )957 2723 MS (x)982 2723 MS ( )1007 2723 MS (\))1032 2723 MS (;)1057 2723 MS +( )1082 2723 MS +( )235 2770 MS ( )260 2770 MS (v)285 2770 MS (o)310 2770 MS (i)335 2770 MS (d)360 2770 MS ( )385 2770 MS (S)410 2770 MS (P)435 2770 MS (S)460 2770 MS (o)485 2770 MS (l)510 2770 MS (v)535 2770 MS (e)560 2770 MS (\()585 2770 MS ( )610 2770 MS +(E)635 2770 MS (n)660 2770 MS (g)685 2770 MS (i)710 2770 MS (n)735 2770 MS (e)760 2770 MS (s)785 2770 MS (:)810 2770 MS (:)835 2770 MS (P)860 2770 MS +(C)885 2770 MS (S)910 2770 MS (R)935 2770 MS (M)960 2770 MS (a)985 2770 MS (t)1010 2770 MS (_)1035 2770 MS (p)1060 2770 MS (t)1085 2770 MS (r)1110 2770 MS ( )1135 2770 MS (A)1160 2770 MS (,)1185 2770 MS ( )1210 2770 MS (E)1235 2770 MS (n)1260 2770 MS +(g)1285 2770 MS (i)1310 2770 MS (n)1335 2770 MS (e)1360 2770 MS (s)1385 2770 MS (:)1410 2770 MS (:)1435 2770 MS (P)1460 2770 MS (V)1485 2770 MS (e)1510 2770 MS (c)1535 2770 MS (_)1560 2770 MS (p)1585 2770 MS (t)1610 2770 MS (r)1635 2770 MS ( )1660 2770 MS +(b)1685 2770 MS (,)1710 2770 MS +( )1735 2770 MS +( )235 2818 MS +( )382 2818 MS +(c)530 2818 MS (o)555 2818 MS (n)580 2818 MS (s)605 2818 MS (t)630 2818 MS ( )655 2818 MS (c)680 2818 MS (h)705 2818 MS (a)730 2818 MS (r)755 2818 MS (*)780 2818 MS ( )805 2818 MS (i)830 2818 MS (d)855 2818 MS (_)880 2818 MS (c)905 2818 MS +(a)930 2818 MS (l)955 2818 MS (l)980 2818 MS (b)1005 2818 MS (a)1030 2818 MS (c)1055 2818 MS (k)1080 2818 MS ( )1105 2818 MS (\))1130 2818 MS (;)1155 2818 MS +( )1180 2818 MS +( )235 2865 MS +( )235 2912 MS ( )260 2912 MS (/)285 2912 MS (/)310 2912 MS ( )335 2912 MS (g)360 2912 MS (e)385 2912 MS (t)410 2912 MS ( )435 2912 MS (N)460 2912 MS (P)485 2912 MS ( )510 2912 MS (v)535 2912 MS (e)560 2912 MS (c)585 2912 MS (t)610 2912 MS +(o)635 2912 MS (r)660 2912 MS ( )685 2912 MS (P)710 2912 MS (o)735 2912 MS (i)760 2912 MS (n)785 2912 MS (t)810 2912 MS (e)835 2912 MS (r)860 2912 MS +( )885 2912 MS +( )235 2959 MS ( )260 2959 MS (N)285 2959 MS (P)310 2959 MS (v)335 2959 MS (e)360 2959 MS (c)385 2959 MS (t)410 2959 MS (o)435 2959 MS (r)460 2959 MS ( )485 2959 MS (*)510 2959 MS (V)535 2959 MS (e)560 2959 MS (c)585 2959 MS (\()610 2959 MS +(v)635 2959 MS (o)660 2959 MS (i)685 2959 MS (d)710 2959 MS (\))735 2959 MS ( )760 2959 MS ({)785 2959 MS ( )810 2959 MS (r)835 2959 MS (e)860 2959 MS (t)885 2959 MS (u)910 2959 MS (r)935 2959 MS (n)960 2959 MS (\()985 2959 MS (_)1010 2959 MS +(x)1035 2959 MS (\))1060 2959 MS (;)1085 2959 MS ( )1110 2959 MS (})1135 2959 MS (;)1160 2959 MS +( )1185 2959 MS +( )235 3006 MS +( )235 3054 MS +(p)260 3054 MS (r)285 3054 MS (i)310 3054 MS (v)335 3054 MS (a)360 3054 MS (t)385 3054 MS (e)410 3054 MS (:)435 3054 MS +( )460 3054 MS +( )235 3101 MS ( )260 3101 MS (N)285 3101 MS (P)310 3101 MS (m)335 3101 MS (a)360 3101 MS (t)385 3101 MS (r)410 3101 MS (i)435 3101 MS (x)460 3101 MS ( )485 3101 MS (*)510 3101 MS (_)535 3101 MS (A)560 3101 MS (;)585 3101 MS +( )610 3101 MS +showpage +%%Page: 27 27 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (7)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[42 0 0 -42 0 0]/Courier MF +( )235 517 MS ( )260 517 MS (N)285 517 MS (P)310 517 MS (v)335 517 MS (e)360 517 MS (c)385 517 MS (t)410 517 MS (o)435 517 MS (r)460 517 MS ( )485 517 MS (*)510 517 MS (_)535 517 MS (b)560 517 MS (;)585 517 MS +( )610 517 MS +( )235 565 MS ( )260 565 MS (N)285 565 MS (P)310 565 MS (v)335 565 MS (e)360 565 MS (c)385 565 MS (t)410 565 MS (o)435 565 MS (r)460 565 MS ( )485 565 MS (*)510 565 MS (_)535 565 MS (x)560 565 MS (;)585 565 MS +( )610 565 MS +( )235 612 MS ( )260 612 MS (i)285 612 MS (n)310 612 MS (t)335 612 MS ( )360 612 MS (_)385 612 MS (l)410 612 MS (i)435 612 MS (m)460 612 MS (x)485 612 MS ([)510 612 MS (2)535 612 MS (])560 612 MS (;)585 612 MS +( )610 612 MS +( )235 659 MS ( )260 659 MS (/)285 659 MS (/)310 659 MS ( )335 659 MS (C)360 659 MS (o)385 659 MS (n)410 659 MS (v)435 659 MS (e)460 659 MS (r)485 659 MS (s)510 659 MS (i)535 659 MS (o)560 659 MS (n)585 659 MS ( )610 659 MS +(d)635 659 MS (e)660 659 MS (s)685 659 MS ( )710 659 MS (e)735 659 MS (n)760 659 MS (t)785 659 MS (r)810 659 MS (e)835 659 MS (e)860 659 MS (s)885 659 MS ( )910 659 MS (d)935 659 MS (e)960 659 MS ( )985 659 MS (l)1010 659 MS +(a)1035 659 MS ( )1060 659 MS (s)1085 659 MS (t)1110 659 MS (r)1135 659 MS (u)1160 659 MS (c)1185 659 MS (t)1210 659 MS (u)1235 659 MS (r)1260 659 MS (e)1285 659 MS ( )1310 659 MS (C)1335 659 MS (O)1360 659 MS (R)1385 659 MS (B)1410 659 MS +(A)1435 659 MS ( )1460 659 MS +( )1485 659 MS +( )235 706 MS ( )260 706 MS (/)285 706 MS (/)310 706 MS ( )335 706 MS (a)360 706 MS ( )385 706 MS (l)410 706 MS (a)435 706 MS ( )460 706 MS (s)485 706 MS (t)510 706 MS (r)535 706 MS (u)560 706 MS (c)585 706 MS (t)610 706 MS +(u)635 706 MS (r)660 706 MS (e)685 706 MS ( )710 706 MS (d)735 706 MS (')760 706 MS (i)785 706 MS (m)810 706 MS (p)835 706 MS (l)860 706 MS (e)885 706 MS (m)910 706 MS (e)935 706 MS (n)960 706 MS (t)985 706 MS (a)1010 706 MS +(t)1035 706 MS (i)1060 706 MS (o)1085 706 MS (n)1110 706 MS +( )1135 706 MS +( )235 753 MS ( )260 753 MS (N)285 753 MS (P)310 753 MS (m)335 753 MS (a)360 753 MS (t)385 753 MS (r)410 753 MS (i)435 753 MS (x)460 753 MS ( )485 753 MS (*)510 753 MS (R)535 753 MS (e)560 753 MS (a)585 753 MS (d)610 753 MS +(N)635 753 MS (P)660 753 MS (M)685 753 MS (a)710 753 MS (t)735 753 MS (r)760 753 MS (i)785 753 MS (x)810 753 MS (\()835 753 MS (E)860 753 MS (n)885 753 MS (g)910 753 MS (i)935 753 MS (n)960 753 MS (e)985 753 MS (s)1010 753 MS +(:)1035 753 MS (:)1060 753 MS (P)1085 753 MS (C)1110 753 MS (S)1135 753 MS (R)1160 753 MS (M)1185 753 MS (a)1210 753 MS (t)1235 753 MS (_)1260 753 MS (p)1285 753 MS (t)1310 753 MS (r)1335 753 MS ( )1360 753 MS (m)1385 753 MS (a)1410 753 MS +(t)1435 753 MS (\))1460 753 MS (;)1485 753 MS +( )1510 753 MS +( )235 801 MS ( )260 801 MS (N)285 801 MS (P)310 801 MS (v)335 801 MS (e)360 801 MS (c)385 801 MS (t)410 801 MS (o)435 801 MS (r)460 801 MS ( )485 801 MS (*)510 801 MS (R)535 801 MS (e)560 801 MS (a)585 801 MS (d)610 801 MS +(N)635 801 MS (P)660 801 MS (V)685 801 MS (e)710 801 MS (c)735 801 MS (t)760 801 MS (o)785 801 MS (r)810 801 MS (\()835 801 MS (E)860 801 MS (n)885 801 MS (g)910 801 MS (i)935 801 MS (n)960 801 MS (e)985 801 MS (s)1010 801 MS +(:)1035 801 MS (:)1060 801 MS (P)1085 801 MS (V)1110 801 MS (e)1135 801 MS (c)1160 801 MS (_)1185 801 MS (p)1210 801 MS (t)1235 801 MS (r)1260 801 MS ( )1285 801 MS (v)1310 801 MS (e)1335 801 MS (c)1360 801 MS (\))1385 801 MS (;)1410 801 MS +( )1435 801 MS +( )235 848 MS ( )260 848 MS (/)285 848 MS (/)310 848 MS ( )335 848 MS (C)360 848 MS (o)385 848 MS (n)410 848 MS (v)435 848 MS (e)460 848 MS (r)485 848 MS (s)510 848 MS (i)535 848 MS (o)560 848 MS (n)585 848 MS ( )610 848 MS +(d)635 848 MS (e)660 848 MS ( )685 848 MS (l)710 848 MS (a)735 848 MS ( )760 848 MS (s)785 848 MS (o)810 848 MS (r)835 848 MS (t)860 848 MS (i)885 848 MS (e)910 848 MS ( )935 848 MS (d)960 848 MS (e)985 848 MS ( )1010 848 MS +(l)1035 848 MS (a)1060 848 MS ( )1085 848 MS (s)1110 848 MS (t)1135 848 MS (r)1160 848 MS (u)1185 848 MS (c)1210 848 MS (t)1235 848 MS (u)1260 848 MS (r)1285 848 MS (e)1310 848 MS ( )1335 848 MS (d)1360 848 MS (')1385 848 MS (i)1410 848 MS +(m)1435 848 MS (p)1460 848 MS (l)1485 848 MS (e)1510 848 MS (m)1535 848 MS (e)1560 848 MS (n)1585 848 MS (t)1610 848 MS (a)1635 848 MS (t)1660 848 MS (i)1685 848 MS (o)1710 848 MS (n)1735 848 MS ( )1760 848 MS +( )1785 848 MS +( )235 895 MS ( )260 895 MS (/)285 895 MS (/)310 895 MS ( )335 895 MS (a)360 895 MS ( )385 895 MS (l)410 895 MS (a)435 895 MS ( )460 895 MS (s)485 895 MS (t)510 895 MS (r)535 895 MS (u)560 895 MS (c)585 895 MS (t)610 895 MS +(u)635 895 MS (r)660 895 MS (e)685 895 MS ( )710 895 MS (C)735 895 MS (O)760 895 MS (R)785 895 MS (B)810 895 MS (A)835 895 MS +( )860 895 MS +( )235 942 MS ( )260 942 MS +(P)285 942 MS (V)310 942 MS (e)335 942 MS (c)360 942 MS (_)385 942 MS (i)410 942 MS ( )435 942 MS (*)460 942 MS (W)485 942 MS (r)510 942 MS (i)535 942 MS (t)560 942 MS (e)585 942 MS (O)610 942 MS (u)635 942 MS (t)660 942 MS +(p)685 942 MS (u)710 942 MS (t)735 942 MS (\()760 942 MS (v)785 942 MS (o)810 942 MS (i)835 942 MS (d)860 942 MS (\))885 942 MS (;)910 942 MS +( )935 942 MS +( )235 989 MS ( )260 989 MS +(/)285 989 MS (/)310 989 MS ( )335 989 MS (A)360 989 MS (f)385 989 MS (f)410 989 MS (i)435 989 MS (c)460 989 MS (h)485 989 MS (a)510 989 MS (g)535 989 MS (e)560 989 MS ( )585 989 MS (d)610 989 MS (u)635 989 MS ( )660 989 MS +(r)685 989 MS (e)710 989 MS (s)735 989 MS (u)760 989 MS (l)785 989 MS (t)810 989 MS (a)835 989 MS (t)860 989 MS ( )885 989 MS (d)910 989 MS (e)935 989 MS ( )960 989 MS (l)985 989 MS (a)1010 989 MS ( )1035 989 MS (r)1060 989 MS +(e)1085 989 MS (s)1110 989 MS (o)1135 989 MS (l)1160 989 MS (u)1185 989 MS (t)1210 989 MS (i)1235 989 MS (o)1260 989 MS (n)1285 989 MS ( )1310 989 MS (d)1335 989 MS (u)1360 989 MS ( )1385 989 MS (s)1410 989 MS (y)1435 989 MS (s)1460 989 MS +(t)1485 989 MS (e)1510 989 MS (m)1535 989 MS (e)1560 989 MS +( )1585 989 MS +( )235 1037 MS ( )260 1037 MS (v)285 1037 MS (o)310 1037 MS (i)335 1037 MS (d)360 1037 MS ( )385 1037 MS (P)410 1037 MS (r)435 1037 MS (i)460 1037 MS (n)485 1037 MS (t)510 1037 MS (R)535 1037 MS (e)560 1037 MS (s)585 1037 MS (u)610 1037 MS +(l)635 1037 MS (t)660 1037 MS (\()685 1037 MS ( )710 1037 MS (N)735 1037 MS (P)760 1037 MS (s)785 1037 MS (o)810 1037 MS (l)835 1037 MS (v)860 1037 MS (e)885 1037 MS (r)910 1037 MS ( )935 1037 MS (*)960 1037 MS (s)985 1037 MS (o)1010 1037 MS +(l)1035 1037 MS ( )1060 1037 MS (\))1085 1037 MS (;)1110 1037 MS +( )1135 1037 MS +( )235 1084 MS ( )260 1084 MS (/)285 1084 MS (/)310 1084 MS ( )335 1084 MS (R)360 1084 MS (e)385 1084 MS (s)410 1084 MS (o)435 1084 MS (l)460 1084 MS (u)485 1084 MS (t)510 1084 MS (i)535 1084 MS (o)560 1084 MS (n)585 1084 MS ( )610 1084 MS +(d)635 1084 MS (u)660 1084 MS ( )685 1084 MS (s)710 1084 MS (y)735 1084 MS (s)760 1084 MS (t)785 1084 MS (e)810 1084 MS (m)835 1084 MS (e)860 1084 MS +( )885 1084 MS +( )235 1131 MS ( )260 1131 MS (E)285 1131 MS (n)310 1131 MS (g)335 1131 MS (i)360 1131 MS (n)385 1131 MS (e)410 1131 MS (s)435 1131 MS (:)460 1131 MS (:)485 1131 MS (P)510 1131 MS (V)535 1131 MS (e)560 1131 MS (c)585 1131 MS (_)610 1131 MS +(p)635 1131 MS (t)660 1131 MS (r)685 1131 MS ( )710 1131 MS (L)735 1131 MS (S)760 1131 MS (o)785 1131 MS (l)810 1131 MS (v)835 1131 MS (e)860 1131 MS (\()885 1131 MS (E)910 1131 MS (n)935 1131 MS (g)960 1131 MS (i)985 1131 MS (n)1010 1131 MS +(e)1035 1131 MS (s)1060 1131 MS (:)1085 1131 MS (:)1110 1131 MS (P)1135 1131 MS (C)1160 1131 MS (S)1185 1131 MS (R)1210 1131 MS (M)1235 1131 MS (a)1260 1131 MS (t)1285 1131 MS (_)1310 1131 MS (p)1335 1131 MS (t)1360 1131 MS (r)1385 1131 MS ( )1410 1131 MS +(A)1435 1131 MS (,)1460 1131 MS ( )1485 1131 MS (E)1510 1131 MS (n)1535 1131 MS (g)1560 1131 MS (i)1585 1131 MS (n)1610 1131 MS (e)1635 1131 MS (s)1660 1131 MS (:)1685 1131 MS (:)1710 1131 MS (P)1735 1131 MS (V)1760 1131 MS (e)1785 1131 MS (c)1810 1131 MS +(_)1835 1131 MS (p)1860 1131 MS (t)1885 1131 MS (r)1910 1131 MS ( )1935 1131 MS (b)1960 1131 MS (\))1985 1131 MS (;)2010 1131 MS +( )2035 1131 MS +( )235 1178 MS +(})235 1225 MS (;)260 1225 MS +( )285 1225 MS +(#)235 1273 MS (e)260 1273 MS (n)285 1273 MS (d)310 1273 MS (i)335 1273 MS (f)360 1273 MS +( )385 1273 MS +( )235 1320 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 1377 MS +( )235 1435 MS +showpage +%%Page: 28 28 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (8)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[50 0 0 -50 0 0]/Helvetica-BoldOblique MF +(9)310 577 MS (.)338 577 MS (4)352 577 MS +( )380 577 MS +(C)430 577 MS (a)466 577 MS (s)494 577 MS ( )522 577 MS (t)536 577 MS (e)553 577 MS (s)581 577 MS (t)609 577 MS +( )625 577 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 647 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(O)348 705 MS (n)384 705 MS ( )408 705 MS (i)428 705 MS (n)441 705 MS (i)467 705 MS (t)479 705 MS (i)495 705 MS (a)508 705 MS (l)531 705 MS (i)545 705 MS (s)558 705 MS (e)577 705 MS ( )599 705 MS (l)619 705 MS (\222)632 705 MS +(e)649 705 MS (n)672 705 MS (v)697 705 MS (i)722 705 MS (r)735 705 MS (o)752 705 MS (n)778 705 MS (n)803 705 MS (e)827 705 MS (m)850 705 MS (e)888 705 MS (n)911 705 MS (t)935 705 MS ( )950 705 MS (S)969 705 MS (A)997 705 MS +(L)1032 705 MS (O)1062 705 MS (M)1099 705 MS (E)1143 705 MS ( )1174 705 MS (a)1193 705 MS +(v)1215 705 MS (e)1240 705 MS (c)1262 705 MS ( )1284 705 MS (l)1304 705 MS (a)1317 705 MS ( )1339 705 MS (c)1359 705 MS (o)1381 705 MS (m)1407 705 MS (m)1445 705 MS (a)1483 705 MS (n)1506 705 MS (d)1530 705 MS (e)1555 705 MS ( )1577 705 MS +(r)1596 705 MS (u)1613 705 MS (n)1639 705 MS (S)1663 705 MS (e)1691 705 MS (s)1713 705 MS (s)1733 705 MS (i)1753 705 MS (o)1765 705 MS (n)1792 705 MS (.)1816 705 MS ( )1829 705 MS (P)1848 705 MS (u)1876 705 MS (i)1902 705 MS (s)1914 705 MS +( )1933 705 MS (l)1953 705 MS (e)1966 705 MS (s)1989 705 MS ( )2008 705 MS (d)2027 705 MS (e)2052 705 MS (u)2074 705 MS (x)2100 705 MS ( )2125 705 MS +(c)235 762 MS (o)257 762 MS (n)283 762 MS (t)307 762 MS (a)322 762 MS (i)344 762 MS (n)357 762 MS (e)381 762 MS (r)403 762 MS ( )420 762 MS (p)435 762 MS (a)460 762 MS (r)482 762 MS (a)499 762 MS (l)522 762 MS (l)536 762 MS +(\350)549 762 MS (l)572 762 MS (e)585 762 MS (s)607 762 MS ( )626 762 MS (s)641 762 MS (o)660 762 MS (n)686 762 MS (t)710 762 MS ( )725 762 MS (l)741 762 MS (a)753 762 MS (n)776 762 MS (c)800 762 MS (\351)823 762 MS (s)845 762 MS +( )864 762 MS (s)879 762 MS (u)898 762 MS (r)923 762 MS ( )940 762 MS (2)955 762 MS ( )980 762 MS (e)995 762 MS (t)1017 762 MS ( )1032 762 MS (3)1047 762 MS ( )1072 762 MS (m)1087 762 MS (a)1124 762 MS (c)1146 762 MS (h)1169 762 MS +(i)1194 762 MS (n)1207 762 MS (e)1232 762 MS (s)1255 762 MS ( )1274 762 MS (d)1289 762 MS (e)1314 762 MS ( )1336 762 MS (t)1351 762 MS (y)1366 762 MS (p)1389 762 MS (e)1414 762 MS ( )1436 762 MS (P)1451 762 MS (C)1479 762 MS (/)1512 762 MS +(l)1527 762 MS (i)1541 762 MS (n)1554 762 MS (u)1579 762 MS (x)1605 762 MS ( )1629 762 MS (r)1644 762 MS (e)1661 762 MS (s)1683 762 MS (p)1702 762 MS (e)1727 762 MS (c)1749 762 MS (t)1771 762 MS (i)1787 762 MS (v)1800 762 MS (e)1824 762 MS +(m)1847 762 MS (e)1885 762 MS (n)1908 762 MS (t)1932 762 MS (.)1947 762 MS ( )1960 762 MS (E)1975 762 MS (n)2006 762 MS (s)2030 762 MS (u)2049 762 MS (i)2075 762 MS (t)2087 762 MS (e)2102 762 MS ( )2125 762 MS +(o)235 820 MS (n)261 820 MS ( )285 820 MS (a)300 820 MS (c)322 820 MS (t)344 820 MS (i)359 820 MS (v)372 820 MS (e)396 820 MS ( )418 820 MS (l)434 820 MS (\222)447 820 MS (I)463 820 MS (n)481 820 MS (t)505 820 MS (e)520 820 MS +(r)542 820 MS (f)560 820 MS (a)575 820 MS (c)597 820 MS (e)619 820 MS ( )641 820 MS (H)656 820 MS (o)692 820 MS (m)719 820 MS (m)757 820 MS (e)795 820 MS (/)817 820 MS (M)832 820 MS (a)876 820 MS (c)898 820 MS (h)921 820 MS +(i)946 820 MS (n)959 820 MS (e)984 820 MS ( )1006 820 MS (d)1021 820 MS (e)1046 820 MS ( )1068 820 MS (S)1083 820 MS (A)1112 820 MS (L)1148 820 MS (O)1178 820 MS (M)1215 820 MS (E)1259 820 MS ( )1290 820 MS (a)1305 820 MS (v)1327 820 MS +(e)1351 820 MS (c)1373 820 MS ( )1395 820 MS (l)1411 820 MS (a)1424 820 MS ( )1446 820 MS (c)1462 820 MS (o)1484 820 MS (m)1511 820 MS (m)1549 820 MS (a)1587 820 MS (n)1610 820 MS (d)1634 820 MS (e)1659 820 MS ( )1681 820 MS (r)1696 820 MS +(u)1713 820 MS (n)1738 820 MS (L)1763 820 MS (o)1793 820 MS (a)1819 820 MS (d)1841 820 MS (e)1866 820 MS (r)1888 820 MS (.)1905 820 MS ( )1918 820 MS (D)1933 820 MS (e)1969 820 MS (p)1991 820 MS (u)2016 820 MS (i)2042 820 MS (s)2054 820 MS +( )2073 820 MS (l)2089 820 MS (a)2102 820 MS ( )2125 820 MS +(f)235 877 MS (e)251 877 MS (n)274 877 MS (\352)298 877 MS (t)320 877 MS (r)335 877 MS (e)352 877 MS ( )374 877 MS (d)398 877 MS (e)423 877 MS ( )445 877 MS (l)470 877 MS (\222)483 877 MS (i)500 877 MS (n)513 877 MS (t)537 877 MS +(e)552 877 MS (r)574 877 MS (p)591 877 MS (r)616 877 MS (\351)633 877 MS (t)655 877 MS (e)670 877 MS (u)692 877 MS (r)717 877 MS ( )734 877 MS (d)758 877 MS (e)783 877 MS ( )805 877 MS (c)829 877 MS (o)851 877 MS (m)877 877 MS +(m)915 877 MS (a)953 877 MS (n)976 877 MS (d)1000 877 MS +(e)1025 877 MS (s)1048 877 MS ( )1067 877 MS (p)1091 877 MS (y)1117 877 MS (t)1140 877 MS (h)1156 877 MS (o)1180 877 MS (n)1206 877 MS ( )1230 877 MS (\()1255 877 MS (T)1272 877 MS (U)1303 877 MS (I)1339 877 MS (\))1356 877 MS (,)1372 877 MS +( )1385 877 MS (o)1408 877 MS (n)1434 877 MS ( )1458 877 MS (d)1482 877 MS (e)1507 877 MS (m)1530 877 MS (a)1568 877 MS (n)1591 877 MS (d)1615 877 MS (e)1640 877 MS ( )1662 877 MS (a)1687 877 MS (u)1709 877 MS ( )1734 877 MS (p)1758 877 MS +(r)1783 877 MS (e)1800 877 MS (m)1823 877 MS (i)1861 877 MS (e)1874 877 MS (r)1896 877 MS ( )1914 877 MS (c)1938 877 MS (o)1960 877 MS (n)1986 877 MS (t)2010 877 MS (a)2025 877 MS (i)2048 877 MS (n)2061 877 MS (e)2085 877 MS (r)2107 877 MS +( )2125 877 MS +(d)235 935 MS (\222)260 935 MS (i)277 935 MS (n)290 935 MS (s)315 935 MS (t)334 935 MS (a)349 935 MS (n)371 935 MS (c)395 935 MS (i)418 935 MS (e)431 935 MS (r)453 935 MS ( )470 935 MS (u)493 935 MS (n)519 935 MS ( )543 935 MS +(c)566 935 MS (o)588 935 MS (m)615 935 MS (p)652 935 MS (o)677 935 MS (s)703 935 MS (a)722 935 MS (n)745 935 MS (t)769 935 MS ( )784 935 MS (m)807 935 MS (a)845 935 MS (t)867 935 MS (r)882 935 MS (i)899 935 MS (c)911 935 MS +(e)933 935 MS ( )955 935 MS (e)979 935 MS (t)1001 935 MS ( )1016 935 MS (d)1039 935 MS (e)1064 935 MS (u)1086 935 MS (x)1111 935 MS ( )1135 935 MS (c)1158 935 MS (o)1180 935 MS (m)1207 935 MS (p)1245 935 MS (o)1270 935 MS (s)1296 935 MS +(a)1315 935 MS (n)1337 935 MS (t)1361 935 MS (s)1376 935 MS ( )1395 935 MS (v)1418 935 MS (e)1442 935 MS (c)1464 935 MS (t)1486 935 MS (e)1501 935 MS (u)1523 935 MS (r)1548 935 MS (,)1565 935 MS ( )1578 935 MS (p)1601 935 MS (u)1626 935 MS +(i)1651 935 MS (s)1664 935 MS ( )1683 935 MS (a)1706 935 MS (u)1728 935 MS ( )1753 935 MS (s)1777 935 MS (e)1796 935 MS (c)1818 935 MS (o)1840 935 MS (n)1866 935 MS (d)1890 935 MS ( )1915 935 MS (c)1938 935 MS (o)1960 935 MS (n)1986 935 MS +(t)2010 935 MS (a)2025 935 MS (i)2048 935 MS (n)2061 935 MS (e)2085 935 MS (r)2107 935 MS ( )2125 935 MS +(d)235 992 MS (\222)260 992 MS (i)277 992 MS (n)290 992 MS (s)315 992 MS (t)334 992 MS (a)349 992 MS (n)371 992 MS (c)395 992 MS (i)418 992 MS (e)431 992 MS (r)453 992 MS ( )470 992 MS (u)491 992 MS (n)517 992 MS ( )541 992 MS +(c)562 992 MS (o)584 992 MS (m)611 992 MS (p)648 992 MS (o)673 992 MS (s)699 992 MS (a)718 992 MS (n)740 992 MS (t)764 992 MS ( )779 992 MS (s)800 992 MS (o)819 992 MS (l)845 992 MS (v)858 992 MS (e)883 992 MS (u)905 992 MS +(r)930 992 MS (.)947 992 MS ( )960 992 MS (O)981 992 MS (n)1017 992 MS ( )1041 992 MS (r)1062 992 MS (\351)1079 992 MS (c)1101 992 MS (u)1123 992 MS (p)1148 992 MS (\350)1173 992 MS (r)1195 992 MS (e)1212 992 MS ( )1234 992 MS (a)1256 992 MS +(i)1279 992 MS (n)1292 992 MS (s)1317 992 MS (i)1337 992 MS ( )1349 992 MS (l)1371 992 MS (a)1384 992 MS ( )1406 992 MS (r)1427 992 MS (\351)1444 992 MS (f)1467 992 MS (\351)1483 992 MS (r)1505 992 MS (e)1522 992 MS (n)1545 992 MS (c)1569 992 MS +(e)1591 992 MS ( )1613 992 MS (C)1634 992 MS (O)1667 992 MS (R)1704 992 MS (B)1737 992 MS (A)1771 992 MS ( )1806 992 MS (d)1827 992 MS (e)1852 992 MS ( )1874 992 MS (c)1895 992 MS (h)1918 992 MS (a)1942 992 MS (c)1965 992 MS (u)1987 992 MS +(n)2013 992 MS ( )2037 992 MS (d)2058 992 MS (e)2083 992 MS (s)2105 992 MS ( )2125 992 MS +(c)235 1050 MS (o)257 1050 MS (m)283 1050 MS (p)320 1050 MS (o)345 1050 MS (s)371 1050 MS (a)390 1050 MS (n)413 1050 MS (t)437 1050 MS (s)452 1050 MS ( )471 1050 MS (p)484 1050 MS (a)509 1050 MS (r)531 1050 MS (a)548 1050 MS (l)570 1050 MS +(l)583 1050 MS (\350)596 1050 MS (l)619 1050 MS (e)632 1050 MS (s)655 1050 MS (.)674 1050 MS ( )687 1050 MS (O)700 1050 MS (n)736 1050 MS ( )760 1050 MS (d)773 1050 MS (e)798 1050 MS (m)821 1050 MS (a)859 1050 MS (n)882 1050 MS (d)906 1050 MS +(e)931 1050 MS ( )953 1050 MS +(a)966 1050 MS (u)988 1050 MS ( )1013 1050 MS (c)1026 1050 MS (o)1048 1050 MS (m)1075 1050 MS (p)1112 1050 MS (o)1137 1050 MS (s)1163 1050 MS (a)1182 1050 MS (n)1204 1050 MS (t)1228 1050 MS ( )1243 1050 MS (m)1256 1050 MS (a)1294 1050 MS (t)1316 1050 MS +(r)1331 1050 MS (i)1349 1050 MS (c)1361 1050 MS (e)1383 1050 MS ( )1405 1050 MS (d)1418 1050 MS (e)1443 1050 MS ( )1465 1050 MS (c)1478 1050 MS (h)1500 1050 MS (a)1525 1050 MS (r)1547 1050 MS (g)1564 1050 MS (e)1589 1050 MS (r)1611 1050 MS ( )1628 1050 MS +(e)1641 1050 MS (n)1663 1050 MS ( )1687 1050 MS (m)1701 1050 MS (\351)1738 1050 MS (m)1761 1050 MS (o)1798 1050 MS (i)1825 1050 MS (r)1838 1050 MS (e)1855 1050 MS ( )1877 1050 MS (u)1890 1050 MS (n)1915 1050 MS (e)1940 1050 MS ( )1962 1050 MS (m)1976 1050 MS +(a)2013 1050 MS (t)2035 1050 MS (r)2050 1050 MS (i)2068 1050 MS (c)2080 1050 MS (e)2102 1050 MS ( )2125 1050 MS +(d)235 1107 MS (i)261 1107 MS (s)273 1107 MS (t)292 1107 MS (r)307 1107 MS (i)325 1107 MS (b)338 1107 MS (u)362 1107 MS (\351)387 1107 MS (e)409 1107 MS ( )431 1107 MS (d)445 1107 MS (e)470 1107 MS (p)492 1107 MS (u)517 1107 MS (i)543 1107 MS +(s)556 1107 MS ( )576 1107 MS (u)590 1107 MS (n)616 1107 MS ( )640 1107 MS (f)655 1107 MS (i)672 1107 MS (c)685 1107 MS (h)708 1107 MS (i)733 1107 MS (e)746 1107 MS (r)768 1107 MS (,)785 1107 MS ( )798 1107 MS (a)812 1107 MS (u)834 1107 MS +( )859 1107 MS (p)873 1107 MS (r)898 1107 MS (e)915 1107 MS (m)938 1107 MS (i)976 1107 MS (e)989 1107 MS (r)1011 1107 MS ( )1028 1107 MS (c)1042 1107 MS (o)1064 1107 MS (m)1091 1107 MS (p)1128 1107 MS (o)1153 1107 MS (s)1179 1107 MS (a)1198 1107 MS +(n)1221 1107 MS (t)1246 1107 MS ( )1261 1107 MS (v)1275 1107 MS (e)1299 1107 MS (c)1321 1107 MS (t)1343 1107 MS (e)1358 1107 MS (u)1380 1107 MS (r)1405 1107 MS ( )1422 1107 MS (d)1436 1107 MS (e)1461 1107 MS ( )1483 1107 MS (c)1497 1107 MS (h)1519 1107 MS +(a)1543 1107 MS (r)1565 1107 MS (g)1582 1107 MS (e)1607 1107 MS (r)1629 1107 MS ( )1646 1107 MS (e)1660 1107 MS (n)1683 1107 MS ( )1707 1107 MS (m)1722 1107 MS (\351)1760 1107 MS (m)1783 1107 MS (o)1820 1107 MS (i)1847 1107 MS (r)1859 1107 MS (e)1877 1107 MS +( )1899 1107 MS (u)1913 1107 MS (n)1939 1107 MS ( )1963 1107 MS (v)1978 1107 MS (e)2002 1107 MS (c)2024 1107 MS (t)2046 1107 MS (e)2061 1107 MS (u)2083 1107 MS (r)2108 1107 MS ( )2125 1107 MS +(d)235 1165 MS (i)261 1165 MS (s)273 1165 MS (t)292 1165 MS (r)307 1165 MS (i)325 1165 MS (b)338 1165 MS (u)362 1165 MS (\351)387 1165 MS ( )409 1165 MS (d)435 1165 MS (e)460 1165 MS (p)482 1165 MS (u)507 1165 MS (i)533 1165 MS (s)546 1165 MS +( )566 1165 MS (u)592 1165 MS (n)618 1165 MS ( )642 1165 MS (f)669 1165 MS (i)686 1165 MS (c)699 1165 MS (h)722 1165 MS (i)747 1165 MS (e)760 1165 MS (r)782 1165 MS (.)799 1165 MS ( )812 1165 MS (O)838 1165 MS (n)875 1165 MS ( )899 1165 MS +(r)925 1165 MS (\351)942 1165 MS (c)964 1165 MS (u)986 1165 MS (p)1011 1165 MS (\350)1036 1165 MS (r)1058 1165 MS (e)1075 1165 MS ( )1097 1165 MS (a)1124 1165 MS (i)1147 1165 MS (n)1160 1165 MS (s)1185 1165 MS (i)1205 1165 MS ( )1218 1165 MS (l)1245 1165 MS +(a)1258 1165 MS ( )1280 1165 MS (r)1306 1165 MS (\351)1323 1165 MS (f)1346 1165 MS (\351)1362 1165 MS (r)1384 1165 MS (e)1401 1165 MS (n)1424 1165 MS (c)1448 1165 MS (e)1470 1165 MS ( )1493 1165 MS (C)1519 1165 MS (O)1552 1165 MS (R)1588 1165 MS (B)1622 1165 MS +(A)1656 1165 MS ( )1691 1165 MS (d)1717 1165 MS (e)1742 1165 MS ( )1765 1165 MS (c)1791 1165 MS (e)1813 1165 MS (s)1835 1165 MS ( )1855 1165 MS (d)1881 1165 MS (e)1906 1165 MS (u)1928 1165 MS (x)1954 1165 MS ( )1978 1165 MS (o)2004 1165 MS (b)2030 1165 MS +(j)2055 1165 MS (e)2068 1165 MS (t)2090 1165 MS (s)2105 1165 MS ( )2125 1165 MS +(p)235 1222 MS (a)260 1222 MS (r)282 1222 MS (a)299 1222 MS (l)322 1222 MS (l)335 1222 MS (\350)348 1222 MS (l)371 1222 MS (e)384 1222 MS (s)407 1222 MS (.)426 1222 MS ( )439 1222 MS (O)456 1222 MS (n)492 1222 MS ( )516 1222 MS (p)533 1222 MS +(e)558 1222 MS (u)580 1222 MS (t)605 1222 MS ( )620 1222 MS (a)637 1222 MS (l)660 1222 MS (o)672 1222 MS (r)698 1222 MS +(s)715 1222 MS ( )734 1222 MS (a)751 1222 MS (c)773 1222 MS (t)795 1222 MS (i)810 1222 MS (v)823 1222 MS (e)847 1222 MS (r)869 1222 MS ( )886 1222 MS (l)904 1222 MS (e)917 1222 MS ( )939 1222 MS (s)956 1222 MS (e)975 1222 MS (r)997 1222 MS +(v)1015 1222 MS (i)1040 1222 MS (c)1053 1222 MS (e)1075 1222 MS ( )1097 1222 MS (S)1114 1222 MS (o)1142 1222 MS (l)1169 1222 MS (v)1182 1222 MS (e)1206 1222 MS (\()1228 1222 MS (\))1246 1222 MS ( )1263 1222 MS (d)1280 1222 MS (u)1305 1222 MS ( )1330 1222 MS +(c)1347 1222 MS (o)1369 1222 MS (m)1395 1222 MS (p)1432 1222 MS (o)1457 1222 MS (s)1483 1222 MS (a)1502 1222 MS (n)1524 1222 MS (t)1548 1222 MS ( )1563 1222 MS (s)1580 1222 MS (o)1599 1222 MS (l)1625 1222 MS (v)1638 1222 MS (e)1662 1222 MS (u)1684 1222 MS +(r)1709 1222 MS ( )1726 1222 MS (s)1743 1222 MS (i)1763 1222 MS (t)1775 1222 MS (u)1790 1222 MS (\351)1815 1222 MS ( )1837 1222 MS (s)1855 1222 MS (u)1874 1222 MS (r)1899 1222 MS ( )1916 1222 MS (l)1934 1222 MS (e)1946 1222 MS ( )1968 1222 MS (s)1986 1222 MS +(e)2005 1222 MS (c)2027 1222 MS (o)2049 1222 MS (n)2075 1222 MS (d)2099 1222 MS ( )2125 1222 MS +(c)235 1280 MS (o)257 1280 MS (n)283 1280 MS (t)307 1280 MS (a)322 1280 MS (i)344 1280 MS (n)357 1280 MS (e)381 1280 MS (r)403 1280 MS ( )420 1280 MS (p)433 1280 MS (a)458 1280 MS (r)480 1280 MS (a)497 1280 MS (l)520 1280 MS (l)533 1280 MS +(\350)546 1280 MS (l)570 1280 MS (e)583 1280 MS ( )605 1280 MS (e)618 1280 MS (n)641 1280 MS ( )665 1280 MS (l)679 1280 MS (u)691 1280 MS (i)717 1280 MS ( )730 1280 MS (f)744 1280 MS (o)759 1280 MS (u)785 1280 MS (r)810 1280 MS (n)827 1280 MS +(i)852 1280 MS (s)865 1280 MS (s)885 1280 MS (a)904 1280 MS (n)927 1280 MS (t)951 1280 MS ( )966 1280 MS (l)979 1280 MS (e)991 1280 MS (s)1014 1280 MS ( )1033 1280 MS (r)1046 1280 MS (\351)1063 1280 MS (f)1086 1280 MS (\351)1101 1280 MS (r)1123 1280 MS +(e)1140 1280 MS (n)1163 1280 MS (c)1187 1280 MS (e)1209 1280 MS (s)1232 1280 MS ( )1252 1280 MS (C)1265 1280 MS (O)1298 1280 MS (R)1334 1280 MS (B)1367 1280 MS (A)1401 1280 MS ( )1436 1280 MS (d)1449 1280 MS (e)1474 1280 MS (s)1496 1280 MS ( )1515 1280 MS +(d)1528 1280 MS (e)1553 1280 MS (u)1575 1280 MS (x)1601 1280 MS ( )1625 1280 MS (o)1638 1280 MS (b)1664 1280 MS (j)1689 1280 MS (e)1702 1280 MS (t)1724 1280 MS (s)1739 1280 MS ( )1758 1280 MS (p)1771 1280 MS (a)1796 1280 MS (r)1818 1280 MS (a)1835 1280 MS +(l)1858 1280 MS (l)1871 1280 MS (\350)1884 1280 MS (l)1907 1280 MS (e)1920 1280 MS (s)1942 1280 MS ( )1961 1280 MS (m)1975 1280 MS (a)2013 1280 MS (t)2035 1280 MS (r)2050 1280 MS (i)2067 1280 MS (c)2080 1280 MS (e)2102 1280 MS ( )2125 1280 MS +(A)235 1337 MS ( )270 1337 MS (e)284 1337 MS (t)306 1337 MS ( )321 1337 MS (v)335 1337 MS (e)359 1337 MS (c)381 1337 MS (t)403 1337 MS (e)418 1337 MS (u)440 1337 MS (r)465 1337 MS ( )482 1337 MS (s)496 1337 MS (e)515 1337 MS (c)537 1337 MS +(o)559 1337 MS (n)585 1337 MS (d)609 1337 MS ( )634 1337 MS (m)648 1337 MS (e)685 1337 MS (m)708 1337 MS (b)746 1337 MS (r)771 1337 MS (e)788 1337 MS ( )810 1337 MS (b)825 1337 MS (.)849 1337 MS ( )862 1337 MS (L)876 1337 MS (e)906 1337 MS +(s)928 1337 MS ( )947 1337 MS (d)961 1337 MS (o)986 1337 MS (n)1012 1337 MS (n)1036 1337 MS (\351)1061 1337 MS (e)1083 1337 MS (s)1105 1337 MS ( )1124 1337 MS (t)1138 1337 MS (r)1153 1337 MS (a)1170 1337 MS (n)1192 1337 MS (s)1216 1337 MS (i)1236 1337 MS +(t)1250 1337 MS (e)1265 1337 MS (n)1287 1337 MS (t)1311 1337 MS ( )1326 1337 MS (a)1340 1337 MS (l)1362 1337 MS (o)1374 1337 MS (r)1400 1337 MS (s)1417 1337 MS ( )1436 1337 MS (v)1450 1337 MS (i)1475 1337 MS (a)1487 1337 MS ( )1509 1337 MS (l)1524 1337 MS +(e)1537 1337 MS ( )1559 1337 MS (r)1573 1337 MS (\351)1590 1337 MS (s)1612 1337 MS (e)1631 1337 MS (a)1653 1337 MS (u)1675 1337 MS ( )1700 1337 MS (d)1714 1337 MS (e)1739 1337 MS ( )1761 1337 MS (m)1776 1337 MS (a)1813 1337 MS (n)1836 1337 MS (i)1861 1337 MS +(\350)1874 1337 MS (r)1896 1337 MS (e)1913 1337 MS ( )1935 1337 MS (o)1949 1337 MS (p)1975 1337 MS (t)2000 1337 MS (i)2015 1337 MS (m)2028 1337 MS (a)2066 1337 MS (l)2089 1337 MS +(e)2102 1337 MS ( )2125 1337 MS +(t)235 1395 MS (o)249 1395 MS (u)275 1395 MS (t)299 1395 MS ( )314 1395 MS (e)329 1395 MS (n)351 1395 MS ( )375 1395 MS (s)390 1395 MS (e)409 1395 MS ( )432 1395 MS (r)447 1395 MS (e)464 1395 MS (d)486 1395 MS (i)512 1395 MS (s)525 1395 MS +(t)544 1395 MS (r)559 1395 MS (i)576 1395 MS (b)589 1395 MS (u)613 1395 MS (a)639 1395 MS (n)662 1395 MS (t)686 1395 MS ( )701 1395 MS (d)716 1395 MS (e)741 1395 MS (p)763 1395 MS (u)788 1395 MS (i)814 1395 MS (s)826 1395 MS ( )846 1395 MS +(d)861 1395 MS (e)886 1395 MS (u)908 1395 MS (x)934 1395 MS ( )958 1395 MS (p)973 1395 MS (r)998 1395 MS (o)1015 1395 MS (c)1041 1395 MS (e)1063 1395 MS (s)1085 1395 MS (s)1104 1395 MS (e)1123 1395 MS (u)1145 1395 MS (r)1170 1395 MS (s)1188 1395 MS +( )1207 1395 MS (v)1223 1395 MS (e)1248 1395 MS (r)1270 1395 MS (s)1287 1395 MS ( )1306 1395 MS (t)1321 1395 MS (r)1336 1395 MS (o)1352 1395 MS (i)1378 1395 MS (s)1391 1395 MS ( )1410 1395 MS (p)1425 1395 MS (r)1450 1395 MS (o)1467 1395 MS (c)1493 1395 MS +(e)1515 1395 MS (s)1537 1395 MS (s)1556 1395 MS (e)1575 1395 MS (u)1597 1395 MS (r)1622 1395 MS (s)1639 1395 MS (.)1658 1395 MS ( )1671 1395 MS (L)1687 1395 MS (e)1717 1395 MS ( )1739 1395 MS (s)1755 1395 MS (y)1775 1395 MS (s)1799 1395 MS (t)1818 1395 MS +(\350)1833 1395 MS (m)1856 1395 MS (e)1893 1395 MS ( )1916 1395 MS (e)1931 1395 MS (s)1953 1395 MS (t)1972 1395 MS ( )1987 1395 MS (r)2002 1395 MS (\351)2019 1395 MS (s)2041 1395 MS (o)2060 1395 MS (l)2087 1395 MS (u)2099 1395 MS ( )2125 1395 MS +(e)235 1452 MS (n)257 1452 MS ( )281 1452 MS (p)302 1452 MS (a)328 1452 MS (r)350 1452 MS (a)367 1452 MS (l)390 1452 MS (l)403 1452 MS (\350)416 1452 MS (l)439 1452 MS (e)452 1452 MS (.)474 1452 MS ( )487 1452 MS (O)508 1452 MS (n)545 1452 MS +( )570 1452 MS (r)591 1452 MS (\351)608 1452 MS (c)630 1452 MS (u)652 1452 MS (p)677 1452 MS (\350)702 1452 MS (r)724 1452 MS (e)741 1452 MS ( )763 1452 MS (l)785 1452 MS (a)798 1452 MS ( )820 1452 MS (r)841 1452 MS (\351)858 1452 MS (f)881 1452 MS +(\351)897 1452 MS (r)919 1452 MS (e)936 1452 MS (n)959 1452 MS (c)983 1452 MS (e)1005 1452 MS ( )1027 1452 MS (C)1049 1452 MS (O)1082 1452 MS (R)1118 1452 MS (B)1151 1452 MS (A)1185 1452 MS ( )1221 1452 MS (d)1243 1452 MS (e)1268 1452 MS ( )1290 1452 MS +(l)1312 1452 MS (\222)1325 1452 MS (o)1341 1452 MS (b)1367 1452 MS (j)1392 1452 MS (e)1405 1452 MS (t)1427 1452 MS ( )1442 1452 MS (v)1463 1452 MS (e)1487 1452 MS (c)1509 1452 MS (t)1531 1452 MS (e)1546 1452 MS (u)1568 1452 MS (r)1593 1452 MS ( )1610 1452 MS +(s)1631 1452 MS (o)1650 1452 MS (l)1677 1452 MS (u)1689 1452 MS (t)1714 1452 MS (i)1730 1452 MS (o)1742 1452 MS (n)1768 1452 MS ( )1792 1452 MS (p)1813 1452 MS (a)1838 1452 MS (r)1860 1452 MS (a)1877 1452 MS (l)1900 1452 MS (l)1914 1452 MS (\350)1927 1452 MS +(l)1950 1452 MS (e)1963 1452 MS (.)1985 1452 MS ( )1998 1452 MS (C)2019 1452 MS (e)2052 1452 MS (t)2074 1452 MS (t)2089 1452 MS (e)2104 1452 MS ( )2125 1452 MS +(r)235 1510 MS (\351)252 1510 MS (f)274 1510 MS (\351)290 1510 MS (r)312 1510 MS (e)329 1510 MS (n)352 1510 MS (c)376 1510 MS (e)398 1510 MS ( )420 1510 MS (C)435 1510 MS (O)468 1510 MS (R)505 1510 MS (B)538 1510 MS (A)572 1510 MS ( )607 1510 MS +(e)622 1510 MS (s)645 1510 MS (t)664 1510 MS ( )679 1510 MS (f)695 1510 MS (o)710 1510 MS (u)736 1510 MS (r)761 1510 MS (n)778 1510 MS (i)803 1510 MS (e)815 1510 MS ( )837 1510 MS (a)853 1510 MS (u)875 1510 MS ( )900 1510 MS (s)915 1510 MS +(e)934 1510 MS (c)956 1510 MS (o)978 1510 MS (n)1004 1510 MS (d)1028 1510 MS ( )1054 1510 MS (c)1069 1510 MS (o)1091 1510 MS (m)1118 1510 MS (p)1155 1510 MS (o)1180 1510 MS (s)1206 1510 MS (a)1225 1510 MS (n)1247 1510 MS (t)1271 1510 MS ( )1286 1510 MS +(v)1301 1510 MS (e)1325 1510 MS (c)1347 1510 MS (t)1369 1510 MS (e)1384 1510 MS (u)1406 1510 MS (r)1431 1510 MS ( )1448 1510 MS (d)1463 1510 MS (u)1488 1510 MS ( )1513 1510 MS (p)1528 1510 MS (r)1553 1510 MS (e)1570 1510 MS (m)1593 1510 MS (i)1631 1510 MS +(e)1644 1510 MS (r)1666 1510 MS ( )1683 1510 MS (c)1698 1510 MS (o)1720 1510 MS +(n)1746 1510 MS (t)1770 1510 MS (a)1785 1510 MS (i)1808 1510 MS (n)1821 1510 MS (e)1845 1510 MS (r)1867 1510 MS (.)1884 1510 MS ( )1897 1510 MS (L)1912 1510 MS (a)1942 1510 MS ( )1964 1510 MS (d)1979 1510 MS (o)2004 1510 MS (n)2030 1510 MS (n)2055 1510 MS +(\351)2079 1510 MS (e)2102 1510 MS ( )2125 1510 MS +(v)235 1567 MS (e)259 1567 MS (c)281 1567 MS (t)303 1567 MS (e)318 1567 MS (u)340 1567 MS (r)365 1567 MS ( )382 1567 MS (p)411 1567 MS (a)436 1567 MS (r)458 1567 MS (a)475 1567 MS (l)498 1567 MS (l)511 1567 MS (\350)524 1567 MS (l)547 1567 MS +(e)560 1567 MS ( )582 1567 MS (e)612 1567 MS (s)634 1567 MS (t)653 1567 MS ( )668 1567 MS (d)697 1567 MS (o)722 1567 MS (n)748 1567 MS (c)772 1567 MS ( )794 1567 MS (t)823 1567 MS (r)838 1567 MS (a)855 1567 MS (n)877 1567 MS (s)901 1567 MS +(f)921 1567 MS (\351)936 1567 MS (r)958 1567 MS (\351)975 1567 MS (e)997 1567 MS ( )1019 1567 MS (v)1049 1567 MS (i)1074 1567 MS (a)1087 1567 MS ( )1110 1567 MS (l)1140 1567 MS (e)1153 1567 MS ( )1175 1567 MS (r)1204 1567 MS (\351)1221 1567 MS (s)1244 1567 MS +(e)1263 1567 MS (a)1285 1567 MS (u)1307 1567 MS ( )1332 1567 MS (d)1361 1567 MS (e)1386 1567 MS ( )1408 1567 MS (m)1438 1567 MS (a)1476 1567 MS (n)1499 1567 MS (i)1524 1567 MS (\350)1537 1567 MS (r)1559 1567 MS (e)1576 1567 MS ( )1598 1567 MS (o)1627 1567 MS +(p)1653 1567 MS (t)1678 1567 MS (i)1693 1567 MS (m)1706 1567 MS (a)1744 1567 MS (l)1767 1567 MS (e)1780 1567 MS (,)1802 1567 MS ( )1815 1567 MS (t)1844 1567 MS (o)1859 1567 MS (u)1885 1567 MS (t)1909 1567 MS ( )1924 1567 MS (e)1953 1567 MS (n)1975 1567 MS +( )1999 1567 MS (\351)2028 1567 MS (t)2050 1567 MS (a)2065 1567 MS (n)2087 1567 MS (t)2111 1567 MS ( )2125 1567 MS +(r)235 1625 MS (e)252 1625 MS (d)274 1625 MS (i)300 1625 MS (s)312 1625 MS (t)331 1625 MS (r)346 1625 MS (i)364 1625 MS (b)377 1625 MS (u)401 1625 MS (\351)426 1625 MS (e)448 1625 MS ( )470 1625 MS (d)485 1625 MS (e)510 1625 MS (p)532 1625 MS +(u)557 1625 MS (i)583 1625 MS (s)596 1625 MS ( )616 1625 MS (t)631 1625 MS (r)646 1625 MS (o)662 1625 MS (i)688 1625 MS (s)701 1625 MS ( )720 1625 MS (p)735 1625 MS (r)760 1625 MS (o)777 1625 MS (c)803 1625 MS (e)825 1625 MS (s)847 1625 MS +(s)866 1625 MS (e)885 1625 MS (u)907 1625 MS (r)932 1625 MS (s)949 1625 MS ( )968 1625 MS (v)984 1625 MS (e)1008 1625 MS (r)1030 1625 MS (s)1048 1625 MS ( )1067 1625 MS (d)1082 1625 MS (e)1107 1625 MS (u)1129 1625 MS (x)1155 1625 MS ( )1179 1625 MS +(p)1194 1625 MS (r)1219 1625 MS (o)1237 1625 MS (c)1263 1625 MS (e)1285 1625 MS (s)1307 1625 MS (s)1326 1625 MS (e)1345 1625 MS (u)1367 1625 MS (r)1392 1625 MS (s)1409 1625 MS (.)1428 1625 MS ( )1441 1625 MS (O)1456 1625 MS (n)1492 1625 MS ( )1517 1625 MS +(d)1532 1625 MS (e)1557 1625 MS (m)1580 1625 MS (a)1618 1625 MS (n)1641 1625 MS (d)1665 1625 MS (e)1690 1625 MS ( )1712 1625 MS (e)1727 1625 MS (n)1750 1625 MS (f)1775 1625 MS (i)1792 1625 MS (n)1805 1625 MS ( )1830 1625 MS (a)1845 1625 MS (u)1867 1625 MS +( )1892 1625 MS (c)1908 1625 MS (o)1930 1625 MS (m)1956 1625 MS (p)1993 1625 MS (o)2018 1625 MS (s)2044 1625 MS (a)2063 1625 MS (n)2086 1625 MS (t)2110 1625 MS ( )2125 1625 MS +(v)235 1682 MS (e)259 1682 MS (c)281 1682 MS (t)303 1682 MS (e)318 1682 MS (u)340 1682 MS (r)365 1682 MS ( )382 1682 MS (d)395 1682 MS (e)420 1682 MS ( )442 1682 MS (s)455 1682 MS (t)474 1682 MS (o)488 1682 MS (c)514 1682 MS (k)536 1682 MS +(e)561 1682 MS (r)583 1682 MS ( )599 1682 MS (l)612 1682 MS (a)624 1682 MS ( )646 1682 MS (s)659 1682 MS (o)678 1682 MS (l)705 1682 MS (u)717 1682 MS (t)742 1682 MS (i)758 1682 MS (o)770 1682 MS (n)796 1682 MS ( )820 1682 MS (d)833 1682 MS +(a)858 1682 MS (n)881 1682 MS (s)905 1682 MS ( )924 1682 MS (u)937 1682 MS (n)962 1682 MS ( )986 1682 MS (f)1000 1682 MS (i)1016 1682 MS (c)1029 1682 MS (h)1052 1682 MS (i)1078 1682 MS (e)1091 1682 MS (r)1113 1682 MS (.)1130 1682 MS +( )1143 1682 MS +( )348 1740 MS +[42 0 0 -42 0 0]/Courier MF +( )235 1787 MS +(i)235 1835 MS (m)260 1835 MS (p)285 1835 MS (o)310 1835 MS (r)335 1835 MS (t)360 1835 MS ( )385 1835 MS (s)410 1835 MS (a)435 1835 MS +(l)460 1835 MS (o)485 1835 MS (m)510 1835 MS (e)535 1835 MS +( )560 1835 MS +(i)235 1882 MS (m)260 1882 MS (p)285 1882 MS (o)310 1882 MS (r)335 1882 MS (t)360 1882 MS ( )385 1882 MS (S)410 1882 MS (A)435 1882 MS (L)460 1882 MS (O)485 1882 MS (M)510 1882 MS (E)535 1882 MS (D)560 1882 MS (S)585 1882 MS +( )610 1882 MS +( )235 1929 MS +(A)235 1976 MS (=)260 1976 MS (s)285 1976 MS (a)310 1976 MS (l)335 1976 MS (o)360 1976 MS (m)385 1976 MS (e)410 1976 MS (.)435 1976 MS (l)460 1976 MS (c)485 1976 MS (c)510 1976 MS (.)535 1976 MS (F)560 1976 MS (i)585 1976 MS (n)610 1976 MS +(d)635 1976 MS (O)660 1976 MS (r)685 1976 MS (L)710 1976 MS (o)735 1976 MS (a)760 1976 MS (d)785 1976 MS (C)810 1976 MS (o)835 1976 MS (m)860 1976 MS (p)885 1976 MS (o)910 1976 MS (n)935 1976 MS (e)960 1976 MS (n)985 1976 MS (t)1010 1976 MS +(\()1035 1976 MS (")1060 1976 MS (d)1085 1976 MS (a)1110 1976 MS (t)1135 1976 MS (a)1160 1976 MS (")1185 1976 MS (,)1210 1976 MS (")1235 1976 MS (N)1260 1976 MS (P)1285 1976 MS (M)1310 1976 MS (a)1335 1976 MS (t)1360 1976 MS (C)1385 1976 MS (o)1410 1976 MS +(m)1435 1976 MS (p)1460 1976 MS (o)1485 1976 MS (n)1510 1976 MS (e)1535 1976 MS (n)1560 1976 MS (t)1585 1976 MS (")1610 1976 MS (\))1635 1976 MS +( )1660 1976 MS +(A)235 2023 MS (.)260 2023 MS (S)285 2023 MS (e)310 2023 MS (t)335 2023 MS (F)360 2023 MS (i)385 2023 MS (l)410 2023 MS (e)435 2023 MS (N)460 2023 MS (a)485 2023 MS (m)510 2023 MS (e)535 2023 MS (\()560 2023 MS (")585 2023 MS (/)610 2023 MS +(h)635 2023 MS (o)660 2023 MS (m)685 2023 MS (e)710 2023 MS (/)735 2023 MS (s)760 2023 MS (e)785 2023 MS (c)810 2023 MS (h)835 2023 MS (e)860 2023 MS (r)885 2023 MS (/)910 2023 MS (d)935 2023 MS (a)960 2023 MS (t)985 2023 MS (a)1010 2023 MS +(/)1035 2023 MS (M)1060 2023 MS (a)1085 2023 MS (t)1110 2023 MS (r)1135 2023 MS (i)1160 2023 MS (c)1185 2023 MS (e)1210 2023 MS (1)1235 2023 MS (0)1260 2023 MS (0)1285 2023 MS (.)1310 2023 MS (x)1335 2023 MS (d)1360 2023 MS (r)1385 2023 MS (")1410 2023 MS +(\))1435 2023 MS +( )1460 2023 MS +(A)235 2071 MS (.)260 2071 MS (R)285 2071 MS (e)310 2071 MS (a)335 2071 MS (d)360 2071 MS (D)385 2071 MS (a)410 2071 MS (t)435 2071 MS (a)460 2071 MS (F)485 2071 MS (r)510 2071 MS (o)535 2071 MS (m)560 2071 MS (F)585 2071 MS (i)610 2071 MS +(l)635 2071 MS (e)660 2071 MS (\()685 2071 MS (")710 2071 MS (c)735 2071 MS (a)760 2071 MS (l)785 2071 MS (l)810 2071 MS (b)835 2071 MS (a)860 2071 MS (c)885 2071 MS (k)910 2071 MS (")935 2071 MS (\))960 2071 MS +( )985 2071 MS +( )235 2118 MS +(b)235 2165 MS (=)260 2165 MS (s)285 2165 MS (a)310 2165 MS (l)335 2165 MS (o)360 2165 MS (m)385 2165 MS (e)410 2165 MS (.)435 2165 MS (l)460 2165 MS (c)485 2165 MS (c)510 2165 MS (.)535 2165 MS (F)560 2165 MS (i)585 2165 MS (n)610 2165 MS +(d)635 2165 MS (O)660 2165 MS (r)685 2165 MS (L)710 2165 MS (o)735 2165 MS (a)760 2165 MS (d)785 2165 MS (C)810 2165 MS (o)835 2165 MS (m)860 2165 MS (p)885 2165 MS (o)910 2165 MS (n)935 2165 MS (e)960 2165 MS (n)985 2165 MS (t)1010 2165 MS +(\()1035 2165 MS (")1060 2165 MS (d)1085 2165 MS (a)1110 2165 MS (t)1135 2165 MS (a)1160 2165 MS (")1185 2165 MS (,)1210 2165 MS (")1235 2165 MS (N)1260 2165 MS (P)1285 2165 MS (V)1310 2165 MS (e)1335 2165 MS (c)1360 2165 MS (C)1385 2165 MS (o)1410 2165 MS +(m)1435 2165 MS (p)1460 2165 MS (o)1485 2165 MS (n)1510 2165 MS (e)1535 2165 MS (n)1560 2165 MS (t)1585 2165 MS (")1610 2165 MS (\))1635 2165 MS +( )1660 2165 MS +(b)235 2212 MS (.)260 2212 MS (S)285 2212 MS (e)310 2212 MS (t)335 2212 MS (F)360 2212 MS (i)385 2212 MS (l)410 2212 MS (e)435 2212 MS (N)460 2212 MS (a)485 2212 MS (m)510 2212 MS (e)535 2212 MS (\()560 2212 MS (")585 2212 MS (/)610 2212 MS +(h)635 2212 MS (o)660 2212 MS (m)685 2212 MS (e)710 2212 MS (/)735 2212 MS (s)760 2212 MS (e)785 2212 MS (c)810 2212 MS (h)835 2212 MS (e)860 2212 MS (r)885 2212 MS (/)910 2212 MS (d)935 2212 MS (a)960 2212 MS (t)985 2212 MS (a)1010 2212 MS +(/)1035 2212 MS (S)1060 2212 MS (c)1085 2212 MS (d)1110 2212 MS +(M)1135 2212 MS (e)1160 2212 MS (m)1185 2212 MS (b)1210 2212 MS (r)1235 2212 MS (e)1260 2212 MS (1)1285 2212 MS (0)1310 2212 MS (0)1335 2212 MS (.)1360 2212 MS (x)1385 2212 MS (d)1410 2212 MS (r)1435 2212 MS (")1460 2212 MS (\))1485 2212 MS +( )1510 2212 MS +(b)235 2259 MS (.)260 2259 MS (R)285 2259 MS (e)310 2259 MS (a)335 2259 MS (d)360 2259 MS (D)385 2259 MS (a)410 2259 MS (t)435 2259 MS (a)460 2259 MS (F)485 2259 MS (r)510 2259 MS (o)535 2259 MS (m)560 2259 MS (F)585 2259 MS (i)610 2259 MS +(l)635 2259 MS (e)660 2259 MS (\()685 2259 MS (")710 2259 MS (c)735 2259 MS (a)760 2259 MS (l)785 2259 MS (l)810 2259 MS (b)835 2259 MS (a)860 2259 MS (c)885 2259 MS (k)910 2259 MS (")935 2259 MS (\))960 2259 MS +( )985 2259 MS +( )235 2307 MS +(x)235 2354 MS (=)260 2354 MS (s)285 2354 MS (a)310 2354 MS (l)335 2354 MS (o)360 2354 MS (m)385 2354 MS (e)410 2354 MS (.)435 2354 MS (l)460 2354 MS (c)485 2354 MS (c)510 2354 MS (.)535 2354 MS (F)560 2354 MS (i)585 2354 MS (n)610 2354 MS +(d)635 2354 MS (O)660 2354 MS (r)685 2354 MS (L)710 2354 MS (o)735 2354 MS (a)760 2354 MS (d)785 2354 MS (C)810 2354 MS (o)835 2354 MS (m)860 2354 MS (p)885 2354 MS (o)910 2354 MS (n)935 2354 MS (e)960 2354 MS (n)985 2354 MS (t)1010 2354 MS +(\()1035 2354 MS (")1060 2354 MS (d)1085 2354 MS (a)1110 2354 MS (t)1135 2354 MS (a)1160 2354 MS (")1185 2354 MS (,)1210 2354 MS (")1235 2354 MS (N)1260 2354 MS (P)1285 2354 MS (V)1310 2354 MS (e)1335 2354 MS (c)1360 2354 MS (C)1385 2354 MS (o)1410 2354 MS +(m)1435 2354 MS (p)1460 2354 MS (o)1485 2354 MS (n)1510 2354 MS (e)1535 2354 MS (n)1560 2354 MS (t)1585 2354 MS (")1610 2354 MS (\))1635 2354 MS +( )1660 2354 MS +(x)235 2401 MS (.)260 2401 MS (S)285 2401 MS (e)310 2401 MS (t)335 2401 MS (F)360 2401 MS (i)385 2401 MS (l)410 2401 MS (e)435 2401 MS (N)460 2401 MS (a)485 2401 MS (m)510 2401 MS (e)535 2401 MS (\()560 2401 MS (")585 2401 MS (/)610 2401 MS +(h)635 2401 MS (o)660 2401 MS (m)685 2401 MS (e)710 2401 MS (/)735 2401 MS (s)760 2401 MS (e)785 2401 MS (c)810 2401 MS (h)835 2401 MS (e)860 2401 MS (r)885 2401 MS (/)910 2401 MS (d)935 2401 MS (a)960 2401 MS (t)985 2401 MS (a)1010 2401 MS +(/)1035 2401 MS (S)1060 2401 MS (o)1085 2401 MS (l)1110 2401 MS (u)1135 2401 MS (t)1160 2401 MS (i)1185 2401 MS (o)1210 2401 MS (n)1235 2401 MS (1)1260 2401 MS (0)1285 2401 MS (0)1310 2401 MS (.)1335 2401 MS (x)1360 2401 MS (d)1385 2401 MS (r)1410 2401 MS +(")1435 2401 MS (\))1460 2401 MS +( )1485 2401 MS +( )235 2448 MS +(s)235 2495 MS (=)260 2495 MS (s)285 2495 MS (a)310 2495 MS (l)335 2495 MS (o)360 2495 MS (m)385 2495 MS (e)410 2495 MS (.)435 2495 MS (l)460 2495 MS (c)485 2495 MS (c)510 2495 MS (.)535 2495 MS (F)560 2495 MS (i)585 2495 MS (n)610 2495 MS +(d)635 2495 MS (O)660 2495 MS (r)685 2495 MS (L)710 2495 MS (o)735 2495 MS (a)760 2495 MS (d)785 2495 MS (C)810 2495 MS (o)835 2495 MS (m)860 2495 MS (p)885 2495 MS (o)910 2495 MS (n)935 2495 MS (e)960 2495 MS (n)985 2495 MS (t)1010 2495 MS +(\()1035 2495 MS (")1060 2495 MS (s)1085 2495 MS (o)1110 2495 MS (l)1135 2495 MS (v)1160 2495 MS (e)1185 2495 MS (_)1210 2495 MS (s)1235 2495 MS (y)1260 2495 MS (s)1285 2495 MS (t)1310 2495 MS (e)1335 2495 MS (m)1360 2495 MS (")1385 2495 MS (,)1410 2495 MS +(")1435 2495 MS (N)1460 2495 MS (P)1485 2495 MS (S)1510 2495 MS (o)1535 2495 MS (l)1560 2495 MS (v)1585 2495 MS (e)1610 2495 MS (C)1635 2495 MS (o)1660 2495 MS (m)1685 2495 MS (p)1710 2495 MS (o)1735 2495 MS (n)1760 2495 MS (e)1785 2495 MS (n)1810 2495 MS +(t)1835 2495 MS (")1860 2495 MS (\))1885 2495 MS +( )1910 2495 MS +(x)235 2543 MS (v)260 2543 MS (=)285 2543 MS (s)310 2543 MS (.)335 2543 MS (S)360 2543 MS (o)385 2543 MS (l)410 2543 MS (v)435 2543 MS (e)460 2543 MS (\()485 2543 MS (A)510 2543 MS (.)535 2543 MS (_)560 2543 MS (g)585 2543 MS (e)610 2543 MS +(t)635 2543 MS (_)660 2543 MS (d)685 2543 MS (m)710 2543 MS (a)735 2543 MS (t)760 2543 MS (\()785 2543 MS (\))810 2543 MS (,)835 2543 MS (b)860 2543 MS (.)885 2543 MS (_)910 2543 MS (g)935 2543 MS (e)960 2543 MS +(t)985 2543 MS (_)1010 2543 MS (d)1035 2543 MS (v)1060 2543 MS (e)1085 2543 MS (c)1110 2543 MS (\()1135 2543 MS (\))1160 2543 MS (\))1185 2543 MS +( )1210 2543 MS +( )235 2590 MS +(x)235 2637 MS (.)260 2637 MS (_)285 2637 MS (s)310 2637 MS (e)335 2637 MS (t)360 2637 MS (_)385 2637 MS (d)410 2637 MS (v)435 2637 MS (e)460 2637 MS (c)485 2637 MS (\()510 2637 MS (x)535 2637 MS (v)560 2637 MS (\))585 2637 MS +( )610 2637 MS +(x)235 2684 MS (.)260 2684 MS (S)285 2684 MS (a)310 2684 MS (v)335 2684 MS (e)360 2684 MS (D)385 2684 MS (a)410 2684 MS (t)435 2684 MS (a)460 2684 MS (T)485 2684 MS (o)510 2684 MS (F)535 2684 MS (i)560 2684 MS (l)585 2684 MS (e)610 2684 MS +(\()635 2684 MS (")660 2684 MS (c)685 2684 MS (a)710 2684 MS (l)735 2684 MS (l)760 2684 MS (b)785 2684 MS (a)810 2684 MS (c)835 2684 MS (k)860 2684 MS (")885 2684 MS (\))910 2684 MS +( )935 2684 MS +( )235 2731 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )348 2789 MS +( )235 2846 MS +showpage +%%Page: 29 29 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(2)1868 400 MS (9)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(1)310 592 MS (0)347 592 MS +( )384 592 MS +( )400 592 MS (C)419 592 MS (o)467 592 MS (n)508 592 MS (c)549 592 MS (l)586 592 MS (u)604 592 MS (s)645 592 MS (i)682 592 MS (o)701 592 MS (n)741 592 MS +( )782 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 667 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +(L)348 724 MS (a)378 724 MS ( )400 724 MS (m)433 724 MS (\351)471 724 MS (t)493 724 MS (h)508 724 MS (o)532 724 MS (d)558 724 MS (e)583 724 MS ( )605 724 MS (i)638 724 MS (d)650 724 MS (\351)676 724 MS (a)698 724 MS (l)721 724 MS +(e)734 724 MS ( )756 724 MS (p)788 724 MS (o)813 724 MS (u)839 724 MS (r)864 724 MS ( )881 724 MS (c)913 724 MS (o)935 724 MS (u)961 724 MS (p)986 724 MS (l)1011 724 MS (e)1023 724 MS (r)1045 724 MS ( )1062 724 MS (d)1094 724 MS +(e)1120 724 MS (s)1142 724 MS ( )1161 724 MS (c)1194 724 MS (o)1216 724 MS (d)1242 724 MS (e)1267 724 MS (s)1289 724 MS ( )1308 724 MS (p)1340 724 MS (a)1366 724 MS (r)1388 724 MS (a)1405 724 MS (l)1428 724 MS (l)1441 724 MS (\350)1454 724 MS +(l)1477 724 MS (e)1490 724 MS (s)1513 724 MS ( )1532 724 MS (d)1564 724 MS (a)1589 724 MS (n)1612 724 MS (s)1637 724 MS ( )1656 724 MS (u)1688 724 MS (n)1714 724 MS ( )1738 724 MS (e)1770 724 MS (n)1793 724 MS (v)1818 724 MS (i)1843 724 MS +(r)1856 724 MS (o)1873 724 MS (n)1899 724 MS (n)1924 724 MS (e)1948 724 MS (m)1971 724 MS (e)2009 724 MS (n)2032 724 MS (t)2056 724 MS ( )2071 724 MS (\340)2103 724 MS ( )2125 724 MS +(a)235 782 MS (r)257 782 MS (c)274 782 MS (h)296 782 MS (i)321 782 MS (t)333 782 MS (e)348 782 MS (c)370 782 MS (t)392 782 MS (u)407 782 MS (r)432 782 MS (e)449 782 MS ( )471 782 MS (r)484 782 MS (\351)501 782 MS (p)523 782 MS +(a)548 782 MS (r)570 782 MS (t)586 782 MS (i)601 782 MS (e)614 782 MS ( )636 782 MS (c)649 782 MS (o)671 782 MS (n)697 782 MS (s)721 782 MS (i)741 782 MS (s)754 782 MS (t)773 782 MS (e)788 782 MS (r)810 782 MS (a)827 782 MS +( )849 782 MS (\340)862 782 MS ( )884 782 MS (u)897 782 MS (t)922 782 MS (i)937 782 MS (l)950 782 MS (i)964 782 MS (s)977 782 MS (e)997 782 MS (r)1019 782 MS ( )1036 782 MS (u)1049 782 MS (n)1074 782 MS ( )1098 782 MS (O)1112 782 MS +(R)1148 782 MS (B)1181 782 MS ( )1214 782 MS (p)1227 782 MS (a)1253 782 MS (r)1275 782 MS (a)1292 782 MS (l)1315 782 MS (l)1328 782 MS (\350)1341 782 MS (l)1364 782 MS (e)1377 782 MS (.)1399 782 MS ( )1412 782 MS (O)1425 782 MS (n)1462 782 MS +( )1486 782 MS (a)1499 782 MS (u)1521 782 MS (r)1546 782 MS (a)1563 782 MS ( )1585 782 MS (a)1598 782 MS (i)1621 782 MS (n)1634 782 MS (s)1659 782 MS (i)1679 782 MS ( )1692 782 MS (\340)1705 782 MS ( )1727 782 MS (l)1741 782 MS (a)1754 782 MS +( )1776 782 MS (f)1790 782 MS (o)1805 782 MS (i)1832 782 MS (s)1845 782 MS ( )1864 782 MS (l)1878 782 MS (a)1891 782 MS ( )1913 782 MS (s)1927 782 MS (i)1947 782 MS (m)1961 782 MS (p)1999 782 MS (l)2025 782 MS (i)2038 782 MS (c)2051 782 MS +(i)2074 782 MS (t)2086 782 MS (\351)2102 782 MS ( )2125 782 MS +(d)235 839 MS (\222)260 839 MS (i)277 839 MS (n)290 839 MS (t)314 839 MS (\351)329 839 MS (g)351 839 MS +(r)376 839 MS (a)393 839 MS (t)415 839 MS (i)430 839 MS (o)442 839 MS (n)468 839 MS ( )492 839 MS (d)505 839 MS (e)530 839 MS (s)552 839 MS ( )571 839 MS (c)584 839 MS (o)606 839 MS (m)633 839 MS (p)670 839 MS (o)695 839 MS +(s)721 839 MS (a)740 839 MS (n)763 839 MS (t)787 839 MS (s)802 839 MS ( )821 839 MS (d)834 839 MS (a)859 839 MS (n)881 839 MS (s)905 839 MS ( )924 839 MS (l)938 839 MS (a)951 839 MS ( )973 839 MS (p)986 839 MS (l)1012 839 MS +(a)1025 839 MS (t)1047 839 MS (e)1062 839 MS +(-)1084 839 MS +(f)1101 839 MS (o)1116 839 MS (r)1142 839 MS (m)1160 839 MS (e)1197 839 MS ( )1219 839 MS (S)1233 839 MS (A)1261 839 MS (L)1296 839 MS (O)1327 839 MS (M)1363 839 MS (E)1407 839 MS ( )1438 839 MS (e)1451 839 MS (t)1473 839 MS ( )1488 839 MS +(u)1501 839 MS (n)1526 839 MS (e)1550 839 MS ( )1572 839 MS (b)1585 839 MS (o)1609 839 MS (n)1635 839 MS (n)1660 839 MS (e)1684 839 MS ( )1706 839 MS (p)1719 839 MS (e)1744 839 MS (r)1766 839 MS (f)1784 839 MS (o)1799 839 MS (r)1825 839 MS +(m)1843 839 MS (a)1880 839 MS (n)1903 839 MS (c)1927 839 MS (e)1949 839 MS ( )1971 839 MS (d)1984 839 MS (a)2009 839 MS (n)2032 839 MS (s)2056 839 MS ( )2075 839 MS (l)2089 839 MS (e)2102 839 MS ( )2125 839 MS +(t)235 897 MS (r)250 897 MS (a)267 897 MS (i)289 897 MS (t)301 897 MS (e)316 897 MS (m)339 897 MS (e)376 897 MS (n)399 897 MS (t)423 897 MS ( )438 897 MS (d)465 897 MS (e)490 897 MS (s)512 897 MS ( )531 897 MS (a)558 897 MS +(l)581 897 MS (g)594 897 MS (o)619 897 MS (r)645 897 MS (i)663 897 MS (t)675 897 MS (h)690 897 MS (m)715 897 MS (e)753 897 MS (s)775 897 MS ( )794 897 MS (e)822 897 MS (t)844 897 MS ( )859 897 MS (l)887 897 MS (e)899 897 MS +(s)921 897 MS ( )941 897 MS (\351)968 897 MS (c)990 897 MS (h)1013 897 MS (a)1037 897 MS (n)1060 897 MS (g)1084 897 MS (e)1110 897 MS (s)1132 897 MS ( )1151 897 MS (d)1178 897 MS (e)1204 897 MS ( )1226 897 MS (d)1254 897 MS (o)1279 897 MS +(n)1305 897 MS (n)1329 897 MS (\351)1353 897 MS (e)1375 897 MS (s)1398 897 MS (.)1417 897 MS ( )1430 897 MS (M)1457 897 MS (a)1501 897 MS (l)1524 897 MS (h)1537 897 MS (e)1562 897 MS (u)1584 897 MS (r)1609 897 MS (e)1626 897 MS (u)1648 897 MS +(s)1674 897 MS (e)1693 897 MS (m)1716 897 MS (e)1754 897 MS (n)1777 897 MS (t)1801 897 MS (,)1816 897 MS ( )1829 897 MS (c)1856 897 MS (o)1878 897 MS (m)1904 897 MS (m)1942 897 MS (e)1980 897 MS ( )2002 897 MS (n)2030 897 MS (o)2054 897 MS +(u)2080 897 MS (s)2105 897 MS ( )2125 897 MS +(l)235 954 MS (\222)248 954 MS (a)265 954 MS (v)288 954 MS (o)312 954 MS (n)338 954 MS (s)362 954 MS ( )381 954 MS (d)395 954 MS (i)421 954 MS (t)433 954 MS ( )448 954 MS (a)463 954 MS (u)485 954 MS ( )510 954 MS (d)524 954 MS +(\351)549 954 MS (b)572 954 MS (u)596 954 MS (t)621 954 MS ( )636 954 MS (d)650 954 MS (e)675 954 MS ( )697 954 MS (c)711 954 MS (e)733 954 MS ( )755 954 MS (d)769 954 MS (o)794 954 MS (c)820 954 MS (u)842 954 MS (m)868 954 MS +(e)905 954 MS (n)928 954 MS (t)952 954 MS (,)967 954 MS ( )980 954 MS (l)995 954 MS (\222)1007 954 MS (O)1023 954 MS (R)1060 954 MS (B)1093 954 MS ( )1126 954 MS (p)1140 954 MS (a)1165 954 MS (r)1187 954 MS (a)1204 954 MS (l)1227 954 MS +(l)1241 954 MS (\350)1255 954 MS (l)1278 954 MS (e)1290 954 MS ( )1312 954 MS (n)1327 954 MS (\222)1352 954 MS (e)1368 954 MS (n)1391 954 MS ( )1415 954 MS (e)1430 954 MS (s)1452 954 MS (t)1471 954 MS ( )1486 954 MS (q)1500 954 MS (u)1525 954 MS +(\222)1550 954 MS (\340)1566 954 MS ( )1588 954 MS (l)1603 954 MS (\222)1616 954 MS (\351)1633 954 MS (t)1655 954 MS (a)1670 954 MS (t)1692 954 MS ( )1707 954 MS (d)1721 954 MS (e)1746 954 MS ( )1768 954 MS (r)1782 954 MS (e)1799 954 MS (c)1821 954 MS +(h)1843 954 MS (e)1867 954 MS (r)1889 954 MS (c)1906 954 MS (h)1929 954 MS (e)1953 954 MS (,)1975 954 MS ( )1988 954 MS (m)2003 954 MS (\352)2041 954 MS (m)2064 954 MS +(e)2102 954 MS ( )2125 954 MS +(s)235 1012 MS (i)255 1012 MS ( )267 1012 MS (l)286 1012 MS (\222)299 1012 MS (O)316 1012 MS (M)352 1012 MS (G)396 1012 MS ( )432 1012 MS (a)450 1012 MS ( )472 1012 MS (d)490 1012 MS (\351)515 1012 MS (c)537 1012 MS (i)560 1012 MS (d)573 1012 MS +(\351)598 1012 MS ( )620 1012 MS (s)638 1012 MS (o)657 1012 MS (n)683 1012 MS ( )707 1012 MS (i)726 1012 MS (n)739 1012 MS (t)763 1012 MS (r)778 1012 MS (o)795 1012 MS (d)821 1012 MS (u)846 1012 MS (c)871 1012 MS (t)892 1012 MS (i)907 1012 MS +(o)919 1012 MS (n)945 1012 MS ( )969 1012 MS (d)987 1012 MS (a)1012 1012 MS (n)1035 1012 MS (s)1059 1012 MS ( )1078 1012 MS (l)1097 1012 MS (a)1110 1012 MS ( )1132 1012 MS (n)1150 1012 MS (o)1174 1012 MS (r)1200 1012 MS (m)1218 1012 MS (e)1256 1012 MS +( )1278 1012 MS (C)1296 1012 MS (O)1329 1012 MS (R)1365 1012 MS (B)1398 1012 MS (A)1432 1012 MS (,)1467 1012 MS ( )1480 1012 MS (e)1498 1012 MS (t)1520 1012 MS ( )1535 1012 MS (d)1553 1012 MS (\351)1578 1012 MS (f)1600 1012 MS (i)1616 1012 MS (n)1629 1012 MS +(i)1654 1012 MS ( )1667 1012 MS (u)1685 1012 MS (n)1711 1012 MS ( )1735 1012 MS (c)1753 1012 MS (e)1775 1012 MS (r)1797 1012 MS (t)1814 1012 MS (a)1829 1012 MS (i)1852 1012 MS (n)1865 1012 MS ( )1889 1012 MS (n)1907 1012 MS (o)1931 1012 MS (m)1958 1012 MS +(b)1996 1012 MS (r)2020 1012 MS (e)2037 1012 MS ( )2059 1012 MS (d)2077 1012 MS (e)2102 1012 MS ( )2125 1012 MS +(s)235 1069 MS (p)254 1069 MS (\351)279 1069 MS (c)301 1069 MS (i)324 1069 MS (f)337 1069 MS (i)354 1069 MS (c)367 1069 MS (a)390 1069 MS (t)412 1069 MS (i)427 1069 MS (o)439 1069 MS (n)465 1069 MS (s)490 1069 MS ( )509 1069 MS ([)522 1069 MS +(9)539 1069 MS (])564 1069 MS (.)581 1069 MS +( )594 1069 MS +(U)348 1127 MS (n)384 1127 MS (e)408 1127 MS ( )430 1127 MS (a)445 1127 MS (p)467 1127 MS (p)492 1127 MS (r)517 1127 MS (o)534 1127 MS (c)560 1127 MS (h)582 1127 MS (e)606 1127 MS ( )628 1127 MS (s)643 1127 MS (i)663 1127 MS (m)677 1127 MS +(p)715 1127 MS (l)741 1127 MS (e)754 1127 MS ( )776 1127 MS (c)791 1127 MS (o)813 1127 MS (n)839 1127 MS (s)863 1127 MS (i)883 1127 MS (s)896 1127 MS (t)915 1127 MS (e)930 1127 MS (r)952 1127 MS (a)969 1127 MS (i)992 1127 MS (t)1004 1127 MS +( )1019 1127 MS (\340)1034 1127 MS ( )1056 1127 MS (d)1071 1127 MS (\351)1096 1127 MS (l)1119 1127 MS (\351)1131 1127 MS (g)1153 1127 MS (u)1178 1127 MS (e)1204 1127 MS (r)1226 1127 MS ( )1243 1127 MS (a)1258 1127 MS (u)1280 1127 MS ( )1305 1127 MS (p)1320 1127 MS +(r)1345 1127 MS (o)1361 1127 MS (c)1387 1127 MS (e)1409 1127 MS (s)1431 1127 MS (s)1450 1127 MS (u)1469 1127 MS (s)1494 1127 MS ( )1513 1127 MS (m)1529 1127 MS (a)1566 1127 MS (\356)1589 1127 MS (t)1601 1127 MS (r)1616 1127 MS (e)1633 1127 MS ( )1655 1127 MS +(l)1671 1127 MS (\222)1684 1127 MS (\351)1701 1127 MS (c)1723 1127 MS (h)1746 1127 MS (a)1770 1127 MS (n)1793 1127 MS (g)1817 1127 MS (e)1842 1127 MS ( )1864 1127 MS (d)1879 1127 MS (e)1904 1127 MS (s)1926 1127 MS ( )1945 1127 MS (d)1960 1127 MS (o)1985 1127 MS +(n)2011 1127 MS (n)2036 1127 MS (\351)2060 1127 MS (e)2082 1127 MS (s)2105 1127 MS ( )2125 1127 MS +(p)235 1184 MS (a)260 1184 MS (r)282 1184 MS (a)299 1184 MS (l)322 1184 MS (l)335 1184 MS (\350)348 1184 MS (l)371 1184 MS (e)384 1184 MS (s)407 1184 MS (.)426 1184 MS ( )439 1184 MS (L)452 1184 MS (\222)482 1184 MS (i)499 1184 MS (n)512 1184 MS +(t)536 1184 MS (\351)551 1184 MS (g)573 1184 MS (r)598 1184 MS (a)615 1184 MS (t)637 1184 MS (i)653 1184 MS (o)665 1184 MS (n)691 1184 MS ( )715 1184 MS (d)728 1184 MS (\222)753 1184 MS (u)769 1184 MS (n)795 1184 MS ( )819 1184 MS (c)832 1184 MS +(o)854 1184 MS (m)881 1184 MS (p)918 1184 MS (o)943 1184 MS (s)969 1184 MS (a)988 1184 MS (n)1011 1184 MS (t)1035 1184 MS ( )1050 1184 MS (p)1063 1184 MS (a)1088 1184 MS (r)1110 1184 MS (a)1127 1184 MS (l)1149 1184 MS (l)1162 1184 MS (\350)1175 1184 MS +(l)1198 1184 MS (e)1211 1184 MS ( )1233 1184 MS (d)1247 1184 MS (a)1272 1184 MS (n)1294 1184 MS (s)1319 1184 MS ( )1338 1184 MS (l)1352 1184 MS (\222)1365 1184 MS (e)1381 1184 MS (n)1404 1184 MS (v)1429 1184 MS +(i)1454 1184 MS (r)1467 1184 MS (o)1484 1184 MS (n)1510 1184 MS (n)1535 1184 MS (e)1559 1184 MS (m)1582 1184 MS (e)1620 1184 MS (n)1643 1184 MS (t)1667 1184 MS ( )1682 1184 MS (S)1695 1184 MS (A)1723 1184 MS (L)1758 1184 MS (O)1788 1184 MS (M)1825 1184 MS +(E)1869 1184 MS ( )1900 1184 MS (s)1913 1184 MS (e)1932 1184 MS (r)1954 1184 MS (a)1971 1184 MS (i)1994 1184 MS (t)2006 1184 MS ( )2021 1184 MS (a)2034 1184 MS (i)2057 1184 MS (s)2070 1184 MS (\351)2089 1184 MS (.)2111 1184 MS ( )2125 1184 MS +(P)235 1242 MS (a)263 1242 MS (r)285 1242 MS ( )302 1242 MS (c)315 1242 MS (o)337 1242 MS (n)363 1242 MS (t)386 1242 MS (r)401 1242 MS (e)418 1242 MS (,)440 1242 MS ( )453 1242 MS (i)466 1242 MS (l)479 1242 MS ( )491 1242 MS (y)505 1242 MS +( )529 1242 MS (a)542 1242 MS (u)564 1242 MS (r)589 1242 MS (a)606 1242 MS (i)629 1242 MS (t)641 1242 MS ( )656 1242 MS (u)669 1242 MS (n)694 1242 MS ( )718 1242 MS (p)731 1242 MS (r)756 1242 MS (o)773 1242 MS (b)799 1242 MS (l)824 1242 MS +(\350)837 1242 MS (m)860 1242 MS (e)898 1242 MS ( )920 1242 MS (d)933 1242 MS (e)958 1242 MS ( )980 1242 MS (p)993 1242 MS (e)1018 1242 MS (r)1040 1242 MS (f)1058 1242 MS (o)1073 1242 MS (r)1099 1242 MS (m)1116 1242 MS (a)1154 1242 MS (n)1177 1242 MS +(c)1201 1242 MS (e)1223 1242 MS ( )1246 1242 MS (n)1259 1242 MS (o)1283 1242 MS (n)1309 1242 MS ( )1333 1242 MS (n)1346 1242 MS (\351)1371 1242 MS (g)1393 1242 MS (l)1419 1242 MS (i)1432 1242 MS (g)1445 1242 MS (e)1471 1242 MS (a)1493 1242 MS (b)1516 1242 MS +(l)1541 1242 MS (e)1554 1242 MS ( )1576 1242 MS (d)1589 1242 MS (a)1614 1242 MS (n)1637 1242 MS (s)1661 1242 MS ( )1680 1242 MS (l)1694 1242 MS (\222)1707 1242 MS (\351)1724 1242 MS (c)1746 1242 MS (h)1769 1242 MS (a)1793 1242 MS (n)1816 1242 MS (g)1840 1242 MS +(e)1865 1242 MS ( )1887 1242 MS (d)1900 1242 MS (e)1925 1242 MS ( )1947 1242 MS (d)1960 1242 MS (o)1985 1242 MS (n)2011 1242 MS (n)2036 1242 MS (\351)2060 1242 MS (e)2082 1242 MS (s)2105 1242 MS ( )2125 1242 MS +(d)235 1299 MS (i)261 1299 MS (s)273 1299 MS (t)292 1299 MS (r)307 1299 MS (i)325 1299 MS (b)338 1299 MS (u)362 1299 MS (\351)387 1299 MS (e)409 1299 MS (s)432 1299 MS (.)451 1299 MS +( )464 1299 MS +( )348 1357 MS +(L)348 1414 MS (a)378 1414 MS ( )400 1414 MS (m)414 1414 MS (\351)451 1414 MS (t)473 1414 MS (h)488 1414 MS (o)512 1414 MS (d)538 1414 MS (e)563 1414 MS ( )585 1414 MS (p)598 1414 MS (r)623 1414 MS (o)640 1414 MS (p)666 1414 MS (o)690 1414 MS +(s)716 1414 MS (\351)735 1414 MS (e)757 1414 MS ( )779 1414 MS (d)792 1414 MS (a)817 1414 MS (n)839 1414 MS (s)863 1414 MS ( )882 1414 MS (c)895 1414 MS (e)917 1414 MS ( )939 1414 MS (d)952 1414 MS (o)977 1414 MS (c)1003 1414 MS (u)1025 1414 MS +(m)1050 1414 MS (e)1087 1414 MS (n)1110 1414 MS (t)1134 1414 MS ( )1149 1414 MS (p)1162 1414 MS (o)1187 1414 MS (u)1213 1414 MS (r)1237 1414 MS ( )1254 1414 MS (i)1267 1414 MS (n)1280 1414 MS (t)1304 1414 MS (r)1319 1414 MS (o)1335 1414 MS (d)1360 1414 MS +(u)1385 1414 MS (i)1411 1414 MS (r)1423 1414 MS (e)1440 1414 MS ( )1462 1414 MS (l)1476 1414 MS (a)1488 1414 MS ( )1510 1414 MS (n)1524 1414 MS (o)1548 1414 MS (t)1574 1414 MS (i)1589 1414 MS (o)1601 1414 MS (n)1627 1414 MS ( )1651 1414 MS (d)1664 1414 MS +(e)1689 1414 MS ( )1711 1414 MS (c)1724 1414 MS (o)1746 1414 MS (m)1772 1414 MS (p)1809 1414 MS (o)1834 1414 MS (s)1860 1414 MS (a)1879 1414 MS (n)1902 1414 MS (t)1926 1414 MS ( )1941 1414 MS (p)1954 1414 MS (a)1979 1414 MS (r)2001 1414 MS (a)2018 1414 MS +(l)2040 1414 MS (l)2053 1414 MS (\350)2066 1414 MS (l)2089 1414 MS (e)2102 1414 MS ( )2125 1414 MS +(d)235 1472 MS (a)260 1472 MS (n)282 1472 MS (s)307 1472 MS ( )326 1472 MS (l)349 1472 MS (a)362 1472 MS ( )384 1472 MS (p)406 1472 MS (l)432 1472 MS (a)445 1472 MS (t)467 1472 MS (e)482 1472 MS +(-)504 1472 MS +(f)521 1472 MS (o)536 1472 MS (r)562 1472 MS (m)579 1472 MS (e)617 1472 MS ( )639 1472 MS (S)661 1472 MS (A)689 1472 MS (L)725 1472 MS (O)755 1472 MS (M)792 1472 MS (E)836 1472 MS ( )867 1472 MS (e)889 1472 MS (s)911 1472 MS (t)930 1472 MS +( )945 1472 MS (s)967 1472 MS +(u)986 1472 MS (f)1012 1472 MS (f)1028 1472 MS (i)1044 1472 MS (s)1057 1472 MS (a)1077 1472 MS (m)1100 1472 MS (m)1139 1472 MS (e)1177 1472 MS (n)1200 1472 MS (t)1224 1472 MS ( )1239 1472 MS (g)1261 1472 MS (\351)1286 1472 MS (n)1308 1472 MS (\351)1332 1472 MS +(r)1354 1472 MS (a)1371 1472 MS (l)1394 1472 MS (e)1407 1472 MS ( )1429 1472 MS (p)1451 1472 MS (o)1476 1472 MS (u)1502 1472 MS (r)1527 1472 MS ( )1544 1472 MS (p)1566 1472 MS (e)1591 1472 MS (r)1613 1472 MS (m)1630 1472 MS (e)1668 1472 MS (t)1690 1472 MS +(t)1704 1472 MS (r)1719 1472 MS (e)1736 1472 MS ( )1758 1472 MS (\340)1780 1472 MS ( )1802 1472 MS (d)1824 1472 MS (e)1849 1472 MS (u)1871 1472 MS (x)1896 1472 MS ( )1920 1472 MS (c)1942 1472 MS (o)1964 1472 MS (d)1990 1472 MS (e)2015 1472 MS (s)2037 1472 MS +( )2056 1472 MS (d)2078 1472 MS (e)2103 1472 MS ( )2125 1472 MS +(c)235 1529 MS (a)257 1529 MS (l)280 1529 MS (c)292 1529 MS (u)314 1529 MS (l)340 1529 MS (s)353 1529 MS ( )373 1529 MS (p)392 1529 MS (a)417 1529 MS (r)439 1529 MS (a)456 1529 MS (l)479 1529 MS (l)493 1529 MS (\350)506 1529 MS (l)529 1529 MS +(e)542 1529 MS (s)564 1529 MS ( )583 1529 MS (c)602 1529 MS (h)625 1529 MS (a)650 1529 MS (r)672 1529 MS (g)689 1529 MS (\351)714 1529 MS (s)736 1529 MS ( )755 1529 MS (s)774 1529 MS (u)793 1529 MS (r)818 1529 MS ( )835 1529 MS (d)854 1529 MS +(e)879 1529 MS (u)901 1529 MS (x)927 1529 MS ( )951 1529 MS (m)971 1529 MS (a)1009 1529 MS (c)1031 1529 MS (h)1054 1529 MS (i)1079 1529 MS (n)1092 1529 MS (e)1117 1529 MS (s)1140 1529 MS ( )1159 1529 MS (d)1178 1529 MS (i)1204 1529 MS (f)1217 1529 MS +(f)1234 1529 MS (\351)1251 1529 MS (r)1273 1529 MS (e)1290 1529 MS (n)1312 1529 MS (t)1336 1529 MS (e)1351 1529 MS (s)1373 1529 MS (,)1392 1529 MS ( )1405 1529 MS (d)1424 1529 MS (\222)1449 1529 MS (\351)1465 1529 MS (c)1487 1529 MS (h)1510 1529 MS (a)1534 1529 MS +(n)1557 1529 MS (g)1581 1529 MS (e)1606 1529 MS (r)1628 1529 MS ( )1645 1529 MS (d)1664 1529 MS (e)1689 1529 MS (s)1712 1529 MS ( )1731 1529 MS (d)1750 1529 MS (o)1775 1529 MS (n)1801 1529 MS (n)1826 1529 MS (\351)1850 1529 MS (e)1872 1529 MS (s)1894 1529 MS +( )1913 1529 MS (p)1932 1529 MS (a)1957 1529 MS (r)1979 1529 MS (a)1996 1529 MS (l)2019 1529 MS (l)2033 1529 MS (\350)2046 1529 MS (l)2069 1529 MS (e)2082 1529 MS (s)2105 1529 MS ( )2125 1529 MS +(t)235 1586 MS (o)249 1586 MS (u)275 1586 MS (t)299 1586 MS ( )313 1586 MS (e)331 1586 MS (n)353 1586 MS ( )377 1586 MS (o)395 1586 MS (p)421 1586 MS (t)445 1586 MS (i)460 1586 MS (m)473 1586 MS (i)512 1586 MS (s)525 1586 MS (a)544 1586 MS +(n)567 1586 MS (t)591 1586 MS ( )606 1586 MS (l)625 1586 MS (e)637 1586 MS (u)659 1586 MS (r)684 1586 MS ( )701 1586 MS (t)719 1586 MS (r)734 1586 MS (a)751 1586 MS (n)773 1586 MS (s)797 1586 MS (f)817 1586 MS (e)832 1586 MS (r)854 1586 MS +(t)871 1586 MS ( )886 1586 MS (s)904 1586 MS (u)923 1586 MS (r)948 1586 MS ( )965 1586 MS (l)983 1586 MS (e)996 1586 MS ( )1018 1586 MS (r)1036 1586 MS (\351)1053 1586 MS (s)1075 1586 MS (e)1094 1586 MS (a)1116 1586 MS (u)1138 1586 MS (,)1163 1586 MS +( )1176 1586 MS (\340)1194 1586 MS ( )1216 1586 MS (c)1234 1586 MS (o)1256 1586 MS (n)1282 1586 MS (d)1306 1586 MS (i)1332 1586 MS (t)1344 1586 MS (i)1360 1586 MS (o)1372 1586 MS (n)1398 1586 MS ( )1422 1586 MS (q)1440 1586 MS (u)1465 1586 MS (e)1490 1586 MS +( )1512 1586 MS (l)1531 1586 MS (a)1543 1586 MS ( )1565 1586 MS (d)1583 1586 MS (i)1609 1586 MS (s)1622 1586 MS (c)1641 1586 MS (r)1663 1586 MS (\351)1680 1586 MS (t)1702 1586 MS (i)1718 1586 MS (s)1731 1586 MS (a)1750 1586 MS (t)1772 1586 MS (i)1787 1586 MS +(o)1799 1586 MS (n)1825 1586 MS ( )1849 1586 MS (d)1867 1586 MS (u)1892 1586 MS ( )1917 1586 MS (p)1935 1586 MS (r)1960 1586 MS (o)1977 1586 MS (b)2003 1586 MS (l)2028 1586 MS (\350)2041 1586 MS (m)2064 1586 MS (e)2102 1586 MS ( )2125 1586 MS +(t)235 1644 MS (r)250 1644 MS (a)267 1644 MS (i)289 1644 MS (t)301 1644 MS (\351)316 1644 MS ( )338 1644 MS (s)352 1644 MS (o)371 1644 MS (i)397 1644 MS (t)409 1644 MS ( )424 1644 MS (i)439 1644 MS (d)451 1644 MS (e)476 1644 MS (n)499 1644 MS +(t)523 1644 MS +(i)539 1644 MS (q)551 1644 MS (u)576 1644 MS (e)601 1644 MS ( )623 1644 MS (d)637 1644 MS (a)662 1644 MS (n)685 1644 MS (s)709 1644 MS ( )728 1644 MS (c)742 1644 MS (e)765 1644 MS (s)787 1644 MS ( )806 1644 MS (d)820 1644 MS (e)845 1644 MS +(u)867 1644 MS (x)893 1644 MS ( )917 1644 MS (p)931 1644 MS (r)956 1644 MS (o)973 1644 MS (g)999 1644 MS (r)1024 1644 MS (a)1041 1644 MS (m)1063 1644 MS (m)1101 1644 MS (e)1139 1644 MS (s)1162 1644 MS (.)1181 1644 MS ( )1194 1644 MS (L)1208 1644 MS +(\222)1239 1644 MS (i)1256 1644 MS (n)1269 1644 MS (c)1294 1644 MS (o)1316 1644 MS (n)1342 1644 MS (v)1367 1644 MS (\351)1391 1644 MS (n)1414 1644 MS (i)1439 1644 MS (e)1452 1644 MS (n)1475 1644 MS (t)1499 1644 MS ( )1514 1644 MS (d)1528 1644 MS (e)1553 1644 MS +( )1575 1644 MS (l)1590 1644 MS (a)1602 1644 MS ( )1624 1644 MS (m)1639 1644 MS (\351)1677 1644 MS (t)1699 1644 MS (h)1714 1644 MS (o)1738 1644 MS (d)1764 1644 MS (e)1789 1644 MS ( )1811 1644 MS (e)1825 1644 MS (x)1847 1644 MS (p)1871 1644 MS (l)1897 1644 MS +(i)1911 1644 MS (q)1924 1644 MS (u)1949 1644 MS (\351)1974 1644 MS (e)1997 1644 MS ( )2019 1644 MS (d)2033 1644 MS (a)2058 1644 MS (n)2081 1644 MS (s)2105 1644 MS ( )2125 1644 MS +(c)235 1701 MS (e)257 1701 MS ( )279 1701 MS (d)297 1701 MS (o)322 1701 MS (c)348 1701 MS (u)370 1701 MS (m)396 1701 MS (e)433 1701 MS (n)456 1701 MS (t)480 1701 MS ( )495 1701 MS (p)513 1701 MS (o)538 1701 MS (u)564 1701 MS (r)588 1701 MS +( )605 1701 MS (i)623 1701 MS (n)636 1701 MS (t)660 1701 MS (r)675 1701 MS (o)692 1701 MS (d)718 1701 MS (u)743 1701 MS (i)768 1701 MS (r)780 1701 MS (e)797 1701 MS ( )819 1701 MS (l)838 1701 MS (a)851 1701 MS ( )873 1701 MS (n)892 1701 MS +(o)916 1701 MS (t)942 1701 MS (i)957 1701 MS (o)969 1701 MS (n)995 1701 MS ( )1019 1701 MS (d)1037 1701 MS (e)1062 1701 MS ( )1084 1701 MS (c)1102 1701 MS (o)1124 1701 MS (m)1151 1701 MS (p)1188 1701 MS (o)1213 1701 MS (s)1239 1701 MS (a)1258 1701 MS +(n)1280 1701 MS (t)1304 1701 MS ( )1319 1701 MS (p)1337 1701 MS (a)1362 1701 MS (r)1384 1701 MS (a)1401 1701 MS (l)1424 1701 MS (l)1437 1701 MS (\350)1450 1701 MS (l)1473 1701 MS (e)1486 1701 MS ( )1508 1701 MS (d)1526 1701 MS (a)1551 1701 MS (n)1574 1701 MS +(s)1599 1701 MS ( )1618 1701 MS (S)1636 1701 MS (A)1665 1701 MS (L)1700 1701 MS (O)1731 1701 MS (M)1767 1701 MS (E)1811 1701 MS ( )1842 1701 MS (\340)1860 1701 MS ( )1882 1701 MS (l)1901 1701 MS (\222)1914 1701 MS (a)1931 1701 MS (i)1954 1701 MS (d)1966 1701 MS +(e)1992 1701 MS ( )2014 1701 MS (d)2032 1701 MS (\222)2057 1701 MS (u)2073 1701 MS (n)2100 1701 MS ( )2125 1701 MS +(O)235 1759 MS (R)271 1759 MS (B)304 1759 MS ( )337 1759 MS (s)357 1759 MS (\351)376 1759 MS (q)398 1759 MS (u)423 1759 MS (e)449 1759 MS (n)472 1759 MS (t)496 1759 MS (i)511 1759 MS (e)524 1759 MS (l)547 1759 MS (,)559 1759 MS ( )572 1759 MS +(e)592 1759 MS (s)615 1759 MS (t)634 1759 MS ( )649 1759 MS (q)669 1759 MS (u)694 1759 MS (e)719 1759 MS ( )741 1759 MS (t)761 1759 MS (o)775 1759 MS (u)801 1759 MS (t)825 1759 MS (e)840 1759 MS ( )862 1759 MS (l)882 1759 MS (a)894 1759 MS +( )916 1759 MS (m)937 1759 MS (\351)975 1759 MS (c)997 1759 MS (a)1019 1759 MS (n)1042 1759 MS (i)1067 1759 MS (q)1080 1759 MS (u)1105 1759 MS (e)1131 1759 MS ( )1153 1759 MS (d)1173 1759 MS (e)1198 1759 MS ( )1220 1759 MS (g)1241 1759 MS (e)1266 1759 MS +(s)1288 1759 MS (t)1307 1759 MS (i)1322 1759 MS (o)1334 1759 MS (n)1360 1759 MS ( )1384 1759 MS (d)1404 1759 MS (u)1429 1759 MS ( )1455 1759 MS (p)1475 1759 MS (a)1500 1759 MS (r)1522 1759 MS (a)1539 1759 MS (l)1562 1759 MS (l)1575 1759 MS (\351)1588 1759 MS +(l)1611 1759 MS (i)1625 1759 MS (s)1638 1759 MS (m)1659 1759 MS (e)1697 1759 MS ( )1719 1759 MS (e)1739 1759 MS (s)1762 1759 MS (t)1781 1759 MS ( )1796 1759 MS (i)1816 1759 MS (n)1829 1759 MS (c)1854 1759 MS (l)1877 1759 MS (u)1889 1759 MS (s)1915 1759 MS +(e)1934 1759 MS ( )1956 1759 MS (d)1976 1759 MS (a)2001 1759 MS (n)2024 1759 MS (s)2049 1759 MS ( )2068 1759 MS (l)2089 1759 MS (e)2102 1759 MS ( )2125 1759 MS +(c)235 1816 MS (o)257 1816 MS (m)283 1816 MS (p)320 1816 MS +(o)345 1816 MS (s)371 1816 MS (a)390 1816 MS (n)413 1816 MS (t)437 1816 MS ( )452 1816 MS (p)468 1816 MS (a)493 1816 MS (r)515 1816 MS (a)532 1816 MS (l)555 1816 MS (l)568 1816 MS (\350)581 1816 MS (l)604 1816 MS (e)617 1816 MS (.)639 1816 MS +( )652 1816 MS (E)668 1816 MS (l)700 1816 MS (l)713 1816 MS (e)726 1816 MS ( )748 1816 MS (e)765 1816 MS (s)787 1816 MS (t)806 1816 MS ( )821 1816 MS (d)837 1816 MS (o)862 1816 MS (n)888 1816 MS (c)912 1816 MS ( )934 1816 MS (e)950 1816 MS +(n)973 1816 MS (t)997 1816 MS (i)1013 1816 MS (\350)1025 1816 MS (r)1047 1816 MS (e)1064 1816 MS (m)1087 1816 MS (e)1125 1816 MS (n)1148 1816 MS (t)1172 1816 MS ( )1187 1816 MS (\340)1203 1816 MS ( )1225 1816 MS (l)1242 1816 MS (a)1255 1816 MS ( )1277 1816 MS +(c)1293 1816 MS (h)1316 1816 MS (a)1340 1816 MS (r)1362 1816 MS (g)1379 1816 MS (e)1404 1816 MS ( )1426 1816 MS (d)1442 1816 MS (e)1467 1816 MS ( )1489 1816 MS (l)1506 1816 MS (\222)1519 1816 MS (u)1536 1816 MS (t)1561 1816 MS (i)1577 1816 MS (l)1590 1816 MS +(i)1603 1816 MS (s)1616 1816 MS (a)1636 1816 MS (t)1658 1816 MS (e)1673 1816 MS (u)1695 1816 MS (r)1720 1816 MS ( )1737 1816 MS (q)1753 1816 MS (u)1778 1816 MS (i)1804 1816 MS ( )1816 1816 MS (d)1832 1816 MS (\351)1857 1816 MS (s)1880 1816 MS (i)1900 1816 MS +(r)1912 1816 MS (e)1930 1816 MS ( )1952 1816 MS (i)1969 1816 MS (n)1982 1816 MS (t)2006 1816 MS (\351)2021 1816 MS (g)2043 1816 MS (r)2068 1816 MS (e)2085 1816 MS (r)2107 1816 MS ( )2125 1816 MS +(s)235 1874 MS (o)254 1874 MS (n)280 1874 MS ( )304 1874 MS (c)317 1874 MS (o)339 1874 MS (d)365 1874 MS (e)390 1874 MS ( )412 1874 MS (d)425 1874 MS (a)450 1874 MS (n)473 1874 MS (s)497 1874 MS ( )517 1874 MS (l)531 1874 MS (a)544 1874 MS +( )566 1874 MS (p)579 1874 MS (l)605 1874 MS (a)618 1874 MS (t)640 1874 MS (e)655 1874 MS +(-)677 1874 MS +(f)695 1874 MS (o)710 1874 MS (r)736 1874 MS (m)753 1874 MS (e)790 1874 MS ( )813 1874 MS (S)826 1874 MS (A)855 1874 MS (L)890 1874 MS (O)920 1874 MS (M)957 1874 MS (E)1001 1874 MS (,)1032 1874 MS ( )1045 1874 MS (m)1059 1874 MS (\352)1096 1874 MS +(m)1119 1874 MS (e)1157 1874 MS ( )1180 1874 MS (s)1193 1874 MS (i)1213 1874 MS ( )1226 1874 MS (c)1241 1874 MS (e)1263 1874 MS (r)1285 1874 MS (t)1302 1874 MS (a)1317 1874 MS (i)1339 1874 MS (n)1352 1874 MS (e)1376 1874 MS (s)1399 1874 MS ( )1418 1874 MS +(f)1432 1874 MS (o)1447 1874 MS (n)1474 1874 MS (c)1498 1874 MS (t)1520 1874 MS (i)1536 1874 MS (o)1548 1874 MS (n)1574 1874 MS (n)1599 1874 MS (a)1623 1874 MS (l)1646 1874 MS (i)1660 1874 MS (t)1672 1874 MS (\351)1687 1874 MS (s)1709 1874 MS ( )1729 1874 MS +(s)1742 1874 MS (o)1761 1874 MS (n)1787 1874 MS (t)1811 1874 MS ( )1826 1874 MS (i)1840 1874 MS (n)1853 1874 MS (t)1877 1874 MS (\351)1892 1874 MS (g)1914 1874 MS (r)1939 1874 MS (\351)1956 1874 MS (e)1978 1874 MS (s)2000 1874 MS ( )2019 1874 MS (d)2032 1874 MS +(a)2057 1874 MS (n)2080 1874 MS (s)2105 1874 MS ( )2125 1874 MS +(l)235 1931 MS (\222)248 1931 MS (o)264 1931 MS (b)291 1931 MS (j)316 1931 MS (e)329 1931 MS (t)351 1931 MS ( )366 1931 MS (p)380 1931 MS (a)405 1931 MS (r)427 1931 MS (a)444 1931 MS (l)466 1931 MS (l)479 1931 MS (\350)492 1931 MS (l)515 1931 MS +(e)528 1931 MS ( )550 1931 MS (g)564 1931 MS (\351)589 1931 MS (n)612 1931 MS (\351)636 1931 MS (r)658 1931 MS (i)676 1931 MS (q)689 1931 MS (u)714 1931 MS (e)739 1931 MS (.)761 1931 MS ( )774 1931 MS (E)788 1931 MS (n)819 1931 MS (f)844 1931 MS +(i)860 1931 MS (n)873 1931 MS ( )897 1931 MS (l)912 1931 MS (e)925 1931 MS ( )947 1931 MS ( )961 1931 MS (t)975 1931 MS (r)990 1931 MS (a)1007 1931 MS (i)1029 1931 MS (t)1041 1931 MS (e)1056 1931 MS (m)1079 1931 MS (e)1116 1931 MS (n)1139 1931 MS +(t)1163 1931 MS ( )1178 1931 MS (d)1192 1931 MS (e)1217 1931 MS (s)1239 1931 MS ( )1258 1931 MS (e)1272 1931 MS (x)1294 1931 MS (c)1318 1931 MS (e)1340 1931 MS (p)1362 1931 MS (t)1387 1931 MS (i)1403 1931 MS (o)1415 1931 MS (n)1441 1931 MS (s)1465 1931 MS +( )1484 1931 MS (n)1499 1931 MS (\222)1524 1931 MS (a)1540 1931 MS ( )1562 1931 MS (p)1576 1931 MS (a)1601 1931 MS (s)1623 1931 MS ( )1642 1931 MS +(\351)1656 1931 MS (t)1678 1931 MS (\351)1693 1931 MS ( )1715 1931 MS (d)1729 1931 MS (u)1754 1931 MS ( )1779 1931 MS (t)1792 1931 MS (o)1806 1931 MS (u)1832 1931 MS (t)1856 1931 MS ( )1870 1931 MS (a)1884 1931 MS (b)1906 1931 MS (o)1930 1931 MS (r)1956 1931 MS +(d)1973 1931 MS (\351)1998 1931 MS ( )2020 1931 MS (d)2034 1931 MS (a)2059 1931 MS (n)2081 1931 MS (s)2105 1931 MS ( )2125 1931 MS +(c)235 1989 MS (e)257 1989 MS (t)279 1989 MS (t)293 1989 MS (e)308 1989 MS ( )330 1989 MS (\351)365 1989 MS (t)386 1989 MS (u)401 1989 MS (d)426 1989 MS (e)451 1989 MS (,)473 1989 MS ( )485 1989 MS (e)520 1989 MS (t)541 1989 MS ( )556 1989 MS +(d)591 1989 MS (e)616 1989 MS (m)638 1989 MS (a)675 1989 MS (n)698 1989 MS (d)722 1989 MS (e)748 1989 MS ( )770 1989 MS (\340)805 1989 MS ( )827 1989 MS (\352)862 1989 MS (t)884 1989 MS (r)899 1989 MS (e)916 1989 MS ( )938 1989 MS (r)972 1989 MS +(e)989 1989 MS (g)1011 1989 MS (a)1036 1989 MS (r)1058 1989 MS (d)1075 1989 MS (\351)1100 1989 MS ( )1122 1989 MS (\()1157 1989 MS (n)1174 1989 MS (o)1198 1989 MS (t)1223 1989 MS (a)1237 1989 MS (m)1260 1989 MS (m)1298 1989 MS (e)1336 1989 MS (n)1359 1989 MS +(t)1383 1989 MS ( )1398 1989 MS (a)1433 1989 MS (v)1455 1989 MS (e)1479 1989 MS (c)1501 1989 MS ( )1523 1989 MS (l)1559 1989 MS (\222)1572 1989 MS (u)1588 1989 MS (t)1613 1989 MS (i)1629 1989 MS (l)1642 1989 MS (i)1656 1989 MS (s)1669 1989 MS (a)1689 1989 MS +(t)1711 1989 MS (i)1726 1989 MS (o)1738 1989 MS (n)1764 1989 MS ( )1788 1989 MS (d)1823 1989 MS (e)1848 1989 MS ( )1870 1989 MS (p)1905 1989 MS (r)1930 1989 MS (o)1947 1989 MS (c)1973 1989 MS (\351)1995 1989 MS (d)2017 1989 MS (u)2042 1989 MS (r)2067 1989 MS +(e)2084 1989 MS (s)2106 1989 MS ( )2125 1989 MS +(a)235 2046 MS (s)257 2046 MS (y)277 2046 MS (n)301 2046 MS (c)326 2046 MS (h)349 2046 MS (r)373 2046 MS (o)390 2046 MS (n)416 2046 MS (e)440 2046 MS (s)462 2046 MS ( )481 2046 MS (d)494 2046 MS (e)519 2046 MS ( )541 2046 MS (t)554 2046 MS +(y)569 2046 MS (p)592 2046 MS (e)617 2046 MS ( )639 2046 MS (o)652 2046 MS (n)678 2046 MS (e)702 2046 MS (w)724 2046 MS (a)760 2046 MS (y)783 2046 MS ( )807 2046 MS (p)820 2046 MS (o)845 2046 MS (u)871 2046 MS (r)896 2046 MS ( )913 2046 MS +(m)926 2046 MS (e)963 2046 MS (t)985 2046 MS (t)1000 2046 MS (r)1014 2046 MS (e)1031 2046 MS ( )1053 2046 MS (e)1066 2046 MS (n)1088 2046 MS ( )1112 2046 MS (\234)1125 2046 MS (u)1161 2046 MS (v)1186 2046 MS (r)1210 2046 MS (e)1227 2046 MS ( )1250 2046 MS +(l)1263 2046 MS (e)1276 2046 MS ( )1298 2046 MS (p)1311 2046 MS (a)1336 2046 MS (r)1358 2046 MS (a)1375 2046 MS (l)1398 2046 MS (l)1411 2046 MS (\351)1424 2046 MS (l)1447 2046 MS (i)1461 2046 MS (s)1474 2046 MS (m)1494 2046 MS (e)1532 2046 MS (\))1554 2046 MS +(.)1571 2046 MS +( )1584 2046 MS +( )235 2104 MS +(L)348 2161 MS (a)378 2161 MS ( )400 2161 MS (p)413 2161 MS (h)438 2161 MS (a)462 2161 MS (s)485 2161 MS (e)504 2161 MS ( )526 2161 MS (s)539 2161 MS (u)558 2161 MS (i)584 2161 MS (v)597 2161 MS (a)622 2161 MS (n)645 2161 MS (t)669 2161 MS +(e)684 2161 MS ( )706 2161 MS (c)719 2161 MS (o)741 2161 MS (n)767 2161 MS (s)791 2161 MS (i)811 2161 MS (s)824 2161 MS (t)843 2161 MS (e)858 2161 MS (r)880 2161 MS (a)897 2161 MS ( )919 2161 MS (\340)932 2161 MS ( )954 2161 MS (t)966 2161 MS +(r)980 2161 MS (a)997 2161 MS (i)1019 2161 MS (t)1031 2161 MS (e)1046 2161 MS (r)1068 2161 MS ( )1085 2161 MS (u)1098 2161 MS (n)1123 2161 MS ( )1147 2161 MS (c)1160 2161 MS (a)1182 2161 MS (s)1204 2161 MS ( )1223 2161 MS (r)1236 2161 MS (\351)1253 2161 MS +(a)1275 2161 MS (l)1298 2161 MS (i)1311 2161 MS (s)1324 2161 MS (t)1343 2161 MS (e)1359 2161 MS ( )1381 2161 MS (p)1394 2161 MS (o)1419 2161 MS (u)1445 2161 MS (r)1469 2161 MS ( )1486 2161 MS (l)1499 2161 MS (a)1511 2161 MS ( )1533 2161 MS (D)1546 2161 MS +(E)1582 2161 MS (N)1613 2161 MS (,)1649 2161 MS ( )1662 2161 MS (d)1675 2161 MS (e)1700 2161 MS ( )1722 2161 MS (c)1735 2161 MS (o)1756 2161 MS (u)1782 2161 MS (p)1807 2161 MS (l)1832 2161 MS (a)1844 2161 MS (g)1866 2161 MS (e)1891 2161 MS ( )1913 2161 MS +(d)1926 2161 MS (e)1951 2161 MS +( )1973 2161 MS (c)1986 2161 MS (o)2008 2161 MS (d)2034 2161 MS (e)2059 2161 MS (s)2081 2161 MS ( )2100 2161 MS +(p)235 2219 MS (a)260 2219 MS (r)282 2219 MS (a)299 2219 MS (l)322 2219 MS (l)335 2219 MS (\350)348 2219 MS (l)371 2219 MS (e)384 2219 MS (s)407 2219 MS ( )426 2219 MS (q)439 2219 MS (u)464 2219 MS (i)490 2219 MS ( )502 2219 MS (\351)515 2219 MS +(c)537 2219 MS (h)560 2219 MS (a)584 2219 MS (n)607 2219 MS (g)631 2219 MS (e)656 2219 MS (r)678 2219 MS (o)695 2219 MS (n)721 2219 MS (t)745 2219 MS ( )760 2219 MS (d)773 2219 MS (e)798 2219 MS (s)820 2219 MS ( )839 2219 MS (m)852 2219 MS +(a)889 2219 MS (i)912 2219 MS (l)926 2219 MS (l)940 2219 MS (a)953 2219 MS (g)975 2219 MS (e)1000 2219 MS (s)1023 2219 MS ( )1042 2219 MS (e)1055 2219 MS (t)1077 2219 MS ( )1092 2219 MS (d)1105 2219 MS (e)1130 2219 MS (s)1152 2219 MS ( )1171 2219 MS +(c)1184 2219 MS (h)1206 2219 MS (a)1230 2219 MS (m)1252 2219 MS (p)1290 2219 MS (s)1315 2219 MS ( )1334 2219 MS (d)1347 2219 MS (i)1373 2219 MS (s)1386 2219 MS (t)1405 2219 MS (r)1420 2219 MS (i)1438 2219 MS (b)1451 2219 MS (u)1475 2219 MS (\351)1500 2219 MS +(s)1522 2219 MS ( )1541 2219 MS (s)1554 2219 MS (u)1573 2219 MS (r)1598 2219 MS ( )1615 2219 MS (d)1628 2219 MS (i)1654 2219 MS (f)1667 2219 MS (f)1684 2219 MS (\351)1700 2219 MS (r)1722 2219 MS (e)1739 2219 MS (n)1762 2219 MS (t)1786 2219 MS (s)1801 2219 MS +( )1820 2219 MS (p)1833 2219 MS (r)1858 2219 MS (o)1874 2219 MS (c)1900 2219 MS (e)1922 2219 MS (s)1944 2219 MS (s)1963 2219 MS (e)1982 2219 MS (u)2004 2219 MS (r)2029 2219 MS (s)2046 2219 MS (.)2065 2219 MS +( )2078 2219 MS +showpage +%%Page: 30 30 +14.449 827.879 translate 72 300 div dup neg scale +0 0 transform .25 add round .25 sub exch .25 add round .25 sub exch itransform translate +1 j +1 setlinecap +72 sl +0.375 g +n +494 182 M +494 155 472 133 445 133 c +418 133 396 155 396 182 c +396 209 418 231 445 231 c +472 231 494 209 494 182 c +cp +CM 0.156 0.152 scale +s +SM +71 sl +n +660 182 M +660 155 638 133 611 133 c +584 133 562 155 562 182 c +562 209 584 231 611 231 c +638 231 660 209 660 182 c +cp +CM 0.156 0.152 scale +s +SM +n +120 24 468 152 B +1 g +f +1 sl +n +122 26 467 151 B +cp +s +71 sl +0.375 g +n +577 180 M +577 153 555 131 528 131 c +501 131 479 153 479 180 c +479 206 501 228 528 228 c +555 228 577 206 577 180 c +cp +gs +1 g +e +gr +CM 0.156 0.152 scale +s +SM +n +480 180 M +575 180 L +CM 0.156 0.152 scale +s +SM +n +34 18 562 187 B +1 g +f +1 sl +n +36 20 561 186 B +cp +s +n +610 173 M +591 173 L +554 124 L +579 126 L +609 173 L +610 173 L +cp +gs +e +gr +s +n +448 170 M +468 170 L +504 122 L +479 123 L +449 170 L +448 170 L +cp +gs +e +gr +s +0.375 g +n +473 140 M +473 137 470 135 467 135 c +464 135 462 137 462 140 c +462 142 464 145 467 145 c +470 145 473 142 473 140 c +cp +gs +e +gr +s +n +593 139 M +593 136 590 134 588 134 c +585 134 583 136 583 139 c +583 141 585 144 588 144 c +590 144 593 141 593 139 c +cp +gs +e +gr +s +72 sl +n +665 137 M +665 229 L +CM 0.156 0.152 scale +s +SM +[29 0 0 -29 0 0]/Times-Roman MF +0 g +( )676 243 MS +[50 0 0 -50 0 0]/Times-Roman MF +(D)400 289 MS (E)436 289 MS (N)467 289 MS ( )503 289 MS ( )516 289 MS (S)529 289 MS (a)557 289 MS (c)579 289 MS (l)601 289 MS (a)613 289 MS (y)636 289 MS +( )660 289 MS +( )1297 140 MS +[38 0 0 -38 0 0]/Times-Roman MF +(S)1785 129 MS (F)1806 129 MS (M)1827 129 MS (E)1861 129 MS (/)1883 129 MS (L)1894 129 MS (G)1916 129 MS (L)1943 129 MS (S)1965 129 MS (/)1986 129 MS (R)1997 129 MS (T)2022 129 MS (/)2045 129 MS (0)2056 129 MS (2)2075 129 MS +(-)2094 129 MS +(0)2106 129 MS (0)2125 129 MS (2)2144 129 MS +( )2163 129 MS +(D)1785 173 MS (a)1812 173 MS (t)1829 173 MS (e)1840 173 MS +( )1856 173 MS +(:)1866 173 MS +( )1875 173 MS +(3)1885 173 MS (0)1904 173 MS (/)1923 173 MS (0)1934 173 MS (5)1952 173 MS (/)1971 173 MS (2)1982 173 MS (0)2000 173 MS (0)2019 173 MS (2)2038 173 MS +( )2057 173 MS +n +5 5 232 89 B +f +n +5 5 232 89 B +f +n +584 5 238 89 B +f +n +5 5 823 89 B +f +n +938 5 829 89 B +f +n +5 5 1768 89 B +f +n +436 5 1774 89 B +f +n +5 5 2211 89 B +f +n +5 5 2211 89 B +f +n +5 256 232 95 B +f +n +2 256 823 95 B +f +n +2 256 1768 95 B +f +n +5 256 2211 95 B +f +[50 0 0 -50 0 0]/Times-Roman MF +(D)322 400 MS (M)358 400 MS (2)402 400 MS (S)427 400 MS (/)455 400 MS (S)469 400 MS (F)497 400 MS (M)524 400 MS (E)568 400 MS (/)599 400 MS (L)613 400 MS (G)643 400 MS (L)680 400 MS (S)710 400 MS +( )738 400 MS +[50 0 0 -50 0 0]/Times-Bold MF +gs +n +241 53 1102 367 CB +(R)1102 413 MS (A)1138 413 MS (P)1174 413 MS (P)1204 413 MS (O)1234 413 MS (R)1273 413 MS (T)1310 413 MS +gr +gs +n +150 53 1343 367 CB +( )1343 413 MS (D)1356 413 MS (M)1392 413 MS (2)1440 413 MS (S)1465 413 MS +gr +[50 0 0 -50 0 0]/Times-Roman MF +gs +n +24 52 1493 368 CB +( )1493 413 MS +gr +[38 0 0 -38 0 0]/Times-Roman MF +(P)1785 400 MS (a)1806 400 MS (g)1823 400 MS (e)1841 400 MS ( )1858 400 MS +[50 0 0 -50 0 0]/Times-Roman MF +(3)1868 400 MS (0)1893 400 MS +(/)1918 400 MS +(3)1932 400 MS (0)1957 400 MS +[38 0 0 -38 0 0]/Times-Roman MF +( )1982 400 MS +n +5 2 232 352 B +f +n +2 2 823 352 B +f +n +941 2 826 352 B +f +n +2 2 1768 352 B +f +n +5 2 2211 352 B +f +n +5 67 232 355 B +f +n +590 1 232 423 B +f +n +2 67 823 355 B +f +n +1 1 823 423 B +f +n +942 1 825 423 B +f +n +2 67 1768 355 B +f +n +1 1 1768 423 B +f +n +440 1 1770 423 B +f +n +5 67 2211 355 B +f +n +5 1 2211 423 B +f +[50 0 0 -50 0 0]/Times-Roman MF +( )235 470 MS +[33 0 0 -33 0 0]/Times-Roman MF +/IsChar{exch/CharStrings get exch known}bd/MapCh{3 -1 roll/Encoding get 3 1 +roll put}bd/MapDegree{dup 16#b0 exch/degree IsChar{/degree}{/ring}ifelse MapCh} +bd/MapBB{dup 16#a6 exch/brokenbar IsChar{/brokenbar}{/bar}ifelse MapCh}bd +/reencode{findfont begin currentdict dup length dict begin{1 index/FID ne{def} +{pop pop}ifelse}forall/FontName exch def dup length 0 ne{/Encoding Encoding 256 +array copy def 0 exch{dup type/nametype eq{Encoding 2 index 2 index put pop 1 +add}{exch pop}ifelse}forall}if pop currentdict dup end end/FontName get exch +definefont dup MapDegree MapBB}bd/LATENC[0/grave/acute/circumflex/tilde/macron +/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl +/Lslash/lslash/Zcaron/zcaron/minus/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl +/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk +/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight +/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M +/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum +/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft +/bar/braceright/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin +/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron +/guilsinglleft/OE/.notdef/.notdef/.notdef/.notdef/quoteleft/quoteright +/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron +/guilsinglright/oe/.notdef/.notdef/Ydieresis/.notdef/exclamdown/cent/sterling +/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft +/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute +/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex +/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute +/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex +/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute +/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis +/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +LATENC /_Times-Roman /Times-Roman reencode +[33 0 0 -33 0 0]/_Times-Roman MF +(L)242 3256 MS (e)262 3256 MS (s)277 3256 MS ( )289 3256 MS (i)298 3256 MS (n)307 3256 MS (f)324 3256 MS (o)335 3256 MS (r)351 3256 MS (m)363 3256 MS (a)388 3256 MS (t)403 3256 MS (i)412 3256 MS (o)422 3256 MS (n)439 3256 MS (s)456 3256 MS +( )468 3256 MS (c)477 3256 MS (o)492 3256 MS (n)508 3256 MS (t)524 3256 MS (e)534 3256 MS (n)549 3256 MS (u)565 3256 MS (e)582 3256 MS (s)597 3256 MS ( )610 3256 MS (d)618 3256 MS (a)634 3256 MS (n)650 3256 MS (s)667 3256 MS ( )679 3256 MS +(c)688 3256 MS (e)703 3256 MS ( )717 3256 MS (d)726 3256 MS (o)742 3256 MS (c)759 3256 MS (u)773 3256 MS (m)791 3256 MS (e)817 3256 MS (n)831 3256 MS (t)847 3256 MS ( )857 3256 MS (s)866 3256 MS (o)878 3256 MS (n)895 3256 MS (t)911 3256 MS +( )921 3256 MS (r)929 3256 MS (\351)941 3256 MS (s)956 3256 MS (e)968 3256 MS (r)982 3256 MS (v)994 3256 MS (\351)1011 3256 MS (e)1026 3256 MS (s)1041 3256 MS ( )1053 3256 MS (a)1061 3256 MS (u)1076 3256 MS (x)1093 3256 MS ( )1109 3256 MS (d)1118 3256 MS +(e)1135 3256 MS (s)1150 3256 MS (t)1162 3256 MS (i)1171 3256 MS (n)1181 3256 MS (a)1197 3256 MS (t)1212 3256 MS (a)1221 3256 MS (i)1236 3256 MS (r)1245 3256 MS (e)1257 3256 MS (s)1272 3256 MS ( )1284 3256 MS (n)1293 3256 MS (o)1309 3256 MS (m)1326 3256 MS +(m)1352 3256 MS (\351)1378 3256 MS (m)1393 3256 MS (e)1419 3256 MS (n)1433 3256 MS (t)1450 3256 MS ( )1459 3256 MS (d)1468 3256 MS (\351)1484 3256 MS (s)1499 3256 MS (i)1512 3256 MS (g)1521 3256 MS +(n)1538 3256 MS (\351)1555 3256 MS (s)1570 3256 MS ( )1582 3256 MS (e)1591 3256 MS (t)1605 3256 MS ( )1615 3256 MS (n)1623 3256 MS (e)1640 3256 MS ( )1654 3256 MS (p)1663 3256 MS (e)1680 3256 MS (u)1694 3256 MS (v)1711 3256 MS (e)1728 3256 MS (n)1743 3256 MS +(t)1759 3256 MS ( )1768 3256 MS (r)1776 3256 MS (e)1788 3256 MS (c)1803 3256 MS (e)1818 3256 MS (v)1832 3256 MS (o)1849 3256 MS (i)1865 3256 MS (r)1874 3256 MS ( )1886 3256 MS (a)1894 3256 MS (u)1909 3256 MS (c)1926 3256 MS (u)1940 3256 MS (n)1957 3256 MS +(e)1974 3256 MS ( )1988 3256 MS (d)1997 3256 MS (i)2013 3256 MS (f)2023 3256 MS (f)2034 3256 MS (u)2044 3256 MS (s)2062 3256 MS (i)2074 3256 MS (o)2084 3256 MS (n)2101 3256 MS +( )2117 3256 MS +(s)928 3294 MS (a)940 3294 MS (n)955 3294 MS (s)972 3294 MS ( )985 3294 MS (l)993 3294 MS (\222)1002 3294 MS (a)1013 3294 MS (u)1028 3294 MS (t)1045 3294 MS (o)1054 3294 MS (r)1071 3294 MS (i)1082 3294 MS (s)1092 3294 MS (a)1104 3294 MS (t)1119 3294 MS +(i)1128 3294 MS (o)1138 3294 MS (n)1154 3294 MS ( )1171 3294 MS (e)1180 3294 MS (x)1194 3294 MS (p)1211 3294 MS (r)1227 3294 MS (e)1239 3294 MS (s)1254 3294 MS (s)1267 3294 MS (e)1280 3294 MS ( )1294 3294 MS (d)1303 3294 MS (u)1319 3294 MS ( )1336 3294 MS +(D)1344 3294 MS (M)1368 3294 MS (2)1397 3294 MS (S)1414 3294 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )1432 3294 MS +[67 0 0 -67 0 0]/Helvetica-Bold MF +(1)310 592 MS (1)347 592 MS +( )384 592 MS +LATENC /_Helvetica-Bold /Helvetica-Bold reencode +[67 0 0 -67 0 0]/_Helvetica-Bold MF +(R)400 592 MS (\351)448 592 MS (f)485 592 MS (\351)507 592 MS (r)544 592 MS (e)570 592 MS (n)607 592 MS (c)648 592 MS (e)685 592 MS (s)722 592 MS +( )759 592 MS +[50 0 0 -50 0 0]/Times-Roman MF +( )235 667 MS +( )235 724 MS +( )235 782 MS +([)235 839 MS (1)252 839 MS (])277 839 MS ( )294 839 MS +0 0 1 r +(h)307 839 MS (t)331 839 MS (t)345 839 MS (p)360 839 MS (:)384 839 MS (/)398 839 MS (/)412 839 MS (w)426 839 MS (w)462 839 MS (w)498 839 MS (.)534 839 MS (o)546 839 MS (p)572 839 MS (e)597 839 MS (n)619 839 MS (c)643 839 MS +(a)665 839 MS (s)687 839 MS (c)706 839 MS (a)728 839 MS (d)750 839 MS (e)776 839 MS (.)798 839 MS (o)811 839 MS (r)837 839 MS (g)854 839 MS (/)879 839 MS (S)892 839 MS (A)920 839 MS (L)955 839 MS (O)985 839 MS (M)1022 839 MS +(E)1066 839 MS (/)1097 839 MS (D)1111 839 MS (o)1147 839 MS (c)1173 839 MS (s)1195 839 MS (/)1214 839 MS (I)1228 839 MS (n)1244 839 MS (d)1268 839 MS (e)1293 839 MS (x)1316 839 MS (2)1340 839 MS (.)1365 839 MS (h)1379 839 MS (t)1403 839 MS +(m)1418 839 MS (l)1456 839 MS +n +1161 1 307 844 B +f +0 g +( )1469 839 MS +([)235 897 MS (2)252 897 MS (])277 897 MS ( )294 897 MS +0 0 1 r +(h)307 897 MS (t)331 897 MS (t)345 897 MS (p)360 897 MS (:)384 897 MS (/)398 897 MS (/)412 897 MS (w)426 897 MS (w)462 897 MS (w)498 897 MS (.)534 897 MS (c)547 897 MS (o)568 897 MS (r)594 897 MS (b)611 897 MS (a)635 897 MS +(.)657 897 MS (o)670 897 MS (r)695 897 MS (g)712 897 MS +n +429 1 307 902 B +f +0 g +( )737 897 MS +LATENC /_Times-Roman /Times-Roman reencode +[50 0 0 -50 0 0]/_Times-Roman MF +([)235 954 MS (3)252 954 MS (])277 954 MS ( )294 954 MS (\253)307 954 MS +( )331 954 MS +(C)344 954 MS (O)377 954 MS (R)413 954 MS (B)446 954 MS (A)480 954 MS ( )515 954 MS (D)528 954 MS (e)564 954 MS (s)586 954 MS ( )605 954 MS (c)618 954 MS (o)640 954 MS (n)666 954 MS (c)690 954 MS (e)712 954 MS (p)734 954 MS +(t)759 954 MS (s)774 954 MS ( )793 954 MS (\340)806 954 MS ( )828 954 MS (l)841 954 MS (a)853 954 MS ( )875 954 MS (p)888 954 MS (r)913 954 MS (a)930 954 MS (t)952 954 MS (i)968 954 MS (q)980 954 MS (u)1005 954 MS (e)1030 954 MS +( )1052 954 MS +(\273)1065 954 MS ( )1089 954 MS +(-)1102 954 MS +( )1119 954 MS (J)1132 954 MS (M)1151 954 MS (.)1195 954 MS ( )1208 954 MS +(G)1221 954 MS (e)1257 954 MS (i)1280 954 MS (b)1293 954 MS (,)1317 954 MS ( )1330 954 MS (C)1343 954 MS (h)1376 954 MS (.)1400 954 MS ( )1413 954 MS +(G)1426 954 MS (r)1462 954 MS (a)1479 954 MS (n)1501 954 MS (s)1526 954 MS (a)1545 954 MS (r)1567 954 MS (t)1584 954 MS ( )1599 954 MS (e)1612 954 MS (t)1633 954 MS ( )1648 954 MS (P)1660 954 MS (h)1688 954 MS (.)1712 954 MS ( )1725 954 MS +(M)1738 954 MS (e)1782 954 MS (r)1804 954 MS (l)1822 954 MS (e)1834 954 MS (,)1856 954 MS ( )1869 954 MS (D)1882 954 MS (U)1918 954 MS (N)1954 954 MS (O)1990 954 MS (D)2026 954 MS ( )2062 954 MS +(\226)2075 954 MS +( )2100 954 MS +(1)235 1012 MS (9)260 1012 MS (9)285 1012 MS (9)310 1012 MS +( )335 1012 MS +([)235 1069 MS (4)252 1069 MS (])277 1069 MS ( )294 1069 MS +0 0 1 r +(h)307 1069 MS (t)331 1069 MS (t)345 1069 MS (p)360 1069 MS (:)384 1069 MS (/)398 1069 MS (/)412 1069 MS (w)426 1069 MS (w)462 1069 MS (w)498 1069 MS (.)534 1069 MS (o)546 1069 MS (m)572 1069 MS (g)609 1069 MS (.)634 1069 MS (o)647 1069 MS +(r)673 1069 MS (g)690 1069 MS (/)715 1069 MS +(t)728 1069 MS (e)743 1069 MS (c)765 1069 MS (h)787 1069 MS (p)811 1069 MS (r)836 1069 MS (o)853 1069 MS (c)879 1069 MS (e)901 1069 MS (s)923 1069 MS (s)942 1069 MS (/)961 1069 MS (m)976 1069 MS (e)1013 1069 MS (e)1035 1069 MS (t)1057 1069 MS +(i)1073 1069 MS (n)1086 1069 MS (g)1110 1069 MS (s)1136 1069 MS (/)1155 1069 MS (s)1169 1069 MS (c)1188 1069 MS (h)1211 1069 MS (e)1235 1069 MS (d)1258 1069 MS (u)1283 1069 MS (l)1309 1069 MS (e)1321 1069 MS (/)1343 1069 MS (P)1357 1069 MS (a)1385 1069 MS +(r)1407 1069 MS (a)1424 1069 MS (l)1447 1069 MS (l)1461 1069 MS (e)1474 1069 MS (l)1497 1069 MS (_)1510 1069 MS (P)1535 1069 MS (r)1563 1069 MS (o)1580 1069 MS (c)1606 1069 MS (e)1628 1069 MS (s)1650 1069 MS (s)1669 1069 MS (i)1689 1069 MS (n)1702 1069 MS +(g)1726 1069 MS (_)1751 1069 MS (R)1777 1069 MS (F)1810 1069 MS (P)1837 1069 MS (.)1865 1069 MS (h)1879 1069 MS (t)1903 1069 MS (m)1918 1069 MS (l)1956 1069 MS +n +1661 1 307 1074 B +f +0 g +( )1969 1069 MS +([)235 1127 MS (5)252 1127 MS (])277 1127 MS ( )294 1127 MS +0 0 1 r +(h)307 1127 MS (t)331 1127 MS (t)345 1127 MS (p)360 1127 MS (:)384 1127 MS (/)398 1127 MS (/)412 1127 MS (w)426 1127 MS (w)462 1127 MS (w)498 1127 MS (.)534 1127 MS (i)547 1127 MS (r)559 1127 MS (i)577 1127 MS (s)590 1127 MS (a)609 1127 MS +(.)631 1127 MS (f)645 1127 MS (r)660 1127 MS (/)677 1127 MS (p)691 1127 MS (a)716 1127 MS (r)738 1127 MS (i)756 1127 MS (s)769 1127 MS (/)788 1127 MS (n)803 1127 MS (a)827 1127 MS (n)850 1127 MS (g)874 1127 MS (l)900 1127 MS (a)913 1127 MS +(i)936 1127 MS (s)949 1127 MS (/)968 1127 MS (p)982 1127 MS (a)1008 1127 MS (c)1030 1127 MS (o)1052 1127 MS (.)1078 1127 MS (h)1091 1127 MS (t)1115 1127 MS (m)1130 1127 MS +n +859 1 307 1132 B +f +0 g +( )1167 1127 MS +([)235 1184 MS (6)252 1184 MS (])277 1184 MS ( )294 1184 MS +0 0 1 r +(h)307 1184 MS (t)331 1184 MS (t)345 1184 MS (p)360 1184 MS (:)384 1184 MS (/)398 1184 MS (/)412 1184 MS (w)426 1184 MS (w)462 1184 MS (w)498 1184 MS (.)534 1184 MS (c)547 1184 MS (s)569 1184 MS +(.)588 1184 MS (i)601 1184 MS (n)614 1184 MS (d)638 1184 MS (i)664 1184 MS (a)677 1184 MS (n)700 1184 MS (a)724 1184 MS (.)746 1184 MS (e)759 1184 MS (d)781 1184 MS (u)806 1184 MS (/)831 1184 MS (h)846 1184 MS (y)871 1184 MS (p)895 1184 MS +(l)921 1184 MS (a)934 1184 MS (n)957 1184 MS (/)981 1184 MS (k)995 1184 MS (k)1020 1184 MS (s)1045 1184 MS (i)1065 1184 MS (a)1078 1184 MS (z)1101 1184 MS (e)1123 1184 MS (k)1145 1184 MS (/)1170 1184 MS (p)1184 1184 MS (a)1209 1184 MS (r)1231 1184 MS +(d)1248 1184 MS (i)1274 1184 MS (s)1286 1184 MS (.)1305 1184 MS (h)1319 1184 MS (t)1343 1184 MS (m)1359 1184 MS (l)1397 1184 MS +n +1101 1 307 1189 B +f +0 g +( )1409 1184 MS +([)235 1242 MS (7)252 1242 MS (])277 1242 MS ( )294 1242 MS +0 0 1 r +(h)307 1242 MS (t)331 1242 MS (t)345 1242 MS (p)360 1242 MS (:)384 1242 MS (/)398 1242 MS (/)412 1242 MS (w)426 1242 MS (w)462 1242 MS (w)498 1242 MS (.)534 1242 MS (c)547 1242 MS (e)569 1242 MS (t)590 1242 MS (u)605 1242 MS (s)630 1242 MS +(-)649 1242 MS +(l)666 1242 MS (i)679 1242 MS (n)692 1242 MS (k)717 1242 MS (s)743 1242 MS (.)762 1242 MS (o)775 1242 MS (r)801 1242 MS (g)818 1242 MS +n +535 1 307 1247 B +f +0 g +( )843 1242 MS +([)235 1299 MS (8)252 1299 MS (])277 1299 MS ( )294 1299 MS (\253)307 1299 MS (N)331 1299 MS (u)367 1299 MS (m)393 1299 MS (e)430 1299 MS (r)452 1299 MS (i)470 1299 MS (c)483 1299 MS (a)505 1299 MS (l)528 1299 MS ( )540 1299 MS (P)553 1299 MS +(l)582 1299 MS (a)595 1299 MS (t)617 1299 MS (o)632 1299 MS (n)658 1299 MS ( )682 1299 MS (u)695 1299 MS (s)720 1299 MS (e)739 1299 MS (r)761 1299 MS (s)778 1299 MS ( )797 1299 MS (g)810 1299 MS (u)835 1299 MS (i)861 1299 MS (d)873 1299 MS +(e)898 1299 MS ( )920 1299 MS (a)933 1299 MS (n)956 1299 MS (d)980 1299 MS ( )1005 1299 MS (r)1018 1299 MS (e)1035 1299 MS (f)1057 1299 MS (e)1073 1299 MS (r)1095 1299 MS (e)1112 1299 MS (n)1135 1299 MS (c)1159 1299 MS (e)1181 1299 MS ( )1203 1299 MS +(m)1217 1299 MS (a)1255 1299 MS (n)1277 1299 MS (u)1301 1299 MS (a)1326 1299 MS (l)1349 1299 MS (\273)1362 1299 MS ( )1387 1299 MS +(-)1400 1299 MS +( )1417 1299 MS (L)1430 1299 MS (.)1460 1299 MS ( )1473 1299 MS (C)1486 1299 MS (o)1519 1299 MS (l)1545 1299 MS (o)1557 1299 MS (m)1584 1299 MS (b)1622 1299 MS (e)1646 1299 MS (t)1668 1299 MS ( )1683 1299 MS (e)1696 1299 MS (t)1717 1299 MS ( )1732 1299 MS +(B)1745 1299 MS (.)1778 1299 MS ( )1790 1299 MS (S)1803 1299 MS (\351)1831 1299 MS (c)1853 1299 MS (h)1875 1299 MS (e)1899 1299 MS (r)1921 1299 MS ( )1938 1299 MS +(C)235 1357 MS (E)268 1357 MS (A)299 1357 MS (/)334 1357 MS (D)348 1357 MS (E)384 1357 MS (N)415 1357 MS (/)451 1357 MS (D)465 1357 MS (M)501 1357 MS (2)545 1357 MS (S)570 1357 MS (/)598 1357 MS (S)612 1357 MS (F)640 1357 MS (M)668 1357 MS +(E)712 1357 MS (/)743 1357 MS (L)757 1357 MS (G)787 1357 MS (L)823 1357 MS (S)853 1357 MS (/)881 1357 MS (R)895 1357 MS (T)928 1357 MS (/)959 1357 MS (0)973 1357 MS (1)998 1357 MS +(-)1023 1357 MS +(0)1040 1357 MS (0)1065 1357 MS (1)1090 1357 MS ( )1115 1357 MS (d)1128 1357 MS (u)1153 1357 MS ( )1178 1357 MS (9)1191 1357 MS ( )1216 1357 MS (m)1228 1357 MS (a)1266 1357 MS (r)1288 1357 MS (s)1305 1357 MS ( )1324 1357 MS (2)1337 1357 MS (0)1362 1357 MS +(0)1387 1357 MS (1)1412 1357 MS +( )1437 1357 MS +([)235 1414 MS (9)252 1414 MS (])277 1414 MS ( )294 1414 MS +0 0 1 r +(h)307 1414 MS (t)331 1414 MS (t)345 1414 MS (p)360 1414 MS (:)384 1414 MS (/)398 1414 MS (/)412 1414 MS (c)426 1414 MS (g)448 1414 MS (i)473 1414 MS (.)485 1414 MS (o)498 1414 MS (m)525 1414 MS (g)562 1414 MS (.)587 1414 MS (o)600 1414 MS +(r)626 1414 MS (g)643 1414 MS (/)668 1414 MS (c)682 1414 MS (g)704 1414 MS (i)729 1414 MS +(-)741 1414 MS +(b)758 1414 MS (i)783 1414 MS (n)796 1414 MS (/)821 1414 MS (d)835 1414 MS (o)860 1414 MS (c)886 1414 MS (?)909 1414 MS (o)930 1414 MS (r)956 1414 MS (b)973 1414 MS (o)997 1414 MS (s)1023 1414 MS (/)1042 1414 MS (0)1056 1414 MS (0)1081 1414 MS +(-)1106 1414 MS +(0)1123 1414 MS (8)1148 1414 MS +(-)1173 1414 MS +(1)1190 1414 MS (1)1215 1414 MS +n +931 1 307 1419 B +f +0 g +( )1239 1414 MS +([)235 1472 MS (1)252 1472 MS (0)277 1472 MS (])302 1472 MS ( )319 1472 MS +0 0 1 r +(h)332 1472 MS (t)356 1472 MS (t)370 1472 MS (p)385 1472 MS (:)409 1472 MS (/)423 1472 MS (/)437 1472 MS +(l)451 1472 MS (i)464 1472 MS (f)478 1472 MS (c)494 1472 MS (.)516 1472 MS (u)529 1472 MS (n)554 1472 MS (i)579 1472 MS (v)592 1472 MS +(-)617 1472 MS +(f)635 1472 MS (c)651 1472 MS (o)673 1472 MS (m)700 1472 MS (t)737 1472 MS (e)752 1472 MS (.)774 1472 MS (f)787 1472 MS (r)802 1472 MS (/)819 1472 MS (~)833 1472 MS (p)860 1472 MS (h)885 1472 MS (i)910 1472 MS (l)924 1472 MS (i)938 1472 MS +(p)951 1472 MS (p)976 1472 MS (e)1001 1472 MS (/)1023 1472 MS (c)1037 1472 MS (o)1059 1472 MS (m)1086 1472 MS (p)1123 1472 MS (o)1148 1472 MS (s)1174 1472 MS (a)1193 1472 MS (n)1216 1472 MS (t)1240 1472 MS (s)1255 1472 MS (/)1274 1472 MS (p)1288 1472 MS +(a)1313 1472 MS +(p)1335 1472 MS (i)1361 1472 MS (e)1374 1472 MS (r)1396 1472 MS (s)1413 1472 MS (/)1432 1472 MS (J)1446 1472 MS (C)1465 1472 MS (2)1498 1472 MS (0)1523 1472 MS (0)1548 1472 MS (1)1573 1472 MS (_)1598 1472 MS (a)1624 1472 MS (r)1646 1472 MS (t)1663 1472 MS +(i)1678 1472 MS (c)1690 1472 MS (l)1713 1472 MS (e)1726 1472 MS (_)1748 1472 MS (P)1773 1472 MS (e)1801 1472 MS (r)1823 1472 MS (e)1840 1472 MS (z)1862 1472 MS (.)1884 1472 MS (p)1897 1472 MS (s)1922 1472 MS +n +1608 1 332 1477 B +f +0 g +( )1941 1472 MS +([)235 1529 MS (1)252 1529 MS (1)277 1529 MS (])302 1529 MS ( )319 1529 MS +0 0 1 r +(h)332 1529 MS (t)356 1529 MS (t)370 1529 MS (p)385 1529 MS (:)409 1529 MS (/)423 1529 MS (/)437 1529 MS (w)451 1529 MS (w)487 1529 MS (w)523 1529 MS (.)559 1529 MS (i)572 1529 MS (r)584 1529 MS (i)602 1529 MS (s)615 1529 MS (a)634 1529 MS +(.)656 1529 MS (f)670 1529 MS (r)685 1529 MS (/)702 1529 MS (p)716 1529 MS (a)741 1529 MS (r)763 1529 MS (i)781 1529 MS (s)794 1529 MS (/)813 1529 MS (n)828 1529 MS (a)852 1529 MS (n)875 1529 MS (g)899 1529 MS (l)925 1529 MS (a)938 1529 MS +(i)961 1529 MS (s)974 1529 MS (/)993 1529 MS (p)1007 1529 MS (a)1033 1529 MS (d)1055 1529 MS (i)1081 1529 MS (c)1094 1529 MS (o)1116 1529 MS (.)1142 1529 MS (h)1155 1529 MS (t)1179 1529 MS (m)1194 1529 MS +n +898 1 332 1534 B +f +0 g +( )1231 1529 MS +([)235 1586 MS (1)252 1586 MS (2)277 1586 MS (])302 1586 MS ( )319 1586 MS (C)332 1586 MS (o)364 1586 MS (m)390 1586 MS (p)427 1586 MS (t)452 1586 MS (e)467 1586 MS ( )489 1586 MS (r)502 1586 MS (e)519 1586 MS (n)541 1586 MS (d)565 1586 MS +(u)590 1586 MS ( )615 1586 MS (d)628 1586 MS (e)653 1586 MS ( )675 1586 MS (r)688 1586 MS (\351)705 1586 MS (u)727 1586 MS (n)752 1586 MS (i)777 1586 MS (o)789 1586 MS (n)815 1586 MS ( )839 1586 MS (d)852 1586 MS (u)877 1586 MS ( )902 1586 MS +(2)915 1586 MS (0)940 1586 MS ( )965 1586 MS (m)979 1586 MS (a)1016 1586 MS (r)1038 1586 MS (s)1055 1586 MS ( )1074 1586 MS (2)1087 1586 MS (0)1112 1586 MS (0)1137 1586 MS (2)1162 1586 MS (:)1187 1586 MS ( )1201 1586 MS (C)1214 1586 MS (E)1247 1586 MS +(A)1278 1586 MS (/)1313 1586 MS (D)1327 1586 MS (E)1363 1586 MS (N)1394 1586 MS (/)1430 1586 MS (C)1444 1586 MS (A)1478 1586 MS (D)1513 1586 MS (/)1549 1586 MS (D)1563 1586 MS (T)1599 1586 MS (P)1630 1586 MS (/)1658 1586 MS (S)1672 1586 MS (M)1700 1586 MS +(T)1744 1586 MS (H)1775 1586 MS (/)1811 1586 MS (L)1825 1586 MS (D)1855 1586 MS (T)1891 1586 MS (A)1922 1586 MS (/)1957 1586 MS (D)1971 1586 MS (O)2007 1586 MS (/)2043 1586 MS (7)2057 1586 MS (7)2082 1586 MS ( )2107 1586 MS +(d)235 1644 MS (u)260 1644 MS ( )285 1644 MS (6)298 1644 MS ( )323 1644 MS (m)336 1644 MS (a)373 1644 MS (i)396 1644 MS ( )408 1644 MS (2)421 1644 MS (0)446 1644 MS (0)471 1644 MS (2)496 1644 MS +( )521 1644 MS +( )235 1701 MS +[42 0 0 -42 0 0]/Courier MF +( )235 1749 MS +[50 0 0 -50 0 0]/_Times-Roman MF +( )235 1806 MS +showpage +PageSV restore +%%Trailer +%%DocumentNeededFonts: +%%+ Courier +%%+ Helvetica-Bold +%%+ Helvetica-BoldOblique +%%+ Palatino-Bold +%%+ Palatino-Roman +%%+ Times-Bold +%%+ Times-Italic +%%+ Times-Roman +%%DocumentSuppliedFonts: +end +%%Pages: 30 +%%EOF + \ No newline at end of file diff --git a/doc/salome/ResourcesManagerManual.pdf b/doc/salome/ResourcesManagerManual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12a9a57577fc3b8f0d8fb51428256ff2c1cdd70d GIT binary patch literal 52431 zcma&MLzFJSwyl}AZSS;g+qSjSwr$(CZQHhUr;R_&I``G9Ta8;|)N4hI6`km;6*0d# z|0s%z(=pLA!~7Y)jxT~?Ct@VBH@1S|BjggC) zsF{hqsTn^%jI)cAnUO7wN6u{eg$gPY+5ot;WpuD@;|a>7apQ?amNf%fDVirj|3wWRA>JygD>`j<QuJ{@)bUQ@@%_HtHl!hGSCm*sGy!=E=}LT( zEfVP}(%GvD67qAQFHSj&pg3N+9ZV;j-*(`^jy;j@_D2gZe_hg~lO%BaQ7Vp};s<;WJ z;vzFyeVDK}y#aX3#|S*1 zO7AYN(4mo~)&B8)M+Ta5vz@c`PLC^uIc@qpUN{U|W1y1u7JuQWygm&4D$&Qf=BvTg zJPHgeyk+M%53M{|@?B-B0zDJ>B9xWIVs2(GO`G~#mdz~6d8htUoVz#gJssHbVdhI^ zse)}#oi3u{<;|MFPC2kUUgx<*?ePu(Q3>%lITR3^P>rdm#LPU|h^_-zT|8$y8FeuJ z#fjeh(z#>Sp(&3Yy%j~ae+K3w8sLGJMzRd9VxWW108JgLd{_mFk&+fn4{J)y}zg8|54w(O4Vq*M%ivRBnU}EI_ zKbiu1({Xt1=(ApZMG11If-1L{RemY%jt4*>rX!K#_hZ?MF>EF}_A-wq`M>h(E782X z;jilM+fXeDRn?OE`ucgFWY2AyscMavKXCs0Jv|=Y4{a3$ez?C~o?1SBt`8SyVrsg4 z{a6CM*FTMR9Ayjx z!&g5?4-Xhye&_jD58tz#J?Ed01>jv0OHqMhkaGkZ4ZE$MaboGKUd!-~S~pYAem@Sq zHv|mTUDukPZ_nGe>mtL?{CIwPc5B3*uAO#aXP@Df^Yg>6-4T5^yt_sDb5?|}9KHSF zcl~$yYJjtaFTLL$!pY9tY=vvj&1UQNxbFPD-=%tSRA%pNm;JbTf#>Mf{qf`4qf{bZTomd)XusrX3DC~`1FsPo`@^phN@Blw7ukk{ zy>Vw=R|ET<&36RAdwwB%5{JqjyiXj5t88!vg1-WwEZ{pCPhd@9a7v6wiWj5LIE|2J ze0`@C0{r~3>xR$=q$kGDB2&j^aM?-MH_80M{xMn|@GYVK1u$92auoK&+JC zV}l+^0qnon6L6bhfmo{`Uu;eFjy!{YkWf>br5G=X$gSYw5L?KKlbXt+Y^hY>Ar;m7 zi3LotSa)tCM8F=#8;s@-=LcT!cq*y=uV-ox`+SGBZzb zt6K*ZCBfFu3La(f`1G3lQ?khD1Du!eKd8@^ zQv3U$5%Y++m9oggodh<3CzL3pJiA|;cM~(A%4xzV_V-Le)VSquG zKfcr0OG-Wj>E>C0*`EO;JR zPmz#kcidTp)TvO1_xRiL&EelFZ#Wdh{ik{gfmx$DRNoj{@@#w+>S$J`MI6}FG>3;+ zAZ+8#VPazKAwqRs4lUelIEk3ciN!x2H!@-gag$@jz89hJpC9(GD(RCoNA>hqZt$Jc z{x2lm!t|8hXvCH-+bQ3cLNkqPp+OcQoFV8X6xs@8c{WJKE(kj8m;_-vP@9B1!_^$N z)&Er0c{2m>i1oLroecKMdJE7ja2F6>&py7bU-3#X{NXj?1>uBLu7hmyBAi|+u5 zPj<7lNrb`hUjynLn2JGT6E-kWbRH1>S{Rv#PEx{HLuRp?hEOE zX)Eg0o!i+27GWL9b zBA95=IQ`M=Bl#Hd0A0>!RP{w;%Fyok!e*nWSZTX1i00M_@sg27?-19>q9C74FO=(n z7a$|kan#Ah?9$2YJtEYpy0}l`pPMFIplNPK+K$ymG+{{9u_>f7e|vIX(Y_UbaK(8XQ71Iq zFBJMDc?+$DgeV5RA}EYIbg+z;#xMs_%ub6I^fgX)wfWcuhD z)1e<-`su+jm8aN*UQ3+?s7x3}ngB64nURH~nPti(v(OtN$0BsSIH*?Au0IQKLQ8gs zT1NUr9xC9rj7?6Qd@Rg1r)I>FWGG#%6lb9TIW$2{Al`?MoUkcJgOMZwZt*&?NXk`N zxCcGNrE0W$mIn=#j3q6payp{gjp86|;5wtw;)%%{wOQzwUz!E$T*x6Dv=QHHe`$(% zLaiB|ZF2+dBVe<@gUaR6C_o%xm6#2gDwSeowudC-fX z6$9->nWi)74SpG(wMLdBym*A-GqNLvl|b^&EscTNR1Iiub33rxcz%=yqOqg@e8oWJ zMVBNSu9W?TVTdRaP@fg+j}VOh!A|=z=F=pjrNI`*Y1*0B8I-{W62+}CyjW4e!x?@f za9dk`S2Q((q4rR$KNdwOaha))*Va(RszaILn#M@`D47A{^bn zwRD#p+Y^tEMoHEp3X$`^#!Bx~5n7f|tfflsMP}P&?P}%hADc3cNjp75~_{xx;>JKfpALvs=Xk0f!2??BPEJYoblrquEmt* zXx#RphJ~2pxBY?Mn~8jsUCp~{ia&vrRyAdz(cJ23EOlHIiVp*Ur@K^>CRBpwF+ty9 z8nQzqSJek5vs&~H62&9WC)(+Xnv}LQ`kc>z03P`1r#1oo%~=6UYzcI{tqhRjWR^eL z)C!kKya@HGq&ml~iGFkX;s-6xPz@;cG;8)EOK%@qR_0;74LEy2&7AmEuZr(W)Ow&II5w!lJfA5WFpyi<`nZ7e$ zHdH(JR;boRETRRb!arrs@zMb~$5 z*?Sq(Orvx9JV&HEI-`h09fp&YUb zQ-psL+uUTSJI_f_ot#&h2ou4hKRuIRfDrpaDHOx<+khj@s_0WQ z3G{+3@t^1fL26v0I$G&!BSaU)M>B(WxC=E(HEOKYlt_s^9b)DpsEhj&EV1@>{@Id0 zcy`I;0kb*!@uzE)4IuMcKPPl!9qlAiNYv3FD8=J93@A1t0pT;+Qmetaj@Ose@DBabI8pd~s;}WZc@<}M7z8(JL zgUux~j#Gn^8I(Eq6Rc9Lw<#2M>ub$T0`32z5=ppo-pky*E$C1XxROCv2h}`8I$TXN z4MienD_|}q$g0qj#)x|R!n#GXPBGai(4Z11Rx(87iepEuGL;x{vG%x3F`~tQE^Mho z;U)z;9>*cU=N6hY9Qa7@+|NUw<8}!KyGpJXdGnoz&b5KxMMZD84^^ICo}QrAXJqe1 z!#II^)K$pglqSO5tXycOPbN)K>lLL^{j8yD$Mx(w%7b+9sk06ql5tX}W9r|Evscsi zKI>iY0O@A@rDVp;zXH0|N+Y{of7yZJ>9wLaU}drB@>;$vZtUxz{_$P>ekW{NHfR1H zGU@-;KmR3^SeQ9j|63_BvHcHP!o>7n1m*vim)z)W+o4Nfm9o!21&t+~wTnh+ll{zMUO9y1X0yy^~H6hm3b0E9&0$Zz_wKwpjgf=m8w= z^K-ww&h6#0S{AkV=3*Hx2Ag=;|WR+Gc*%MJgZd=*$kbZ5P$s`UK@MxUrlS!e7;tGHUGRC z`|t<;_@C#GpU$B_K9*Uc!6;l~5V*&i<>2rR;QaMX9I;R}lDV-s>F|~ZU`g1ud?>aB z;q!&6=WiDiANiLym?G7&)?KO-X&-LQR?*6ZjB6lPl(GKOxG;#pr#04c@5A{ zb4;7z1j0Xt?@-^D9ZoIzucYQ;q;SL=nf2vDBBM^LQHj!7Lr@u&INOCIMzq6USdlLE z9p^wzoHr$mkYJm?b!%CXUk2)gn5GDDR*04#fI2>GGF+r8V%6A7&)fv!(-;k{UK?|q zVYFU=Qp7H-%urkgD~j@3Cpvm!G!#rL%aaV|duKfUWanAPCdpD9h@#x<_K`$~LosRL zi9!U6ZI|fUcMTBVVVLb!&hDy*x{L)dO@_`s>jp1E8G0oYgOpD!jgB?f_wJ)F*>ZhB zwmjPIPrZ4p`t>YZ*C&Q#zmTH!+0767o`aY%HYwm*JDe7&r~^Nck+vYqtVdV zlfOmpu?GCeCegsvZV#yot1S@15)x?BpMq_7nVHJxO zmr9^nD%EsB95VSpf=!ofl2<*^2dO|E9=L-{fZL_pBtyz&(KDXIVH$Q#>yChfZ|LqN z8ATw;h9ZcX>_}KX%L&I6n7Fy$vdaSt#jvHYse3L3D5X0Sxsa`TJWoahI-6E$KzlZi z0fk)J#k-)hIj*8@Hl%OeCDy&3c~cxNBS(cn{31L8{_ySxJ!%}hf_n5pp4boHX&iC| zJ-Q#fO5Dr38^!L=AHM%dDOUoM_~hJ!y!U}Pd3gPM??a+Ch^TlB(0XyQ-dbKnksPaa z{13yn$9|0|+z^*r#a7xCRCmD}C#WlaeFgLLhnb%*Dn2*2are{$S^Ws~TsxnnTdW^uzOHNbU=xeWfLC2UK`svD>i!wNP0*McopHwbXn z0`GL&q{;|UqR$a>kT*?*i$cQswK78Rb<5(1ew>r{TEM%T z+#t2`LTRf4$3p@OGTwwZZ*Wd+5Zs8{1mo2j(e-MEzJebS^4SFQv1Kp-aQ)Rxz~BEE z4Y#kFXkNTR=Q z6YuA@I(F_>v*qPA=@a zR=f~8!nt?{&s*Fdd?4*A_J0`50o}Fw+^Xk88c&oiI!O&^qIn837wxe^w06C@y$0KDM=!rOfcjz(hrt^y@`m+^30gO!iB!(8UhcYtE&U5)(nRJ8P z6;iBCd2}nt6j?Va8(Qci-k9G~md8160hHO5Z7`1<{X`eE6Oau9ETDhdwwwPkLG0>gPs|oR&%2A}1m%yZe znvKrN4BcYQQ|HLH<+#`LXD;*1zs^>E1%<#_83C{P?L+gJ$HT81gw|4rTrBxLmt!BF z<%S;(wJrZKS2{%W(dnneEiloZn9kCzy&~(DwH)B`qjLy>MX3BOwj#uVT|Bg>N{SV( zq*_`~FQmqB{?bx~^8^V0McgX1QP*BWCcEa@ge71ZY}`#%``MU?oe#PbK!)Q)Y1|lG zsvYB~g-#RO#&5oSS((_e(xvF0iGX!cV4V+5tmo#oxCEDwNf{*w*(DFW69gMK;|2d$ zxsB|~QHiH(Y6Ke#GwzNA8>4^1JNqOXhxYkp9HcbmiF0vz)g{8!e8$xxtdG3vCX&`g zVW5|Y{#;OhmcUy1_Tw|FLrB~O{Jk5z|A4CSb&RfoK!TT6j!YIlD#aGm1h-&|_(Ce_6_?ZKYk5pGJzXVqP)&rA*Rg=W90>ZZDz%e6^f zlaGNYufc2L*}YfijIaYm&BTdYVJdq-Rx-oG#FCtBU*k99jA}mRW$01Zh+oUVokXXB zS^MLJ(TIPNf|PRMNZlvOMk#d?ACue`YMQ?wp-djpGRQRip5hdHt9D0r#R)C(i82J# zO1!yLR=Hx5SSOJ@c|yb~C!Z`ZfH=8D%yh!bxYkUofMDX_PQ0&4rJQk^y|-08uMFBbCcNH)#RxiO zUI=TfmtnHK(w-BF!%ETYgi~~Bwu9dF^G@MvoYnUga zf8zOUEUlOpOB9qzhAi9IpLjRc5T$8yhycgWx7ZtGkD-)3ehlPHVsY|C!i@%VU@Tv~ zWHHItj}w+lUSe`^GFCOzbr>+mce3L&%#u~^U#5mMO(zn?Y!*9jS!Fr???~Np>Wq(s zW7w5<;UtW$Oj0IYQYf{_9s1mfv#NwFeM zT2#9Pen1@bEgyyx7I7M%_EyH7^U?`S&-aAsasW?Fy!(dXJKj`1htarD4PrsxUyR8y&HEzb^(H|WzTjHJ0bOdr)`P5-QWTx@O@bPf&CE!xG z<~{|$qWh++ps*F}^jV^C)3Qu!w52~3o!2%rnn&!>JMpxOc#%jRb!3ghXOFPLZx;}Y zo+IG}1wCV(-2WA`n|;2{yLg>a_h44-g1A)#wfu`r>s>S)ZMbP-WZhOJ_w6Qh2%pIDwxdh* z7{%8tHj$0t2!g)D@6Yoi-mxmvuzroKRbt~#rz;PfAWZbZLB)LF8&?g_u*oD*k~0Ia zu?LPiCuW441Iu~Gt<04_F6ed@NpeF3a_ErqX+q4=pR(04Fad`l|RMA=S_ z5Zs78Dsohg<@`n%OjWcD>hW98d=nqDBWSY>tIkv2LH53L-j2WPnaA%dfsKYFVYhA* zTxWAIY9#ezqFr#?hix!%1Gs@t(9DnF&Xu)eb-v(7soMFy>U~Fin!iZ6Jt9?ft@hmf znRy~pq5oJ`r$`E~MjeXT;wmVZ?&b6I7!Z;gpWVwEwBITGJFT*{0Q=N5^I=|m%X(&4 zAKY#Hdy_q{crsDX$L#Ab%|%~#%TWkNnNGL8x4Ig9p3h_X8l)GHrjfwz~y5$9=9x?wM_m$sj)#oc!g>jHE&l+mG5N5+*D9$GwoZX_%CPtRO^oU@Q612RWzQ`La;a^^YUnz+=!Tl zQ}&I|uaUq>9u`O^UA9Z5x1mw{ZPK}5qDzF`!S9_&@E^2RHArsT2&cYaQwung86f*p z@tYf-*P0cLPl?2l53E@>5|KYRcr5AqA`JWftg1BEc3{n+Kf7|tW$ym$s{_NKx^$g- zQqzyS`K!kTB+F`PBd(~Ww&~R#bZod6<87(tySj_6{8tiZz*s#cx?DUlWtj|pCE7__ zy_@O{kST@pG3t@)b5PrO!~lw@(qU(CMmM&gyeIF0E}CWoP0}m_3_LMI*6=Q%_MvB>ua?TbYA%_-?K}tTb(Q?37=$l z}33-%~%DfS{(J4;EFNw2sp+eJ`SaU$8lY50M2AQ^&KQla=rIO+{dr1nvB z+zc9W);Tul167Y0S6ltI!)8-Lpl zuz88KC5{VPus!PFhP;n`;C-a)W;E^3FvHC2 zA2yroLfO&%0_lirfQ(=*8^0Raz^ZEtOEsi~9SE=HZaON#VuCuK;}IJ$A)RGQe0^u? z%IjgZw5mk4;18=$S6X~0%-vg#Z>H?rKipKm6~SZSlzfVa`(wol@+@lb-%qP6Q2s-l zrym=36Q9ySX>%^|cSNd`I0rS3Hm_~qLm90WhT$^^x5N0xJBoIzu>)ant`ItZXbCoc~Q&ng2hsD9rzdS(ME>vQhLWz;{%d0UXNmvYw1ProCZ93|QMB zsZ3e|QgdU5Ega}u_8XAE+u4qcnyb0#2p2^)gGqFF;fMN3o@3iYGJ|^dvs)|IH^D|qJz1D5VQu89$fBSj(HQKLW@N{J^fVaO}L%`STZOew?RKr78 zqQ$Y>Id#K$-G0W=&)>^c^E&%>(q4YH+m$Wt<>hJTegtS<26V@(6B1-UjqbWF<45lk zWG}Z}8F9XtHs7j;yYk=>{=8q`cH)E;S(^N|jXPz{zU=hZ^*-J0WWKCCl{ilV7#5B% z?#{$@{XYIZsWk5?^u9rOJ%ggXUq8NH%>VX$y)%Blt5iHpnnAoM?&yALe%pQgaDC;r zya^Pk?3y>P8XR8B!7Jz!8`PGa>Q4Wd;Se=nX7qjd(1Neq8wy7G zJ{o#+*0gu82HU!SoIM$zyma(DpkPeAE}Z@~E-1hIb@Ae_`Gk-#_aSKCCDw6Bw`H@f zoL#_sU97T?U#)q$I!eR;F!Qe3uSYEBbN$+OL|fuxYbWFYt8)l}-XJn@9Da(qQlxzY zel=j;&p%`1MTKqBu}65%nN9T*xS6`5Fy4YFUdg9t*_54UNkOyDY1y;7RcH{Mpx}(* zgw-VL`-SIi)~dd`)JV@i6_20qMv;Rs8IN`=)B7FE^`lLh3Bt(-gXyF4_fr31we|m` zW5zlfqS#Z~AD_rNq@(~WHv=e6D3PvzitxbsCd9f4Ty{@E4#t(P=KB4= za00HrZr;8C?_3cr`-5BA0zdvQgzF!z?8_PalN(nO&qyZT1*D4+a)!8rmRpP+wF}Uvom?(VYFn^plixLJ&T!%q>VZXVX)_$WBQ~%rS--Yj z8qn`!Zc)n1cRjJ>TDxz&NQhloMA_Og8zYP>&yBV=C$@F9)M|YGFtNUTqAfd|B%%jS z#qZI8AK$L?gz~rYxX{+KxXsqUVAM+Xli)%pO0VovDY}@?D zb+C#W+mCdU@FRgiwgmJ~fvcXg-GIyeS`Dvi1o-U_?N>r))__+*yIdK0+x~WY!uo}! z;;NRKMz`K((o0qu;%{@+9vT#2{Hyiwc(>&7eN>)rY&<1QOW=B)SXp%(hXmuSgmnz1 zrB`lO=BU0V!^2zR_6hCqdNM5h;>1FFG3gA%X>3YXX8%Z~zZ={eV`%DH0EkwNvw0h6 zzf?{nKc*IPEt-BF(=o$akrJ?F%qCbdVtQ`<~&Gjn`jU(kWcLS3PZGRkpHLCjYxgC4EA1qZ+v6e{npAd$+(Zq0e7QqHlg-@ zBTYex=&Up|fhhk^-6n-5wI4jYnhDF;a;cPZ$ zIA712wjMko2wA`W^L|H6D{~18ksN*2%M}jH01X{3@myx-Tk%tb)u8>Q5Vi2I3&a#Y zG1|N6a}rLg2jUFib)Q^W^UKiq6PV#yh~{T5!G{ecPh~&={Q*5cTla*Yymo6--YkAn zsgNHU(o!~G0#9W34s(JYv%6r379jT%(SZvpgYR0r!G2hR@^Y+X)K&LRDmbAY@mmpM4 zdE6`_y%JY(J*tlm(0NwBpVOrwTP&i1TPZOCPO}pPF5^!=Ml~YCf>T*SD7xmSn~qdo zxMcOpA)K{Kg;kH~2@Qw+AhDP^k7JnSQZe{*5DEKNyAe9WTof@MipLXH=ET`6=3OuO z?$-x9RyFjuAjIfEPq1`An}l3YHoUe$guvxH6FhC;#6|;3@KLva#Wg$QL7>bz^dNFX zSX9OauB(q?6if8}I1HfS9H5vb4)^#Qi6IRp zCrhM(mpieI&I7B=cKoANx|hZeK{xS2mmFG?yTtyHFY=}!Q$1hY>4g;eC`dcK2^oBZ1%8~{Ax9As~}q?h>N(GFfe`kW*I0A{c(6%T*mo%Yr8QpbLEC2KJjSKur}e zA3BORNE$!_T&(+OeHGOC%`<=k+jS5rGqF=#1Do}Oo>lMFqw6%IBeF)i6M1RFV`tcw zLlr)jm8=kM0<7j2qwUxFHR?t)#A6JWP;{c2r-=EPQRAlwjHO4p})$OT?2P zO?+X=!Nvqht;Ps|c z@$sDkeL+$ps0lagLdff#Fs2MYh!{cBrTzE8VD)EFu5v0~aZbVp4}m*sp6tVL2v9Gt zi#LZM7E|61t2B&Skup~~IM^yEqnrae^JA66C(1~8%=N!Mj+s_w7c*_S|U18dxmo@m_$)ZlSXU5%LC*g%}LNAyWf~DV>`zP?JN;XCI`igCpN{INtmLL1~2a zO;1iE`YoC!)a%CINiKSTjP#RvSy-5{s3>T;z!+L8rv}AvGQ6ZDZfh)kxK$--<*yWK zI?t=KM-h^(NW_?w(spP|KH@l75E_fmN(~7K1KH{YWqtz;;)3+eT|s3tyqusq75VWT}?m< z+bGn;mUSfC5+VXjUu2C7W;04%w1`7J6D7j3hGJS=o?P+P{5vUc+I!eD z>PF#`lSePwA`>-Gy+lHwEu~~61#gJS6AxD)*@};g<6kR(Npf`2zq^cp!9`?8r2zag z41YwEa%4+hI1^hfQ9-aPtCYh62L8+)#NL=F(w2oD%7Z~>b7Ex&k4mr!(D*A8m@#n6 z(nd%II3eqG^}=NQAuyl!ReH=GHekIlUyhYliG?8xOKbTySgOqQSe9VJ}YA!Ao#nIrD<4r{3 z2FvtecswSt*|O?+=na^q>v~s{#S}|B3dY`4;}!g6}65(vOpbD zA}eir+UAeL(N54_c#(4j=5Qp!s8HICWD!4Givx^mMfNd9b4~pD4P@oCdZ&dJ8iUBA zgZYM8z z_;J(_u!bk&arHXAWK%pb-Ffoy+YhqNBtPXvj%?qoR{Ofi%v1g@zMVls?1!B-|K*mm z639~0BM(bb_XYO%_rrd$4U-D5))ZRWNv?!F0`$|*^L_P3T)1!E&^XhrM=O+JPb@nT zQdIWKuK7tL`};YjT;1iXM()!U6wQ5y_i*fi{|)jRX5dE2<6&4Q>)WTwq(q#Hy8HFQ zewJ(Vhyo+JAo%yy_mG+V>7~1)G5=oL;@a1N_`W5NmubKF*sUDJ=|>*~zxBINXq;P& z?6@)h7TJhXJy*@Wj(t%BUos{b^cp~_zO|`O8^8(|V@?v?au*u|mv~YFOjazU2Nt|? znxCnpMC2aTN}nh+u!zG=>R}8I9`E-Le?fn!R#^apQMNXl&+FF)V(u1ZnptS=4R3~{ z3`#htfb_k6#Z5K@%_uK9SK*uVa|lu%ZHOBrULC?3AN8Q>tCs@pihzHN9_ z5tjtQ8xB&}9!jc;LYl-`6z&wT8u-IXkESnp#+#z05WI;uMZNRhh% z?pqnn@@8Z@)Cm~Fkbg*Nn585a$F;Q^S^!$QUhgv57DYk75mWecjvr-aV@O~`FToKH zH;~1R(GWOT*1-u%E&L#1BqOHtd$UM-&7!{jIg2kB40A8HfM0z8E!b)H?vv@+_^Q@G z1jO~dh4Cdlmwbt{b1CI-xb7KIK|QKG7OEhSKpK`r;8VTNChHRvF#&e=c`lOQ1~DKp z7(n4(us)sM>2Nm`gLxkV0>x&lq(7)X1Zeyd2Cn&^L1*ed-9rgZIFw1ZbN-fK|an;b%*WX`be@RlHJNJLS28qYz^{Ldh0$@wIo>(Y3D_t-t4-|z2rvdbTlEmc;?J$T< zS)wY~J($pC_5VAg-}7eq~c z8~QO4mC6BgDu+c96Hf@o-sydzIm=_8#3Z61hgi9)c|yd%7~JKl;4F z9PRqZ*r;D1&8C7H<>;#r=wAhY==pOdbw^G|;k|yblH$7#jySS-h=#KLeK#0NXxy8g1gGQm$YU+BvOAl+L zmS#1*m+Y}6jT< zVOs6Wva}`CJJc`e;$(7B7gya15aGaexM*1K3QS2y#(e}e9T!;`Iuj#kPD}mNa(!#j zK^CFXkgl@0`f-L^JEQuDUN|N`P@#WSB^Y<8{}m^7MVvIgQ9jz=ClQZp%gUDfvd?bY zai*&6wD$_cT4z4)Nj0IuXJsKDTA0^X-jDatF$-U7sjInfCh_Dx;X65_-afBP(lN~l zPPI})%VdnI)?PBqvhrEM;4*ZMzsV!6=Cs|0$ zXwh3n4lSW2(Tb@Cnxch}k7*-8_uX5$n`)N?nnK(kxy?|^C8ok&K~Gf*4ClrQaJbjD zvWz7{o`uDW77<$#3Edt3Smhf-n64}kr6CUaR_TPy2rNV9SR4{$fh+ia%yvr&-)@e_ zG-d6M42}xpI$^$Q1B1Z;Gfy`>4PBhhJvgOj(?*{bAVwUtK<3_b>5V_vU?~aWOwJB; z#hlrikor&{!$`C)5hpQoAutn`GsFbiR+S^cp9mLq!`<;g!-@!yl#0{SrJG-luKqcF z6;tOFJBB8p7|{!xt>z6%{p&_qy!MAnNA)aLJ%{aI&JzM2p)t9X*_V3h&eS%_0b1`w zxZZvzHj>>MO^Iv8wKW9N!zZWbe?IWJ;E=y21g{&ey$g#&VAimu;=jmNNj zY{KjgFUsb3W0FcEybD=p2Hb-gZUUFj7O;Z#oftCk7LtX@z+`t@wt8e{z2~!Z%P^LV zYh-vb{~1EViMc_mHY0O(GOOwY(bO--PzN$?aR6dVL7VQHDI605G&x!llar2MV=60S ziWT8AA*hz{TU9#f*QFcOsg%qVcZEr#o`%M1&_Uo}h_*OhBqHWWjIN`_e>c6vow>`I z=|y-s{3k1i6(+j^<)ulwEm@ey$Cpcy&`hgVru}ER2@)E0^@a(IjLun=7(8~!I^gE4 zRPKz)55(|~CU;ELAq0ohR4?en**=`CY|Rbg#b9%x=2X2!6c+V#;GY?1Qn#+5zmkr^ z0^H`x7>C9e5)vo8A^lQNs8_>}eEr;M?TqpQ*Bb>zMkw4}J6)NJOCGgr63`=9F!~w% z=v*5a_BjWska+@K&rTuO^qL~Ju3rIxYlVkG+R--&nQv4CgWxv2BfEd)8&J7*v2h;i90Ze_O-&OzDIEu4mXN45s%lW;=S3~~J z<{M~xKSrejmG^wc`0tfz5P{dz@noI-oxETEPJk*{Cxx*<~Y#X)E~`425^SQ78^ zQO}SEB~wvRe?SHUMY~_BEpiLKA2`zNBX4y#?`G<|B??&4t(Sfgv;mpx_$Lf`rkN)F9iwA18jroPW?Kx~ev7oU*MsDo^mRzxa$}q*Tto z9c2EafhDb4et2h|T7A~&f}19 z@Z|^k9+Of3k=uTqC-}P;^g}U)U_obo{n{P)-ae3^B>m8UMd0yD`JtJwPoL&?XD1cG z6((dA_R0;&QpwsHwcmWBG|&NWS@2RWL>n_{9TB$Gd4G?CX%T%CMy7C!ivF6);}I&4 zXQI+G!;Lg(R`Vq*i>DU{syqN^f*=5CrP9Rg$`DLbX-m5l)mZ`TO2LLq7#=FiUX@-N ze_AiQ4>Pqix^=aUS^zCvr~rvjBSQFUOHHEh#!GoN^+A%2PY8y6v*iCO?>*qD{{HxJ zWL`Up7B{3}+&w5{%L)z3UP&ptP~0*il}JMqp@h;f8nRbZ3WbyriV)fR{?Gf3zPMMP zPyfgF|NTAw|344cx#ym9-sil|Ydl}CGw!wThJhhf8}uh7q_Ub{Ux{F{?mR$RMhApueqA4knbhb%oHGDE342>v$%tNvh{}G@4=rsB9 zHifj!^q#VWt{!5jk$gP zTy^zC{22jDK^=jkXLz>#+`M+oT$0V?pg_b4v9N+?+rE7u914uN#(sibv*aF=^*!@f zOC`4+8eoeQ)ol$d%V$m5|6yfC!!q4_gn z=JpwrlBfCiTca;`J>W<%>gRj(()4afTBv;`=b_uWMsZv}0p4=aYT>G@lcU2I-b5%pSp)d!jTa$G`US z>656FpvI?Ck2P&=GAHEP@F_*!+(?wOY6&kv|Hj?oK@WM(px34;zjD7GFMYh^gyu#k z<#AlDczL6%nAJDcbG`?jP#JxBdKr%1{;7mLQU@_!=2YJSZo@HD4 zqZzY0caM~PBOPW;w{eVn>c&*aBC5&nSBu4_c=cBorgwj^sd{kFl;M16XrH=! zLE$ScQ5~h?_krH|VA1!wjP{zN$~!f!ivz3!cO}=He5{iDvPF`sKKops_?J`wA;y%o%@dPAAgY+d#zB|!o#uqea!MB z#+sir0^~DZuony}sMdH~zCz&8NIYY_=5<`Qi||s(Ck<)ue<8Ot;NHJ;m$N^1)O$25 zJ^_(_*5>_H4cDtig10BM_G^YUrYZUI$4WzS>5{4I(B{?0~Wd6CoeVFXT29t*N)*Wkah($7hO0e4 zPa^J*h6*NE=X;AZ>n4w#ef)Ko6lZQvzrk&j+@?(_4xyLoY`)!URC+v!yt_5JT)4^} z-?eQsqlYx=UMFf_p*nUW>cXLQx(kF_p2M zyixT#z9m$iY#Xz*DDmOb_^>;X&Cyb|*oV)3!smzb$NtBej_JrXyO?vIB4t$@9=)?= z*_UdRuDs>U;jv>=Ch3Nm#`iv%R78yNUUo`39Z9XYcFqHrBPGm9)YW+S-BY@D>%~V_ zwsOmz9-gwZMG(6z*X&xhIu=`o2%B0_lbBL%@=57z>(~n8i4`9zmMKnc*t#!kFrl|N zC4GAmae|3={QkiD{kWVlMDqI!%8ic=mb4EtRzrBIo^O1%xBg|09lg`g{z zNWlDtu6PVBbj4%;9dzwHyo|*6v!`EBYKmd0L)~~#(j_Dl$HrK}%A`x-2C@okFSask zZS_qU;%+bZd?}PV>0LY|ciLyE$uIGduCqtC+`8^iJgyj$PYx-}nd-@V)iv4W%a@tM zP2th^*L?A0e7irn*8DZ=yJsWYjlNrp?0gdtS$DJN=g;h$Unu+zjt0T%H`g&`EeQ)? zMW4AXzadgyx9qt(S%BT!WI1=?&*rYT7NiGBeiMwv#~3I~6-xPJk6bEai@*trp3;>T z-xIuG?*f{KK{5C{zk=+U4WZ-F**(f-&p$TEpKnpo-I7|c>3-*P-#$wJFvG3rypjAo z%R&lUuMXQpbmz~K(nh;M8D&2EGe*8=9&6ZtlG#LjtZ+ANr0mzh6D8fMK9|F~OS+2& zZ;v%kr0Q9;EHx10(Gxt*DK5AP;a@nwbH&^I!x)c{W0bv3aJfY2g;kHr8>G!IMN8qT z9`27g@hMS#^O4*hh6#7Csp@7%;WH8?oFzVu?+5ByqeW=&t{PaP&)lpM) zZ-#b-C3^I7ff|zfz7RQ)B;r}GT(LYixOal%?D;iiZtN{3lGLj*`A9YOyj?NcKd)}k zVt>Ie9y)B%`%TEcvsz7#E!_C%XMN#~)@f$y%6uB{cU?Tj^JTnVt&TCgQSR4DL%-WH zr&cQ+jXUn@-u2;&VX~e&3XfVRHXt3+@^HhdT1mC&yWU?|C0#2Mr`V$ett)FApAI^H ztug;~aD_&}s)i6({(aZTg4Rin&hlX>hFd#X+D3zUa>@oqFIb;tEU^eq-I%;BOsz4X zCjHu{Pg}2LCD?j{-aoy*eI>6MkF3xY_lBx^AEk3@o}I@8Zmie(z^=khz4~_3Gk0-j zqpH+928nw-QZI1!B7;l>#MSq()ZdA@@uRxuYIU?nSh7)g2w^F+Y;!lKKwz%ehW6O6 zfp^(idUHRox8r%ldH2ThuqRvEHy&o%tx&8TscVqf{uIyuW3Asq=JyQg+VhQ&m+dj;@fnK*|ua{r}F7jo=dLG4h`I(#6 zBWoW?^LDB=J|5bpT6<_!^n)?sfm6$O;hx(JF}CHa^ST!g5JlD6Po-`>zocV%AIg?`4PS(zQQxhtpl|$%0#ZE?ZmQletT}m7SacF znZ3!*>tA+x>_egM`BE9Sh&W(2_Hi{)PJYkH8?j8TdXiA|+}ps_mRZgGpO< za-B&%Z+&eOFQ1m~CAMW#2On(NxkvC&@mt@ZOTn0*w>I&{2jR~%TuI)NE9bC@WUz8= z$&P1?hIibSI7+sT?7g_EGMPp!W?~Hi&74hyjIn{_0{e> z+9JL6WWQ}$W(DF3hpOn?@6oq*_qR=MvXi}L9z=MhcWX+|Vrhq;nP2F}$inJlYeJ>C zH=a3;tl@rSxb*Ih3)fw^!HZz$##b+6C5CIiRb}23yiba9`;uJDz2m_+qSdO*(=sBB z-*8ibj-29A&JE(e8U5?EONFjm-Ww1sqw(G2Y3nT2lX<*_>!%}bSi(a>2ce;J%KFM7qb|&LP)Q?TCcYeFJZuvIt z=*;beAE$`}x+UAwO{}Ern%=Ns*WHWZecAU}kK1@x8+);Zkj@Qzj{F16__Z2q)fwx4 z9P#$@Os)@5%X$}`&M|~tjTSvpAm4m%=%rztR`dFmESdUw$cFJf>p!=AWV&jV<{lOm zv`nJ+>FEv;j}2MZ)Go#dhhFbZV{J%i550c+{q9Il>{l^u#@7blntLh@F5xyaE)nmp z>bdI9-=~c1Q&;qSAdWJ+A}MIha?`>4;Nwe`jXLIc<2S^lp-(N95!hr>o4V$+hGLUa z(03C{p4>ytYq0pVLv3k#o=zj-nK+^fLYh|`tgs|eFWLES4aCZ zB6747E(APiy?K3$|BZD88^eunHkp3e&hN$J{qn8CM(f=ph^&&E*fTqjH(K;lr7o{> zJ}Zv$_;w7>RJ}ZVFy&ILO;3tZk&D0)fu}mcS`QAYG^+a>2eLc~S+-Zz*XPWRG;vwI zA9A=P@ufVMqB?UW{P`4Y>L!*Mi}#AX-rUfve)0vwsvxFPvbS;5nTWfGm-PSISuh~r zx?K4E)#W#m!&>Crvc8V2e(N$8=Kd=_7aMcn%vXV7$I~_Z8N%zImw55s6l+LyDE_hb zs4_M;Bh53;%eMY(TDq-zwy*V=T41qH;E&o!4c#pN(`Ddnolu3XD~o)~_r4~4o`BfJ zb+1KFmhL%lle@C#jNQ@UsvmbX$|t0ltFxE3x--Mvy` zKZ-1zM7=m$c1eAzH79yxUW#k2U~JRen#bxXt#uo1yKdQ;C(#Td-*HJ-G8vi`w+ts1 zVDE=#9Ozkj?x{(4zL>*RKfV||TW zYjN47Jq>2PLbm&3iUN-ALuuR}cw=zsb$U%nIwyhc*Uu+barVXKS^J}UW2B^b z<+Ju4KPrLzh1vV@SlY&vrbJ7ZdkjKbYz@q$?CeDYWREv0z7D>Re7y^tcTm0@T$-|S zt!oOUV2?uA#dY^Hc0Z`j5W5}IS+lKV&}G9n*L8&CZg=DP+t~Ac~xRGji{JL6+ zZ4sZeSoXTEHlvE6V%-PS!tk_0Ja&x#TD5X;(6IaNLbHkCkCS_4b|wzXbA~LvL0MLH zggq}b*=R@g+qdVB21Gl2ZKSj{hsDrhbr^xeSe-2QpD;54O^ekD5Ptv1YeL?b*M|ve zF8%U-G}Ld2#GMYXOI@f`i?!~fwin7PZQO=~afxl#E$fGj^^K3l^Xfl%mT&Ra*Vs91 zC9Twy^!9aG=jo70eoW84Gox-9`=>gme7(K9BwRg2Pke;-4bq#K_ z97r3D-evx_yzU4l)xqJ)`b?_Z_pXx2W81G3`RuMper`fo_UUW+o?R7JlGPRJQ!@Gw zRPBx;EZhCzc>2wovRC@mF`G9lJ)7LspK-%E$^7NF(Inr7!!N#bdimL2q_9-vY#kl% z-KO`FK{b!EZJ@IH2~DmlQ)+I}8P741eqr1bTZ;3VirSrLIKfr%B&}?F@KL87 zya`i0=@xg>vxCHJiVHR=3H!d#P7d*nxPB7l6=7B)8@wWM-1x3Rr}f^>Rkpl2+mnwU zdd+apzy8~s+M3r{=J5%)?xb2IETe4Gd8udVt0gsc4ps|#Znv2kGD7<$m%#^9E}YAF}~U0Ti#QZ z&iz4`cdJzKBDqO-K8d)g9#%={TZwYR6k4<$^B~yPq$WRn3vXzO0Xq zmS36MpJtupR;YeThM4_aTc>#R`$ z4k?+xn6!?wr)TRc+1+pP-rL467~vF59A}N(V8qt1;4Xa^J+Q+}65SJ42_MhYhlA#y6y<+KeXR{RqArep0l9t`PM;s+D{S z^B^N!y_AxC6`Lyu$A171~Ra{}S+IgEHK^w6~A?15NOD}pSmpJVDqGuU_8r!Le z?IJlE`}V8r3S);OSzC7;j0`PQk^j#3%#g@*jpeDYVY~-t7Rv@H<6kE-4E*Ad6RKQw z8yHins(l|2CHP3E!&er#Zzw#!*0<93hLBR=%5D3^>&~b5OzayCe|kxXDCr}YQ_2%&UD|epy zn6$a>Eqa-Uf9A$ud}>YiRq+f*CZ{ZYOZ$CmWtL?>*OgjY-g0;>DQ;hqUO@+|0T#dE zPREmH!>!xjJ!L%_qq5cbT<)j0MUq7gZ8q5(%a$L%a%Q>RQIl1dZeQt4X8m&A=3|?D zQgwCL7kq|(O8f?Ewe|bCzvbPrZusONQK-1}*ky13eBPjY_O4AMg)D{#V$W_q{#4Mv z%INHq2S3M4)xP&EeYCmIPjY2d+8GtkjKmDlVXyN+_3w#a#NDVZJ4SvPn&vqFEFXGg z(eaJ2=2GXy#=Sb#RZrL2Ao*TscQ+Ze-`Z=+V|nv#>T{9Hfr#=agzQz;*fht(oZgei zZaqM(FkrKka)0nus_?e-$`B5dYlj^+t*P6lrd6vJ=BtaVe{YA{+yPv>FG$HaR3D89vB1kV2pXPZ{oY6q@0SBW5RzrlHyM*3KU=vS?f67#O-nZ zSli07cG*cnrI*tNX7eihO@gH?YL{*;"Z(fj^Oc30*R*J#NvJm~247niYHU5<=M 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 -SALOME reference manual - +KERNEL + - + + KERNEL + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/kernel.log b/doc/salome/gui/KERNEL/kernel.log new file mode 100755 index 000000000..c766a704d --- /dev/null +++ b/doc/salome/gui/KERNEL/kernel.log @@ -0,0 +1,272 @@ +|SourceProjectName:KERNEL.hpr +|DestinationProjectName:kernel.htm +whhost.js +whmsg.js +whmozemu.js +whproxy.js +whstub.js +whutils.js +whver.js +whform.js +whphost.js +whstart.js +whtopic.js +whframes.js +whlang.js +whskin_info.htm +whskin_blank.htm +whskin_pickup.htm +whskin_homepage.htm +whskin_tw.htm +whnjs.htm +whthost.js +whtdhtml.htm +whihost.js +whibody.htm +whiform.htm +whfhost.js +whfbody.htm +whfform.htm +whghost.js +whgbody.htm +whgdhtml.htm +whgdef.htm +whproj.js +whproj.xml +whproj.htm +whxdata\whtoc.xml +whxdata\whidx.xml +whxdata\whfts.xml +whxdata\whglo.xml +whdata\whtoc.js +whdata\whtoc.htm +whdata\whtdata.js +whdata\whidx.js +whdata\whidx.htm +whdata\whidata.js +whdata\whfts.js +whdata\whfts.htm +whdata\whglo.js +whdata\whglo.htm +whdata\whgdata.js +whdata\whftdata.js +whdata\whfwdata.js +whres.xml +webhelp.jar +webhelp.cab +whgdata\whnvp30.htm +whgdata\whnvp31.htm +whgdata\whnvp32.htm +whgdata\whnvp33.htm +whgdata\whnvt30.htm +whgdata\whnvt31.htm +whgdata\whnvt32.htm +whgdata\whnvt33.htm +whgdata\whnvf30.htm +whgdata\whnvf31.htm +whgdata\whnvf32.htm +whgdata\whnvf33.htm +whgdata\whnvl31.htm +whgdata\whnvl32.htm +whgdata\whnvl33.htm +whgdata\whexpbar.gif +cshdat_webhelp.htm +whcsh_home.htm +whcshdata.htm +cshdat_robohelp.htm +wht_tab0.gif +wht_tab1.gif +wht_tab2.gif +wht_tab3.gif +wht_tab4.gif +wht_tab5.gif +wht_tab6.gif +wht_tab7.gif +wht_tab8.gif +wht_glo_h.gif +wht_glo_n.gif +wht_fts_h.gif +wht_fts_n.gif +wht_idx_h.gif +wht_idx_n.gif +wht_toc_h.gif +wht_toc_n.gif +wht_ws.gif +wht_ws_g.gif +wht_logo1.gif +wht_logo2.gif +wht_abgw.jpg +wht_abgi.jpg +wht_abge.jpg +wht_abtw.jpg +wht_abte.jpg +wht_abti.jpg +wht_spac.gif +wht_next.gif +wht_next_g.gif +wht_prev.gif +wht_prev_g.gif +wht_sync.gif +wht_hide.gif +wht_go.gif +whstart.ico +whestart.ico +whrstart.ico +whidhtml.htm +whfdhtml.htm +whskin_banner.htm +whtbar.js +whskin_pdhtml.htm +whskin_papplet.htm +whskin_plist.htm +whskin_tbars.htm +whskin_mbars.htm +wht_toc4.gif +wht_toc1.gif +wht_toc2.gif +wht_toc3.gif +whskin_frmset010.htm +whst_topics.xml +whskin_frmset01.htm +kernel_hha.hhk +kernel.hhc +kernel.hhk +kernel\about_salome_pro_architecture.htm +kernel\about_salome_pro_help_system.htm +kernel\copyright_notice.htm +kernel\creating_a_new_study.htm +kernel\displaying_hiding_toolbars.htm +kernel\displaying_studies.htm +kernel\editing_studies.htm +kernel\getting_properties_of_the_study.htm +kernel\getting_started2.htm +kernel\introduction.htm +kernel\introduction_to_iapp.htm +kernel\introduction_to_salome_pro.htm +kernel\navigating_topics.htm +kernel\opening_studies.htm +kernel\readme.html +kernel\running_salome_pro.htm +kernel\salome_pro_desktop.htm +kernel\saving_a_study.htm +kernel\setting_preferences.htm +kernel\using_catalog_generator.htm +kernel\using_left-hand_tabs.htm +kernel\using_object_browser.htm +kernel\using_registry.htm +kernel\using_usecase_browser.htm +ehelp.xml +robohhre.lng +texture_horiz_ltbluebubbles.jpg +kernel.glo +default.css +image59.gif +pics\frontv.jpg +pics\fitall.jpg +pics\desktop3.jpg +pics\removeobj.jpg +pics\registy1.jpg +pics\sheme1.jpg +pics\open.jpg +pics\bottomv.jpg +pics\clear.jpg +pics\sheme2.jpg +occ.jpg +pics\globalpanning.jpg +pics\usecasebrsr.jpg +image2.jpg +pics\readmepage.png +tip1.gif +pics\rightv.jpg +pics\objbrowser2.jpg +pics\newobj.jpg +pics\save.jpg +pics\panning.jpg +pics\zoom.jpg +pics\trihedron.jpg +pics\newsticn.jpg +pics\fitrect.jpg +pics\usecasebr.jpg +image60.gif +pics\rotate.jpg +image61.gif +pics\copy-paste.jpg +image4.gif +pics\exemple.gif +pics\setcurrent.jpg +pics\tile.jpg +pics\topv.jpg +pics\close.jpg +pics\application-splash.jpg +i_blue.jpg +image7.gif +pics\productpage.png +pics\cascade.jpg +pics\undo-redo.jpg +note1.gif +pics\progresspage.png +image57.gif +pics\leftv.jpg +pics\backv.jpg +pics\addobj.jpg +image58.gif +pics\choicepage.png +pics\reset.jpg +pics\dump.jpg +kernel.ppf +ehlpdhtm.js +ss_btn_related_topics.gif +default_ns.css +whxdata\whtdata0.xml +whxdata\whftdata0.xml +whxdata\whfwdata0.xml +whxdata\whgdata0.xml +whdata\whtdata0.htm +whdata\whftdata0.htm +whdata\whfwdata0.htm +whdata\whgdata0.htm +whgdata\whlstt0.htm +whgdata\whlstt1.htm +whgdata\whlstt2.htm +whgdata\whlstt3.htm +whgdata\whlstt4.htm +whgdata\whlsti0.htm +whgdata\whlstfl0.htm +whgdata\whlstfl1.htm +whgdata\whlstfl2.htm +whgdata\whlstfl3.htm +whgdata\whlstfl4.htm +whgdata\whlstfl5.htm +whgdata\whlstfl6.htm +whgdata\whlstfl7.htm +whgdata\whlstfl8.htm +whgdata\whlstfl9.htm +whgdata\whlstfl10.htm +whgdata\whlstfl11.htm +whgdata\whlstfl12.htm +whgdata\whlstfl13.htm +whgdata\whlstfl14.htm +whgdata\whlstfl15.htm +whgdata\whlstfl16.htm +whgdata\whlstfl17.htm +whgdata\whlstfl18.htm +whgdata\whlstfl19.htm +whgdata\whlstfl20.htm +whgdata\whlstfl21.htm +whgdata\whlstfl22.htm +whgdata\whlstfl23.htm +whgdata\whlstfl24.htm +whgdata\whlstfl25.htm +whgdata\whlstf0.htm +whgdata\whlstf1.htm +whgdata\whlstf2.htm +whgdata\whlstf3.htm +whgdata\whlstf4.htm +whgdata\whlstf5.htm +whgdata\whlstf6.htm +whgdata\whlstf7.htm +whgdata\whlstf8.htm +whgdata\whlstg0.htm +kernel.htm +kernel_csh.htm +kernel_rhc.htm diff --git a/doc/salome/gui/KERNEL/kernel_csh.htm b/doc/salome/gui/KERNEL/kernel_csh.htm new file mode 100755 index 000000000..23afeaa1d --- /dev/null +++ b/doc/salome/gui/KERNEL/kernel_csh.htm @@ -0,0 +1,106 @@ + + +KERNEL + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/kernel_rhc.htm b/doc/salome/gui/KERNEL/kernel_rhc.htm new file mode 100755 index 000000000..65674f4f8 --- /dev/null +++ b/doc/salome/gui/KERNEL/kernel_rhc.htm @@ -0,0 +1,106 @@ + + +KERNEL + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/robohhre.lng b/doc/salome/gui/KERNEL/robohhre.lng new file mode 100755 index 000000000..297538b0b --- /dev/null +++ b/doc/salome/gui/KERNEL/robohhre.lng @@ -0,0 +1,101 @@ +[GlossaryTab] +TabCaption=&Glossary +TermCaption=&Term +DefinitionCaption=&Definition For: + +[BrowseSequence] +PreCaption=Previous +PreTooltip=Previous Topic +NextCaption=Next +NextTooltip=Next Topic +BlockTooltip=Select Block + +[Common] +Contents=Contents +Index=Index +Search=Search +Glossary=Glossary +Logo/Author=Powered By +Show=Show +Hide=Hide +SyncToc=SyncToc +Prev=<< +Next=>> +Disabled Prev=<< +Disabled Next=>> +Seperate = | + +[WebHelp] +Cancel=Cancel +CantOpenURLorFile=Can't open URL or file +CompletingContents=Completing Contents... +Display=Display +Term=Term: +Definition=Definition: +Done=Done +Find=Find +IndexInputPrompt=Type in the keyword to find: +RelateTopicListPrompt=Click a topic, then click Display. +LoadingData=Loading data, please wait... +LoadingContents=Loading contents, please wait... +LoadingContentsData=Loading, click here to cancel... +LoadingFTS=Reading Search Data... +LoadingIndex=Loading Index... +LoadingTOCItem=Loading Table of Contents: +Searching=Searching... +FtsInputPrompt=Type in the word(s) to search for: +TopicsFound=Topics Found +BrowserLimitedMessage=Your browser does not support frames. We recommend that you update your browser to a version that supports frames. +SuggestViewNoFrameMessage=To view the Help system without frames click on this +SuggestViewNoFrameMsg2=hyperlink. +TopicsNotFound=No Topics Found. +CantSearch=Cannot search for that phrase. +JS_alert_appletNotLoad = Unable to load applet. If you are using an old version of Netscape, the prefs.js file needs to be edited. +JS_alert_colorlimitation=WebHelp has detected that your display is set to 16 colors. For full WebHelp support, please set your display to use 256 or more colors. +Blank_topic_text=This topic was created by WinHelp Project Conversion Wizard, and is the destination of a missing topic or broken hyperlink. +JS_alert_ProjectLoadingFail=Could not load correctly, please click Refresh. +JS_alert_cantLoadProject=Can't load project: +JS_alert_ErrorInLoading=Error in Loading navigation component. Please regenerate WebHelp. +IndexBtnText=Go +FtsBtnText=Go +ToolBarSearchBtnText=Go +InTopicSearchBtnText=Go +SearchLabel=Search +SearchPrompt=- Search - +PreTooltip=Previous Topic +NextTooltip=Next Topic +WebSearch=WebSearch +SyncTocTooltip=Sync TOC +Book=Book +Page=Page +Remote_Page=Remote Page +Show_Navigation_Component=Show Navigation Component +Hide_Navigation_Component=Hide Navigation Component +nls_edit_label=Type in your question: +nls_button_go_hint=Go Search +nls_button_go_text=Go +nls_body_instruction=Enter your question in the text box above, then click GO. +nls_body_empty=Sorry, we were unable to find a good answer for your question. +IndexSelectTopicTitle=Select a Topic +IndexSelectTopicLabel=Select a topic, then click Display +IndexSelectTopicError=Please select a topic. +IndexAlphabetBookmarks=ABCDEFGHIJKLMNOPQRSTUVWXYZ +MergeError1=The merged Help system +MergeError2=is using a different language from the master Help system, which will cause the index and full-text search functionality to be disabled in the merged Help system. +PoweredBy=Powered by +GeneratedBy=Generated by +Author=Author +About=About +Print=Print + +[PrintedDoc] +TableOfContents=Table Of Contents +TitlePage=Title Page +ChapterFileNamePrefix=Chapter_ +TitlePageFileName=Chapter__Title_Page.doc +CrossReferencePrefix=See +GlossaryHeadingStyleName=Glossary Heading +GlossaryTermStyleName=Glossary Term +GlossaryDefinitionStyleName=Glossary Definition +TitlePageTitleStyleName=Title Page Title +TocPageTitleStyleName=Table of Contents Page Title diff --git a/doc/salome/gui/KERNEL/webhelp.cab b/doc/salome/gui/KERNEL/webhelp.cab index 145860899b4e387d1c84e76394629020f5633918..b942f642f9b003eeb7959f3378d4681fd302ed68 100755 GIT binary patch literal 89619 zcmaf)Wmp_o(zbDT5AN<3+}+)SySrO(cbDJ}!QEW~1lQp1u7U9N>}KYjoiEwt2iJ(hGtg^5e5a0_{7x<3{AliR@2Lb{G1_sjk`5YYy2nY%Y7)TrB=L>b$YNUbw5Iu=_KT1Xv&-Yt`T43I>i&f7Kof8VKlz{%=_oJ1Y}g3(vpsIRJ@a z`TygRKg;)LVSZ*w1`x>cf5HDOija$iweeq0=mA!U*1vc1rPPoKaSeZBO+*Q zVDJ1_G)91Ewgdi)m6D0Eg`r^%ms0yxmf{%^E`f$e`fV1ok!^2zz1CO;kA0QRe{;y1L4iMz9)qlv*!mJJY0 zQQfat7iVWXTLl*JtRb#xT9b$0al$x#5h+U3J9I57h&6G>+i zn|}%UCrtJZ(5GI01v@+a!~YM!zVo01bo{f4|8+3LoSps_<}qMDxX6ExDO>&3f3?7Y zfJo_nfr?w({lj@UVCQ_9e~mgh88~|U5dkUF&#ZO_6t-}(CCk5u54jz^>fu70O}(CD^%Fr#n#HiSj52jPgTwXSPhB)!Tv*I3;>)? z^1s+f+M51(U@2jMfOMpO#r|==g$<0%O@2l_47gf?RDMO;8k@NPV@omsMV9{8Jn`>K z{VzR8{sI3@5lR3-?%Dos)qm9ZkN*DN=~u9vi_QOEyLAL0AU2m@;4%ibW-fsAer5&< z&<|?RuehIw?C%|Jf(Qr*JLJE>KNr0LAO|JC;QnZ7$|lav7Pe+T(KkS6UMc$p3b?4O z|9L3Q0hL{@{Uz*V=i+E&B4c6rb6pP%>SDISI7Pt04zG7*{%MHvord8qfw*+%vzVf=Kdip9zgoU*nkcDXQNTE zGy0pX=m0a5F7@xRza891fUYC|X#W3PQB_Gs%);740x;iN|CM?m01V{+742kV{KsDX zxu<}M6GG^}aDR@!RsfNLi~R!phxWq({m@?Jmz<-si-GmuySy3TP(5k>AM5OBV&V#D zS33W?v;pG#8RQTkX?@-Q!YThtQ9tQ^fK18tenBf+7+M3=ENl*#`cwd}e)0}RKtM;P zzu^C1{>bhh(dYnBt+9Xee~j{gG5*i_Q|HeoKbIy4>{-+JuTj8_^OJ%{1_Jsv|6A(s z6$=4SNBh4;rA<5}{~Fhf0d=rD`Yo&Sx9)8V=&rMuzeUymhWY|h68!#a6maGJ>mK`= z*E|621_KBTpxA#F>QD4ih*FDzZj3#~sp|Fq#H zo5}i$E+w5u5!5cLMGu|_B7~Tm(X@nNc|~b)T@YO;DXWCwGRYaj?Ht-3B-?v*im)$Y zp>GjNmn6(j}@3!2LltuTa;uvtvahKcGV^@e$ z1*a#vUc1nV^xXAD#os2{_-!G%1G6$#KEPeGgZ1}5lEY`kU4TKNVQrFJ>6;JIgT)Xg z2vLmZRvOxQt|x1}Ds1?wmO<3#QW9L}rU_a^zwcb9DHAJUKr)9u687ZyEJ!s@KIbIj zq*dEqyIIu+v8Nz5iXK$d=t_+b@zf?#3m&f`j4t@Kf9{juJPLOU5)Q@?wwc&n-iU7} znWiB!Z6QkJJ9A#oH&dPGB5bx$v%ONvk6%C zRtcog#07&T_>V#6WeIUYr}<%ExU0H{A2{5%P<{bp4J{(KuYs&w>%vY@y)XK~ zWMJ(e4I5>M=97LX3IrLO8a1-4hydgSW-wbCXi<;_ec&?6)O#M>nH`#@FvPxnxVtCT zQh&!jjnU2P3>o{z^&0%xC!hXjn6c<^`l^;T8p%`*6M075Fx)A9d=-|`HVxoHB?`Gy zZwPQf?A0?*dws@pe^Iy;t>qFLeE1N^&*LM|>^|KLg}q7|LZvANkjg_s=!3ms;>H@n z%;iPBmpW}J`yȲ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

oXOQ}Ge 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

3mV47(J-nnng03vOv>=_>hgK# zV@Uo*q5;zXKR(7-#m6X;d<+A+b3-ZEi-C8CrDSG&pPLV6#s_iCjMItCjN`v8W=64K zW)!DmWsMr}j#kNb{1;b-yXV9*w<@v0eu@H_%!jKQ{K3|X{0TeN8(`(w$ox;HG&{LeJ@b@X`oB6+?@k5f>p$Bb66tXmbFl zHZ&u*a@uUmdl=(~r)JzG9rI%XT?HUeo(5%3qKS&2k&Yk|V`Rh#B2#7DG%G>mI@xDc z$pn#^Gy^HKtOSwSGH%XA6GZ0IJY2Xy1K|mvSB!<%zjP3HX)Y~8_vMHROIpVb8Nl2X zu%WVnxmxdku`sueR--0sw6)h-lho1BeT2K7)}hc17AD87U~=39j8kU2-BV+$fs}o^ z8B?u^3u{@km2c$3Zh({C4*JQZA{)?7Gp^hwRNblj#C}N;>P^3*ddz9qDJ-(!e>7%# zmD_B6gvCBVG4=_#;Vmr2vL{z=8zk{igug-`=yKX4z$02#dCcCm z>k}8ls+oXogMIW=D$kWME3{|fwy>C1J())9Ua zCWnI_#oMXD*IZ6|mx>i{XCVtAV_67Ua)wH^5b_eeoSL`uqAdYt`bks4d{ROCe#)o0 zpM{v~0p_B#s+E3|WTJPoHqrYoO!SbmUgX>satCfXM;qfz^fn0-z2e%CXOPq%T$NFOE{*wJSWT&i`U&rci?X@r@q`3@_m|;l2x9 z+e9I)U7N({`hsrHAThi-iNl*CCz3zR6D?cPKTD6H90+(km5Srl;|H{iW=y_R ztHqc=;mEEU6!&6W(!ei}dN5o!tZ8ggz`b7lPSBA9H?3`KYHp}fsX|p=kfN}d)_jh` zws&T4#UuubmQ-Sjc1WEp8f?ZszmVim?~t=-(xT92Ar&a+8x9PuAv72nu9U?~Ic}IN zet1T#tzsI1%q7XJtq7cLB(k>3{4B$jX29ASOJh*(xRf5;G?`0?bfX~BS;$-yDU8TT zsmNS?X)^L$lSt;Oly{$k9Kt=>Gz+8aI@zgJvd;jtL7(rh=<{$-Hn(AWLnHiBiOAVW z)UUa+*XPAkzZS^Yh0fH67(D{&@Wsfz)Y(s2i}Lmn<86iFT!U0^M)7MfTXBKf;b|7< z+1PFp-Q=fL5b9Q;J2H2Fu?hm59h1J4+4|yinnviFHJfdV zyzn-Y&DM;FMrujolx>$eZ;zw6?UW;SMJC$-np@T>5YWyj<>JXKGC zLv@*VOb)>9yYr68K|kZH7vh+vhtdBDr)wPb^Q--cq;)k^jK1+kAHC$fK^1eK(gr$~ zjke-dKckCRQm}4M_!$pCqa$xP+DC77pKjYur%+snvwUXt;S!}Ys9h&6IpXY`rZ2sX zPC1_eyYW4Ed3RtpevnHa()$_g7=6`lpYH2;Z`$wEedMQ)>4HJ)F5mky&D$Pt3H?I< zguV$q$+yt8>zi&@YJqQKf$t5!@^Mr^NV`fYi=V=+Jo5bk&%><^w{2@^=I4CvHeN0N z2<;76mZ?o!SYF4=?oa&mr}W2{#1j1;{kc6$^appwfQLH~{Z6*>O>^07hx zll}uG{+9zA^f&ZBNbX9*1~sw_gYy~L7G1sJ7SO}+q+^I0Iff4x`{Nm+MjjBz4~-sH zhN#g?RLID;-vuxN{KC{o_;Y{KfUl-%`Re%#s;aT2XmHK(e@=C+;(q$^cgeEpDkfXS z#Q359&lo@S;#AF6<#D`XH_qR&qyAIx&cwUTOd^sReORan8AHVZtFmW@@&DnL|3&$-)qFn55j1gg_3X4^GgSZbIupta_>HH2boi2NXu54&Kw$XdEiycd& z1KYd3Yr~P!vQFyP0e|M2scQ72u#GZcpwbl>SJB%^%7BRJ!Y9WVWfa=b)rKlr+30T! zFwY^7huh|H=|%3t`r zPO3XYwTOvCsa|)k?orn%&g@b-g&GxawyA@* zw$nDgq@A{Q(2jh62i=KLI7_>;&(i&(`^P6nOl_wJc~rBxA}-4m;dhPA1gzHGS76_L z^Y!Id7=u;%hdlE!u5ZYZctwuHUe^)Yg`e3`dh7#w0t}O7QF^vCO8bqobO@T>CfQb>k4|1C8n>5=1jDG9EFWd2H-|HOqV)4}KZ0M#Ga-I13BSK6hmN%9HK{S|FCIXW2aNFNJU%>||EU6e;6<$z z;<{~&(!WHqL7?@44gBjis(=Q0ICrOv6|`T=Pa{hIeM1}d6%1hW(x^d^P)|fe4Oc}k z%)wBvsNn_Ew!*a=0ak~K{75K2YUE;cs>P-Lx?pZy)aVILu917nTD>8qfjvPy84%|!h(=+o?F$0XH?0@aH6J0vuQQ|7nw1Z$@qGVfH~0_$aYb-^BJNIMN} zrEsi7O+q&BA7dgLy=ANA&A@FQDQ_^|?gqN2+G$-kZ=jZ;uo1CYrS8;E_5?FI?#b8o z$i@)kN|k<%+94XFCOfFm4wJZ2*U!R-Hp*<*!yR!7U!$){${E-Vg|98~#ZldxTVrn{ z<)Af;$H_6q%jW|vGai<@buZSDfrA=!^2XjmdcQ&*ujw9SZIky;XOJnUS`O>BG!Jsn}b;yK{ zpD@cdt!~EU=25izAdCc*zIL)8leILhwerJq1dC|%x|;et9tv@7APuL9M;2P@eg+JA z2FMCPf>^i)>VSc=kb)HM92?dyZrIe+(x4h`HQnx=D4NJh^AD@dcJIWa6J)L#&?k?e zBIGJgJik?2IZ6go%#~z}|7D|uF4MfGAn0DBzyVE5s2h)cgmmnu3At1bH6!RN=mQ`8 zUZ>?g33uE!+C=S*JDUgh(vQC=$8LkRJiq}Mx3o0-z!$Ulg`5o)0+0C?9&_Q2$AfY= z)ce#~vDOna7UA5{N^ruA(LU@UINA=IoIj{eS+2un%Tp*xSNLfq#-zJ?(N)-GSPB2y z7WMBM90<9RZcfecZ=iZS1h>c)JvRN<<7%;)aGCYkjo6HE)?;t>Qxh!BdnG*dUTjaK zqmpBOH-jwSl7Sv}yPY0(2aR^p!)jOE$)-nl`)L<$*(>2`_R?-Y-HQ|lFS7UJVA__8 z=lVSa7v1I9|L|-TE0B*K)*P`%Gu&l*f*!|8u#cY|wSH+haB)@Cs!`tm#qG8aNB9x`iI4l{b0(eVC5efJD=7_b821(fQ(=u|`bG zLeJCwRF0C5nHO7=`{-mq92q@bsR+tJAL<_tgw9Z*`0fMs#1PY2_;7rc;HxwY8K{%S zo{8D2KCOL?XI06QQ?dp`&cTygU{aK(v}WZ+)Nv^DBI+=d`H?`4JQc+i3Cxkd+~G)I zp7@DML;?%cZ&+ItULZIVFBFb_z??4(un=6UqFnWdSs1Q84b{y`uG@{Pqg00sbx~T& zg_W{IRVpsMHXNmODii-?DXgwkW@FiXONECUx3xCpL9R~P#*K%8g9ifXU1eNInNuNU z35D!33%Q3oFIEU#5Y2#S#>G@77lV|za_%+DxsUtbQjQztxE;%JCzP|tEaw3p!dN+i zV&mE4G0xFmO|e-8CJYAe5e#0}k3-(TV{(K93+B6E!SHP(A)gon@fRa75C=adb-y^) zW(YDp+1B;kDVD4D)5r7)-A+F+dKme1yD{8YW-RBh(Rk4~!tr>(j?-vUR+F>e69{$0 z3}IU7fXxIS9;444v`H?}$?I(&kHQ##?NBNfY_-CHE!#M z|BS7?VkLoWb6?z}NiKez?;g9Xdb`+s%gf>QDmRX4qW1JWk}WTsCIM&m*8HD@jlI6$ z!rN}__4BjD6f~&FB8G|EPPRvjzIFdw+m%2^Rh{AgCNr7I%Y=kU0*px{vILkcfWZ_3 zA`%uONt8uHT)->?84MYm8MZ1_P(cuFQEUxvU@JkyRxP|FO;1agV~@4AwToS~cCoeA zTDw`>3iSW(eQ)L^c|(S!=Opv)^4{Ivz4v|p{kM==sI-|h5?FkYWJ6(0vcZDvi)b_q zEnJj{vj(2TT>j{<4u{qQKaHcYD1SVE{6dj(B{e_c4A7?{hC}ND;iy95{n72_NHnn4 z1urROz~`<8#-yQ*j729W_yBS5HJ%LNXrv(sFm^E%XKnEEG^o)Qx58 z0Gk$?7&)5K#K^U>=az*+?KcPULWcwH1y(h!Z;u*@QYpi%$8xiaF4JfZR5eCei<%c? zBoI+@Fi;3w+7b=~I+P4YHSB24ky;y2{n@BEtP7?0gTV#3s3x7R1Ts%+3z)(_3y@T2 zWj?yXfe6FKfb?vG_qCXdo@l&!&XYASqov5Y#yVB54h1m*8!$0Ace&KOsO_Jvq_oy` zL`@lR=^qX={YHMjxVN0=YHKL$2Fy;c3$}zqkn`+jr*u@40N}Y83qxH%T3WIWDE2!SeM+M}(5o;6jvj;stnIWn#tJnKp*)PdK8;%+ z?l<3>Is)x3+J~{^Rmfi-kovLgx$C1*xoRNb7VVg)j>#ae^Ek$6zaW3VUCY=(XHK$9 zOx~7h%)du_rr&XnT=nM3D)b*UL45V{oTM(rA7wLs`-kXndN_{8{s#~{? zU2Rh{#;)fy)bf`!>cfzx78Mn_A(3;oWb<+QDvJ6VkHL~ads8$ZrxGRrZ{};)@!I|d z-@Op@O#~u3ldQr&oF+ftwZZ1NjE;r;{x+syAH9r8aGyrK^opQa3AJ>Rc++^t-^2KR zpBq)pDNsuK0S_a?2n^$ocyg`{ZQvn(P3?g{i5;1Oo4y1aBq&)A{hWRVn*SHP3ZkI} zVY!%J$9Fp`R;~I(x#(9Ky-9EI%=s%XTk&o0aa^ifSfiOlqb(%8}k)nxIAqL9s38yB~=w++yo^U52 zyC*V)#yCNEEJAoLUkfvT#!hpP84Q{ z3q`@uhdH9i<}gQ$!JM`|%n{=>FTT?!K7RDe-mmENb?-NO=q0}D^qp?{u1>Eu_`N?=Zvnv{gO~qmgLO=@<73iE zqvK;DLpuEwx=O#qct6iSzc$JLBC*JL=WECzWlC1~y}#wUyXkj0q&k3~!}#$+;${t` za^9AjZ(E`B_AdA6y+-f*@`1nNb{YS>89&VNJ>02(;Q6v+^r6Wjt`qe(q`y~@{tm2o zBl(bFLwm34{C{WVr#wMBG4A>5Z9r_~-BO)SiXP#pFVlq!G9x)6T^E`AXp%9gIU8nT0cit92Ha5Wg4%oMf_inchoH| zNu1lo>jXEbHE51tb!@fHH0;t%maCN~-BUEo2zn3liqOS$#}Ompuu7QZIAWTj!`40M zRmje%Y~BNnmB0C z7`Jxsxf)KBe3k!~2&QeZ9kQ{bRZ}IL90T{uh2Z1bkgDU8;IK}_ zA=6MCR(}SSfbvj0(Xu4Ct5a~UWOG_{u|^d*NOIuKxM51|Y}u>R>0@ZsjMK9gXF*C^ zT3S2LEW|l5+LoAw$SAEEDknp70O#9r02jiPo;?S!MpLI$XUeXtqgo7Cy_HRVwaKqr zGKkN74K2f)x>oU-mnX|-z8-Ak3fNUkNI9?2cuyaF_5`!kOk0WbEeoL=fK#BA;2=8` z7rhOzTAe>ATN`U2bWkYIwvyAO>wt<{u{0$<(RKl5bObgw4NfS zP*PS~Q=~2w4$P0$wTU+3j?GE3O{HOwVz7LRF_P15o=J8SS%))|t>6(CN*kEUmeGj#<4L1MAe9D5;J5XCEa2<76rnyUWV}_xIVQxsmv-B^wl%pt z_tE`!a_lirwsFt6ql|n|Be^9yjXO@o&kb~t%h1sQc{4Glq!*gM-g2F$b&3%s-pXF8 zN})PG!{6DZq6Z#SvKi4q7=HO8>7}bo_a<+_y$POQjOV3$lcll%Wj~<;jKK!* z?woLda-)nY-kr0LRzd`MrB1ELYt?DB^obHw&r6>u55ma7{X!Zv$i>6$of0g{FgjM{ zl4jy`XvKHYXm~u{Am}(%!09nKj?+5f$l2XRnaKONpna!a&vWlPHN)rfDZTi~eN@a1 zxgE5KOj6~e&^sHtPGtkWj$~SIf;2QDXeT4d(|9o6Wt$!2lz)=e8p$S09Q?{$owoPq z=k17ru%2@jnd8NhgbB5C0Aeu=6$fHNAK1rH7&ti4GsnJQ=xC3iJYyqO9Bl|fOT6NG&D&gKQ!=%v?x_GP*z2m4U$qK zhS8?Eq0r49o(rX5xs{)>@v*qtev$^JE`iA1PzI(LqD_Z(|CyqdnN)>=o)xnnHv8;> z;^j04Wz99g&O8o;1FNJsUd#v>_`nf`N^bmj;{Lxgt5v z%Q!J+Y|9w=72q}c65j5jn>1n#?j8o{9ZA;Jczx*=Jpx*7gj{MhajLe<+e+Jdd)Y@zBM zbURAe+7GJU2~uwhIEVw(;{nIzdufJgzbXZvMpZ^?1*Jo=B6VbHr9)IX zMODnE)1`*MS;|SD%X?WbRU1Z}=Br>j2N$ZK#=#mD%;4Z674-PhzeO%@9qv@^yGpii zbssHm^tpZMLLs?p90mSvT3+Qef$9xqFOsJWq2?~iVn|C2O%VC4b5=<~dI>Ix2f81#0Xnr&9uA*;M$V3p1@s&YU*C*L&dIr*Ad&pP{h+~-u! zrdT~4W<6n9&pSR1#Db>NdJqemccV_X%BUh1v_9Ixlj;*pENnyGHl6OS(txXVx~D4B zmnk2p9F{jMece|@FXR?h_Q1CX~f?}A&c>sELs-MuWyT|CO z>stqtbgg{`j$f6dQ zNk9TY1Vu3f3}hn-L=?-Kg(XbL!ltz@xKu^dx`8Mt;D|6N2cqsZ`DHHuu}nr8C+cscTSTFB?qjj(mIlx&8T;^Knzi~1@3 zA}0s2Akjd6JxFes=rx~@B;oc{1`Lr}LljU_z0Q(SItOP+yeCUACzi#b=SlfA70T%i zj8pc#?Xax!ICNqp(6kVEt6s3B4Wuy>Svm|r>Jsb}iakDM*!BWDO+6 zhyn5s4e-f~p~wlvgj#Ll$(3?#m&sl%g%o(LUd|0$!5VMPjr?{lmwBE&5O86{-8X+N zt$f50e%W9vqOQzd{^F%|)l;Yv7GMEw!qlnqb!R9pJELXQD!%WLhstqusC+@>2tq1! zrct5NP{%^3bu#F;1x9WK*Wb!MpysWHdLs3m6XuXSgSNvQYIgGZbHts_x*m3EH^K%d ztcUB*e)n@D9Z;_)$ZCQ*y16fQX*ZEJ(t0{~?wd)>JK>Iqa7lML;cf!3CSZ2vVw-vF z-5Z9AWUybXPR;VTPu@@aoj8J4bE&X=a}Yepfe)#XirkRjKf>=HW$EVf0^)^c=r#_0 z47X6HM?#W(-KTugo+agdhk)UudVx?Xv?v@)`<7PGMoAk_o1Hym^U{K#=jYD)4EJCq zkoGLUd=6`%p|NFkb!FZ1rizvBO5iy%4f3!GJ>*7h@ZIH1o)B=6zq4niB1zFjib zB^AvrOK^5xMccLxZktZlfNgHnM+Gl3Q#s6=6yv<%2q*orEi~p)j_Xw`rseAd*cL9a z{H7DS;Ehm3%D1QscEQ^rh?MVAzPkv3EV9V*M)(2I{4gAm@&g{(KkA9V`5{jxKcpMS)G)~@ z`iaDzsw<+u1(b86NO1}mfs`pwPBBpSP%%h@a*DzD0!fC1$@GhKvLbLAr2&!Y6j>r8 zOxHjR#c_r2hZ!)NVgx5}emLrw6s4ksD9X+S7Lc-3PO((jLjj6;VlD+& z^$O>AjhIh_*M`CQT}SM@MSMF1&TkP%x;O%yA1)XBY3B8RV(U3FnqOsU{=zFuOJ^%I zKj|;5EGX8doXMYm)!dTV3e7K(UX+!W&ML^4aDD`9La)jTic2dC^q08DcFLFx*gqG> zP3e@D6_jAK^q5~%T0vF~=_4!$$ABr66jYg%Ny;aQDWW*6Q+%gW!tHtjdimpM2?7R= zy2VYh@C`E1c@ym>_~N3xx`z3>+#QDELq^mPQ@u&D z45~84GJ4`bE`xF47EKa6jfZ42`dcjiwdh}G@vle!28(|q`meY6Z-8|19gF`)i$#`? zmHWAJOOcM;70S)U+_2>qc5#&|-ObAHRdmlPS6g;@QN=e`x%<`qL%DK0C`7dynx z$j00g#9iWU_4+CWVtHu*T%J8JF#xIPj152&MMrU{cGSNv7z)*Bj126)eqySuq zjtP1xXocQGk|hYEk3yV=KHMd=OwwR=Xq-r(2{{>y+95~heYsc>!63X4du)@q$dZIl zthU2go1h`u9x=kL5N#Lh;0MGk8%&HTI&U>_>uIc_huZ~`&1qE^YTMvG^?HE*sgC4b-GTxM{#G_!orRgK*DO zF*$}RLpIhd)mEhSF+%DQuuDHO8?|LC7K}{0#P}ftA0DQM0r;?$9un|j`(&~%L*jD% z-7x{!8HA_F>}LS>Qcfk3-=Nq=-EZ;j5ane zmzWPw%qiX=1PQIBHFH_aveqbFk=rd56{RXFrX3FHifk3n+i}&G^ySo7w%q3xgZm_i z2W`2_YkK@YD(2hZ{vMOv@0i5>?IPUYckuTfzwChb+u%6i{vOwnJZ#INKGK=oD7LEC z^RNiSPiA3{`w11~a=MiNM1ldgO8Z-Lr0K0ybWJZ!bxrWNf~RrZzrR}&xfm3c!BDNmv~)M zg7EvPI1as8bpQM3BK3xhqdftRtf-ycCo;D~N>`(O9ImiL`)lDp39+Vf6rKIr zbb(gg1)jB?N59a+`x&ETSt_j*4>MM_tBl=KXRAT1QKZupC&)W2vgdb*oZ@WE*Eq6h z{E2eEQ0`~SeFmhQ{2fkXC)hRR*IKAJZ(uZ;GIEHScTpRTVXU7eM(Ri zdo{tJltmh7Sj>_5x!Aeal2~||gd4U}S$rnwa4!TRC@QP`gs>cAn`}^A&8dYP8MnMlR48Ut!B^a+6s=ox01EmBXMMz0u z5MxRgpHoVTU)^V{8LSi0ULE{>yE#OR)C}}N+Z97)*oq;#w-tknCvuncCwiiL%;QSG zu-Xu9&o~Qt4m)U;h$yvT_nxL0yX_6XzN9fFGmJZbi$sP@Q=JI*)hccuFp!n_BX0kf z`WiOOX!O-bG$3JUr$kw#_;|M(Bc=5Qspia3Os&6%g!Q~6qK8X@RK0d^L%N0UMoGTw zJxC4cA~)4SIz-xhh$yI&W*eLuD#v32P``T??Ve_>iK;q{j?#-(Lz;OQN~cvMR#CBX z`RaHACkyKwNsvfziT(O0ewj$JrPNH*ef1Kwj6P10ZDypYlbfRLKkF9?#>~8FAVi;v z>gHy7Ij4clB5AWG*DtI?udV_KU#0|n&QQbjJc2i~S6?0G#BMg!_VVz2Q+!7rkx}NY zc)~qZNvL*5)6nynoU^XsJeW(ZP=(1gVDmOP2;NEJ#W_e- zA(GsOqhWDlQ*|L-`$`Rk6q5>HR@YL4Xw8J7W>`r}{SrFnZmeJ2Y>`f1s#Te*)$u!Z zzFHbmbppJ04BKuL8W>*OPglYUx{h9D;ytg{c+U+Xc+ZV=_KQ7s9raiTDK6M(Fs*gM zI_j$qP3br@_0V->)G(Gn|C*%P_?RZyWp0*LiS>>g#zB|1&Lsv0p@XiTW0%s!frA8V zdJ%=Pu_ksG3EZUg;BE16j}tbNwt~Hg9o3)oURj%j>x?Z4NPIum-SYZc2Wb-YRVK?6 za(fsaq7)yom9tbSN-w3j4YpE>k6|U%_*OSN;Bf&Hdgbp$J#M?Lx3RDjc2EwUMBZsj z>Eui>@ov~fIoM;Ou7wuWw)d$U3G)pBs`;G^s5WVo{YQP6wUU+QL#1yi&qJ*Q!xjh6 zn?Z%k)^pH44%%-9&1i1opa2K8nL#sG`8cSZgM!xC4O26_ODAEK^`pNOD-FhN(!At^ zBSdo~lm-(qX^uMKRifEUH2uvLK@XH^mi5805>ZDYNm8h3hCfhC5SP9Nsz4@2b#1J@ zVkIcETdr)fm3xsq%#ETc$pXflgiren3)w@_M@#I~!{EdnU~)-Lb`S=5b4<((Rq3k`YQ#CLX6IdZl3oL>F^Dh8pPdI^yuizl=1W#QBac86+I+}gRi1sn3OYM z)*&b%wc(rrW&A`ZqTTNi1aalo?l(!@_b3(99YYfBS6BJF52z@vkx_igM!ItbEa1<{ z06GkG$92MziSeF6@e;2%rYc8id(2SU9^ETR=$@jfks`ziR#-A4we_oIHC+hfbi5P!g zSp1ua^5jX3KRmXRCvx6q52ioC|Z-WOg>_HB5xE-DFC>vMb=T2yY z?f!1Rj_C;*(_nXOCp^V@y2l;Y22cCDH)#@X?+gz;Jj*n79@3ZSfEWDT*J(1JCi59& z(-heOf45N)Yc$y!gDhQ<9rSni*JRw-;GqX5JN1+qjCL0S~I!2|FRER)0PEjVT~ zh;#LsVXGb6IE0P%qGTI~Eo>u-m~v0zBS`$RBz`4?xZRHURV02*62BfojH@5ZMP9VL j$U6vQyxBBPHHX0Y$%bom8~rnbf|E+7;TAV0Z(GnxPsDS)jbnT)Z!v8t)Fm7}Y$sVTt4 zG<^YJI; z2@V3HF7jJS)WP1x%?{u!YH4g`|I;K2n8l>{Z%xD;Oo0~mu78FB0|KHc^IKZn7VtM% z9heim>hEDsQ-GtZmBXKrB*BA#7^(jjS2A{X`K$Igupl5;M!#j%9BcsgR^ET%3qTUi z`v1qJf0pmh!u-sV94L^j|APNn6cINoTeH8MFaWK|QCO;iq1NSSZ`Zu&1z|&RO8DRXAWd{Zm z-|#Ee&DGVxUdheHQr!LjPW&m59BBIAxSW-XE8zb$0S%15uK5>cqQ>^_#x5fN^7S*K zb|BW;`wLdg%GlPyLd?M)pl0lB0r*o#-Si+Jj(xx4z3l%8L&FN-@pEZ9V83Fx`~@oR z>@05Y>g@HCqXc$Ao%>&K62>+FX;*;Vzl8r2KEwg`@aJE_t}g%Z{|eNJ6(&&kz^4Bn z2T8)!3@Mr+B*Ehc_eVBahQLNy0{oSd;Jjs8S~Gq z;*fzi4D0`(f3lOngcwDC&Hl0I-{S28qR+oVrG-uZX#T2J_BKCP-2iWh-wj`;sz|Dj1nAnqjbUu>l9&Hp^$RB#|51(LsF|L6yz#-^5lpHUA3 zuc8s|)4Eh!K^N{_$BTf>7fEWb-8~$Tr`s>R0M+L5d2yN*vxIbE; zD!|p%%HHCq{~y3kPFVhL^gj*{@M5$5=b>Z)%9r57FVGs&Di8W8q*3;WFs@b2IY$E>R|&Otr_X|{A zMNY!X79a(jhi(5#Js1eS{&BVZ)4#e4!0eB``k8tquzdw_{TJ@faoGkaQX0NrfdA+( zk&qxDsWSiO{zD`hR?e<&#wg$i^>ALr2iW4 z%z$-B`TSc}?Qh-N9@t&)4}Obk{tfj9reyx@*C_DH``118Gp|J;y8rm!(Z8+ShzPuH zAb@)Oxo>~3>z^zCy%wRsT>f}1LV;wRvf%w$_P8M^%w{+a|k{V z^i`Dg?FJ@QV+k#)o#;mHjuF78rkpxgl#f>~t- z2T9y?OUbsClS?df658+4h%T^_#Kouw?}`)QY`t94Hle@ZQsbh|Lwg4AShuD4yT&GV zV^FNH#_ilDg7Y%8NYIJ|B7VYG5Z-;fZP9um$5nd>B+?`>Xu0AV5=HARo*MrG3oZ4k zUIeO%U_B}mC6zPjS`UK7!^_8)Nnt-BjU376mH=;j2(1Dvs0%JdiB;Lc2=eP*RksXpvl| zd->ww7@hM?%Eh!P3b^Swq;1AA6VjH@;Eoc93OI2WnRTkd?04MpJCF>?m~hrlua9Oc z5S`zwsJ%x#l~SoBvWjF0KvPyA9h*1enW~Z8>2IHoy@f75l)KqJl0zD}tv{FUT*6ewE(%L^HU2|H)Ax&{6N0R%+Zqd|vq_n2M z-J$eBG$mu*i3;On*%b6GODp0qJOnmzBnlq-H)2C}_*W8*e5hc>Qz! zVkXwOjoqp@p=0w=Z}AG0g+GYYtPXr0X-?f^`qW%zX^daBr^JdxyKcQ#_h@D#kI$i& zgR%YP-Xm6M)|DD#SpgJMQ^gp4A4WN}F=lrRR6$hcGQc1xMT$wFDz9jilrcpyGABvM zb5()+8g-LbNDqfF3RXWw%!DAkh}jRMoCq0CN@gO1(;-jn;4~r>n%SK4jdD_4hEtZ^ zyN-9n#7qcPGVj+UyemS;qy@e#A)bu%q4JJKkJm?x8a<3W@{;Zd^P};Skwt>*Mkfty zm5~MJ?hCI;knF4~Ssp@1_U4cw!>I<@mNa1X@bwz`;G}SRi!LJ{C5pZa_IS2#M7r?2Fh@GUCl&Cam3B?S)!=JA!8%>j<-H18 zvMKKTvuUYJ>)|5xJs_|S4Z3P_!3u{$NLdi(!J9~j@APkiE3QNydsoux9AMnO5?Y7u z?t|9@xIlt;P;^u{+D1V+`(qKzy&j)1L(gu)Zjkt~lKGUmX3*iE=&W#0LkV%^9IA?B ziukGR*e-*S5fRb7`jzOgkk0Uc@ z#B5t_uOr)WY{7QBUSgtF+fJnBV| zyGk_fNAN9$hYPW9Wh{J;0&)TAasiwwACw1uDtCQ${6efd6FO1-X7Gquf8gMg%XkS^ z(PHRhg7bG#b(N4?jwB5EZ?+mrn)|>Ime>;vQ%gga_x7W0quScU$ID2AAQC34Tm-Ku zSHHWIFcA@rk#mm|kmC!leTDJGc-Tr#p(PKR&MN60-Z54CPAO*KaH7Q4GRa%x0aN~^ z$#xl?>#|6j`hb1v2uu%DfTWxiZA-5pD;@Vf@(n_9rT7)d!|Ufu zM(f!h%#NChVRt3f>h+uA(9evSGw#JYyn9>&hu}>o%CP{^%;v=miiIS~85`4fBy&@4 zGWL?L|e} z+}hMcsTUoM9u$ZnOP+{qfo@Lam>t4{Gh16+C#LCi3GnLP(_q1_BsHCYrMs;=Ze@)3 zR%NccuA%wo3>|CH0~i|HoN;xD(KX?g&dz!g2kYlo7DY^0*%&O;8Ra?I=Wte!VrNV+ zb^G5Jf{KeF0OdD#5r>s4Ia`$KX2hs7|6O@%C?Ns;N$l9It~osCd^bp zVjU|d2eUVr>x^8Ify0?l38Bsgrr8;i@r8(F*qQ29GMsux!fv9(-QPx_8K3e%Und-n zYTAm#W#=~UJdYslkQHIft|&OGo}NCM>8_-FvUC?SMTJL-b!$MvZPH(PE+9NE-Z^^* zN|JzA*FoeQ47R*NXxz=jhH|zJ=AX16MaN01M)whZQMv>*7d-Yh!N{=ZZr9bl<-)q9 z(O|BCs@!pfw;%VqUvEs3mhm%FFG_OmEwK)1?-Upg`cm46C@Z7nz^QE@pO>*>B!1Hu zXTZXgy=V&5=P0?7PrGEIb4r9>B3@Eqc;=#PAeP&c84%W{;rOTSxc6U<%o;HbDg!6| zOY$O$PL_*62WL?9)XqlDuD!ty;loposU%_Zhz(6W>UnFEFzKmXH&Pad&)w@d>y}v^ z)fKgk3#yD92Da)+x!UY@q!1)8<*94t z7T>iObF{~Xwlas$EiR;b*Fs*UBjj)fbeM2vXUQTD{f!Olzt?%p7j$8-y9%*9fsc+% z_Hnq=#dqZs$S(~?zP_QW74Lhsj2~S_u7{3{h*#~eqvNfpmt66~@WC*K_7>3vOSFtJ zH#B`afDq!xH@KquKDPJdtw?#OUxu*yfi_m7E*ji0*b`Eznbj%T6IJt}DV1N0o5vlj zGl9!$rEB$4B)eTK|7f0&OL}f^S#>CqG2WUszIrC$sMwwgt%RQYsAS2|J5)tQZ zAfT1*2*)^c__deJKUr@JSe57Qx_%@R?WDwS8?;niKB$k90+^LIYC*`DWAb zlavd~*pV`5=6 zy11ga5)b=aE}hXjPy{>iWF}@RXdy^CV;Hee0UcQlNqI|7ofKfjuAw#_5;-`dK_@p^ zU;kNe%BW#m3GCPd=}!0VDP%D@;ZuOvY^Is{_DCeE|C{wS+)MGk*~{*X+!si@P)s-4 z(^H2Mj~R&RGtI20{G{p`B3iZ#!I0RM#dBg!ghdVXHTI_9d7_1(AN2v~VVW4^cy$~| zNKHF4@aelbdsAC~t(axHhN^ZHYibT7Vk6bVL>?s|gP1Y^G;;zQ9 zqVVTSY;>~429ZGR6KOApuI!eu#ZGUBu9(G9=qV_wA(IScB4DXeerNCEu1MszLna-#%GBgT*HSdc`a8`y@-*Gz6-kqXJs!#4|38HRZjJ;`t=fUfV z=uwEK@J4V4S3Zv*|4*3j|NK68M`p;4@vpN%~yS-Dh zQWGKvt=AMf^(=Y_-H@r^SXf!%HQIe7=~?$2O@k=VG;2BZW?xnx+@$8Zlyw?PyU4e! zzlkPM5b^KG!$%|vOVdRN@9{n$Efl~GhGvZFCWJCG6@Q{vBmGRifzgep zkGqq8iAQ&mDt)EPlOUnC$9csM5r7^Sm~fmOEFAk;_jl=LHOri3O%eV>#~LNiUoX*d=dBV z5VYcqXv;`J3gASu7lp`GxPyPigrg`T}E7593e$EP^qSizy$wj4V&(lTY6 z)}1$&zY{@BBQi%jxf><0kog1vyGhF`qGhKnUk!;aM8j4~*rP0QNJN z5?R1F1dg|z{3R6X8|3b}6qq?KZNs3>dtp->YriRegU#AgBpr9XJ5gWZt%C-9&hrm?DcxB0ngjXH@)l@THwYQjAEX!@L@1uY9y8jvN* zhG){Aip9U^yL<1S8W38Bj#%uww$2>6i`O)$l7tl$8$g>MkR6arN0^g-^s;41du7%b zdEHqT0n(j*5QF#w)HnF}snDq+Trj>55#2vVY_)VR@Im>CxVmWde1~#Rf?A2W#n00m70=p_%Ktr3wX4m`DakZ5d*ICudyE(AAShENxA;qh-9=Y1{Q9? z{0c4mJlbc`F$6W?j+H9N*tLkQYA zOb{OXo^{5N&|E=Cbrx%A$cUGGz<8LeDZU@k=}>^aM}hQ}#!;BQCMb0VH1~=N>IdzQ zY-`a(Ykh_#ciB5>uifB}?x{bpCQ3QBf-rCL!r=zi;(Lk2_fWJSxK{K{nOt%AppzSs zDH;q#S3PpVX=LvRSk`xFI&2WOgg_*xMB5>^BOvOGA2`R8sd6~v)jH2rzG|3gfF;us^s1 z9?o6e#P9pfe@}11M5{!H_3gUEXKfhYU8=hW1U~P%RDL+hy4(0_<}=XgHM5<@=I?yX`YU;Sc95hORi8`A{J%KZ@gv zC;GV)WW3HvP{>vgKQ!Oy5)$Fn7Nc7-^ZtU;={~jka2X@I|Dw~9E^lCD9J|1P=}wYWQKn(*GI3Z_kqeu{t;VG@6lX?IO?IfAg9N)0Hva=uK)9jK0q8(D0@BCWnIF8kU`Fe1*+Y}~& zeN5_f8=+yb26N{T^?maJ7+2J4Ef;!i4I+AQ#)<|lnrOz#&~YQP8;a^l<9Gw3kUw*@ zk+&a5^>l9x4!}rI9BPuXtU=iwMc0qF<&hnOuOErUy6bG-@uDJy>uaGq*!kJ}-psb( zA&lXZI{C<=VWTi{rqnO)Qi)`63uRbb8EV@F+Q7Gf2r#L}73iHLRU&yO&?IBfxGTxy z$WpmTWX)=)N<)(LFto%M#4)2AeL9f7HUPh6VnmT92tDFbaG*fxg?4gx@Uy?O)?Kph zq%x6&sMe>^GNB#k@82plak}efJp~U1IJp-Mn3rw(gzH31XiT1ls@}k2BMu3L<=I2^L*?=LX~K8af#cn(f`&tWV7EOhHLXpIU&+=vji|tD zTW@{-HtJwKt1@4bV{7LIJKdB*wdi1zV+~OniDELV7CELdHBFzrhde!vNJ%HFV-><1 zhXpY@1wq`1cCiVxh&MmNsqX}e6mYvWVWOG$tx~YbN@XXFn0akr6}9^ETS9=JU$y(D zfzO*m1TA0<>q0&e^@jFE;v}z(d+yS|P`8S}A;eg2!IzaVVJXn;$V( zM7ziQ^!3d(*vrR5G_?H0DU_ONsYHxT_A&oZ7U*WkS3Vg*N~-c+CeR{t`aK!Z+>|8a zfl{p>g0o5@xpiMl(~imM2mNDpqF$C}R00YZVCY?|XH-tTN=si;s!HwEb>M_U+(kx0 z+`Z%cRBufXq?4xlyJaVa^Hpnm9#lY^6ERmbY;=O~j!NjP(-y(nGG5e07!%2KCtewv zG_7Q)JE_Q-(=uslYq8q>AHvq)7R*nSF=OikaLBn6@SyxoBHKwQv=xeIGcz zUTjuK&`9!AO|~wzIvg3Ib-4k_iHoT+}?AQQ#Y=S ze(^&4CjZp3GAl>S^@ z;cu#i2(DCvkB~FlrfJK5lq{SVGn97!Xw>!-o;nt0t`;!!d`}zp^@Z&H07mG3O?QF$ z?UGs;@*4z)v$CuS?0vKDgbcY?Jb}W;eaT80l5MEDkJv<%CuU1ws4HU3`|$}+PFl*; zDJ-Ap*A+>ESQ@^YU^P(Fx+GfHV$xtXTiuP;B=1*LfFT>^j3m86mjk5KO;fM(Qe5W_ z_ufZd6Bj#uYNQeyUAq7fx)uyQ6u!@VzH?G|-LB;N)Vc2Rx_gn3@_8jn(80PtzjeuC z8ROb#@0mbymZ5@voN(^~xBcE0QARBBfGEIee>XV;g$3P!)%hE$Ttq~OFE-5;XN;aN zbeUNukpp47r-l41R+J%r8X1?flTgz)foEF3Ji+X<_ZmDEN&7SbidA~*gvqC84wIE_ z%JPG8C6#SMESQU_lCf_t6`i2+)LEJ0e{5nrxyA?4R7qPevR&adG|(s!Ik?U)U&5yF zl_f>bY8%u8+0h$S5x)jnf=lk%2^1UAa7K$PumDjm^@<7)UFMV45{y_4!$Z$ zqKsJVJ^M2M__%<>HA#Z#2mkD=eXsv~a@&I1RzBgL77#An)iv>oK*t5w58#H=%zVM8 z>$$Rz3|`aCPjAlR8`G?CeT8Woy8>9%%K3x|MjSWF^{1K21H7DGHDFyc*UQpc46AxuRo*P;V6w`r|{!HOXzBNBciKizuDJo88aa;p`y1 zH@BCl!dbbk+4QCk`;kSTmTscOzTZ$9Da-5{xucpez@1=8?R~ zUM4pL$Gob(jfvXm$XW~GSZ zw2r$~r-Y`J$SMkbRKy0DuRnF=LN*?SISifA@x0SQDn&TRfYIsd_1hTwwAeC4)HNHWJW>>3*iZ7OzV%!rmKL+9bqj5_LNeZE)w`PnR@Pe%Cp-wOZv? zP--ap)Gs@U=RjZBTR0HQDe0+%JemPTdx-VLS1ZyrYbBxAoNgT*rwOC6cM(CRdfp^O zwQCKu`p{lY8#lpy^Q2ta@FdXtT_&JsWRhjm0i;F|Uvf|{v+B~J1YT`ZU#6jlHn^-jO{!OjgA!+r-jo2$_EE|Dp&WU?f z2gSTfU1_DCvbKwpHfcRE}$@l{I=w5^RpQHs;lI<+phRYk9^nP7s`X+rpxY z&l4iv`L*dPz;y*MtIe6kbCN|nqn%1^YcJ<#`YGMs@#7;W#oX3070%(CB|j*8ijs9 zZ5&Q;@O50bt2A?E94Z=T;=>dfgIs;g;}T`Gg2 zB=;M3Eu`^^d0NMmIprWUKiBd@mWF_ME^XPiRL25+!J>Jq{d1UP#&5O~&1lG}yQ>Hs zQDK`97=_`=d^GO3R?*9KXYVC)DP<>B%=y~!LPvDJ3^CBf#=O(6t{K#c1Sp)qs4e7_ zatg0m=LZcQS}x}W51uz}?*<;Z?VCJLR9H7_r`|RrRat)-CDZ*zlYFsc2>N+aVTV_A z#t?Qq)q74i*%dgXP@*9X*WhywyHKZb+Dq#uE!g0p(uT@Tr*U6p+OSM_Hx<|s5ixNG-xUDdq zot0d+z8tX@5|`BJ^qvJOVrCB_UJE(%d+_LTGR}cIW7mXd5z)Zw8*nG?WE2a-xTM6g z0q}5uC63Ft0f`_Z25)b0rfC`~nuWE6n~;K@{7k5RgU~tQE8fv`6;SV39aT5<6N5mS z@2pHGR9No$!P;7cw>DND$`3ed{PZF&)Fm_e;5Kvjk)dH{4RDYla(UGQ;Pko^e8}^M zq>xi2#a1UX2%Kpsg{#%qX<-k*c5?$msWA16!T3|F*kz@q zo90r)c4!mC-e^BMSHDSSwCA`Z^%K8IaN{SfMU(NyG{yC5usRJCfmZ0fspQ9CM~{NV zEmc}1ht-TII)-SNOpN%R@KJ;bW4-=^@PYe1NDmogqs_OxIvOW z%Yvz***Xe&3r4?;*;DzY?F3^bjPgpRZ&Ffg&16qPifa60jW}3eMzKY(G!>ie_kC~O zXTZEqNOL=Vq}h`>XV5h~s7JF39yR5}Y3329{iI;tIW8myyll7f_vNgo(S+(zVNIU-L!s?Hm_ ziU%vabBFMr%|BE1;2?Rd%M{u##Z54Fi?j#PdgS=>JtRh5T@`UF#5>ykIKd++O-8w4 zWO>sl@!lT&vsE8Sx6DzrmrQd?LDG1s3zLPAD1W%W*{rmEM$O3Ev|Pe(A(+MbP_am! zxxp%IiH)7s3e={4P$|(W1~=(|%2jK4y0_yKPRj$vg_Xg+j;2)z; z@6FE6hj`Tqtnwv@O5nlLGD=+&d0=Q1dDV4yTJGVn@zIOOW2hY7Wg^z!nU^ZBQ@Aj_ zS9Q~i))?1d(bAZUuQNQDQDlFyEl*sF!}W)x120pcos}7Wbf2@?j(OLJwa_YFJ3EPW-7S}%3DQe zJ#H$Gz;2TNjMv>&VRAMzG(%^NCwqOJ!^b;oechv}T-DODVZwTCwynDPjqrMwx6T^y z&8wBwjdNiFreaz&q+9O#w^Q^xFfC9!v_~S72W5nEr>hOc1W&@eZwvxh7W7=&8KK{} zg?XW6wYbR4sw)gwn0{P9V;t5BB{vBD#+}xt`gmQ|?x2sppioUKcZ0A*M$8H|pNzO8 zl3YR9305@Lw43XNPC4(w@0Bb?Z#6zt^#G3^Z6tlCkq91jbdJ^)9K<2<{=;WHVo}YH z?%Hx1w&HGkY6iEc9~QX}n>)rG5+{Oa-sReKHzcp%7sxK~g949eKVO3tR>@~!DY|n? z!YWz7($u9tKSo%*8JMPCGqAu08*gKuF@`Czacj)7?v>5oD)!>e9!(a~Y z$a9`GRd<0$JxPR3`lC z+V2uC1Rr9nS1g}Bt&IF42Qd-dtcKN=oFA`d%~sPD_&z_GHqS?ykiT5#;VsA@x&xeeg zez%hE_?1_>>dU-V_jrTtTv8FkR`M$YZdaaW3PcrM!~h{RT%!%LcYIIrZgf&! zjg#7hl<@KXoI<N9UvCSTgOJ~)tl1|$_M7DNnXX_Pe+nTy~nWvTU zB?NA#IyVVEFK8;mMEPY0y3!$o-rMl8_x;-1q?al(?cK6z>y~Lxo~gNGUNO$CxqBN;6q?1ga#T1R`nVsepng9eH2;$d*vV&O-V$DN{5rS}Ve zL#2`uL$au^8Vfh{LaKH6N_}mj*8PygrO6nX9~Am^&<(u+JDAe2uuA<^YZao+61~2q z8A_R9IG}m}wc@rswO%b|3JKE>@Yn)R*+?|)N;>9m8*aaJ4iJgXD?0d07<-@;; zWtG*a$ZJ;}+t;GHVVjN@*&V{PEa!z9BbB44(wJRvLVpk%_?E9cEoyaarLot-(VhpX z7WzcDF||{1Dad@`rr*%QTiGIgJ4c$^ur)cxsS`Tyh|TS$dpN8p2tS+KiMP6sh%r3N z4ehaquo+yrYZY>RsQ z46#Wt$_dsW42MDMw!$?Xr(q zYl)Oi&Q*FsvYQ3-T0-8d(`~&uma2g^6w!S@5ngRsyTUcv5>*qvn7M40>`KH>@hJ>t zK~+#^Zc;VKEfOjA3*wE4D+51G{H?8wN)axblx-|Etq*P#qOvtSe}2SuxBNCGysn(D zY}Ibr*IZ3h3gozZFmHh#Bs+~kIoj@`s*^?1LTe;mGGX_zFB1m|pXS#khf~DZ^{<*C z5*O(4nkZMrX0|D`FD5gwguUmu`L|Le+vpYIr$PM>iaZ`z#+hsv+-MnQ?rlN}%t;r`}!ocR4prdJzl1AQkgD*~07kw2jevpDlNDx|%r@Ic;d#+T*fk}^mOg`a?R&NkT zPxRde0Osnvq#N1f0`?WORC~+(=t=EKc1K@geyWe>^~WTEysE0^4H}r27c7NW5)qji zh7LQdkzKY1#%1t3hoqi9yf~U1}BLM_m0CVw@t$t zagW@iB3Au%m#MCcFQFfynR#*NCaR+4uwp&#D%; z`r>{uLjx%cLpz+`h>C~)@)>nNkW8)?a@lpcBR4EHVb4cw|7IP^>4II$#7AUnN1bK$ z825NULvJ@8%R9`rnlS*`N**Z-t_QY0J0ew!^A1s;3*~{ir)Jc>DJgx%3i&27gRANB zij!b-oTp=`Mb$*owODSuv89k{8w&?)O@cSF1>dK{j)gy0iu zvH;23mk*WDJdWI`&P+5CgMpm0-w0gXJud{!U$*w}yYDjGe2|^*FHP}T{n*UCttKXL zh7n9<>FC#diOs%L3TvPQ%?A?;6AwTUI0&E)$n)YVd`J;VP&YN2Y}z<%INUp$ovQJ0gKVDk)R zk#Cqm=UuaGL-2Dx_Pbh|EkB!9qwBVbgtPC387^ZNe45$rFXwExy(Qt zRfSG$X+~}+QJ(o2CQSkEzgM@rYgbe+SYxG6i^vk~B-l^@#HNvUl$%ZcU15pk7TZ(6!>fnI&%qy*i5B*K=+_&zc z!oUFFskrnyu8k?UlUlFHX)sVzvTIZe2MnIO+-L&2nfZAJ%+}4bC+O24X{vCr+Kl}Ds=Oq~MFCvWtXFtn z&&%wQsJxcOBD`W==Qh6FM9(ztt*2h5DZ8oSvMHv1Hw;7V6yuwBW*@Vdi%3~n!x0zu zwIVgsd0AOkBh9X`!YZkCd9!iI9|1&x!y?lcV-x#F2TQD@m~d{9XRcaEIxqI}F)pz3 zxQvD|0Xg*h8u+%Y(QbvIjdJNC(P`hW(mHLLKuOhYLDcI(8#~93bT-wnB;^hu z!7ULZG(W?B4CLv`;qePmxg-1Jg`w!>+jl&@TO^v(ui%)MGWl$MGe&gM4Wh549j!T} z+;r1;HHPC{Z>-j()2^6fG+aL*{a$ZsZf6?R_vx_AW|I~o>-mkjKsl0nNF53_HsMU(_&=F+2Z|P}8t^iP@6>S@~;R z52p#nRo54l(kPDi0)UsoRkx-18R93ptYFxhz)CRMmrHP+IC-_=r6>6DaKZ+^%TyjF zBgVwVRy^djcy^{9$U; z{fbR2xP7W+FwnGC3(JmY96@igCPqNOK@o;ImeFA6Rm#cd&jo7 zcg!kPD1F%|OM-oHW?O0eUNXs~O|nK}hp^qk7JoUB`PrIzKvhgPPJAO~0N|dLYi-my z{zD#vxr)41jOi41c*m|%gd{hM5;4&3&7pI53k)Qe8fvHPWd9E_+w=Q)PNz*AZjih{Vzlk3GR7i}DGIn&g42!(0pYj#fhSMHfX2Spj0yT2`N`; zPo6|wh&u))r^L2NU9?I?9_qxQ7Kq z&vyX0;t6;7Ft{J9MnvH{jA=Pbza){vrG-M)isOx&$WJbKO%5&vEh){_d>HCkF4nyZ zs+ww7@glIXYZQJPwnB1xOH-_}qw5L@Rh3+r&2|xFG>cZ<4}w8riB`}G69v8?KEovB1N#V4K=_UXq)T*$Fz^n20ZJ*O z04uNvgx{oLj*}>L#dw6PLX)pV)7S6=&OEKZ7$(6O$d>6!(^MF)>6Ck?vu$uJ-#ajO z00xm3#k0Z_HnT-!=-S!zN@m7sx?f9vH-KKJ+pj~DTT(pN-vZrCJQaS%Rqk$#Io12P`beri|(Tr&)84lv@-%sfBc8g zslJb|+G6exd6rBwdkRICq>xKB2sFYdKnPKNNH|2&WeSS$br$g(DV7Xr5@Fv!owv93 z)_#F-^)#sBp+*#zdZhw&EzJ&{XDyxYH|;vzoLbkH-=DYK`38L5;Ps&Jpb)Lgj}N#h zmNTE?2TmH({PCYJeEdIMOy>$n@j_KJ_9U*;lvzW<`jF~FrY+t4znqaqK zx{-aRqlL3tt8Ec_6+aS12>q$4TU63V-Fi1r^j%wkBZlG|&Mm1^%8AA(m%cQ6meHDr z0I0+U?HW8{l@^BGScvY>NnXEA#9H&u;wP+6_4VM!*dq8%0_}`*mV6~5reX5?o`ILX zEdvaCJq#!s5+rC}=P+)zykNzd-+hURGAVg3ATU~vL})YMI}SW)H2PtO%H|(O(X_CN zYP|B5f<$^6d^9dJ#=l77_FgIYqjFYS09cX_pXWu-^9UTvk`qXy5`oXxWip~ZTr6D3(hsdYhnqq<) z+Di6Zo!A-!&>A7wzCIuc+uan_leRI$2)5L5Ebe(|a!ay5v}SKx^EKAQG!|}I7o&dK zxvhCDOv3QQ3lB^dymCJR zvU>I!Q|R*q`KbL@Qr47`PZUF2_)G%?s@!s&snd~t>Ch$XYZ56RrSo{lnrIUaK+4|@ z67Qzs>I07Zj4jePol$KHyi;azAhC}~$y-;S536@*L0D=px5cH*cQFe#& z+UjWQ6W1-tp5_;YdJ)D~>2`Ag@+9UY*PTw}7mR{()1yz*T2|eXAa}Yp-P1NVVEoW~ zd8lEop{ERf-!95cwJ77qoywLTKr?aB;+J>!h)S(o`@|{h5Dw?$lVj)0g*Rto7RN1m@&MKeihhH^7T?Y^U6N&w4|OQF@k@X zdwYbO#@70ydUp6m(0umxN1aVx*^l@=@V#4T52M&5PT&6rH$ce0N`FRxc+y#xjkBtb zj;tc8yNkQWCQ^v8CBkMYq_T@%VeoZ0X{;Z7zeq*OrM1^|39> z+IiNN6H8#14z5^wHgH(Sbe?Zg5(_gaM@~+5^>TEnJlWFPZmZ}npH~9P5pt+82Nn(| zzqQ$Ng`5kD^Xv%To(%POrb?fxeos_?g@DL^Th#Riwk}VC)WCm*j3j&j(J;1??;8!Sx{N>B25q}lY6NU=kMa{v|grfDcR3) z_huhe=kn9=cftToF6IRM2+`aDnvF~$nqLLqflK%frNflbpH)j%C|&;&p}~9+z9UQf zX(d8<^n+NYx}Vm{A8SK&c|X<4AGHItrFe+05?XTI05$2>0N*e|QhXp39l*@*;z309 zqE$0xt3ZZ3ztmnVs%svgZK6@zPQeofUy_qW_8m30(iB@MVux)xMfvy>qHYc!AinG> zb@U+y*6!L9v^V(#eQA(xFHPyEyGtD<;NiVblI}j_NyDH0IHwBHBQ^MZv{WmwgQEAK z_#?7D!IdsecBi?W_5F0HK17F&D+QX!S29brh!y>#$5dFBx9Qm^bBtoui4!EfJzk@@ z@5KS}w$%5*0sU;khB`s9- ziQ9ql?E?f3l#n;@Ivb`aC{n*WRo7;{TYKLoVR_l|Wo`Q2UUNfh-M9T9RsQc(5 z9FLV8D-r!)B`SQYxEn`LyV1gz)f{f?|^*cDNH`9A^Mggi?)rU zMJAw!!JpLQbV&TuLxI@}Y+mCq>j$i?CsX^b0lXY8dT`D0Wqco4TSf+PHgmqwr+wlVafLOV{2&i^QkcKnqf zF(`HMAu-PJ8AD=R=I03#;|9fp#AJ&nNVQHA(#gmm)keD9 zDV@`G^|BV`dgkG181d_-X^F#GbzpCDz-DbYoYg1?PSa-rXKlrao)w(cqJerb7BsQl z3Yut(4NU|zI8dKCG!di@4A{;HXrfytUSozPdR){ap^0lp4^3>P>+saqCkjpM0aWIo zy(6P`%;DsxFAWDVZo`#)FgTe2r!Qle`{~XY$i_W%H!lC3VnRp+4)_Y)k7515naTnW zj|>MqN{^uE$IN@{L9B`UsCO6~@C3jy3pn5@jShjlaD=`5Fg=ZOpGg=ac#e*sm!2OP zBcP*azU5;P?AJttjwk4m5~2b0)nHtVfL=mpyc~}4^9n}xAwXu91Y57gl3*l8aHhzB z5yIl65GqEm;y0@68#!o;CccR^?Q^5T>&k>jaScJI{$f8Zmpc0L5UuQ|D*2--L~Dh@ zzFsKo8wO}om>yz*p^(TZ(-mOmyfU8F-k|u9bgkXXI`Xy}r7Ulg%JS966v@I8YE^C_ z)p3>OE|apn)1)km!9QGC-X)dg-Fl`s=*=@xmUsWPmE{{)S>6R@`KHk+%eO*VzJrzJ zyDXLEd!a1frFXzv*2?mI`t{c>HP1~_^V}q~%?D4?zDo7|z;Mm;aiMwkVPrlVq8IcR z9Hn_OnNPo}c=pm&v>=W~R zze#DhW;EQf5$h$O$i-qoXO$r=RfLmM^;4x3u?147 zHrd$wTs~f?`N4wVt2#G^)^ff^)8K`Ykn+QRiqqhP0zFJuQf5P+u+(!daMFcvO-WdL zKvFdU3= z+9$-Q6|fKFGn5Eh$W`EjErY(0kWUJ03}w(5qNFXA8#&e?$9lAJ#^xpLABAHdj&X8(h`dtPIF2-rlm9z!zziRZhfDKfSj%$q1(1v_oeT=#11iN%*%%oUtEgxmnTl7%BrsuVs@Lt@qtr& zBD;&&sY|E{VM94AedENUo|)}C$UY;P*;{+TGdW1PgOsl?^@WBVV3CpwvPF)f;#?tJ zOexk3M#`ixotABns4Q3f?GjtfOb9J=v-7-*#1D@UI;w}L3?ag&An=_Xf$s)siHv}U zFAn`n>a6TZA*%4CC3~Dn9<9Kht+|~cs`6;I(sZ|$bdbgt*xgPzc&tT&y&gUxSx5`f zhSKyTkJIjPC3`ZGJekR!tb+9HN$xD%pJ^-2c4zYa>Fz9dChivr;{Gh$pN?D`O0$zZ zS+feVLt+cV=jIUAd2-yYedKoMcrpr7k=Rs|>~ZzcdUwV?%5rD8bL!npKROBD#n*ad z#8Ygo(QoLZsRa(4CHQL!9B>b55|_j#88DaX&PwY2bS-l2*he`=e$H2rf-?u)Eq}=} z+|H!lKfjN|hM+FcIy(dHYr29hYSW5o zwT~s*wlg8G{9G$l&Jk3>M8iJ%wjKarT--TP>V)p#&KgQ4L!U+TX zwFf%=TYI81MLF$9UQFDx<>*<-gwlLcRvz23(#j)>=ZFPboa}FF4hQv9o>RbGa~ipp zIxvUViKc!@gF zuMrHg72>6uuB-;Cw^CkO6$|^Uvcf)BLyxh>KG$lr4uWG^V+VQ${HYu8(k8%P#Nln| z*p8$cnIsn6G(1@)JN;fEJ85$mW4=;0?yAItoU#ZwmW?T`%$vN4fwCs}wHZd1!wwew z8f}9ZXhv^a;Y+d&Mv=M=lLjQ%M>`UP%NYJ03-~w5?*;HX&s?+Gbay(b#|#F8rQeCM zyIbzL*UN!;gWNLr$X|PL(+&98t6B#D%r82{EBgIbuq{qIQDAWsMgySQ zJMcp8j4K!19dCoy0OZ~S8^#zUFFGF!W4L31;UfG_r8Soo<~O7E@EvnE;>Mu zrPHHy(2x{@Y$*CwdK}e1A=V-DE}-_TJnPlR`sl{6SSl1_BgP}xXlm^C>zTN;@p68| zEGNCCq1~&rb<6jUIkqDqyD38$f>HvO+cFYuwuzQ69utog9uSE#-wWS2PFDS7C z9xP4q+L2`EUyD-YbqB7itMX6yqRJPYjH=~5c6pE88?I2*9hIzi=F`R_M!<-5`t{33 z(*^Pw;`Bkv2z_8b^FEk0>MnSep0S8lT~q?4P0#Z@y`b_eWKDo*jvQALhsXz2Ia_qd z_SAaytv$7Vkgh(8YuS0(dHAjhI&4&Cj#rJ!y7an^&~qxw3(8sT38A0w%CY^SSLla! z%#ILUXFnnn|JY0O<#@hO&Kz-#-_T6)>qdOsG*jffS^T>tM7QsQmJy=6^xHq_rR8z5 z?`I-nQTRlo@IDTq>jvH(Zi{l-vtwgXjSq;9!YZKn@7y%qy#31z8 zDuoC;-gvDvReT;!WxO2$b&K3$B_iC(gK*M z#GxQvg2D~~6u6wVHY%R3 zD@yTcEFxonu&??8=pJW4ipbG)=W;aN=@s$00M*Uwd=0IN_HYaAUmS30hl;9RM4jx` zdK~2hf=h(Z1x>C|rZ$Prlbx}6D=SPs*%w=_>op}P{MgS?J*<4LbikPdPWLQ=${gS;u7Ziem?o;PTpY2GMX6)YXPK6jh! z&f61&ChmlDmnFh+Hx!<`Y_!0t>my8c%tTa?T0trdJz8=*xZ&6(gS$h zhvYI{8Bl&%`{XjcKMrn?qiRw2R0W&i4)!SC+X1u6*^A}-9(vq#yz@kOeTz8oifihk zF_UV$m!~>gyEtI&0wYOioZajJ#;tx%RK*OB)}gxL@(nZUV%Rt*Zitp$l_+vA8B+Fep`Iy^@L4z-l8`# zx=u-&VB;lyU6%8XC`WPCZV0HS zOB*^HQtA7#PWq(d4A$wMHG!aCq5$vF57X%f^dm`y8(z15EPMYaoZg7WFKK9Pa?wv^ z-~UW{&aQ9jXoc?=r@b$!1h+546#76u{LfK%nbb3lCSM-(c`;vuY7a7gyXcqn3*7N5 z@!-=pSKvRx6RpzU<`;eNA^lp6z~N=3(rJx8f)^O}Z)3>{!t0Co@885Gn#p0~>_E^L z>}2lN3h@BHqu*j~{vID?_*j|Xf$PWc5IaPlB+S)R!9& z@4j=-a_>3k$}&}7h$ZTe0mv1&48_6>15+mOtR61;9VQ=K!FG~g%LNd?C@54P?p`tQ z;W8~q;M#3WzSlU-gyH@bq=*E&E#RJBOIqHsX@g$xXwz#;R4Z;_WuhZfw3_PR8zx10 zGLtRhBb}%1j5Q)J*mTq8ZDBfJJ{-k#sH1{_L2*G&giip{&c*Zv$)I66eYn`3ZZZ>5 zCP$b?%3PyS5^-vi)CtoVop=GM_%(|vO({*>+VFEOUapaF5*J-qykD?jZUOQDHDNb; zb-9i2eicjyHR5XNri7`P($$or@eFRqHoOT7yEIXj(8{(Epvl!Vg(f)>%^fO48JUQ5 zk%Yo8TeW17$-9v&hN*?7qd7y@!S!W;XXpW*sp4tWnTg;?hd+%2>b9d05urtz%R z#qhta{pQ=YZ7<-~t%T!qX=`zC?J#W@t&eWQH|HraiS9T@_t?AXE)>59E6tTv2q4=E zx(~$mevB25XZ@lgw}GwOSpsngG?Tj9i&Db$d-Mu zbZv*y3r}~BE)LTlg6#Y0k7W720);nwS}6Wy`Vt!a<6_fq`V&aOW%lCet08)nzH*j; z5%dlEI?8>sU%Us}6{6k18}zjt!H~oB7=Ij2+^ZXqhz+z)r*#b!v0()rK$(MQ3vfW) z^aP-J@)Mbb(bM#&sC7t$ifu)rG(Dp!;j>_r0+80X=&<^2C7Uif8lq!#q^#G8i8n!c z%Jtu^rJgE!o=#NSpDk>k(hKx$!24p!ZWg_afjma9lx%2XuTC~J>AUnDRQhwqy;buT zEn2!VOs`T7Z}+|8jZgZ4F89OI5ES&9Zv96kku2yhb?T2xBS+91_+F3FU-PhG4QcMi zjx`%FIsaBm0YAaz4p=MFn_R>UIHr4${^1iuBlKSet(8CE&*<&qWid{ZwX{VYHwNh4 z5dECq(fiv)$|C)vmXH34nITpl!t_hcLjMICKLfp(wRi^k*Ba!1)jVp&W>%`P>_YE> zN2Ta}OsEwar{;95TgS4c90W?I)jSsE=(m+^2I)UT^Z|z9QyS0Ff6+&1;lGPb*64TW z_XGN0eHxS_H;3tCtgO99eTCh`s*Y`Q`5m|NTUwSyoNIa9bGk95u$URP{FaZIv=t~a zC0Joqh3I)Jq{qb7Cakb5Em?>Ui!g&i=@)F8cYE8$+eE7mTZ1s@eyi3jF0x{=dE>^g z6_r7@>dx4yDv;gc(}BX)d6vz}tW{reV~eSZ6+@As_@eJ?VNf$3DCABO3`XWn2!NNrdr96)nr|$*G{io zdsEm-Ye>!Oe~&B~A(3iY9q zJQ{K2(K&Zv`PI7EYGI_dTA2q9C_@G;mJMr*R-c^!wp(u7j&kU>LZ`A-+t_~%N{k>% z*j(8N5MubU3~L$%I#IGHQf?_GA}9Iqmlj>8C|ZQqxRO}2RD%kE+QUK*bWxm~Su>G) zT+%IQ%f_`t(xGxn{xF>m>#Deug$J&$C^7GoAjnNx#C>n_=2_?9w{*9Vjbz zMgh5}P5mF5`%|Xg5pzFo>K`)gv)Cbare3V#n@yVu#()%lE8$&gxY)1dWyh!9f*(sV zr{erSEU!ixqf&^a#;EiOZn=){yHYtdPQ2rj86Q02+cSPoCZHW#CVSg6K`T?`$%O2H z9n5;~&R`3y88)F8y{x9URL81wsx^L4qKk9cZZ%R;aG8~jACUBHCeW>_yqQq93fVzB zu)puP9qOb}C^S10w!^w~CgRD|#HD&W3`{vq9rZWZHw;Gd0@2 z^im{T-V%*f^Ls4JsiiCJ+P$*v*L+eR=bSP&2|+- z>))$d?7^96x5Ub5wxfFBZ2xwywd?%A$2{ztQ=UnJ>yMc-|dcMLVxLd^v>=B2*fcu=I=oqt(VnK#NB9;B5+*c|3?_& zN0I+coPhFE24c5tH|9-<2QNXs7aaVai*X4P+jFok9>zZ7Zf>qxEC1^Rjvai9PBkm~C%jfAlR}-bq@= z)oYyfW^YmPy!u5l`bzC2JQ(|IR#;6>Gfnu4Nom{HWcw!dAcE4;7|$hZseWdOq*vMQ z?^GI@IrY9XEm?On)ACuK;ymT)07LL}FFnS$)4jAAH%5}ZwARyVetX+zcryNYL)N!( zCXy0@Sv#@8pA=7^4|qQN_NY*TOLnWFwhvqNA9f)j+bR>1aU>XTIN0}s?cb$-l!$xV z_bETTpG+6~)va84x7twLzC>{Os3jN+@>kV8bstp8SkPl0a_V>Zb%JP@s*42x5Xv$* z-Ks-c!j`@RDFJahDuOT)E&V&ep5hk&s{9PI!DMhG+VOsA@j1(Q8A#8U8cI|dZxdmdQIkG)J*$-z^gZNWzk3u6Wm zn#}wduB*ri1o^}ACH2EIj7j8L6`yb_dPc%9o9}k=7!Bq3Z}srE<{#S+K7f_SaM=+={KYl!c;xu}fnCZ~iWXyk@Mwkv>P;V^hMt~I> zE&U{y@MSFM^wlWA!^ERXDaILp4^8ke33&rwyjNvn!5*5*G((N{&S27WoJRAYqWSc3 zO7h!HlVNPN)Zw)4-QlHJaQTh^*@1Xh-;)iytf{t_nTrS2l1W;9oM!QVf+wII_;#oz zDAy{vhU8k!Z~WFSd6PMq@I3zY;w5k>ZHFhdL}Ec^9}x}bd=Jk$es1QO9>j3PUukTj3mNY#FM?Td{g;=BqJLFluqgs2Gi`zbMSQJ5XQmltQXQ>`q%q6)% ztcn3a^3r5F7L0|MHH7oDY)6=w;{>|;mK(OLyQA1iHFg#MT%M=Tw}g|iFe+8YLbi{w zc2y=43o~2pRO`60DsI-7r|SU15VRtB?aT~oy2T=;K2wvlYhrM3d?!y?L2nNznY`E% zjP@K&-%xWQkGG5f;srTa!{x>nmBTCKsl9*6JgwWMyoZy39E~NpjQDHR>w-nd*saE6 zw1*^Jkh3!Eg9{1mMQsD(w+bEfC%9NDG4pJSIV7x+7ANCgW_nA~y{aJ%qPR~DLGT}k zB*b~zFHSvY3|_XnQMTvsOa;l#@I;%biOvH!A1r}G!3@h}M%t94^)nL<2bC`|13AJh zf94!Gjip0Fwx8q)T+8=8=@&CWI|wB9K;9X|Xc0==q2{GKLS(b_)7AGI_}idFm`ivv zk#4F=*%6JQd-*NwNVE008e;o9)gU~?e0=Fb!Y*~2BzXC9P<5ado&^tEYGO4#w1HF$ zOHRFNB&tUkp$0J-eoRGCd8B#V!=pc_rJ8$>h3ydFiY)C`51HIu>W<>%o9zIPX}bU+ z9Y3yCqU}Z(w0%rp01Cfp#F-NtaN^sWozB%bUdMUrSpJThN;|6i?CL#zucL8Po^rOzfNeihN~b#6)eaNx>*aSe z($2N6;!w{MDZ=;alWOOxcq&gkaXfkq^uS@rJWvHT*go5j0SX8Z0Rse+cNWL}2gF?M zG#*R_4}+gtLa{1_QB;ZmT7w)LV(BRsLh^n|&O!(XGhgwdpOEdhef#?!MRUUH)oLg; zP-)t6P*JCvD0RZxQ0=rGb|7I)tlplZ2Zc(zul;rcoF)!Q;TY}cWx*Bq9Q{F_zSt6u zg?k|Y(+(zK^ax7@w8IezA5(h_ec59SFdtz&{Mur^bS^nbyH_!O?&1H(y$|wrzc-tw zZ?$+~LP<|?nLh)`IYQ6n=y=B8bc9ak=%pqfkD))yGCiI0XLHoc>EB1XpFg5cr~5el zFP!pR-|t8A>yr6bocA|PDdcdMPZ^y8%XkJ-#|rx=r=xFnKw^!E_13851Ba$0kKh$9T=t14VaZ=IlD9Hr-23*b7Q zLxWyH!u_HPaf)RZ5xurs9ZxwU5+zq3h@=pmFnu$cKzO4!em^edEN`X5iT5Y|Kg z<!@%CMhz;>Lc{y3}Qe7n*1niDaB{baCocX1gcp;Z^+f8^%vytHT8?>?4_K+qn|- z$@QrhXP%({ka^s#R=7IMUNw(Jz~ekH$=rg@Ja(ieD70D^afCGh}rlD#Sb z>3@fhY+s_Q?@-KZAiz4EfnWv?0sx=L-7h*xAMoe>kY~dG4D_F)|0}%AHMH6^mFF?Q z%RDVFu}_n3+shIN0L}PWIcsKm!XoZG{A3j|3Ai>*X1uZ25l6tYL&lqk8tpzU9j1jqpQH*#_oTTSh z4OV^f_io;*K1$zr&@a zW`16%^|LXc3s38n01<;}xjVhZPW&ZjiD8}rEXHJM?>uQ@Gb1`@Imnqe`oLujCAg853yV%yi6HgxCp zWc;`_KAAdhO?LVjq%JZ2e2XU^`soDpo$BHEPW;%pc|jxJ$M4*5!kYeND4Nz}nx*|{~_H9LRk zGo5)mZ|hcbn0Q5V^Zti(25z~*oNiDs;x=*p))pPd>3E>_^Inar!7whXs~ja{n-~$E zr))G(-#?Cj>>T6xH^3!zpg8`+LQIDe<>UB|QX`Q&dZ1n5DD1w6BCuiQtycJ-mT`=2 zs!}QON##*9KB>(*65{yJ6z_i$;vbfCY@HHfk}-LJ03ve6SzYnj^DQcF0vmqX=o%6M zaT?;5(1;)c92SMPn2Xk@!6&tnxm?MPw?4+KLKG9{AhY5#4i@19eh$v4*hao|tw~<0 zlb4-wz`>O|dHLCnr;sQmQxT=)Y!U5Nt5qm@%~{VxxE`l|OjS3WecxT(sM=6;%^Bw; ztOXuUmD71kH{P|AYzJZ$PDSjIa;9=H{*E}5z&S-z?|a=2YbZIfc5z$BCMn>U5c{{8 ztt_)$TeZGp-TFn?*mlkH2DafVHn=L-DwCR4-s1UO44z$c^Z`uP;X=SKyLqcVpf}|c4qd_qXqBBsCuA`hvX1!Qn(>Lwz$hkZtrfuvaN3O5n1YD`{@VXL#&Tx>b>_=7X zI&_A6R%Owu$k4_RJVdHN_{*vin*qnR;CyqBOFG=Qo7A{|4#4rEXpCu=l?IG?bAd@t z8MR=9=r(Z#dX$(qX{c#27Oiz)#)Q*wW7&oiPQznexa!S1P&Kwn60H9f+Gtkeiz4n= z5^?7kPv{eBGy-!nfgS4lrjnY-f>{3^hdOj^LfOXZ(byi{Sbb4rlgl<%?=+SyKdf~Q zzKSomQ$jrdbv5# zkoZLGgOltO9dL-%;fUmFb0_3nq;sYrFd=e)3{Wrz83hAe1M%gJ@9feoqB{VPSz5dF z!#im6_Tr-h%QA^Ua3kOj)~x4e@$Z_i=Apu65}OhM1YwJ{bkkbNT&N*fL~43fBsA*U z5zVQQvqz7);QF!2#tZKsmu^(`_uO~Qb@w)ZwOheeKlOPkrN5 z=c%VoJ##7_ga;}HpJDPNIw8>RibCx465qDvIEVL2UA{Qn;{OA`M_bn6EC7H*ORQZ9 zd{oudKR21o@-l>Ek_n7SAnZ7kuqmivlPv-!AQC}@RstCy8WKwaNZplBtG3pyArb*hiK`P#2XVx~>NrQ%&jZH0*LTVBF8ev|h2Gr4%j}T(rRT@)5hq!8MVz(*ewsCsh8?;Ravu;%kaW5PI^>3X&uK4>p1zE zn3yjL9HN9`p2lQSVEZ`66PnaD33}U#PK0fxs=2n_?-_Ph%4BY>9me~Fk z8zGMH1$}9!S^o_M-9>*tB;y5N(?77P|1)i#{lDm2B=~olJo|3?PfDJ>5ZQ1(h|l+0 z2WGm+qTe8bo4-``iSaI=5|fKpcx?m>gVv`cVE7Huhf5)225(>0^y&q1)UW3cDe&=& zJang91f<-`X|Je8ihQ}e6pElIFsMHmr77btvUqi}?tT#xur(@Zd< zraE#9c;NJt@i*4Dtbt^;zG;0k57PAwEs~>(w6hLMdJw#c&9$Ad4vqAX3(E=iePwDM zgu8YnCf@JKc5pY#Z!DQk(F>D2$$jQ*KCK=hswC8&DUYc0`54B#V0q7rw7l}>US6-# z*C{$&xyj7HIh=;r^&nK158tmq?k^x|*_O#+5{JpRn&bh86< z@0O5rwVCQf%MSQZ?k^8t`|EfD%Ad2V0&}Y~(18l%Z=*;gFhA&y(J3)nGQkyeW!z4| z68bH52~@i zf1njbyTW?>x6>F57js-(Y#U9c{sY(LYBW!9o6uyqm(fktsd(nrskW0#DvsP_eqJvA z{H}y;zC8+=zd(*AP!Dz$%jR`K_dk?{vBkgk#%N!Ro>Xe#l~C4rW~)@9kI@U_5&V7` z3U>P`9CC$x3CR%nYMuGX85IVk_ixD&3Gzx#YxmEfEF@?dolh6hYx1qmvpQ>tRvPMu zxx#e^YSi)8OKkl=zE(udjjJ`5;%Xn|36FhKnvu}1J zrpVPHm`lFdVT&ejEoTQVoV#_^XKK;(v05{mEB_rdvj>J;dqgJm{G@@w$R6S1)he!= zEj&L>q$9mbXPz_NcU&H@O6qD-Kn;o z1ClGDE6P(dbpCxj-*t#0X-u)WwfliKdI^Q|z<)}W{zF}2b-cK&61<{vS)5xx<4-r_ zk;Mh{b1@+3mWATWvkHCQENNF8tg_^@-gcQU{9J3DT*xon;42hB&w<;dU3g(= zi92!tY=FrBRUu9n}%|6NVydIn+}JwGsF^LnnY; zGqwV>nelLZEk>X#et>dxZ**Z&jKsuoY66@JjpmB2G~6`>p031D$(R`dphb)ghqBtm z_>eCg6BEHd$bu>%$YXAPDG_>nxX3vSD*?wA3sjtfRh&g zZnk^92qd^}s;rMT)Op|txKR3vs!9%3rM9e^RR^5K zi5{|<1m0(sraGn55QB!oD!;RI1U)w#V9N+ThgS8dnnE#Fv^35%1%hEZ63x)QpZMg{ zXkroCBw8HiaCm!FwJY%U#`1BL-}9VCK3{QHuRW{93#U)xB-jFRvKMwWeX?ZygnK7h z>~W^FLsn55&abN7)U>|E1FR!%>V2|7lVG*X0sA`M;FC+X#631t;tkJGZ+IrZd5GC$ zy@1zLDrXQUqy*vSq&nuI1}8%42`-+hoDwT_yatKY%%^!i!fzKaZP=T@(=5vc31186)>sk=x0{7LAy+d!r{{* z=v1ZQF1H?lh!fO#ra=wBNP>2|bfzMrmY2_KTDP{gLFs}u!3oqNnE&rx4Xs(agi6ZM z12AL*+yNYh3Zb;RxeTz0LTT*|3(kZ5GKCV}1qNLR)0-NH>|ySNE}@Ij8Jkn+!y&r8 zCoTh~k^-{5+@LD}vDmcjehTMe8(=as$I3_t{hUrk{HsmTcXoZVO;7b&x&{favozTP zR(e~k8|en*ag*vUWgt>#zZE4f0#<^O6M}A4CEuoWEM~*jiE7*(>NU42jSXACo$#x0 z1&m+zF#~j7_o%$ul#ZGVvDNQBRlobSO%YSU4Yn{Fd&~^+ukj&+9)^|71f4hlAeTCe zoOc~SqR@XN2_oKdk=@3mm_0wJ;AC8Wq ze`W9%`Z4~@`4zRS@xprMq?Fiu!mKgzNT-LuG3)BIZOwhKt?8Z-g?TG4JtbieD@_#6 z4Mr<1#st_Sk26So42zr3V99;1r&jR`_v?wg0PD>%`lH=vWBMj;B9i`vrZoW7ND~I>hM~-9*tI9%9U`M=RqS|&D_dmYB$#iX+w@M( zgJYmi8Y*mDJ*Unud|XT66~@8ACecUuVP7c+3s#bNU7Pd9PD12~T;v&m;8@#Z7X?tk zNtkWT8;>Y7L_ZNs(}>*>B7`m}a)NS7=o++rKnjQt2uBjcCkChV8zhDrVi@3$bWAqE zBo2>Tz#l10HrY+Wm5B%nBGsMyAc$%?+bLOWRXGqs8(xZy>I@d*oOFF1uI~DP5$&$dpP8!xhBipGAM948+ zJ367u~{TFE~+!fFWo_Di0lbf35uo`sdbZyscL8!LQaKHJhc zN`iOMVi^&4G5Q}BAscLTZz#KyuEc|@6o1wm@^{iN@ZkDR+QPZs(n+`TWt%!Mmm|}S z$P`hHPP!WpuCirzFCK8(2RP9qDq=Ybwinor2lfIx@qiO`l|xGPczNInSPVI^xIFMQ zSG)+fxN>K~{!5YShA?_GD~o%SlXTK=Cx9Nkpo?Bz(n)V*2D3Zptr-0Q@g1I(IXtWA z`Aol9RMcKp$RBv39ChNG_mEE3kL&DLH>mRhb&KFKU43}dc^|*^m7Db^Q@S{ThFd&C zC9?#S0I#Kg;s2k*GzRC%w_lnm#)+eJifS!%oyNgmBh}rMqi-wj;ZBn!eGAt-oDaOJ zV}yOVLq{o-#z;`#?@Vz*rR8Vn0`2q~W@ZZZ^N9g6n}V1S)onDlY!9Go5MsSsXj0?= z<&^Ie-k8X)YNNb}zK@B%TWFyAkq=hee#!%@8qJ%9n_|vpAOwWFc2q@TVz}}iR7X)U zNVaplh$M6R1pgbA;G$8CJuFw&DYlVW&SyQ3+&*E4!^_I(Ir>Jg22jJ%+b4CL<>U3t zrnPqY$Y6kly(iZvfHn0Eby8l!({-;2Jd~TwGhE*^G(HO`A5nSPb730yLQV9b`W{kE z)L~;|YKa;vtkbO*%AcHdV~ZE6o^Iuw(F?wrFIrdMBHamk;p;jJk(#{_I%Gw$xAwxL z$k7MwTF3Kd`~+D>5p*;!arurhbJm`Yf^q1Q>JiXch5%q}l1NK>!j@W}4(=%XtUXX@+6vw$dltz9E3nnrS;v8r>TfAP3nEh>T-BZeM^J% zc{o}NO#0gE(9$>$LX%^(PH2y?*>FQ5!{$1lud8})xaUFW*4vK$B!d>v{9cH6QYCb} zGYe5_g)V>`q{vB)GnsL>luko-%lM0jxav?nV{CrT*osY-%1j?H27#OoyqYVVYw1&p=;ApmrnmlPd&k&vcsdHVOkBDNv>_` zGQDW8PN0N2i)t)SbsnBdc@WF(5sy!KAjr z`7S#WpHks4)^2+^BQs(?ZHiY1Xk$;X_)3xN;F74EPttox;D`uUBLDkc|1LwN=+ zbY_CeS-rN0@MHj$UVVr)Y75?@9LC)3*EG$CB@$ zyxv%?)+B*Z$gKbsCxL!6TLasZig>>#^%L?!S>-|ZsAZ#E%jZiRGw5pV{(MJbSVlsa z9_Mh6Y1-|RMi+Sp3A>D=#)aJSI%*H)@TcsJguJfe7!{Za3nhNv!w;j)1^fsr<1%gx zGA@<&kb>bzF-q`;U@e4-73h}L+Wm={a*&nt0G%_S+S2{Kf!LY zJx{F2Eoa3paW<96sSp&LB&A! z4lV!z=Mj-hHJ{UTS>3}Wx6MoPFrRXOmuK$={S`XME9{Dj2^}XT!3#GvwycS^)UTvc z?m3@QHbO^A5+P~6Z#Iu1HG+z?l1pD+Qu>4=r?pdFjQUxcG)G#_?MrpU0$$NdVl=2K z64^~7+zstCB4TRAsez|B&IYIQ$mgXNZruN{9KPEdd-&jSZ;)^tKTeHs^6KEKiQ;&Z z|9#-x!o*oQ0nY7j@JQ^}8=T9-F#t^20sWMQIkHuY%pSucAX|i~9%n`~K;fW66%INq z<>Eb}HyrdxgWq^KVVSZew&S2Y6QL5LdIcZH!aZZsKKLjfZ-d6Ai+&yhaM|%YKF**D zQ0aOzuaLNC!H44{G;xZ3EMhc37(Q)Xv^I`7_p5S@ptyC>x|W&IRTz%atJh4LfzFs^ zfoEVA<9t>t`8Tt1!b*t?%r)plpwkD(ljp&Thm(xKJX;+c&XrCb7r?1w8gTBZuJn3SdPxocDaHMweXRfb(8N z6Ab09zK_gfUDW)PHY210CZn7X;GfWC$nx?O(C?LW0!N7pgMX zBtgH|sUdNF67+i`n!5=Qb5H1ZtIF$UXXy7zv$S*E!i{P%E6yrw_*7LwBbD zWA8QSJ|NO282iBg6BzptJ&2qiwt=xb4q-R9yVv~%Iw59IJMik1GMPOFJ&MWDh|hLj zVA9{$5Yn&cG32;U8AAGXN&%!z<{}a4M}bH?5}o_6J-wMLSG&H!HX|!&^J#htv+^_i z!BwSL`qgaSu%f{}n?Fy_A>9iYA=z;t_+^Wz{|fY32GXnPG4Efe*AV*+N0I28cKrBl zwHJ5?E6_V>qp$DNd&vKTG)ZV5!kl3$XRjY+D~#F^l%-D+Kw0_>Z{|}F^A0Kz{(}B$ z&|9GB_3r`7nxj&i)`;(N{!V{G?qAv9S^7FPJWJmg^ew1+X;};Sj{c24`;QYmOLQ6c zf)J_T*-R&RHY+te>jBE_P7|KZ7JQ_t5dO5_*}ftNk#kdt1b}Tj9YiczQ}1{yr|cbX zwb0dkzM3d$2KJ}&%DWY#{9Q`)6=-UqR`>&l#}Y{JBI^`2d^%LO{L0 z8wW}QO9BO*bVLW0NT75eKQ3*jA$)cj&Ob*24IR=!oCcmkM(?EYF`9@wjxaTjo>uas z%FGy5!O4fBMgTG$4G?jnf=qQi$$b|~q%mcQ0i44h((WMBvqLY5c2eXeFZkx4mnPj_SJ3`=XIX8c8sW7{MR}0%I)nGQl>sg%BVCf>?+kjAe?AC6EAN zJ%|7sgH4SM7>tc${J;=`F`>aps0%n631hpsZJ_U@&T_M|oK;(?^-dX$cO7{Ah7GH|Ix96(7*YhpDDgE_YO1q>rlumG}!a>-TiC zP<_~51FBWZVk`Ch#M}%|_Ox4uO}k|{PJgZJmhgYu#IO6zvRl$;ary^sx0L%h{Zj0f zc=(lVw-g5&H{oWe;ye!bns&<^+in?<_K!A(d)O`W0rl4ZmLP zZaQ{M-)(rk#K8JOa|@DQZMS>R~eFtcfV&6A1T-Nb7dpDP^c z^>1p-EB)1+_)T-%!Z&2x#36ASx>2xy*D=K|-t-ZS*Ky9f;_(o|EZ#QGl@U zMo@tLn_t+rX}#!flr~WcWI1uYlWuR6SLNgki3)O_At~@ETEihCvf0@vbrdi}p83?v zTP6WTkia4QV6O=@JX4_f^VnvThIoa=agA-A8>@u_%a@UeN3U=5rj}0N3aY3Q8E-W| zOAER>oxXsG+tOrVnn8CU`JGA1RZ}|m+O%Y>>kwwFyU|Gr)^r(-AkYwnrSaUhkSM z*ih8TxZDFAMa2EV1fe-;0-EBcBsLbms(lGnTWU~AGJA_#@dtI0Q|;FzYClg_nHHM@ z!Z{4-j@3r!M}+9NSeUu|)CmuUXcfNrYgHe#0hF-{TwQ^xb)9R4t;?Y*SPKrgRkRK! zP2U$J^iYGdWS>n?h zepow}a8X+jHkBShq4N5z<^Xl}-YVyB`z$IF9Vn+z%!$I0I7qugv`)nWW zMe=98D2bkfQN^2*=s<{GzzLNR_C&3h!r{7jSwhxysI}348tqg!C(QB%rCvjp%^fKB z29NLp&2`g#zsocL?)eyOjetQiTI{< z)*teA8(+}d#^OLN?_x5IGjOXE;eF<`!*Y;%ba{|NZjaMlajLmUwP(u1kB6({RM&Wc z=HbM818;}2S~6;jj|eWb=n{=aj6#eq;RMZ`Akb1Fg`+?&yT;lKeL%H`DJK>{$tpJ- zHWbNLJAi_XGe|jHGGfd0K#NLjoZ;@m`M}w)XLZW^a{O3_X{8MYu27(q&|+H zX*l}5$LfR0y5GleC$Hj8eu&$<29y|U;+v=eme1ZCP` z%XqWMvT?ls=Msws=~1)b$IN`M(jlGiJm&-F@^7JIwjZX~(bny2(%;CTs1cu;p>aGmt=*?hX>A4I00ZwFIsZqf$L&hmQ$*~4&adnAv(y}HO|PBATW}vAVyBUc*u$)5MG$1 zvSfi=XB(5GXyq7Hi?JapQt&5#4X~4JZ#)&l%se4Y74RfsRrOH;PtK*AA#Zxoyx!s| z?u4Y(y&L#Rv#b_D!t@bXasEb9if~y9;j-?EvXAd-Zr38%-S%*Y6fC|UY_kZ5;hS67 z*3;evA;k0m;Se0|1pYTkKs2q(HWs=@Rd`m~G`G&3iU^{m5JU?TF>TVdYT;>XS5$>! zP{x4HPeTN4F!eI-HTa7#D|@fOjlhB4V`>UqN^trTEx~uNG))NJz3>>}55c=HL@f|L z{eTB^AUbB_B(qpq5%2)AJb2@wc&+ph1T7XeX8V_%vS9rCjYYColA@J6dupdOXamn> z#VM++SjF1gmu*?CP0}qeN#`gDS3)0Fp|N8=l}Fp?G5n~u`|qjd&=dGQ?MQ2*lR!kd6OwIeBFd*jv4_aOEeu6e>@awCzET5;%5dg7?qewKmNI{73&BYbnwVVWtB#>xsH8mB8@qXH$_pQ&bjiH}Qg83*TPeV-e5=M}FLBa&e8qGh( zh2=_s4zG&lx2p2c%y+D+Deu7{BbFOb&NSDyaA)PQD7=BYf;*zyY~b@&2i&JU=+?2& z*q3>nYG5gOQJ~ia~mO0G@FxFA>+Ja*%enoQ(wrX)gmF0Uh29n5hrw@D_*~Q&MTT%0fI_m8ZoalO{z>SO(cm5>xKE zcFhQ}(4~1@SnSQ?PfvQiS|5btFokEVQ5xP^DRu?3Qz07XhIqoLW0}9vJG&FpIG^UB z4hz!3;w^&i&&y7BPly_!?Mn~cxCEs6p6JGoyivO^9WbCA zl4`^usWiZVLL}n_25bu{E}3+}fWj!#h=Wt9!GK9*GBy~{B$K%gFre_uG}A^eFraYC z_<#XTS{WZOpisuF24zfIU_iwpL=5IGOA^je2WS{8ix}c{^ z#qIJuJ%=(5xS)DpQ3Lj(3##`LJ&qhNyPpch_mU50{w{tjsg8Yq5Tf4$-Y=QR zGP{JRkCUW`X5Pg^a#EF{yGklxP^yfBy@B3Kt-g6PT`~V9~Gr)XlkgNQV z{?eaZ#iZJ|h*W+oa5Zm*)nA3^6M+2EI?M7?aP2pPY$lB}E1%NOkoa$%EH8hDUOW!~ zUq0M(%;l}7@W27YSB9GW!rE>ABlTfz{-?C@hyOyqM23G&)-wGnxv!jBrvJ#L|D=ES z0~-E!BGB-EQ2Wn?JpW4UF9rl-_ZHX42pIuDaFRJ;c*4~>DM%qk(8%I9fl=S)gbAhK zgfS`g)8d2)8zZ=*jFDcT!vfmNJz|XV105E6fey#`gAT`rj3OguPG=I^yrri{MHcg{ zm|}(rf@9%IgfA0$hPK3dy_wGF+rpdX@MbPc_5;e9Tf1mPJl<#XzFZ4e3=7&_GI2w; z^O@lds!WM+v>I?ljAMo|-Y79935yKN^$Dyo%F*R8h_G^HF;aGFCLU6=${16PGJO&< zWb#xPf3LhR8b1--V*o5NM!$AcSq8t7160&c6Zm%GipWiaG(Z@;~pD;hFhjkdkyDspm-T4c+kc@HbD8m#-@*H66zR@ zd;GG(JwDnZ32_&v?J9u{Ox%fpT@ET2Wm_1e7r4}e4tQg?1K#)w0(Ln{c?|)a>8qUS z*dV=8d4awz+&JHe)9K2{TiCvyYpINUhpRFHx45bX;f_1v9esVj3|RqXMAkw2{TX0h zZ@56;T`@?1lo8Dtpg)b%_mJ8nY?>=9@>Zq1PhQ=iZvR5D;7To~@jE|Mwfe|JI^JTG zTDBvlya3Je$4I4^Sa3T{(X4QhKQZ%F(9hfmLHe6G{ahPf3>(mxuWf>+BT(aJV~T^Z z9tNv%=1adp1*(RhEyf$c`(mmYYODhHX@uk!_$0kV8*z!#KOfUrNxuI#jg|Z_g_Zo= z#!7x3ry&z7iTk*bsj!lt$Bi5Z#|tcfGjS8CI1iRB6Dv7RVI_O0*BI?!aJk7cFfF=% z1JnO=xcpi+8bIMv=}vp39STqFmlY+@pbw-Uxz#K2=8dB z_P0D4IF9^ZWZ*b8^oi}&(>yI)=qaF74t?_X_zWLT%w!+ z&(kbd0iZgTiV^^;V<;xqum-Z4fYwov&iGoO(-o3qJ)vA{^iN;I=zDoD^&NK4V{CBR zSl7939q&uwlgQ~ZS{zE{!aZMGpQt;Wn(t_-4+7G{m_-0g@R-O)g}6fsxIb2U<%c&^ z(=+8JIFlZ&ok@H8vQuA)BmFom5kAUkIn-X9|2+mSoUqjswt)Abr zuB&rX0@;^0thgQs(OLe0=3w_j>zCi#Tc1Y_v;ZY7gnuipqI_K0&|P1>HDWOk1rwmm z4(f_#LwTJRXn7f!qodGe2R8R@>BxriIvpRZE5NrL1!};;B|iXXp(%~<)N}OL>r*5*7$`Q>Ow&G4S>~dq+Sf@mlI?X zbDDuM0Q=w`vG8Lsw`glgzV-}jLR_|DfU@W@KZmRu?S#n(vmac;Zr841y&=QD>4iAi z38=O=;>0x4XUohYkcmBNR(VFP6*_Pq4#7@Si?Z5Ii-j56kSY!|IoLGuW zX9r=I8HQfcGS>b4gd=O%_T^osdYqKIOyRPTG&D$s{gii#Zq2CCK7Yc+RYfO7m%w*5 z#j|#07{#3M6G^<+D~IM zYWcnl&{24k84KTUvA}uIja;PYGTh#dJ>;i|yhJ;3d7o=FF3>J6>M~|zMP|Tx%KgRB zKr1|f1-6N6oUzf&>D9sVSa6W4k5OT9H1jxxIJWf^aiZE&bc>2RDlX=9WV=Md!H)8& zl*5Id9C{N@l``SKKErfw1F>A1m~n_V)Iq-PXJNG#dLN;D%PRw5y_ z7CUaN757wfoN>^Kd)k$6ycM_06*t9-+wF=gvEuf);wD;g&m_kUyJW@fb>*98#qD#o zq1B3e)|KyWD{j9lU$YhWoGb1LEAD`+%rREni>|ns6?f1TH_nQC$rV>@#l7r`n`Fhk z;)*M<;$C&djk4knx%&FYR@`gJaTD$L9d`9gn-zD&^}cE=?yIhR%dEJguDBgm+%Z?& zRx9px9jCT~IrJtqI_Q-J*ME*4xlH*$^$*aaZ_^|E%)i@h=FG)wh0bw|f7Z~HJ*&eS&g}`S-u-jiGn&SRp~2)qFUq z<`{ll-h_FgI#3Cf=*rVgm2uk5QxEF(H2-^2>blix-7ho=ALym`$}GD-X_noaILq!$ zHOq1dndN}?@5MaJlWTzgXQEb(f?VrER5WWk*BCVqw4b1kax3gWZSgT`EH94#FRQEa zbQ3ZFfI~~HT?=?r$8|oVy?U(#tdJKXv}-R<*I07xOMh_w_VA-+JV;3YW zB&-z>KXBp%$B7dsaU4?f2rq;2gE)p*iz#^!J0VTmqm8IRWu!YAV zY#aLI_eK=35|sR|v0f7RTj=mxpNI)*I`(;I8k;SvKBDO!9ebLdGB^Fv3%0n@q>GhNR6%K16Vf%BcbyiE?bK}HULG#12HmKw656*)Uy zv@0)X2YWV|J=fe`Mui01SehywKGky@7?+LNz@(f>Zr>9JUWsk^spE4jrARq9?p3l)GT1hdTIKkKlrql&L`&Ch9ztef!@EK!HMO3vQ%3dr z9*DbTo7Qekb&sS|Zr^&7w`}NziJMc|g}SoW6*N=Kx6l)x69_f zSw@X!Q`~GJmiO6d;Hx}d!1`uY1tp9b1T$AL&hncod74{oFV#`r#`Q@#J1zx^s11(v z{5aunPwV}s_h<%fS5!0R+_`0FTPAH@#TEr;e|sgZ1I}+P>}Ja$B#`EI>_|wj-l3Cq zVn0HX-Q`Nw2`HT;>*Cf&8I}+9_uhkk@6mNU*R+ta0M)HA+?Yib)NN(V8C4j@#FjslKW1Je|+22&D)Q=r(y!FK5@KhgnK?543c@55DfCM(@{|t?SS9%PGmj zI{1SQ8m}Z{n&1)Ig_sXt+%;s01|0}I4jl9tMhbIz`N(khU}m6uL@;r}$DfeQHDKmb z6i4bOv>01!5B(=~`9D(tJBk)}<38mgwGh1A$=T4R9#`C6J;wLtHjnZK9CwhXv-f=L zW@*aC?;fDfp}+?(g||F{?TM;!-zx=@?igI z=kuV}9lgUt0|PzX!)DLCXVuVf|NVeX4G5eL4R=z{{buXsi;x3T$7fJVqkhW5N#0CX zz2ulqH)C5*COy0zC%a<+qGtf7TY{V1@EIe}zoY}dtep>Z_v0}1tH8&VqvBs#= z^qOX=uPeH79OyQYaCfd}Sy;A|L)sbvFYvfyfX8`n>lqYpvVTijCStjetpxX(xqzkL z0W%)Mb!*e$bvks+|=#BjY1MM<6Em!$ zcMK@FiK@%LarEN1qeD7+@^9&X{q!boY4fycVBK}Q)@k3O-<3l*pCC%j2bkRWlNeR( zS0(VD6Uf`$O?RhC0hh}IXWB?Jf#CmE`TeRKAh}|3EmEl_@tEL{$(k9AUZw(Ih7izk zkgIkdscPXI0OR1sK+NfKousCrAF^t?#u<-|t&uKNGjtc4EE~7*2RSmNUk&Td9}{_% zelwz{9G->xw`|*jOW5R{*+zNLY*wk}$_%aMnXB{4R2_av4$<)deYJplu`Z$6=C|q^ zzpBUeX=5w{)O8qXA$7f?Xx-Zd7ONZ8JH4UI>Rowhe%xdk27kJ zA)=NV_Y*i-u)*WgYcUPZ_FJbP`p_6Y|u&Nmxrz)vn%ycRCc^;31DMC5>4EtF=7v z)w=wOJF~Ud+*}TGlQl9Os7`e|KF>mKlB0K^jFsxWGEu0z@)^J*FwNa0_P0XdK?%{ioOFvH#%%z*LrsKJ%87O`= zAhKRp%eb$=exwr?ot{nHEYc;PP zLJi+k?}tblNT;_}s)w0-StNb%QX2&75w#1iez=fr6^{!jUckQV7e1;!f)04hw&Zq> z4Tp!fZH2Ov!}xyO3*-BV!WiFA`PCEZlLauoPqJQf$zfQkb{F&=`bXpUIyAm_TDOx= zKFW9YMFxHjw|faMdt9DX@x;ni$qlR8+7oxQwI&;zH*_omXfeS2x<1jAT(x0cygiv% zE)jWFN`(xWJZ@g7>K#aT4}^m)nGY*748SA?*ovFO|tvO;Lo8QVh>oqck@v0U)xp z2(U6vl%-o*uu=YQ=W-{@f-IL39dimi+icUq!%maF|E0-yhHfh&fuZRtSn65zoViu> z09T=epP!CpX-yz~kSgWJ#zTVl?Z8EhYpT?L9-=Fwv2(OGOSg~Go#yA=qtwlbQYO)F zE|zGMPUQR5A)3jB+WgI;Ssc2h0S;{LZLL3FR2>b4>a(=XWcI|NA|>g_I>{OB$kP2U zpsv4`!)0tTlKQzg9U|4j&sqHcb!h-%&cl8+smJ&^kN-a*{Ytb07tXo zpmjt&wacfXVSvm5{!<*9@Qx@m4pNf4AcBH(mQ$&3ngtMEw@$1p3&$qzj$;EfNl-?aO z<-sZM0h$`cq41;pHobFXS(TmhD-d91EzF`-0 zsT2PS4;W?S7Y%z_`_oG$1&!x*X>$nqH?O{ph+&)GihI-T_){g+*AIpGfBJ~Jb0^GoC5D27vfq*7vF_BeMrB!nwxrBj$j(sB+luH%} z=x7sywip;yL1}c{`^(ImI*4;o{5T*ienAsiRjX57X{TE2j-06@=YT#Ua_7`IF1Uc_ zaSG>0nl8Q|PgCYmv6eZduOj}LDH49@BAwENF48F}l1|m(j-06@=YT#UPV@>e=E+O( zoQ2I%m$grk+uG;z^h*4){%GHgc7vszIxRB| zwn#VFb(e0iCa1yF8v6wI@q%Jtq_nHp5d#YQ$&UJ~!6#c~wlF-jhbAxR)T3^cwOz>l z1zM8@KI9gjwzK|>lGXb4W=hv#S#>99bvOTAkX1dgdXvg7$-`c9 zPz7x$!abf-@&$WJ=8#7mNm*mK6SKgD+N?@DylGiDt&%Cc)zL(D8cpQhF`5Xg+}Gw* zZtx-mK@;ku`n(m8c~C%1;u(e1j(V7ogho}LJ?5TwO5ViZcP#ymmCAk4 ze0ywgy`y8anFNQI+wyS7A7-w%b;ddz}pKGDeP#GIO@d#L10t|2cZI+5F!5 zER`Rp%6gtdt@_uVvtlo+4?OaU`Vg-V)uUPUv6C%4E%Y>%MdAJbXoiEhduP)2F&p$cj^D+z#OopxQy!(fZFItkBo>>NI|2Oi@Ieh z*|K3!ocQFh94_pRV_z+YLe4!AZm&!MS0T(^lR48BAJ*Cs$++Z{&3c`MY{88Gj_iVN zawp4kP2;3<(9uP%?FntHEtk{KH0Qd^B6D3PjI@1@k#=ovIlvNYhSxo=&TX@`6!K6K zudv;wPN#QxL5Ye-u?_ zAKVyYq{4n8ZJVS*Ct5u^7Y}QsG4>_4VchEUePWD+e8UAccbO?Oxx^8=3VF}eCqJ-* zli=Apk2!KWm2raS>C{*2b`tQxeBDmbF$PX@bFYVi)3ttD2&4~A0H$yaThr;(^6mk1 zs(b@okIddVF(;4jf?KVHa9Zk#lUZB{!IQ{4$!?%qDrgC=$ozdQni^s6>SYfnW=YH3 zcF8NK79U#aa$3~Fj9`xcZ=(caSC93=+d>Nv-s-aYS(9tqJQKHeKXt%`>4fZk*3nud zU;hU}UED#PDCV8qw7pJu-i6yoOW;VWjM>Emc4>ye1;H*4F-8oA>kiOMLnEkX_c z2hgFRjNX!Wgy_xQ6`D|uCS=7~B~Z(uOgf{}CQ^kgxOjZ!te0(zlljI1#kNG@F{p37 zHqR~-&Z9vrQWR_33p~VSr7bQeQ_2J{H4YE17sTX(EUZpu;CbaJuQvHP7g}*Gc6(v{ zk)`WKwI7ZfZNa^n71!M6hEM#jW79a*5ZXr-*h8p1Y+Rnt2xaN!bF{=3>Ki>v8M8~d ziTa!!B)#)g5oJ|9R@=qJvDX#MGA2>n*lFJk^BUO(nj;1)mi{R8x!4)HwTPC6Lr1AN z+#p*&rdEgF`ccUK?ttUJ{1tQC7B-z`#a^NK0Ru{}1F>J!%E}Ywdt*O#28M%3w~r=) zYF4zDB0+0u&;r@U?AIk*jZP8Hxn5$$D`+(wr|V5vmXfTYCXdopCcp%F)D@C$TT~h>JwRo_(&J?L7L|pArCq4y5%S~bab5;9wWvH; zw#a{+u9iysO{FVpDq=x@ur!4l)|8x~_m<#vk%P()zx89AVM3k-n`IZQ!RgR>rq^e1 z^o@I{DvGVa4WrZp72`$@?8%@0d!6b3uP;mE%d^HUY@J@fe3a+E;dCacJr(4Xg3GpZ z6rUH~7Oerl_H;2u@wkGjp?Cz}wuv6g9pvck;G!1(gxpeYeV^T6+AeyBLmOOpNuJ~N zi`qqtne#O7+-+lLzxLIkwTFPM$#nD$?SPgH1)~n>qHr3Adoc#eF#Sz%u7fr)-*!N`?jVd{exVYbmX4&eLJ`}BO^l*_)=RehR(tEG>{wOz8zDz z{c^jaS%UA4bVqQpQ||)gF&OEUFjGvfW0Gru+uOME@b@4#(9=!8f(SPYH(z8&cmIgA z$nD$)CUQlxLma11Gjv3ENkqIxAnkiuuQYMFO5Y78H!s+sxmUWFZ%wRenI53ArtJj2%@0W+TxH_}ep%Iha2e|24ha&E8aLNz54dr(^mhT_VH^u*m_!f9< zf|pD^j?1~H*j|IovlK?rp8|sU4}8nQlepBo@GT3w{q$L&p~v}TUkAbc6eQRl_tn1p zu+zEum!;-T(Oot#pk4(@3#4$Qr*a5`x3VN2Fc^lpkT&Uw0;4^eC zoQV{2AMpix5&6F~fh!(P1C8An`dbM3T)En(i!G1mquXw z#cz*yY*^mdx;)-oVA(vyq)4`{iMMij`LlLNN4&9pIZN4T642JNra7KWw60v<)|!lS zERQ%HVUzM=Q+!3DHIYoTvAnI2fJDcd=EhDgvruiVar2YYHJLnCHn(+jG`4f1a*!Mm zXW4j#^E=VHW^Hm!I~O4d8Epr5#GB*Go$zXeH@7u5<&|-YE3~OG*=UMsLRKJ&`^8*I z0du+SZ~qs+@qw^^XDhl1c(RmAMe86O~CZU@3tLtmmV+qfgv zTx;knF8T(hzv`mj#q>EBy@ctnx#(M&e$_=cGX0v1jx+sr7rm0{Z@B0L)8}3EYNo&G zqFb2$6Bpga^tW7e2h)G*qIWX=XD)g@(|_)w?_~PhE_wsg-*M5sO#g+8-o*5GUGzOn zf6qm4Vfydw;C^_K180B)A5J+AtlX4}mE6+Q3dr8mJ{d1YzFISS#*FP)gR zW#AR(EANEXO~#09Ih?t0y@27ClT8S4#-UKl{M zqE)C`TdnoFwJyEdKJBCRUfbUG*51qg-gD0X&p(rYhCzhq$(jHB=RfOrwr_bq!!9zN zKA_P_ats>HNT+wr96!@JzUMFXmma3^HU0_yi88#vKS_pD{8ME(-9KH1GySt=IM+W{ zhV%UMWLWMmm*E0HJ8)R(uasdGKpr@(_AirRjen&KSNT`VaIL>ihV}lC44eGTGTh+b zAj4LFy9_t^J7w7Ize0vR{;OnojsIF1Ug!V541eIiNrt!hZ$oJG&3p8|d1F>)rYpEt zPEf&Ny1Q5$rXN-urBUz%x1Bpw_Sa4xvm5g7OI=vDHYk_hdC!jX^Pmz07) z`1Mn;6#oD&;vC8*eF-g-?yS?XJ?WD3HBn^CQOV%HOcaNr6md8yMLc69G;YjCO@r5* zGxA@-2U){$gVT!J##f-tb)Cj5cM=O!*E(%}D$#^(%};$^<$CN4%&f9$ATk-0V9R#4 zz*~d7IOEnDNDQ--p}3-&LwOD?rxPIJOIKyN#&y-FtR-f4*309S^h=h9>#-Ci7gQ^2o3d^ju>6hSt=I$Jz|aK&sEVEpUNPw99a07(sQhxHvw%r%OXz7(Hk!abMbuNd}gK3YLFc(YR3ThG*atWrIBnS~Rx1_?d1 zR(WWd0~3KzV;B6j%B1U*g)`!ps4i$wFG331OzJ;lAevM(-x2dFtdmdUInQk10qIcY z->oVN_O6$wD|^>iWcoG;e3Bv48}75>k?A{AM5f;itgTIOo|PDxehnOBb>T{Bg2G>| zhTs}2Wc#(4CtbKIW+0<6n?r3407t$4G%g>?_h37BP*;yMfsN&E^>p&7-%U4p>1NzA zJqtr!o%P(E@_Lz)GiZ6ev|*ST_e*zs=a@F`84oUo-kN4^!WEsvCr$K7+%4U%j!wz6 zxu2Kg@ngoF?|}uZ9iH0u6s0y2ZR;+eZ6)$`vj#W99k6Y+;BoCihws4U&mP=tuN}DA zV-OD6gPR!+B2u#beS-F3T0NP9x#iQ?HtlS3`960Lz9KBPmxr)U9i+pyfC*{Mt=wBj z>6vt%r_X*fTc=pd)92~ODDIeQ-^F~lHQM*0YTr-rnpYJsJ~Cj{j$=X`q!ZebNY(rm zRr6PqAq-fonyR{`e}|u8!TWhq2RU!j8#WGd-b&{~@-MBnOnfMoHFyV+bsZbH=pGoY zzJZkQbAIbuV3NhBR~hpg>+WS5FuCcY)NF|@vew_yCpLHspL+S!`5&=H$G?XQh|gfc zYFM1Ep+9=*V_2_xrGsa^=YFB~+&?Aoisj-NEt%l|1s4y|qP4~TpVR3t^cA0#rgYVIbzH<=Im>mT#>Jdh9JxK2R~SSr99$Myo<_kynN2&UzH|MRGXF(uH&X^-ldgmjTE_;I3X*{nuFTWt*I7Cw*tepnM|CvC%nNu8a9He>B(_IjuDns#W zFki)01~a8EMxu!*t(V537S$12ju5)6GocU&=zCZDbdq@7k!DU0~dK z*NAMbD_yLHPUP^Nw-!pGWAUd50_A%AX_VRGPcu}ATJdWF;CosRQwJP2bn(@1i=*HW zU3HMQhA9W8FmbV5$*mE(u3#r+^3|*(+gtna$q$S~X(~~*+05WU%E7&lFMAQXyO*~5 z@5RG5`LN0VLwg+M`_2(Tt}KC0&KM1lb!0>>C(?G_3ZZOXE!we9(C-Y zkx(JTk6h>qKI+^<*)l)vWUvo9=3$X3vM4OObrAhbcjs>IH?Sb?406Bjk5D8C-BQY8 z;!#0igpP2No;yx{m=-+ebczVQP!pCK);Y(i!k_?T@Degm&o3i2z{@~%MG^Wb2hF`y z5Ole8{@LyZT?GG%&}*RYUqF*j)tBfdJ~7Gq;+|k5*unC5d)^}RIKeCtwgT{0WD!!5J%M6(Ig z*+$wlOIlT%rTppxyuu4-gHr|8Dts7y>(GI;`{17rmEO@{DXX2U*Vr##PtttdI*8`$ z>6h=>vF&x3ZP-qW%;u@|ao<`)3Y^}V*tfeOlX`SbnwnLRjrFn(9?7k$O!vxz!2|Ty z;=Qzu!@my_f5pBKp|63Scd}2$rF{WAO}TV(--T&|iv1k14l{OH@PHUFDD6+XXqd|B z-dzN9lGfui8A0(8;Tb@ED%F=ZsRrv*8JtR$Zdy-d+K*+uWh}L_uFq7}$ovM3rz8iS zB>EchX$_wN>ST1v!;03&P>sFsO{!UuDPGU46%)|HlG$E~Oi;gq<4(*g4O-4ryKA z0qxWYHkYwUa0`B66l;P{vJ((BHC4#E89iXAbn423~gi8Dgiv`e|B?QcavQ8J60^Cp&WymPKfOt|QlZfGY845&jh759hly7x$g{3f*@c z0(|F6D|6?%kd*%v)s}g39RYX1<7kkd;zxvPu*VKj6|7XjA`Vv7$fM@@FdD(EA0-|2 zyh5+iYT0rgm3S*-9O<*s{JN-~X-Fr!NZX2yQ@H1&bid^7qAcAv`8y@p0k^tAbxdCV zAu{ZkFors(8T#V&U6qsW+QNce(hdzd1swgel1G6Jv5s|G%su0`XSQdw*PqH@A?g-K z%BHonB}S`+bJ6PXhP)*=7Lm?KU?O=a02{59E+s53Y#NF5BePo9uII<X@v@g%4ktp&zhIqu)+zEX^>@J1qr_o9J ziIZnFcghD7T21aUF6=Uz&k_T?7S%jNOSJ0=!vm1CdhjZ%2NTk<3{7(MhpUTNL*+zN^#K-fcH~mKj#b`FU!hw zGh{n1x&___*Ox`%&*qxM0ai)K;E9+{@Y*@^S`R_J&;@wZRE(o`)5ECk9?MkIJ{uoZ?bw^72jvvaHNMj;f-;y< z)AdL680zx4^0aQDt3E|n`_#BuUOcIYYk%VFou^)nawnirp9Y~Hh!KTFki$?o2RBZ6 zenr-?%jGk41XVj4XH01!;wVLGI{q;|hfkhY0tyVel-#_aI_kx5$ZvF2uPst*38prOgf-4cs z*}zT|6J6w)K)E*2$u+A-n_XEfuyW%quq>0rg6Uk|u*JZ4?S^E+Uyo2qII88c-PVLH zyN&M`UB&>)>13O=&0wFIQJJ;@6ZE!pr)&U-@t!Hemc&lS0B zTET#w(qZo$IO{n^nbN(5sq_?8)GO4cYD3b1hf|felbnvJ;8j)S_ezAKkWu`v&Eku6 z)eG`=&=6E%PK4I)mPhqemx3l!^ehGI3g zEDTdg=@IDbAETj@VJ?;falz(e7th9 zO$*b!xL(SS(6z|*de=_)3gI8_UEHml;zs2Z`>gnq0F$J9;o*}9jQ&#Ut3p$rREFg4 zytRS}E`w?4POfycmv|>Pos%kPx+2x|a}D~-WBTK!0=#Qr$qVG_B~M9A7JMo+Nz188 zi-~E4gtbu3t0*oG4!|%+=pIKczccFkuKBHBU#(ph(sN+b*6&AZZzMTkTrKmtSGG;% z);v%VJaO_X)8vki7&e3cpixzL+_W))f6yq7mspD)X`1Z1Xe%m_iM^dm4VEKsOyC35QeIS5a77E2t8U9qnps4O{g^0fk^9lQb9w4|L>U^rWW;-rk>z82h)ik6Wjs-Mt_bNKh+=t`lwt5i*>@j+dSm!h(1yOnQ+ z(Sg4)Ut6(RKsrW>_snV1!&L_}tCjodCzU#xqhT5^241dH7XK{RL5txADr+Z|$E|2Q z4BTNse)*IXXKgEU1zZ7VLz$buAB6AAJjDS|z|Gw$yD;FkE)Fl#C%PKDc-*o$yf0ra z(QyW{oCOzpSy_4@oj0G3KsxMV*P<@4iW31LeKbNWC^ zpayDj#pvo*7Z7;e=YD<^N~9o5udwoU?VvE--}`Z}X{=C-4JChJA)*~VP_Up?#&Vry znR^cra|wAbGt1VUe{bn6{bjp|q>7|2(HpC3aKt`T>4eYq=tU^v?G3E~F(JRY(yoOLeJ0AzXi)cFf>h1eEkhIIl9Z)|LDeNf;*++%}6R-x5#y>wGqBM z-o=FL(r453uiPTgR zd3RnXVUfBa)~w>`p3!-!w0`2O_fhrl+NIOqNl?M{L4v(K45JIlpQNS!w?vU#H+m29 z-wLX-w~eyBby!m=b>yA2+&YXtX3J7&%z2}$A}U3Xdflu7bIxfV_3QaK@G)W<-*;W) zFtZc0N>o)@y1W(`$PKUwQn0HLr?EDyy(kV)laT?4$EJ#9 z7p;t$0|nx#n!+thny`eVPGT!>oawn*l=E2N1{jGJ#kJZgobYVuz?@E)KG9l|3I758 zg%_Mh<$jJ?ED$EWiMwHJHc@~%Bz*$~gu0^SAH z)&6e+GYf)dJ^#K?d|9_?Nb5DVmF3=@w^Q549kh@h(!{av0Rs0=QtJEpmB*ekcl(1p zj6(TPFyM4ZhZN=5s#&O3Pz)XiMLt76I`c&`x#adQAxLkZpRS~ z-PT^9afE>4x9EfHI&n}v;w6B%a9+STXsl{BZqgi-Gzbm7)WK^8%6{#3@h3+0HiSdq zHE0xHWaJe^6UL8Z$l7FPsn)t`^h7LSb2{`|Ncs-T&Q__&78WK1;Ny~jTvSnw^OIK0 zvT{RcutG3e^j-#3nRI_q52zG4?YlAVA!<|2Y%TmL%fm)LEzh{fqg`(hQTMg;Qi0#w zINN0YQD^Ls7KcZ~4m2);P#F}b{*yKF2D)oWr99r!Ba#P+O)Tk+I1J7 z_X^5-L1NSG7a%O3O$w5~aVZg=wu^RhcfA-cx{AjuA3|6(E>kWMq*5hROep6{vQ49$ zTU0);CT7&379kSAgtzR*L(Ub+ ziE_JR7FnlG*s6JH2TnDNa;`x2TW;(L0=|JkIm8~8$@LZmB1W?G zJ1UIGTn*Aj#M&kf+aWwice#|&E-q)Z(N>}j1EBaTM&1`#AQ>^tn61J;072f06^=}gWx;gywki{jOd zx)TRp-c-&Tu5x>Iei9ugSyaLvxCE*@H(I<=Wka-J(R9vv=1wXaH(OnS{`F^Mx-}=_ z?oa7ksi0B>Tt1YN+MfbCWF*cIbXWjsJz$nLc8U8uY@%VqULIz-TQ))-&*VF*>959K9Ebz=*mx+j77QK##FLbNCUi`GNLoWKJ?qYL zS$H#UK!*Il2h?JnTf< zl0)UQqDV=`%P%a>@sPc#DT=hh_hc<9!5f%GFF$Y(wsau9{EU^ zrM0}aM?0J_8V&5aPTI|O+-Ujn||NaH!?V@j!cx%QYsWrf( zY}#A!JDbur8fMnt?@r^D(s}7Rai7thwgwpVpG!PtL5`^3$3mINh0*}hV2f7^;0Fq^ z*<)PfHFn38^+Vy(aO>fUa8<%W({lenVRAw4ky$W z@LK>^!6^%5-t&BIr5=jRT`gnq*XL%A6WZ`jA-F0c>)+84MTp#59G5C+ME7xi0)q*pFFQ!dt9kJii zg;Uh4OkE}`0LbR`NGfQ)I41OzLf!Q470xpvU?0(2w8#*p3E%KDFaL0F+oIF05;L$~ zu$u#iE3je`P13(D95W%N=UlkzO};$X7f2=iSGs#@BkgA(aMw!9ex=a&6C=v+g7Szj zr_n(Pj}Woo&7!9~JzL!&%^^o(=}Jm{j~uL#@_k{v%7pumG7eywCIYKA&fq;j@>dtn z&z}^P+fGX6%>!Wo2Tc0yKrOaGV1_h}(VSUmeiLwrg`_wEY(4m9fjPNhAT5*5<(zD8#gNsbcP9+sA)nVt5cbR@{fPI?j4#8mLW5E3Y%h9+q(auc z(Z``~d>ejNd&E-fp`0?z^ZG%K_b>D`5eH0+a#SP4MAxFi+MGdv#G*pj3?EK2G zG1DtxNRa&QcARbH4-bV8x>(U4Za?&*FqS~eHZb{hc1dpci#RMP*vZKv3eI8)8Dr|F zPSFMXVR~-9xOzQ_OIuP_gEd${u;Z2w_cF=w5$5d?6)VcQFq;*l&OWMvd>B7|#%ja| zDpsaK(jl`}Dts8R*nH@9*$4*yQ=(_N9Am4>dNHOg+ntfG8T6!RNKX@VMRx{cYMjAf z>@=DsA|Hc&3~a8vWRg3=#7X%63Pqom4CwFYyvAp~3|eWbgv6`|dH<9cns&n_yz{u9 zo;0K^S@{pWI4=n^Alb)GocSidLy40X8N;&b#R-Viq!gEY6k%i+%^*THwa(p>=-d3@sMi3q z(m*%%bJyNZ(wI%W*orLq45isVs5$^)uMl_g^@WGd?|f{{PXCBpw;>JSA2HuqkH65> z#7bvB=!C|`V#}vXkR73HLWATfZG5HRAfD{|;CKG2Kq7w*(^`-@ok+ed|?jL@`K0BB_mYcRpcmIuS>6OP!jfii8&C?65- z>$NCScN&>A52(0_?2bK|g$Z>Js_+Aco5~c~$DT#^?^|FIkE)jpUo~lY4q2yZ1^mCH zh|(76K}Ym)?*sF<+HAx=E%k(YvSB+lji>7TicaGyQzzDqtDq2eT1M&` zXjLU}I){B+d&VBpL0Y#zRawKYS;ik_sX2re&vWcPDWA>{w2bQdv#)l^AffkN++h97 zZfjXKFLfRsXw_&|JqD$2pRg#n45Kl=1iy2W-HwEhf2^dQ0bjmY6~?TuQlI6yyP zKJ0+Ek|R=o3zUUl-7y58AitzcUs$DpVSjj#E=g2Rfp5hT&c?nvOZ&|$?7~9(D)eGK zHC=LWEuP*&0cP>QRm(ZN2X}R1rq5gn+9z%V9%FaTT=6*+Lkk>hsElcaTsJ5(H&Hk1 z72jJs>q!}N#tn}&Q8E{foBp0#lO~`1UKYv|u=@%g%{gsj^^D#Y3SS97orHabd@B~b zC1+Bn;=N_UcrV`mLAY=cdn^v(soHY3QjZbJfbkZs3eihUMIO`w-&7V*EC>9{d(vha}aJMEQO8}JsyhA zy3ltSqOI_XN({>`G02%|9B~;hB8xdz2N))y&d(Q_V z{VDrQXKn7luSAwTAq7x9bD|kF>uF){|KU8*rF8Ssj`zjW0O9J)CJzC?Vh0+XN|9;c zjw|e-SyqkY=i6H&7(b)QnSAvx@PJgn2i-Pi4JG~oq=u!Tc|v7HnirPM8Iv1j#PL9B zZN#brxdD1Xj_qC8@jOMtz6x23JYaV_M9kG?moqmV^7|rGiaVBgJ1fEQfL9fnp*ji~ zmPfidH2o8hWC1SKe)7fG<)7@+RO=P@JtSD8Kj|&=Mqu-WAF|SL6!B=e4mP70Wc-$j z?EpGvdrFP;)bd6*eKTv~)UfjeOZwyK0Xy};(=d+sS8tV}Sf2-&)Cmr}8KTVrb&L3Y z^G)T|+&LmGi>!{KTBwQrpT!00vqJyUIDqOzjoFFpn-cLCxyR2HoatoxrS>@ z)(bS9RS5Q!`};~fyRp-o(R6_5InW1xEW7iBVGx2Cm)CMoHoiba)Sz=_W2$ckUWh`t zk$)D`_+`GsHllA?0&6M+hG~B;&?4YIwtMB5?Ulpa{f zbTiD)(fq3Kd z@3wu%8BRfHWc5bt6BJ-w6StuwGxb10B`@d$mRYl3fgN%Du=`9NyxZIhRTNu`S1deb zSE3i5sZh1jkUwByQuO!1qTg>M(K`(sImD+o9Zv+Z*0m^MzkN+>=Rx7+XB5O6pII8J z72m8KXg_79d82K$-s$D8V?}s00S3GM{AQ6UVZU*;CwZj{C*4tT6l-Uy;7J0}8m%Vxkc?o*n5pYH^;cu$xjs;lkjN7+E(LP!m?gPmCYF^Trt=iHH^t@c@T--f{c@Ia6Lfn3Q5{y!hUP< zqzOxEoCSV(ipT~^Szf7bNR_>mp|y-=*1@oxR2g-}A$egWUCH=UL@Ic_Aev1NV7nTz z6#P~BBIO39TX{*$!9riLVZfI)ua5e<2V%t=eS15oJWQmE8DY($*U}Gj5CWQb_vFb9 z_TVc{*|FTLAH$hGEebILj-kyKaybrA(w%Y8#5L z((J2Q3cf~8-u>cY0%A#6v(%qbS*F}c-aSZkM7c<#GM`#}C0ekupGr}G;sXn_su0;M ziSps*d-gX$Fke*ho+0jKJDfNIeqAC8d#ZaZ$4;&u!1%qvtjO zdmk--pwIYKfFkh?2y)O-Iz8aHtWoUAAwy!-6~dBhv0d3F{D3i>DI9^)kAcNxgggcj zvw54L*=DxJWv(CYIsSR{P<}fd8RdA^SuQ+b9GV4%p4Box4xq!On`Bnw1S(@A``mE9 z+cq&ZEyWU?tNWcZ*J;=N!)w!4GQ*=T=4h&;!|FC^foXC6V(`VO`lFNQi+a8@^zNGW z`PYndWgJEgr~|WMQ~EO6xUHqu(=xduZHrp{TE(TsxUEM2rJ3rb>2f>!sGCL=u~4jb zW1vU&&yAu26C>NcN(P%04<_x%)_&iuKF0WgkD9+o)5|YUpFZrzRm-|E@YwcKCv@;1 z`*Cu?g)-@raTH2KWBFQ6mGF@d09Kq!ToYq z5b|>I%a1KeyXzsT0E87agJr7}lrErx9?l3bOU%72{{*?!z450x5h`^267B5lU1<4g ztEt)aVQ9uItPiWq{}e%Bao}~Nu`4N($WaJNHfSiCRGlHCtxEGS($Q65b9&6p_9`SB zr~REQV-mdy!ar3nAvyj525x=iCGzW~AtZ?d^@zo-3!VnW`LNnys zO?1`$L!lGumcYD_X(@G)KVvOL323f_W2nK%#e@h6Qy*zQHQv9yKpejA$aYuXTzp?H z?L1Y7lGZFtL2YMkWxa)v#wO3u_Eq1PL=VCG>L3YNf7br)oTS%I>o;nSp*BNNrG_l5 z76=@%pllJfG=zc2+g>{Zf8qeEESP^7KaUt{sOq1+wCkk(?u0@iT(qM+ZfjqecHoWN zRfmyjCT_WbTov_q!f>2QJBmVh ztu(TpU#?IWVejp&$}cJ;ea?cc*QC2P}e=o4r=4ghQYipMljKestpc$c=0);Fj}pO%#J zP*t4;j>ME>QI?%KCQXHvqdQJTmE{m!^W*^X5{r#|@W}5=pzq*fHODTAZ|xnI0ko@)nOK;z62=@+bMk7N#7A?(i!wY4#*!}6SCSClcsW7wcBgpgwT@soP+ zBO`T1H-J8N;o^Pp&*^w2O4|_W3J_0vw`&^@U%5@QcUtKqr8YsvZA~=V^PxILJyt63 z#l@!vJD0#yO;>q)Su=0%ug_Qw^N-UKv+-$!Rxz<7 ziAOU;ZvHT4hZ$K3)^Xyv#`}9{cQ}mvl=+`(#7z~t*#E`~nP+QK@|(^#Yjx<8FbS_| z%5{b^({|A9NX;Dw5rs1M`RMl(@#uCT5{b&r#ADm4BAWYPuACu_eH1yP1dyZ+cc$(qaC{xH*1<3A9gjZ9c@o#?N{ zt}T*d(i+Sn7v2G7Ny8a=R`IX;L#vcIkMP}rg-Z1b+fHYQfG+El0P~UEST5N}32i9r z+N>CLV{;u)G0^Q<xJ`te-rsI=N5 z%kkCyb%}-c%uSLdvvV-#g*-KTor#rxw#%^LgCS>PP+Ga+`L0KnlJLQwo`Crk#5APZ zvRIQrt9t6smDwn|(OL}QivMAjE%88CB;nf6S9Ja1yV3FdS{}~H3$e%JfOtLj7k`il z4Lruq76FgXtp@>)00K{lZWsg6;UAwE9R!}rM!SaYS7kGWb=7h>tNv7v@7b$G-)itgU-p0B8WGYb1ts%4~e*9MYSa*eiai&fNtPPdWGWc}7Sf@$tP89ZZf zWo8wLgRD};t1o>`DhjThUM_7Kj~cS{8Uic)nMcD@(WzESJ6p#@ZRc;YVvA<(!0_8X zN&j!(@T$*SxRj}pVbdls?~VW-98E7wb>l^An)*sY04o#b0T=D$8c&m9T5) zsc7Cxz0NIQN}BUQvky<$Inb?)7@H){{3-h?huRyPCTK^6tt+tITCWOwCZvVuD8v&J z!!fzGcqX1R)7TirZ0~YBmuDj$uUun$f35VSt=Y*r0TfZF0G2bGihac;B%^E-)=6k) z?Q7VMPYb}Qsw$QAHqvfu*NkuD!W5?EUEGU(+l%VpKAFa)%G)KEnQQ|bb6V_WDdvgo z?syAZ-LX@}JjTcPky|#L>^?o6z5=n9>41Ju`?F-IDir1FkdFAynN9a*M&ms*bvSKM zf(;+NQH}3F$mHWf`u6YI@#%mQO>7AKiM4+@hGPr`&^AcU)XNuq>^2_IB$WtWTId|5 zw0QHa+Z^EXEe8-L*xO7oC&8iBY}2>MAH!C*cD%Kt2u4&{-_1Yt`$ zAdE!Izb7tE^vPHAkj@o}C*_No1Hh}IC1<5$6~Ujcx{OWtwjUzL$0Zvg7TaQ(fWBOD z_#V(xmfuS$CM6jQ+|zTg`RVU?7ZpB2-oJ&PknJxFuX`3AwDIR@go}wMj^ZODx+mBZjaitsY(@ptQHrb0OtBBtx{f>ZN$G zkNuF48oiw9;hzrpXt68TW$*#S*`%ZCk7vI>SLP-35024|K%`Pc3OEy46sP#i8|>f| zOhsi`xrseE*j$bTRx|ZeB(!UMv0NRGt zgZ&Qkj0u9@CKZCN3)&UOSfaOudpo3O`*6DqpqUCUkG%bQs1lBNSxbZ)cG9;MD!DF>{?=1<6!LN z)j}jd*@!f2BFGe2xT>>wnl{^t=k0Mj%?WkrVTR3zE%H28rUJql*DkK zC^V89hKLqL=V-0ma;{Oe-Dv z<3hV`k^TM-J`>ubyA^T?3%y4>&{EP?!KtyJk6zL~HK@^CmNHyjwb9W5(meR?x_*!f z?}2us(ZY_)g*%^837cF}(6I-)05%~q(o}9*mg&W`20ij7!PJQ;$ z*ja9RNy(gC$UzW)&Q8;G5FVO>Dunh4V8xO?Rp58Ku9LXpf;7_#3j2WY%O4tujIPRR zy9F<;!Fa9et)bC&__(hXo1)Khu4z57u8L==t5S1LL0Sp_V_O|MVr_@!00k_GV-&#O z+4Qs90l059nP62ulq@S$8YrwbyfGI!`$#fZ7N`JF1u%7JAwl6Gs<0&;TTOR{Qe1LS zGWd5qIrdlXEIuc_tAULvzyTdWsDt|KKzI<`Tyh>jW+R=GQB+{E#=Y1XzwlrV= zD_5tSSWZXiC?Ji3$;rzNk(e0N?+`T+d8B26zc;wG;xDO&_5l%ra!0w`7u4 zSEf=m)LkC}dOyJ4K7RoV8#uYC3LW>cIWnp3`?^UxwVCnT0jt}rd$E`Kq+-J2S+Omv zk9y8u!>{(Hbe4m~>-Lkk4_cndxcn*s`YIRhk;qzJw-ac}Qs}^VSN?!#Dv^B(e10ke z@;)z?GcLU^eRnub_Ho9H7Q^Ma!OrVQZCR(f(0-e#$LJ5v%Yps?SQ#n*Xjk8Qo2OAC zufXJYmXz;dK*~%3P4-&0iw2W&=!Bs$T|!T>_h@1+DQyy9bZ^0_(_37G<0)VX`OrIl zE!Dt;*;**+zQa~VmRSHQ3~17ikxgi?g{?>hTM?$i{E#!&D4U%#7T|UhaAa+;INOS! zkMM0zRru;yE$yC2|B~z4Q)md+*)Z(Z97@qZUeU-(`waDAb>n)2XG0|{O*4z+ zPylRLFn~sPCc@=y9E0jI1E}A>n!>E=ak4skq<#WQ5jCfC6{>i-bYY*`gwKk3VI6>7r3%j#$4NLdmWjcwjLMW7 zNkQRhAx74@az-rzLq~iK`jp$hLbpg89Q$jSlo6BVE|66|RJK!M2>ae_BP@vZbQgVb z^zK&kTC*lN<%~+VIB5^f+~M)qJGqI=d}`-d+3`Y9b?YiT)qz+{RRx69k^gZxOCbXm z6u&kIO$oLIVJ;nMb1L;1LEBM(p1#2`$$?brWk=cQYV1BJtpHm5*WNh4^)=*WQ~Ee* ztQ-xiBvNlzGrt(bh_Rrx=jCRWLb2*nkum{roL$929kGK>@pT3xZ9xr737W^TO!IDX z2>Ce4z2D4dvs#%HmqL4A9+I$Dc(wWT-O(Nn4w$Ja^tnwX2B_iLyw~1)jSCtpM6% z0#~-JTcyDk?D2HWuGV22E**)FR2fF_bzcpW26-X`8?f;+HlAD#u>L_kMLyXdk8*Lh^*Otnx=kIQhm375odQFwGuigDDOuzsga$@ zxP&=x%gVL$R2SDm-@@XUSxwQlOQCI4x~w)Uy?dN?n~~2*hf)^n(B;Z=0q@G>0q{>ilhi0vhNiJSv5oQJ47}~{hf>>_5xn$>N3=0rx8Zx z6fH(uy}DBGsR}opI)om2x)oY+B@9GNGOwaeg zyBKf~q`?{TKBzYAw&Qr7_q>IgY1B;sm+46o@BF*W_FHJkveHHzRjrC;32*-T{7iqE zCT`kP^f;0{Z!l6g!>Vn~{{ka2O(83B6|pyZrmDPbp9J&)Y^6I+9*U%7l~3JwCJ2>Pavd=d6@m%#eAJF`g4&6}ZuJkb6ZLxv=F1)T{l?Hr=!V;H21xK?m06O3wnE$Rf<;~T zVVowhM6C(E>yloIs%=S2SjVi2){#;kgnFLtupt$Bfcn|r|BZ+c{Vi0*`M&I}xl#|7 zSh*KiK1zB%Vm7%#omlZ}G&rtFlg?SGZEOru||E^u0jQzJ6_I?%3dxSC*?jI=-S*k_*)`bAeX zonHi{tLM7MNm~vjyS>M{?#*`SEH%MLU43(DwX?Krc+IGdzO~%h(lsI#x$&|)inZ|~ zm$*AyOw-=caN(C|QZB?_dB}OfM?`8WaQ^tvOlwgo!3IQASU=wcJ{kQMEo+z7kXO;* ze6wtplEKZVM;U@&9DcJZ)W@$ScEs=8I%o{1N;ioo^Mm&FzMMZO4VFOTw$O+4_(PKc zQ(R<;?Nff8Z^X%e!oqC@8DsashtA=M8W4+qW_}e^*daM?T1Wcq;*v6v zZc=2@UL?)C{e7M9{KO*_SHz-{_h7x}df_4yEG_mafYva~Q=>|~B%814_dTgPL8_Kr z&Dnz7ekels@v~ z31=G?F`&Js{3uJ25PC2NDP}qK>XBeW^mNMk_|k+5@mVisClJM66bX9i91$prF4BXs zQ8KI<&t;TR=5i)a8@^qP9RFFX-&qbBQxTT8k7&Vx6sb-ZksURvCE_6X0H@w7_AcKv zn3|&DD?x2}ixC_hC2^su+*FWkX3tx;pm5FJZ&Qdj^d zAO-FrPEN10x-OROpBs66M5-ZyJwhGYSOUPpp9KJTKJr{>Iv_cK)W4}fsZgcBRDY;| zsQ{@!sQ{=zs3fa+i*?Js!7VXG&gyb}4&_Bmyah4zn0kS30loeN*nbiDoeln>4@ecq z5`;$hYk)#8G)WRoeEiN7`EqxJmn}<$hk`%~M@x(XPl`YaU$VPg=4bAQ(Cfq(m?9Zw zJm|0wy)U(IWt92f(33!uVE+woa!ou~G-y1C9IR@HT(1PA0;mE&15^oG39$Hw2CNcf z@$TAr@M(}TwlnUM1z!!e6`>Zr7Q_xY7r>4=7vApgu138X0SjRsNNv)l27Dx7Ge9$t z%b)c>oB$nvuKc$AWbWH=`e^uAb3-Pd30h%maqWP1|LltNq5`l2*eu5u+2DWU+^Ota z57zjrCbwtBafZ4g+z@O_e`4I>1RUxpkxP1Ok9tdW6V>xAVy&7&B}ob_x}(8>R1JbONbB z%$isvY-7w4Y`}UjYf$@eLq?|~ZT{ab&OL(s_#)1}&c4rm`@cP)&L5HB93i{ntz*cO3-XTjGfgL!OY< zB&#on1&FXLBpF($IuM$%3IUl9P~;BV+xd+6n@at0?VQoAT*2#avC)oXBog->*38GR zI$9DhUjl;ESH=AqAq+%c{?FLgINLyiS63Q4-2G0j8$kai zfz>ACfwQ0FrVm*zIE+BeoFtIU=D@5BT(zU3_(Ja$H(t)GuHL1Mz`LUUYdOAhw=~pe$Obmhwx@4lf`6N_TH=JR#4&JJH2OTR zE_?~Q*!nfeHLP5#X9X58ta^67waX$a7&#VC@(iHFDRAF0JIE7FXhmk2@K~78*ysO^ z!w}{*;Aeh<`Yc6{tVAw3NWT@*M$B* z9G1bnbJ!wv;3l(Rb?nAx-$`6W56eng)kN^rG`JDF6h-hB7xkA}5MD?t z-XlK|E-zEpT;_p%xx%A zraIkkK74L|z8ikd=(m|(IR@QA&~7Hv?_lV+Nrs^eI;A5~2i-PiR~z&@@rE}B-S{J0 z9-#YIlJAoH+?IE^j!fVW%%`JxV&+a79^Er}WM@wtAJ5KhH;lM6dC{^$SMtZ!Y?R3z) zNVsB-?zmV=xJ)-3-LumI-DQqV->ITb=m#LRb$ZndEL`}xTEb3L#(w?Q3Ju#>%&i&2 z;AcSYHfhpMj@+LSNoRZ*w5Mhv_5nhOR^3fIOm1#)~mB_?Mt>G$2O*3-K- znM_a6R16%;*4BFa&3zJI+)m-5O+$CqB@3urlpzR$JwHf z#-NYp1P9V$ziIT3puN@MLEO;YXW>EMhI);V?wN*rU7X|nj5l<%9j;yLm}6|4{&^#( zzEO?3UKvKxMb|5->pYW%!ncJ#r1tL=j%@+IN8#Tl7}Z?J{B{DrhvDDGAKd_U55c>E zJH+U!{3Pda`_q~;Wr(mq>e_cpMIf30xMO4tm#Zm&D{tFwa_edamGK$$r#ke>d zo5X!u2$R?Y$21Vf@p{*Alfv1CVPSV(C0ycYDemLi2*XAH?Bfo!_caX602}8s0h+i` zyMWf^XYeC80_}f&0_{fzUg3%cx=DN@!8kA5#<%bzCHq^M5;rF{Ea;G(HcJR{`zWO3rBK zE^*?@^i4Mr&GXDAinWL@IRDF69JWv{tx=A$K)BhVjQZkI$unIA=L?3Yn$3&(&F!k5yQe z$*CrU!Zar0*Nzu(1-~*N+4fKL-@zh;IG>+ACV)LZ0%>f^y5KDB`qletCn}w&)PyR! z4DqP+V{wHpeLyM~luH42HcvGi?Fz!w1hCebmV0?aWgu{vx`@xC320>hXtNV(`xS*K zO<`Q5#$Ck5U9`qs{PLk~o`IJ~nmay%cAfxp&d9rd#nLAd)PB#sPK~A$=0X~2DljNI z3TS_hwD&^LW>_qOJ#RikA3&EDE!*HJ<>V>d2;w$oD~JdFn9ThaPPy9mO=l;TT%&Y0=i5>`f2K-o z&nj7zE}fAoll<=zxr(OcT1;yezvNoHCAP8=i)hf#e;4yVFrUhp)uiwuxb;l#>?xDj zZd5vfS9BfH&P^(@MU%gHbs@q1=e!xp87%J_Z!v3){K>176WBQ<_j*#G3`(#J)uU)6 zEl2?s*qLQi4RkR}-O}}U3~n(CA<=_p(HiJ{8jIW+@w`}}#WZgbihnCRNP!mES>=4b zHh)H;3^kzrm!8|^BhiDtR5G~TsK{m}Oo0~E*)v$;cRo)Baw*WxWB;AA4)po6bCHZ( z$`7U0`F{BNVnQNMhAswq(3$4i6(C~CGgA`B2b&1QxxBweVlEAI=?1W~e7%C{%`h2% zmJeOvGAH5SBN@Fm8e>7eQ63I+CT78)lepB#(*V3cyD^@2V&y^s==_*3HXWJHi%Z>?u6rapHc-V_>P_Yp;}O&H{ujm#;VO3|$GQGv$0s@`gXmCX;YczuOoHn&BKG zUwgzp4Lb!+>%JnO4O>@)var0y)0UFcwH8y=dT0p+=3gfeTae9~HO-%Au-aa5=0|e3 zg@^EOB>K<1<^R)40?iLuZ~Nm}qf2NQX~Pk!C$LsmM;M(jgGgH@U)S~9!U;e4u#Z#R zgUZKZYoVQM7%e#mwpt_GF}M76o~k+5#A*G)$k4?@2p&F04JF#!pwNRpL45(a+ranH z%znw!wRo@;l0Q(EH}9mdKu2=DuO#J%)a=2bK--SrqxOc}xNl466s97PfsdN12@y%% zjz6RJRr}1X7n_#Uw zL!wVf#OpKP>G0p9LBEdQvyraqwZ`2XTI5~qhs<1~@v;eZ%K0 z`5*Yh8; zDN!QUhNuX1EXqU0xBea(83`5{AC~6{Xd*_!rB9JCBO6fOB5p{ZnrHNJ>K_<6Su0>+4m5|?apLt5h%_FYO27#4*)pc_Ki~=fxK5llb zdr#jDQuqb;A*2i>vbSYBOO0gvFns0BVk^O=gqMJSi<4;9QVzadJUk%m1Ey%Q>vC&}q{?msP%+GmLgHPMM%OO-P0negIzC}*dN6PU0@di* zRZW!zdkV#vxHYZw( zEUPfi?=Exa+!qtVLe{M22~=xc%%J82Zk+- zN?fLhV`03NlEc(UmFlL9`nG>8!%lLDunQi`uaT31IEY)>3^!xIIb_ihfGr=OaHeHaI3K0N70&B5&2dIk;*j}E5#RK7+$zo!)u zMpQnTU74QVBORkXz3NGH!>SN0$mY{=Xmt2k&;EgwfcoH>$j&Sp8 zRW(S$C^TXbDgv%rT~e{PP|q`nVIn0Qg)w#QUOi}42aZuVr)T4E9FB1dX~tSB;W^If zeQKks3c3?pR`lMe2c2FwS3ymZNQ0Fv1oeT2%C*HTV_P% zuGi7J<2tBd2tEkkp!=<~+K$H`47FhoHUU)|>t2PuWliC_a9>lTtSMR@u8wqvPc#YK zUoBL(`3}@z471wWH*f^`>PU6?waaf;M^8bd;VmzI z-f}ppFQ8HD!W9_&?#B9tbFi}h63kbE?bdV9kX`lS;=Ty)=Tk#>fl&7Zp~~b%j9gW9 z*95FP6$+PaNG??x@gi)T2kniM@YP1%{UGj!p2n)p7om9`tP3|*ZRfQ}W7WgF7EOdF zFTb0JOkRFF5uLnzv3>&D6XDPW=vasM-*5?bcP4OcWg?P@o`=o}c<fR~N zw}tX($}ZcGOujDLl}rIWA%-_?9vc{-PAjXxrFob@{au3zgj8;ogI$M)kETW+A5uga z=pRZ^q*%RAz%k+gN{>2@n~7@35tArf`iVg!@UHWhlkWC<(4?C z#5icpo8CiY zr>Xw-^k({xrgZ)7=K9-XhG?W+0(w=suWn(zu@+KsHU2-KMCrDjTer5OjG+_zF?^o7 zlEJQil^xck0XTv?1{H1&j`pZZJB&y6p$xINsj9518>3(p!(Ar4BF8QscQ*Gwy8~lA z3&_M_43&y|8n>%sSl!3qS#>G<2UO`wIKde_M~#T;w7$9L`5IrK9s9TUA3W5`@vmRx z@_2vXkn96^yF238i`k`(1JP7<@F_ggw06>i^!B zQthEPy`JThu|>is;NzIcDOKxoo6qL40|&4zd@2sFV9_*`G{E7raFn8MIfaAJPs6L2 z!uP70v)qE$)U9QP`B({WVEcXrzQ3@Nw$rq}r@s#aaQ*c`~a{_)S4xfP^WPol; z_tKO45v)9)fgfcCwJIG+*}lb_&tQPY+@hz3mi7w&b1;qtbWUx=#?eA%pZJ0Pfq}JK zc2dK=0O#?Diy^pgb#55P7X23(X!X(k>D1^^6t=2kiuH~59Mb_de;h7hil0}&qCDx6 zFiXzx9ry{{{gXJVzcsI85&98J_-S|-kNX1Fu-poQ$~)~I_%rYx9{98B#_%fKhx7B; zcYF+fL1m7cTL~?{#F_tcZr|@&Fe1GJ!+7AY!LJ4y?tUWO!)hcmmz zMn;B5GpRlUu)nRY-lSoR)+E2{V=JY=Z2f%&Jy*K8;XhH1q@K;}8tEBw!^EbJ>Tmt& zwx0eWI-FRpo`vY^Pmc`r9H&_JdF^h!`8c`G1V!(R9dh~OSqr0SVm;vj?+%9^twC(y zN~o@rsy+1x`ImvMBi`JxtE;7b%hvV|iukFrO=HB;K8m~^UQJb}LT%cV?F3Z$s14ga zZmMeJe)qZ%KBnChD4a-pRtc%6;%zX_l5R?T(uR_>MX;E_D^IL$4N{~`WU6QSxz((` zHTX#NFiBr_3>QglZ+@)RdGLGi2T-o`tLpev$u5DvR-<({uIk^Ye|ve36!M z>2fuE!O+?`pgaW&)X;8G zz51Vk#3_v4?FH@rBhQdpp_lXYz8L%?{AsR{b;)=(uRRA(xYw{3{!Q;+szaw&Cfn-OMLb#Gpz`ppBL@HE-LhFCNq6@@ z2bOi0yZi40%X9x39k2GkV29qkPn9SBJ$ecHI?F0gmYs)#<8U}K4nt?*8FdO4?FBem zb^(r4nI>~L+8&xTPb5f1bzhfS_=lo&8Dj0$#;ar1@i)M#j-7@`bzB{+M%kZjvT<>? zNhU1(R*s9aO%Ry49kt zo4=}0cSC3b-rjQ>79|s5UosQ$Q^`aWH%-9gI!ER9(kWFf&%#MQOx^0wVN;R%jPma4 zitY*c#j{X%3YJqk;qJOa;XckQ+^4@zz^~|Z6OKyaj5=}!rhX~Ktp5`J%4_)CW|R6!wlx%dLK{`qb=~1^w^Do!{#_@sTJv?GYSI(%Tkk+L zw<%+^`QM={`-i|Lbn=YP81hBW7_xc>#*pfq&f<~O@fIA@7o3mGnfS|^KB@w3B!gXP z9vD?XIgU=80@F@vka(2FfN2cxJ|7QV5IB&jj;rp&4mLK|Xf=SBwImJ+oN+8^taAg@ zVY16uRgoc8tExc7j=DviPS=~Y0~ItBp;qU6GY&CtAC_wiEb>Ve6s@UJ(3aP@N1H{O zU~xq#nq{nX>%vM{6)?NF(6yW0r21XnyhbI7N!*CL--C+!ORz}Q;l<}*A#S+@iO$;d zuyg{JyGh>+w*(|z={L!(@M_^Rb6}FwmXe~gmpDR?4t5RE9AI{WvgjOO1x^)OSP6^H z0cIlWI#4T_$rnfQ#%M3AXOcJ#Ar!%P`8kEKdy9V?()8;m%8M6@@rk*h1s=ly=X%(K;7k_q-<#_d?V3rz+ROI=qnk)le*hMP#7~EHj+gv!K|6BmY)1rGE!yMIhSQTJ(Q79>hP7x{ z2$rl4t{glR9vRE9(Q-G=Ue*<@MgpF&p%V>tc}^ft!ai(7PpPX5OhP~xbF{_Des6caBCUV}dfO&NXcXIb9fuR8~e>#M`)w$gy#%g#Y9e%zpXhUKbfxal0M!XuMze=rC`0avo>tvvUwPpG`` z_Fhh2ggX@C)=t2Er{Kl14P_h4n!?rLje5>)15R~)j%WfSmpy(+U>H@#sPDc1iU4t#ox-RuU` zAShsra)V##^>}^kt8>uD?kS;R&P6HKjR5-2u1b(RUWs=y#RSr{4ojanSf z*Lyd&-zcg$j{lbKWx6|yP#Dv(T~Ug*!d3{#AVt7(wNiS)A`}GLrX>`%RM@s@xv5AL z@Q#YEV2NU~i6M#!SxfN2r^dt=5)L7@ zZs-H**Uj(Ad3GhML? zzQ~mc@#h(ii-|)GK9y2StH@$B1Z=lzCE% zh?2iCZ=}tm`51W~80n+G=pOw;XT@Dhk>SR7_D%iL^>CIBKc-KL!RRIW)C)%6&x6sc z^mVa}%~y1x1ls&4OPgmOls2~}hLg!&OR_58N4JalpM3Ocw@b)6>8drbVHtAV>7^HC z<`~uDN$|K#Uj>E^9334}c_4cNm$T4=q;otfIW|TOsOmE%U|<}Yx)*;v8=<9A!?G?` z!DP&nzn+7u?!sRTo~t0J-!FeP(P~s=O}>S`)=tT+FCW4-P%}#2n6uC~XDxIl%?fS| zp`({TCaoY#H!^7pQ#)jJZ~EwT^Qm4z7T?{c+6nWxtGF!RO}o**_B?czY#%svW|iy! zmV)>DXjK_!l`>Wg`gt|rwItR(2zP5PtaDF$ZP2NTAE6~UO`^Q{&@e#QZ9a4?OvfRE zIaKixd8Sb}=xgCF9Rk}%?Qz8+adZuj^d?Z5Q(K_43YS{c^9ZNPecbS8$C^R^5=fX&*wPzY>(Sd%ve@EueVm@Ye0buKzMZk zzIsbKU+gBGGbt#L&gmCssAc>}Tb`lkQ*<*coxdQZ^J|Ur@H!ke?=@Dvc$+p!5qyi> z3J4_}TS1|OZxZ=1|Fn4xP~PT8c;+^*yy3YTVCFVFKL+zi zw`tL7%89jKoN|GX#}hfCds1FMLzzC~)rV+Nn1{A`9@N)>cL)`LnpX;xISnUmbf!R; z%6-ekzCl^J<+5@s3e%znt+br?Tv~Ls+}Cv9iOihcUX^?FC;9m`GBA`3VWCZuXal77 zW`NcF*22Iw;?|DZUsc*dn^EjmZzOGr(95{Js*R*FE!bKDmbOD%cfr!mFpppz_m8DJ zsSB0ib`1=m?G?PTXC(&rl+UCLRw$O)DKLhAvO+zM9AO{CgdL!w(%)cc02)07t-ZwL z)*w=XUdgQ^5gz^zyCk=miO{(jeyVdtFuvsFx8Pqo#~}-Mif4>~KidW-I);;jQY3xU z!k>Qu=LzYyR3`v{Lrd&kdwf*Iz5gAO>~2m%34wqM0izHCyLmv62tfgPM+nHP5K$l` zONb^}Og21xASyoag>OZXmk)g4gG4qU^;KJH>-FA#yuIyhtG3r(t+utj_1^ZroBqBt zbIzW#d(LJF+MrXI2Kl&R2=)XGhXO@@Y@jVBrr z8W2(bs6{wQ#P=1F-xjsNZBr($2(PYLSQV%6+T3Rfj1nhk4T4wq&;W)Jko0oxDPMV0H$sGF%6)I!nR2DNYU@>#%5t?g= znOjZSbbzwvz@C;fwA`riCbOp28jmxQZ)S1MFhqK!A(F*Z)^2mFqqJlfwZhb=1l8q` zMp@pZ`Tlg7rv`btf8kHhU3rXF3mag1ZmqoZKq!3+_Qm>L-LIok!?ves$EmPJ5+NIw z9PEA?xK?Ren;JMq&9NQYjgHkWHL4vWBwCXv8vPJst6FVl6P3+uDr{y~z-DGbb4@wc zR^Hs0&^9cY&~}ZvCvG#TO}3lVBBoIH-ChWF$;1#>xSk6gFecokKnIM;b@6mSA;!hi z0SD?*g6okE$l@Bx^(O_+87#qk8j5m<*;s;SQh!7iq{I>&0X|F~h>CWW;3!#*B14!N zL1VC>1ze;xV9pG<6z(fcAYzS`jXTaxeH$-h&k=&zM!6$bA&WTIncy}_-cgxIa63=- z$oUQgx2YC_+X%Wqr)k)FH3)7q<&CpU9@`v5Oao6aj`22+E=11x@dUR8097U4%)U|lF|*XulWUuUPV-H73F1DxL2C~UXL=p89g*lwrW&_H*%Q`qjJ zoyc+b>7%gSNB5${`&}q(f_B&p+F^1E+itKAo9WRWDQx>_FEZ|rqp&@OiLIF)w^7)h zln+1XqGmtM@wPR@aL8nWnZLYzGM<&I>NiV^YMx!xm(fsz=geRD1?HTkstqP`zBGD< z`mrp+tCtevWjJ1m_hVJ~G94G&<1>Z0KZL%)N~*yOdxhiA6Y)CM2@&#QF2YeN{F+Ly zQQ;&}uCCMy5S*SjMX5v{*Ei`U2Tq1*T77|DbmehrJy>)@lzilE3ZPAd`*c*BxJaib1w|i^e39t)?lm)r?M>-9c5HJ)@JV@%~3? zaoSN@CSH6s-a3Y7n;$yTvrY$_@I+!%h)1ge%Pbfy#uAu1J7D37yjSFuuO0AVX zzvnnb_<8N}X-2TV?urJyK190UaRPJXLBf|FG)Ia&O! z2RK-XB)o;XLvga6=%8%LpsF?*RMmC{)l-5ybwHMWST-X{%!w;eak99?$tP8!8qcrN zYYxM`+UV`0bj*R1g&qYb%cYN|@S|g#tW0{t@tav`SJ|FDB@{%zxW%P60Em7u0EDtk z|3%Ob102@H(*k@*3UP=bA*@>we<|QYhOn-Gg?ji3^>A{ihgqkLw)|_xK=^oe`Le?w zB-|mM@ALl;{xD9#9||S>L4&DUQ}*m4$h#ww0wLbx*9Q>dbsG@krFbC3WB*q`h#~=m zDC!9a0n4rlhA1+?5UWfu#8NvLqJxF|ufPze6AV%028MX97ebh`B-0BV#Nd_j#)7{Z z2n4FVbjyYi{38#GYdNDGyfjLuB6tHV>JbqUqySdz;vU4oGAdQjhn|2Fq^C*~NEY>=vSnk(4EsQ@RcX+DZw z(6dN;Q5G#iFJy}MmZ*s(DTuX#8tfp}uFxeL_+-V}OK2r(a;ZV4T5Vz`YI`ry)>9n{ z4OxH^4FF2i0LW0{xD!<6Xy=n%a2ZDI=`AIzq z1kMwOFe2&-Nii?91p-qW+xa6THsOg|#EVBFp;jLp1f~e{*b4J~PcV;d zS-hxS>j3lEPB-9-y)j0(zuC}Db~t-Zz3pT`D?z$Lr`zeyWR4+YB(J;aF0{ivNiiq) z@wibP{T19K3EbrLXfHjnwR$T*-%nWrlv1j!)aA-*U2c=7C%J%B3~&n1$0FnjRD{z+ zd_O^kdE^TOQaM16soLD63|m*mfmALxKq_k$NQDLG@&zSP8tvIf*)nl|_a`D^uK=%% zdC^itx+ui2?(8=2^ycsG{>*lhiFkQ1IpQTqPpRlIR~Zdh2j!qdf?YJ&!8HYD$(D!~ z0edMy0tj;x1>!|G9~c+N^Ctm+%ha8)5g3*MJ(-RKKQ;p&ABpq}B;!IUQoY?^4+yo%bRO4}v(jJHM7QSe5+mZrt zo~CD#ft~i6s3F@1#B{^;9I)HV~+*{?PpfG+1iW&FCYv}SUba>;#K;HYhXlJEf49elX2fH6K z3Km1FdqxBMH zC}cd8itI-32Mm2nn|!L&znF613Q-znTmF`Wc$ugNOti7KDXgUYdT||R`G#~<*A#9G z%~Ywv06sKHVKH0yJeMux)YiTP6p5kM#LVZ=AX$%S!JfGl>Ex!zM3hXKPeYXl3m4>8 z0iB5qXUXEFPBuaoKQbjWR}qau=Fy30t{~7O@o26RotNI?6wqAbXe`PtPYKO6fzCm> z6*e^2L@0%&G|3&!g%+NSJm?@*NW-O<#Bj*Z09jwIo zSuH5O7NZq6sC}C@aVU)A*3YFntpa3f6`CV;9}=rzf_6frh2#sbOGKotm!qoD0g-mO z1(7xoN4zw_f@~ntHpm;VFcE2Oh-jin0xoQ$%(=-1Q`;hY?8<2R@i539zc;X2QA` z&I#_Z?1MajuWBbfc-r?t9tMcXeII1E&a3t#Ho(|kw13M;A*gus75qC(Z=P>fU@_}VOdZG95xDGmu;yT^6Fsmb!C>=rV zx^T-rcMmTE>18y^@e~k>ufkQj3qtYrEP8`pOJN`AO{d+rZ)4qb-hKOyPH)i(jT%nh zdfCHjk5$50(BG!-!5Z>6XxjDRO-lLyTTJl%;hfzDtAkFf46L{mzS)uQ?|B@yhOTH2 zwefde*Uq!$Kj3|HEz?x<2G+{4*!@VSf21Ft64LXh^b=>K=leQ+K<`O#<hrr4kd>d)?~(Oi-I0}lq(30X zzn?y2<$uwCqQw7pL00~W{ujyJJs>N!KAOh)v^0y|UCR)nhvw-CZK-8yKHRL^(Uw{^ zB#;lZzE-rQ)=yMO%W<~oYq`8&8j|pr-d(@1YUYa73l`3tg^fauYmWct&8ks2N*(_$ zSvFn8q^Xz~)>8k1VJ%P2plme}+s(H&r@^jPPGhIV?t3x;#i59D7FvJ9)7Ck?frIdw>J zK#6LjEzcVx&J`FX(l@Gbi$aI8vLM1KDlAgzA@Lk|F+=F*(s>OqJr{d~MeOVjY>xNs z5ZkF*CpK;S*93yaC0#VA6HdX6GgY-g6mT#G3{kcM?HqbJ!59!U{orJ3rCPoN2<>d8 zD{F(bGfZdx@`TuIF1;{gFJ+`1GT^A%So*yK%504BjB?HA07otBpz-`G;Hag5qn^uu zl`^u6&hMmYfTK<`&#KkNt3sx6O+Y$3C(uRH@iMal`A297jA?V>>9bIf%;w?$1^8JM z@Mj#MWiYQ9?tipNbg?SUw6ySh)tnGU(V8f&Hcf-tFtdeh=9EQ7Q5D*`7QYF7gx>@% zL%N+_RntXlj!+F^f>EkBnxxEZ5^IZ%Hb-008ez8IyK{OLKqC>`aiC>^UzKTZc~{OMivjRmS_VCBU9 z+%taEdN^MMVRHOtA3BVZzk4{So`+Oa<0!oYNA}<6zaK>D$8eH0oNi)`>09D;COUqO zg~sQY=a@X#NcL;Wg?XQSlm*{zeeMg2FXCqc#XAibUf_4dE25eC)pGwyzF(9+t`Ns9 zxFu%h`SLP>-}M2%o5`6yQTnt(NAMeYu)?Pj#`~KJ*hmYXkru#((Y z1xEEc=qiqxx87RITGVo;Kq8xo#$}$*z$CjSska!a-opNbxR>FS1-p2FbbMdbx=buAE2h8fEIL^ zrLHo*>VN8<;x*0vpg(Me&DW3*W|V(hyB1(;4qH{icrT^1cw9E z|AQb#ahR?0_vc}RkVQg^89&qPRlOIzI^5Q)OT%@dfjK6^jScIHYYz`j%q@D`^0H2q zeEd|gU9g#nI-~-!j~ivptJ`q9d7i6rnnawGUN>0)!y@52E7mJhK#p1(s_L`3E5yCI zJpiEcK$G@iZ2G}W&%3!-6n*um) zJoXWK!Z=OHq6&fd+92D&2j|f}BAkRzYX@th;nF&dJNMMjkf^|JgTW`jDH7`OP?*oj5pRZqdDpjPI?9)c?m*TnC^bjo@iZd;MW zNP4kOE72#twTrI8F2hOyyDaA4TAZr5lGY~2?T4ryAHg~~qsNB-dfY8G6Hc=oy9t{S z?sn`Jox%Wr^^5!Hz1W`U2_TN~-3ADJBn3O{MkhP$W-4>D!y5js6A4Av=(H7&>=*Yn zduf|a*CEBl73&Q+-8FLZh`yWQ=eh#>AD&h*1NrDy0||C}in~lZ=}yc9ck#EQ<}X7W zI605gfJoV#}!4Zg0ma`|4xlI$3<+O>>Ycy=)F^!f<6Xqa{ zI4SYCVGOexthq7;*bIwHq8W(9A&x^7=&8R7c_pxcpm@#~AAebMdyfLmNjBl7J85#O6G0&fO)eud4Q1&5l2Q(S0;iAz=sA0a{WgrU;GY$ zd7{AdxIGd-qw!N5fDY6}A~E2@+u<`%&iues6;S#p}GcQKK}&4BX_>=jx!!txvT`&sHpV%y{rt^ zyadzDO0L@_tE03A8P-IpjteVhjjCAOdVU~E4Js2~vKF?cSY~70eM6;(U#_*r??J9E zYUh^+ZNUSD^y(5Wq{OX|lDI;)nuT1;jTb8fetc#_HREEYBo>1dTRGR6)lMz?WcC(xtxeH_E2#AemyGJ`lI}C_TDUdMeyxY)u-5>hBxp&AO5-6B=xzP)N zgt_}*_ld)-Cp|=O(c83%-q-qSIkZU|sV&o1aM+|hs_o-=d@zqunW=lp(d^0fTR6fQ*na#bz5?Q{j9ZnOnA=1UWm-e0WulZ4gA@y zJOd>N&E`J0#{jM9IP^Sr+pLXZGc7xl=btPaazyRXc_dUmo2Qe0kQ@6Oc%Hb8x`9Bj zJ8sks(pdw_)2Ps*R*A<>c9#Bp4Pm3uA>_x+LmiL`!%U=tMN%)IGj*O)&vM%-!ydzQ zUc?((!|jlVM$!nBU&xDDxUE!T-HT2_nv}|IctfZ)A|-3Pw7R7&5^DD1=#Ub~+ur3Y zV}>`eY+2^Apzz!4JQ!LdZOa=WT$O{~>LCA~gJUzs^NUy4))g#V;=^Z`j%`|O@&LMDH0}arp|2SmAy^kT0q-d zQr8*^wMb0H3^dZufW!j4RFz2=LeloE4;kQ{*@&vPZYFwLLv1Vu zhQx6%=&waw^k~)foF<;Ul$IcAnRTdK6mG--T#kXksVi`#iv@Khk|pYDLrcU!ZVMg+ zM*5}PzsOt4W3@iqD)#+nsSaw^()2Tk)Pd#OWmrZOsJvn2HZvOZ)RZ?!F)uqqe0Eu(_w?!=C0Aid8J!%2N9L+AZOBZh~iZI)pD}sHHM8t-7|Q zwn2&W*g2K4+4KTEk7vE;h-u8&w7wClb|-aY^4$Cq$1Di9LW_=C+irgCTD0BKB--!G zIvq!orWF(v_<*qKts49~y@sOR;5JwsYO0Nd#8AQj;K{ss1Ap6Za_%|MSK0u%8DjT=40g& z<)xqL^mF=v2anvAAOE5aCgr@-9OSF@Pt3tb}hhBRcHABH@n%* z%_f9RB3Y6^c!%8tgqR57O?ViAfFOh@@=hQz5}O1;J9Ub+K8o#(6suqr5HS?N4o-46 zG_9q!wPmz+9BXYI+xqCkcC4dQTOSqD|3Ck|cOSX?fY6y_?|I#G&OP^@bN=UdJ`pBV zEJ7`Wj?Z|CKM0>k$U44|Rpk8TmT3@;*q=bAfesDR5Myoe(4}EIyclVVhn^H{@h}rL zq7%>?VN{3NDVfCKP|V?5ecbY|cm@1!YSIE6hD7e&g9XWrmKw?k%JE`=(>xgDO@N4+VOUO^`fe{yW(s93 zUP-ary*O236+B(|{5_&w+oC@(tdh!!L~~7u1Q+2Vfb#kmrnXDKkeSi|&iIxdK&Z-tm<;xTi(`jk|H7Z>9q?l+NFc`>|$A;G!4 zmi1w~zp!PWo!y@$56K|@i1t3kCmlDgIed&2U1{x5SE3)(l@Zv25m0_;6M)%+q0EU3oVwakUn@TDMj?DO~4j zE#j~%vXbJ+N^$}W5m8vA!^$qm2ykEx^C_Qbts;eH(+&|%-*Zp>%*qCGl1 zbfo`}TqsS41AXvlLkJ#YhMtm+=+ITKLMJ#x-8$Le@r2-%4yXB!XQ7A2C*TY9!I_3W z=%ZVI=zC6w=Y2oxg>!V(;iV9~tivny0pF|g7C87C>*imnj~tVn@R%Hck>N2>Asv3l zzDIBJc%P=9w@voH1eX}^yak-fMr3`!_b#;^fJj;t(25Wd(w{GOpFm zK1^pT5X`IVgL@i6m@if!=+@D%tUx}c0A1emyUyT92XujFS(%RG13FHm|1viD$WlO_ zqtswdw|c#ShLXh>?2goO0BWf8q@@9htnbDta=D7;))M-!<98Io%J{imG*7sI%t3Pm zYpmHi!$6OltY#~HbjKju2>PC)8KL7e=Sd^sgd|LKo-_gDcx)_ zKCNa@E>^2gZIPN>xj0kBrUkok&QN^tFifJ*{2c8tj2qZ3>cx;ikRv)Stmn?rO>pio zWg0`<1@ps?P-Iq>Yt?Q&6=f72hJ4A`cNj9w8Un!()x04@@6dL;`SBoEuu*ZA1NFOE0HgiToH%L%f4kp$4Y9Do=9p5 zA2pn7)217W!Y2!l(4d%gut_zXqgkSqOv5=g6UMQwR&Spt~Q9x31U!v$Syllw;By zjnHJ&v5#6c&tMqOQZpSU9f0?Rqh*X(YhP^ObDTF+1h`BIrc92h2I0Loj z`3&>;dHZD{~E!YI4rP0j30u-VQG+d9p3D@=*7vvwGE)_Fl4>d%4&B((+B8l_Bq zB72PDT@?@R0yRi`{BwKs68a zObcRZ_NDLg^I$I5HQ(H+7EqwQu}Rr7SvX0oWKrH+9coVl+0ZuAn5qpe&u;kL>@FRJ zTe}KY^4E4f!gVRZ1ts^!F(&2=`Igu4!4vfBEhE=UOV&-Cyfrnnscq2253*gfCbe5w ztJETCH`7=)cQ)RlkgGJY%8__mB-!z$D4B8x&)gUf-JR^I(Q>vQ)t8Of7 zwLAHh1{g;w6<^uAU=Nr6S^_b>Qq~k*x^(`2xQ}c22LE(kcA8Xaed5!krv4`>P5Ny+ zn)D%7Rol~~4{PuUdmT@Sp2MUO698P3oaRk}e1A3xk<-=(E zRf?7+%9N-|Vkdp$bO;`RtN{Bz6krG@)3rjte<}iJV7dwZBgaIDIn@QoV5@Y;J84x; ztaf3w1&A}tu-0*$^Sga>&OnWUfU{7785CSBL5+g763nFF5(#?!8NUFxZyA@A{w-Ji z+tvryHTXUL3=~RkwX-M?g0{U3x*IO3z|Qjqm6!7b$Y<>E^==4 zyXf)!nVjYFXX?=G_rB174TZfrw08B+Hk;g`np_v#r0b%ZjA`e>TV^{KervXKt9?73 zLAA5nYG;SpPP=NShv{$~c2#HjvwSSSt;){Nb{v9&{A_=g4qtr&=$fDH+^ECd)%^N% zl-v*QWhA1#Tx72f4-mVtkNu6L%j{>g%jmXyFx@`?6SLdrL)AmL+5=tZPni$!C_ljY z$BExL`_B(bse&cu@_Q#w$5;@(D zni92RaN5EmOEa*@f@wN*owf=*X%r|mz&fSIE}h zEGL?)dB!pcJ33gzrZA!AN=(xbZ&R`~v6F~+R#?$E=gx`8jXLR|nU-p%$!l1X7RmQy zhx3-xmd<__S%#m5CRt*DktfOdiu2)Q5e|5XomCkH%6oz{>Kb=Nv@~3@3l;87M7A_m zEV(0;U5}9~?UhK*D699BV>UTP@`%?drY$5sF)22_D>k(&3UmU)=z5sJG5NO@Z5_*- znmU*W3_^gbEE5@rQPa}KCd!&5_e~D(?j}spRG4BM7Ho&@@7)YSlN(RL}xGzrY{2yc-s2u$b|7b1i~1 z^3!52$$*x)md`pEYSk33VW|eo_fNwN{7}`snoV1_H_qTeSVs?Nljnx@8f;)DC|8+ zbR^&}c9|BamSpA*xLt$Y46l2sJjb2vo3WdjAclO|6IYlL!ILSF-Q5f}mD(|T_b~`> z9M~A*b@nneFQZw@D)vp8d*6ydhq0Dl8cuV`lW$VN?4~osRF08X6P^V7CG#O;rqXIC z=?_c#BVrZ0av`sU;oO6g`zUcki4kGcy545Qyzn?Y#(h78Fsd{OluT`e&Ymbu(#k(wgSU^X63I5c(BM47G{p##`ZXd{zn+4vmBY@~%E_*7_O@2(8oJRn z&~_g)B2WhJz)TG_Hc~TC1~FTGp*X}u8N{KKKt+5pM$MSVVyFaG(|Co3!!SR_*c$yb zuPA-Eg&T-P(m-)6j3JJcu9Vn`;BmBuV|WUsWEVFc$5C;dkb+%Y04K(^iz~~-atub{ zi{WHmC-$;IS|q+0PLI|ME zLrdLVX>b(B6@IN1Vzm-tC4pdd7z1`0cC;J{!dMt=5CQ}`k?@*ehf6}@5Gy2c8ao(c z;y7Re<`Tvr9NQaQN-TEKN(4wCu_3mL6iNAqQ&i9Rrrw0vVbJ-k{_1xf?W^6v2N35j@G0oUQRz@6)z7M7uWvQH` zEYahbu}W4!(N%+Dk=3#qVq6x7MOII$dK+6FgGJ^SLSIaPMTUhoLMf{M6Q{39Vw3u;l;LdS)OFEiN7r~f5Xwnx8KB$6;E zEBIXaAk!QCp{AIJCd6+b)=i4gGv;5tNY@q|xvjNfO-G~cj!SmS>TMm$x&eEo7+Q!4 zYwpd050UH;aw#2wrY4&HN!id&!+N2j`QKSAPF=#CEwW+g5a?FIH1M#E9JNXGr%f2% zYzwzwc#AC@z;LTAycNT3ws1S-vJP8#o6Up6UnKpjr1)>n=|)M5V7m0|ASezeIXxu9 zhUB{_sq!3gNy=L;=_hjXei^48wmt6scEr8k&bas6759F-W8TlhUa^JuVE9#A_%#gw z*cRSv^P`+8=_pCZNSZ5YfuxU1I#Ey>`AGlEf(H5fyXc3T)2}4`lZdC`2@e^0Q>S@teFrt=rkBLRtCXZz&s#S%8}*$}wBAHmEJWFwgxf*d51 zLf}C%J_PwlaziiJw`+50p=eOn0y^l6xiBH_LhtpBd2H6Xq&b# zZ*?#DRNhy!H3=L`GuEk1Vwx?9^{i2c>NG=vLcL?g+d-k8R?$CY^EA8gXRExuZ2B&U zakQWkZ_p<`UrB$H9gy*ja@u%Bt^hIfOAIrzd74V#fp|QF$6P#0c|8GC;<3yKL-s|3 zoN41JhfW?kjiXaOohH!f$%`UM7frRvB=cpK-2Je)!ng^kMs5VEEFi)6;8&V=tL>Jn zP^aPN^7cy-4yy*E>utQ56qyS99euEpgctS0>PlKiYpC)T`XbQW3-v+B#|A}9 zTu690-RsWihYfg5qEtqXYct|gZQz92h++!aY(HnUk8d{JyRZ%N_J`7l`;-xa)(C6? z4+-%0Cs?nYEBas$RcQqFX6?gM1P(;t;9ORcOohQKYl*BYvP+-9Eu96WgWS;^?!*`C zgLg}kgOG<8C+H#zFFNTW6)(<|kUtAD5*z7B4nbE0J|_2pA-F&}<=A1Phpkp6f5a^L zm9pfkk*)g{EVP$=vMl-O+LF)1jx9<)yBE5H*zb~g!FQ9S9+}X|M^nW)BB2~r#m<3M zyvnR2YZ*rLW0IU{M4*T89m4qy$qn5}s^-tJE}hnksAZaeYPG{f>x2aQ86LO9%|7@t47Ujh^tKXmNUK8bs7&r=s*r2(6{x?LVT<@P zy~uO4()=}t2Mu$NJhj{z&t~C=2TwD+p5eW;X`&Yn)5#|sfBJgiu4?`7o7&Uf`VXrj zJgqIFzuAiD4YpsC{VpZ{yuJ?nYO#8SX#-d$+t4$Hdv*l=J{S9dQ9!Gl_bTKa@_uv{ zoCQf;(R=x4AhRIp9JmZeK?MHMV<^Rx$_|>fV$V^l%F!wFm7bDc?L2Qq5VElmeOp<0 z6NVM`;N`z6j9bxfnQH25K^0Sx%;sa<aN*;Q{U0V3oqUlQ|1}xV|0*W0?2@ z_yBgrW0+oHE`eXlMueF=#Io_b;dY1N0=1fcHrCP4@_2J;jlXd_#2&*I5@PN!8}Goc zQ8KnkW)(Wka%w6ytSa@4nVAClInVS8JtW+jVrx-_)x?@5>pa=ZYRMC?b}etbEmAJYPBIHn)3W$UCt!+uC3*u12jQU!Au z(c5&vVMG&XV*w+YC{hO_%BFJ|Q8t6ah+>FfL@_ji2@p=w>*Y4JPCI8xB&DO&uGTY@ zTF+2wJwvJW3?ss3m5jvmvn6iF%uG)PsrU?2#b+865L%w2b#_JA^L`A@=!D7m>a!zk zfuR^iXRcOAplmS*xLgo~?F98w!|_1vT(*#f3OWb_i?F5sAVHueYm<$zYLP15p5F;A zylPmT5n|(spNc;28Ho-0LI|#QajR)kD;Kj=d!O%?j>d5X<=-Yr>C~cxb)9ZqtS> z!wGFDu5qM88sV9Z7@~<^8rd&WH7y9Va1 zIdHoImF{HfdS0=)4wDfN6^fku66{LAB(~Re1X}%pwubg}mVEVZXui1Woh=nWlVK!}|qLN=cTPX4s2N z6a4arH^Hxfr6jcyb=!98Q%zcV)eE=39p3%Ksm`A zK9NC!vvo~ddt*5*V{$9_Op6O|Ha1a(DC_reR$SG#mbEmM+t#wC!)5`!PVIGUlvB*q z_?oCoH8U`D3R~9;O;8@uPB)Q<=M>m%0kUpUfUK=CfUIpaDT*z22enuy8H#Im$!vGQ z4r;4T#p$Hg${}qo*aNT7!>?jS2*nGNAWzHfyve-IixSHnHH?!MAzf=tP%+_lc^yrT zbGOTb*yw27{k+YcG!M{i!{ML{4iU7G-u8>ij|b;BrQn^xKJco#9q%|TK00S#*SGZs81a|o8oI`$Q!~=2&;#TV-b*RLs ztj)34Fpiq);Uk+uNvH9-PjWFm)rOXuj#pTga$qzLLo~$Bz5*`%1I(!M6-FS-@L3=P z@C7W@>{iUjztIWTEfC2sp;iYXspbjsgKPdNi@EAz8nhcU<&saQDRe3l-jyAMhI$3Y zV}@o@w0Sv2<>_G!zfQmKdhZO+&g+W2NX^A`{a&-g>pwhbQ4*FlbH2fO#T%Zvtl$k&hCQ^B~EYF zdh(px5{!PK_yT&qfaE)`__pf#wo1NTim#pcq8sD++9hADe9LWI+;V(NEQKQB-)0Ba z!cMFu`%97M=m#griwZrpn+w0=8K%mYJ8q_eETXNruLYx*r2M^h`Nc8viwDS`spRiV zD8D#P{(j=Te;?(?OS^whNjt#vFc+o0WlHOZcLY$Y(=$8_M=|c0h;w?J{cuWnKmOE{ z8iq5$Xi!Ny%O#ER4C{vvM4k?MQo`_YFuGr{i2Ba+(#0o&r`bz}{C)82VDx3h7Eo*f zlWm@4yBLg`1+i7JZ8h0)CEKN7bfjVvl?`6H5Nr?rE!p~l5AKn9|C?|Wjza_QR)2(B znoeA#run*cYU46i+HbhpxMEWqNu-nqGG9aH-*V>P#W45km~SBS?>X}yVwiFCV_Wxf m@O7_CFvTdOeyTLYFHJAqcC9rk49vqmGK9@C)^6r@4H(13t|pnyuN)fwUt=rLoj_r@hf!T!S}TmW-n z_PPlE4gHTc@Pe3t!2gFrl0fYF#0CPwPN)GR1Sr6Y{f+;x7HLAeYpXu;ADhNMGkI*q zLuAm!))yyK(JBxo7Rjoo78XI%QW>UBc9IJxq%km`5{FSXQPxA(H^QI^_AB`dF+;1= zLKVZ<`VkXbDq^4`qoaS@etu7P*^x6_!1(5Pn{0P%v>k5)oTjg7=x4r;Zz;^XpWksrN!WY79oK2_vQWXPB_Tl%6z_n|ZR`kgN{R1mNF$K}|Yn2@hsP|KzeWQ$<RnSAVZ9%(-= zFEo)NDu0V9=}7PYKEeo%E;9O15gB33+OSnHNxpL zmna*NCil9#fLAZBL7z?#C8}J)-58ntW`QgS_~9*i(j;s)flMBKG?!1#&#D|N=@Npc zDOnO$oJG=}RFPWoW>{t(6M_0lBwO=G;b&8C07AOyoF#u%p3@)5!f>Oj;>CFPR{GOf z&AtAH!>BS(Z2>!;qhZ3Qn7309uAI|aef5+QgP+2TEkm+Jk+L!u7V<*_oIVIT5|@r? z0HWeCkBg(zY{4I)#Av4J@nqe#^hx0(YENVx7!lp2Xy71UCzzJ4hmy6;(0I+nduzY?+e$Amb#cQN)iC-L zQt#v&f)LhfGA@S>!Vs8J%Z%eA0CHgcHN3d_%&BM0tDUMin7xy zWm+ZK>-wS=*B&O#e@=S}bEC6gBU~03ti5dHV@t*@J29{^TORslyWbT8$WNqdCXspkQ00Y3V#veu+DbU#hV@I%pYzqcXkeXa_^G3+-@>}&Dc%^9)5;4yHb_g1l>p+HwGF?3}gwXh(AuI3SIrJtX@%}tM?*gH~ z>U}AD&XFhewVc@!dl3Ar!e!%O-15NcB zDGi&EmSSr5rI?2o+vPl%Ra%~>jTus&bIA~g=loFZ*5YV~JUJ+eL)iH#sfWBnfiQMH zISjB3Qy*y4LAXAI43ZZqJ^*e>Ggh%XyS|h*DdU?&Jmr#|HjE&+y)Wp5HG8(ijm6Jv4|G{nF77$Oq-)r`4pqH7PCPy%(1f<-JH$DceEoV*ap1 zB>3P-CNxoM{bIsPlF&7)K!N6>@bAQ-IO4a8gc8>qC5N7&2sr5E6PHy%?X4G*P+!e< z?hr&~+*DM3HN)f1b|%f9)b=YtQ2rx>9=f@$q%5Tp{3cN?8a4W8OaUq{_;ZAyJ`(A7elm+>k0EC9^AFuh zut}n?N|MlPz4c&-=dRNaVTpNK^qUIH;QYfv#pe>Ii9<>oMVE4nE!c#y8xPq&&ufda zHD6ZoJTVJe@mtw=2p1k9K2pF4#qKyWbRa@E8nLiALfWaz;uusVBl?^Hu*{BHN%YIX zN8<;QOWiG3@(-$`(uE}pp&Pi9&=5$iymbwrgBH~SvW)jDq#eV7FdtKgzF^N;}CazAdpb7}Uz zM$x3R4%90arK~$Bql0wb)t1Wdab4&fiL+KqSviZwc|O>%&5KV|aAntb_@XPG^YHe9ry;4j{Fb8U z7fGfA_G-Q?eLN%PAPojcxF}r-kQmZN4wItn)a(;zQqD}Uu#fadOO;0WPf>HWV!^A za1tJCg%fxT@7u1lMrWM?-&A&!FWlqqN?dNSI$`QR4V)3Bbx8vRBF<4NJXOX=6P)a* z?+wd4X85m(_`0ZNV&By zk`mV$O-BHz8i;f#w(>lGOkL}ix^Y3LYtkhJ>ZE3-jZe;gJ>s>k9V5XWR{g?7wK&PI zN|fXE*!S(J>898hS=1ulajloS?esRJB1rHn(xp-4SE83#1#Oe*9qA;;I@+h1%9&+k z+B1n9Ghj0g5%JL#l*D}hl+l+GvUqeN#N|?eeyjmFI2a)J63DplQ;QQMGikxFE|4HN z^5El25@*Lt)*LV)q?Kx&P02W>sZX|`2^o)6XfKVmE+QXHwUT_+Gwl)A&yR`CL8hs7R)?6z=(R0;#){IB`AVszm~%dlx_CeXy9TC z?4|7MK!#Wdecaweh=thnjfv?h0cDqWY;`QOR;Y#LbWoLPK=5PEM$xO%-RaQ5x#JC) zcL|JK!t25@g0lNtBln5*g49COLdh$DnA<$x0<-Wm#23d5hmVE9)8Ohv_ERMePjp~x zwr!~st>kn<3r)V|ipM^1FXRtBCXa12nB5%@T!NeRK$_cv4mW5w@H+6-^{uUHcbmt( zx>vj&Wqc2N)e0}+`TWCfdN01E?LfN@Xya^{i<{U5CrmvkdqQ!aPOjO4Lu?%&?jpxx zb>l!Irlid4q^?Wxthvcg!HRJGABa zS&=u@3whC(MS%X`5xw)v+Aljr@Z;MtT^Ba-OH$1CxTmD^(CdD;__YEll+RUZa7FK&}CHw|65KrCE?hPwkxv}UV*uB{b)R8Ha?R4JhY=Mr$iB6(h2lN3HbqVHPPz0dpCid z(WcLhdT@YhNWIGQrBxx5{LPu_i4prN@;Jetm#4=D<&yOq;x&?mJ>Sk@gODDXY8N4; z==B0v7uZxCPPvU|zVpnL8aj2wiO~eU7_1`HLdqq5CHYo-VY3?#6$YXepBnPjftTGt z7wSIU@+qz-av)X&mAwG4AZq4Rb#) zoj?R?R_T!rTycUv7gbgg@Unln|fw9CG+pB<<{YAKHVw%;yoO?VjxWFXQQVz+&ce7w7fPqz8cf*oWiz zbK{8jpf7mj{HBE#XQxQ%;+A*nz$-xap^_u+Oz_M1$PX}vU%Q;4kw@``go+rB5(`Cy zLb>4ea;PQZ8Uq4^@KlH#11ujrl8xoZ#>!!XVCW$KuSJjrZwHmPu9W*x~5E zVwSaGD{@>kFIhMmUT;JKKfdUA9WW1lI8>GKSn`sDUJ{xUkSX+{dJ<8lQmFt|hj@lR zO~X0KK_JYUl@~idjkuc*F8M8n`p%eCW7R}UROLefzmn9xj?My3-N7olQVa3?CDI&k zw5)^x@w@ngQa`;-EbojgsSUfb_Ema`4ONQKcd0Ei3qH2eMivlzt3e6oxAaJa)F~ zh-DB4Mqja9PJUcB%?dp>{TsxeuGrhjCoNTk4c>lkxd+xW6Iv$aWmF2xg_N zx^x&tr8AqIAF^R1+6^gWG%UU{LU+fZO(csc8EOQw6;A=L`|!n6OMPLTsd~Kbdl*Lm ziyNYMX0aYlX|Gl0w~;6}0x0*ZcR<3KFUgXuW;q^%JNhl0t_zH|1+oiH+0}C)4xY_T z7IxqaZ!yK>r&#K{cu?84npY>Ys9!k<@bT~CE%9J*ZdkeV66PZC_mi^j&?A`@xnGZO z#30a2yB$cv49avvRNNbuP13>akC!xnRjRVzExXg8UNADld4+E$mmC8VDdgDBj)#gm z32J37cKd`%#Y9aOQ^rjm5e{Mc%^sAr*Ww!xOHrU7xrCMN7A*aq zzY{p0uN#CocTmT}dGaz7NfOIXH<;?fK2qx4hZBZm9(|XAGk>2aMOogp;?P5j2==iE z+)Dy`n8t%5rkVU<96f_O+sYCJ>=zzyZ#XGuCK06WPX;sXfEW=JGhJ87*bMO6v408w z7}NPwK>=HKUkd2}bFBdGtmqUdBm?d6rb1vwn1Kc6ZW)Mm-MzcU&3z7CR4@0C*xDd< zZ4%#Fh8XPRufnH6^1Pmrs1ScD-(V@P=)>MX{utjlfP#3l$n#zL6_=B|>Vs8gS(4u0Umc9Du0EsjjTWSLQdhto?aWa#Cv3 zn3q3WplWbkR8ZT!K8w`-BOLbVw@nXyh4dShf})`sH~O^l85_qU3?xOb9Qu&O<2)Pn z)71Tdq4BzWS~G!r-ewP;I{QUdcm67_p8M>8j}}a8j#M0E+PS;xu^;nfbWi6!e~sm( zkE~E%F%CU<=E%rBPaM!!tVLA`j8w+k^$QfwXDr;fr8lYS7ytjaU6pW&|MTDaRSon6 zyue^3|7lp+6Eb4jBNzJor>pfp+R#cE3;GWwL(2EBR30e|$UjsKIp@Dp-{jUHsQ(!; z(ONwa9SjJl6AB0j7lJn6L^q*{1(zD+*T(TA z)xR4Xk)^>10V1dYVu)*y8PO>b*y!FwT!9|UPv$XZr0eciuAvfK9@NR9`dX^usYc?U z#fe^K>E&8Hb9%MF`~J+|^BK*yDVWyBuRiSrVFIYqZgTSOV>taYuDw>y(f-HSxq%wt z_}S5WgwZ@D&#qZ%j90pZyeNy^EHl+EMRAb2g|YuQp9}8kX(a5uiN9v;ZW5q#94W8`{e<2 z&M<%w;|C^4;nWr8EC-dp{u*ztOt7pI6L|DyP^*tQ>vYX#<;F~{wE#)Z%w=3ZwHp4E zC)KblLGRD%EjTxuot@mbn>24Y6`q0iuS;J5S}kgeO*lY5`qkoyzhF^QEBUbLQl9*b4PsT-5+bsKZ%uz2 z@k|$5db2qOG#XvzFz(!!mpk!c&*XC^tI+~!^xJUxlv~CR!%kxmUd_ex<+5O>rmPOT zsKriuLFA0`J}6mnC_e89-^PTZ4$#=5nG&nhiG9uXg=!sV8!#DdbkBJXR_+eMR(i zHL>(O2)PuYA8u&Gs>`lDYt8I|fpj$`E-J(C!>$WINC=Ojd8#-V^#c`dG5aoMm56 z=~kX+Qu$80ja-2*(Yj#g8b%lQ$U(8^0g}nDz3OhHpOP(0GDp^;%2DPq=>a^+jKxOc zFHFN>YJVLu77C&)PjZl^be)m24enkY2j4Ijt#W^v*K1__@HYw(Ku|b{r&T0ID(`*Y zE;n{o-dCstz%N%@gu@gS_qr|ISQ^RgZn2zApc_ASXZ@i>LeO_G;Pwsje?9MSH`}1) z`d0^{q09WQ=S|YHW9Ft7{q1@GqYXF=+u;AW*#|4vzf!Vn2VnnDEZqM}C3JUjCG>DR z{R6V`2>x5SglL|Pe;^xPfq#Vtc{h;%v&eBX&>k>gAfVpAF46=+ZqyWl8(_$UaX##S zd$i$=5AnZChZo@gSIS5L@4r-#AjiK_3xXv7%{sgZabotyApMhd`2T8yl&~4-KZ%GY zF=osg43xjA|D#B!bN|`=hHo)luzx56Y3~0YRl7d@H`O2w_TLdZWCZ_z)PHOKz1gy| zUVjHH&?B=o*Fb@Qj1rb)SpW)T=>G&P{zs!!wbW77(Y_F%CyhBMgCYpmVW^Lm3o#>_ zD64W+76cLr%jT025>S~^CkvTTdwb?fx?lIDovS1^n%+)?0V?XxX)+`!v+0$YPNp;6 znV&vh*B_71*8t+6m|dnI%*%NFSs2#=M!;bFucA35M2!>$9|STN|@GEpAfvT!zR)ZwGzPk)0!~ z#dTAy!8{@qL4r5z>XCM;5vSxEZQ+`TNbhr;=wHuFYeL*mui@6PHRhURUNHx75CAN? zj}-p^L3m+~2?o@l`x@;V+=caG{gH-TAcMLJbxtt`8d`DekR2))LM8iXBD9Da=FF-D z`kLL-;RaT5cCZl-8QeO}3XZ4jZdG&`I`h^r$&hZXViV7MTmnO(z;J1}xrAq<-6mPL zu{kTlU|-x6M%uZKetS-d(D)f1UBJ|oi{uqm;J(^LS4VT713WX%uVJjWB2!Owq@d{V z!EcgdM79CQ2SRUPa~Dxf{lLkvFN{h;Vsqu?}z#0d`XAA>Z!F zTh3~N$K#(=t$BN}lkvru#k4|#Ln&}w6YX*IrL8XEX5%^q`>s4K=AP)$H2?g= zUgWZJ)I{zPVhmD8H*C7$eI2Rf^- zu>&9jgJp_nl@BB_CPMlP=u7qC;w6Lvl0nk0&AoLY0W!OFK|zL!MV{~}1(ZX-yhj*Z zH$C$d>0r<9OK{kXEf6kV;Q=Y+XH~0>;RIMp*QzWw;$X4_WWwkpx2SAI%2}qOl~!?O z*;{;0iTX%Hly7A`$zIzM?x|^c88YMWp5?}ouDSf$ zg*lxoEsgyh0#b~@0sH#lglfPKvtb29;uNyYKQF1X!ay0`KrH4@@&KP7KW|#F3LgD5 z`P0k|Dpx1Tv|e&0J$p;_cSWun7+T`5<+Q0*9&f<8n_8vqD{B!?PTmiy?{_=I2e z1&pZX*0TfwaM{m+W(jtTKV>c z#}F->#n{Rtqe4{G)GU2Xq$%M_oZJ@^kc^RUd_?^3w*m6M`K@>*KFoiyf(BJ3yZ>6u zs4^#}UnR!hhVehzfTh9@{f}K~>G1t4RjXt3-&#a^|6a>MuNmT>T0c$M|FxEfDa3yb zGSHF>vz8g_?|J=?HY{3d0wez?SQZHrVP5`MVC~|si##FL@<$5X1295@xi#FsJ^Qz9 z4q1EsGZhgV_J0E#;%z`6{x;WUKXejOEFhrggcN65!2iqz`2XBTX+nFeEG_XLPu-C- z)5iu=L`te)Fv_4Hl`F#|`6H3W1EGNRHJgsYjrAInXQlbA4$)~?K0j61pd!Q14y%PxYgM^6=(%;QK3VbKf6n}sV1osIU+8?_?s^7fdR?`dz2{1hEo)?8+O}c3m9szTc33%bE+N^2C%#ki8&mBv|Dmkt zM%v{jTgjZ=Xbu5De`jPvCFM=+Axr+fgWFK5((a=IVLK(Wef1+@O47dGBH5lx-XY$9 zTEo?|-5Wc;6i1}6ry0&a_OI0TO?8x+&R!EKXaKqGG22FbyUErPZYYTbY*=od`HEDKak!<^_JgkNP(b6g)LvAGgS46o^cjD|YfrdmmLhF8Mof=^H6 zH!00(*0wr8%SL`udxaprLP>{a*;Ix@$jYoGwndPRihN=TZALT&ci$*T0el^(m0^dn zg|!tP>)1y{Q~1iz0ycJ2>904;dDi+m<~5oC=wE4)k(y86cE35i*{t|hn1b#5 z%^bNJ#IManam8l!=hQ4wn^y!)mdwi4r?Rl+O$|>0)(frKH6@q%$9OWBD(o$pLvqR2 znF5_;7?Pz15xU~+VRK#hka1MFgHf7QmmD+MD#dlMO!_k&&UTQAB}sLjZfwcTl*KM} zKQ0#Pt`@sj!PeS?OtFX3Ov5PjFWtpS=WzVnu9voBdlgK_6_iT76LHjqjRCG>OQ#a@ z>YXHj25oQINmDPL^vilmS-V79LXJegxi=Lq--Zj#hO?#0C+Lc!&M7(95T;scb7QOW zs-I0e`Jm1T3|(nd8oY7kRL~_d;-onKi^r+l+9$LRrfa8KCFzEJtRQ2nvad!BCzlUw zSR0MrvYuvs2=mKJpuTT}T{)-Yrz$&{EoTnf2Rl<+anq}gb+; z?#Xs{rgH7i1?QO2XKYDA_AAY;xTx#En9Nxv0EYDC@Z>N&##W8fIB2cY>;yKNJ5Q;H zw;cGP4pZVWbK&b@t+}{*r4ju!zh^H%yrdY6a->zHZhQ5I7YX#qJ&TVn+bwv6+-VZQ z81t_!XrGr8#R&W*5I&Olq*IUCZAxhB>oHj_E^6NkEL#oBPPf?(md@}qm!8$qQ_ ztO(JT;>;~piUP)$ofVhpkKx2HHpaKty(X=LtvVI@=`*UgWSR$?VovY_JF!ZD-Nl*g zRg~z8SUqyW*Lx(G3P%A7#V)~W=J?=H2F)A354(W;!t-7Lhu>}Mqj1$HLD`oMv9}TF zoWWeoU*QW7R3U(tIG4ekQ~PzvJY?%EDcwWB_Qy<+N8p9socm1|9cn~)k7*{Z%1iT! z`h#?yJMxd3?z~@L%9^o$%P7}?Xko~nyl;Q-?6HZ$o!8Un2d%6gSRz=S@6!9{oN34G zu#}KF(QZDuMdIW=p=VmEa$AB_k3x6stpZzdh4 zDaQp^eOJOk5mL7=f=@3L&4EE(FocBR51EH>D90+E*lV*1D!rZceZM@wL%b>3hhr7p zqitR2R_e5F6fBruoxG?IUHnN@7%M!aBImpY$kjn@9S0%HkPx$P?9_f-nXwj6oBEtP z$=Sv}3WO95cS6IM2{7HUk{NYonhiL?D-Sv_S0fQSgP4{)%B!D5f%LPVn8fjb{sUZbm1%=p?LSsLi0gf+`E~C8SDmS4`yt5yo5LSQfEF$pZu(zcH9$~KSF7SZj0;6TiPfq_sxX>=!DfUEzIA+cx2WdU8>DYg5w zize;dTY-3E(+5_&Ld%Vb6CwN*KU`s&s>t^BD1$N#2snh=f=1E=XwRs_a8p!EFRR1o zmZ5Lv9=vhk4SFQq0d#2*n6|1j9>03?klfs9+56|(B*lUH!nnxqmRQ6gmL~=(@=nC` z1Dms}I)@^~*5 zxw1(o-(Jg)G%(@;#@xB>5`t?0th>5gtg{=aQN~6n zP!1UEcRzw~PMlBM%1WY)Oi=y4+nvk38d?n?uThc};m#YkGBc5MJ=nMC2C`6+fS6@D zYbDq_oe^2b3@%M9IXW!evXw`@Kb}c~oR3&D4sCxS0l5nT9xLKuA0s84EiJ`8>3EvcN^g#O(+Bef~NUUy2@Knx|a4@5Q!GY5jCwTF8W*%j1m~q~ZHA0kY2{ z(s(bX_}UjhS3G9t2cIN~nKW?s)~$$8^!h&H9c0j6sI#r&>hgXJlnfm&sBij*BLB{` zKvNNF-xHU)VOukzN7D=HheO&*Xe6&i{FvLzYwc=OJRi-=%D%44S;hYMhGOkihzGiTnadfJ(?TQQE`-lzZ5d_9i33TU!*Oo@nMx^1S}IFa-x>_iuBr| zdAM^*+RPeUu61Sdf*3z&`5LpYpw%Q>_1n!A#Cx9!*zCbBY|1_t&DrJHe&8@>q49vVi12}wP=qC4%=nob78tux=OUo8oPK;6ocJcqqTj_L44r)ctK3yyimaw zYv}B1EH%%rt~MwO_(%b`hjXnF(Jia|ttC>a0IZyCJX2Z%jj&9lpUIR;=SOoj3;Bxx z-<##Z2CgEz-!QJxUoSTahsm2Jn&ucFa#NSE6$_oIND1L728ZSB!$`ZdH_#z2gs#*T z7aZr_7**GZZvdh|$W^2+7*lHqATuNsi4`U|0 zbEDtcv~}h@Ro9qNnmvkUiznR6v~^p_bt2M^r-d?1$l+3*;N{U3Yc-6?V;2(ukr6A* zsv(Cfxk4ng$Q7JDZy80k1)MS0wBaP*g6&?s!&fEKO!yXzV~2AbG+Fjv!%{}z)*Ce7`gTxy{ zR2a&u6h1>#mddM^K9$nTZ(*H#(5T8qf9I`(ziE}*K6Xj9IJQ-^`hhphFq=B;5Z+A&pN>zOV&;<`)n>=%!ov@Y*L>5sC7e`a zc&aUHIEvpk2D$~Q9Ya9@frl*-);n``MBK9@m=lGndxjkvGYB*G!Decdcjm1kk7Y4W zFdGZ_@F~=CCaz=1;pKuIq&V5wjTiB_RY}p0kADPV-&bP`WH&D7Ng72&cxBbEkRV*C zLYl!QE)6>hx1O327uXC^3$mJbK)Z>&LU@@qwOD2BunOUcIyAZfFd0RH(pZO-`6;wZ z6UpT!Hgk#NiXIhSp3moFOOH=-gO%8J?JN z)!kZoj8isDS;Tn*4_$({n%{%C_*&|=&0P@yh-nO7`Rt=a>_L`}iSQl5&D`Se!m4kx zJ1W=Eo{rAaU2d^}Bgifi=bs0bmkM3jELMwXA6<|Df`CJUq+5B0$Cyv3{>?e@ZiOj^ zt)j`{seqRxPTwYdZ`GIhW)=Asp=zRb(8*{^X`=%i&&@PX@M0WuD=RTcFuaR`*LC9w zAy#4Mn%Hf~0bUO!K7#legV2c03r=keZtbI`#Hhm)gE$6&xE{|hJ>6nQj~z!4)9dLL!)!_EaKp8HgsF)$uAEc0;Z6Y3@lGm z=l%zSH;>Ybx_Fbjye=tAZL=bXJ3@S9+KL8V)@HLcsLucki0r#OhCK3ORZ&9B7RKaHvB}{{L zfS{`8Xe&6V7oud#oP&Q2hBUw8q?jHUH7L)lw^`fSS&Gc{N=%0Jheg0;%d=q~G3}x! ztaFRWtEIuUAU2SiGMrb(?FS--gqtJ$-BjDeS~YI55eERulq))%cPBts}LJ=hL7K% zHCq!$3Ch7HRTewz61+yGeu>E-f1?j56|Cv>mMXsg@I4u09fTDYyhhSHq`6_>?Q)1U z9c|U5Xhe<)HgJlqPQg|{Z5(f^#lD8pI}-vxd1%UcC-w{OKP5KP6=oly-W#&hNxt%8Jh5@MB3v7G@ z^lX=8i=LgT&j7i8Sof@t;W)UT0GfYV!_V8eG&fatbDT6(>DMJYWks;brgsxHf?5C+ zi)j!rVnz}FT$&GY7hLWddA*fsM&Y>aO&V7-sPd9{M+uT_!k|pTVHlvFZljgMz6E^g z_cn)k+zVTZO*wtN0WYYcKD zJZa&r-Nf4~+l}(;-Nr44vN(e7y19)WBj0%FQr{C&meD z&73!}g-@@XP*Qla37n&xnvx8nTSMMs$fZ(v;T^4}F^9HQrO2c5+*&Q16Y?vLXP?wki6W zyKq$cUrQn(47lJpW3?4+^Gc`+x)DJWvo0TUY%8dGWb&x~G!ZH4$x%DvBkYEx z`xWqHzeQq@bBWsE9Q+x`g4(=W)9@L=j`z@T+2R9g1lWJ`OE)kGfh`#jZE~%X0~N1@ z?a+X;PQJV>NV`LR*kvTd`&$RVfSH^MDFCDn?ZmUu&9ql7~nG_ zYg`vH5oMoyNxRwC-V0HOAbs&-n$ZeK+{Eqwjn^0G$dilQc3?01`U-P6%Qy0jI6 zLk8z|F;;Z!mDHgyUONkzG|L!Mtwx26sKZ~pAD`&e0&V<-Cd_uR(7y@bdJIBXBK_`N zwG(1(Zc#g|Ou*Vg9S8j3r~squ8@q&zg~B6=c@MhmxlejNg@P*#$Pi76zlCjc^2F@V zrfK}+p@k%J&eo4#D5Jj0BRk;=cMt4RIPK2w5h#kNvSth1fq$9^S5+yegcmsbB!%yV z4Ly|H$qf{Hj@%pwMMe%_umj4ugr{!kR|vOuTbip&Xzq#Grq@k7Xem7v7??nN?_FEV z5Lh-rnCt6J#pB?4N@T#?pU{ocFy@x(1L558_twPwF@%rz5dbjVqqJhfEyJ?eWx-ol zROFttt8nXRL}=U>F`)y#_bO6A0#B2IT0jN?-hj9EiJV^80;vHk0WI$S@dVUDF_jzk zq1gt=eD(?p_Ba!$Ze7MN(;CCHR35Y_#^d6>m)0teWw=VU5f8zjg%JlNQ{x;0gM(QA zq=%+qjGemOP&KEses7~5!-K*@@vy@KM@wQGxyC+vmZoKhz;Gj z%6f6cni~>%Ct3yUjcDGU?6{{RUiaJH7 z$DxuxB9j+s)m@?soidl_-8V$Qz7+ZPLtq=maVz(eGyni`{CI2D^vv59t{YDHJ2MfA zGB}t>z!7k@q0sy~iR2 zNy%uvLBpQ0i92(_Www%&F3syw-GK@ZGoU6(C|M@Cu|h|8$2W%w)x9;Fmf0Ne5Pv6=9S4$)D_hR`&L){f)wdhApDQG3m9zU>pWvR>j%su+6lAR6_ z5giCcN}_fi%&NK7C8{4#$!jy-izoCG)pGhwK*)#MVXTQDDY~KhB?)}VOU-x;q=i); zHK&j)kW0jME`$Zlmbhe>bj~!dZl7|zmyG}XP%mJaoM{Z134Dg&q4u&22a6lonHy!4 zER&>9ic%0vFZ_>|-2DW{cFzFnmrHdIZVyv8_DAwj?Hh_SVa8aQ>}JH7Wu1gO=2lrj z>*ZC!uX)s`aV#O&8>@s);;rc_CpL|gokTIGFdSV~1Fw6W(kvc9;!+#@f}b#d(!G!2 z=)3_PFrLCbhCs=f(xG01luQz*#ZPhmbye$p-oqgQpEL?ckjo)@KjgBH7PzG>WIn(9 zYYlv&b0)QLzm|$n)96E}LCpiFO$7P#vFsNmla?^#r!1@O=Yl?(R>$k#uiPYu5<$NhPQ%ruE#~#eAg;&%d;vcI~L37N?7zeWc~stQ|GSBSL(RCC{rY4 zvCd3UfA|D1pTJwuEsSUaM^U<3S^8PnKg>`%!S>6fY z{cf)v#c69m3&WvSEcc_tgu`~aZ&5AHiE4wYInmwiXGM>9lW4am3#yjB6Y5deWuHOT ztgl`QMI-NP-qZ+s@fz2-m`vfeH~W%*5Z9uNQgxK0wBcDH$Os_2&;ZwQg)EwBLHv2B{Z+v;2o2# zMIjSy71k-EY5hD9PcN;`ES5bZ_i3?s^X*A!lqFE?b~1Bqitp|DsB;3CUGYBibUR(S z&G>$b*Z8J^G%9YANLV=rX; z#H>=SjFlCNo8zlW?~wokgtQjc8aGOn;c0h+g99Slm*H(3^@hivtohvc4K6yh6jrBK zeO#BfPR|-sG3pwDDXuN-4hSLME^y!1GF_aGRWt*V+ND^tZ0WKt{c)N`ToE;VZtSts zpo$y;DGNDrWhy`NuxK$GyKSoj+L&=0(jDL4s&EslbG6KNLHhu}6(edEszGWCQV4do z_K_lkXIHjQ#ETYqRexTVL1lCOmtH+Kcnyy?oyW%;wai??7eb&c5|PksGT@o=7vH0Q zF{LkGNQ#%pHZsZ(t;4N2y5=~oZ>NpD4Bv5eZ47+5Ru(fgCv9Y0ow{ti7`UA~Q`A^K z;HyMvUy9%>IsO53ZI5FdidEY)o+KWwA@xDeQR9uV!5=!-I@juzh^-GtTaWDfjQZ}> zp+e$btch}aw3p#dO=i-ba3@~}`K!=(KW`j6TjrT=*NP+I`eDPTYtC~v_v|bzK}g6K zH*7&RG;cceI-Td{cJ$v9SKw>ZmHGaOUb0%|Yoya{+3N?q9gKCfu-Wc>_#{f?3K_TEQD&B??{fB6{1q!?!P%t=A!z>#{?2 zJNf$EdtZI^?ydW4)~*^g&)K`qI&;po#~5pxP0K6iBA+-}rAx zLItP)=cV-X+BDFgLyI#iemVh)g}fcJQu!&`v+^EHe(stX?gRVn)^ zF07aMg^|?>1wg@rp=n*RjKIFBUOq1WQQ`n1awuMeM!5x-5;k8riu#ym4Zndu_Kn~J zUph8S#Fp3I4h@hM5E0Bhw}&Y zZ~-X;6o4r+VG3UY|5ux9{Rjz+O=ya0O91fVf34V)-Y49;@cpP}^QI#-G0}fDexl-YDGLbS%AJ0l zni3E_B{;iwa2~r4wde!<8ZSWq3jN9)J2Y_XJe-^AvvIv8Cx!WNtp!ZTJ-Tys2~7zU z0IppMzb(wl=W-@qEnfRNvV(phoB?+Ir>`Ju_ISSuaHwa$XZC4!c*Znf=ht|%Vve1Q zL(kn{Y61~;HB+%{rk%MobAV9O%+tN03nPFWpr)_-#_e?7micuW3t;6699ZouG|&>Q zmFRx^ZVI`;de``NB{xmjMQ14Nm;xVq0eU?KXQi7Nv8+H)5!X$+@Yn~@=hnvc(OnvW z?Pc;6Ly?f$B8GO8$RB>;W8KQ1Tva1#^(T`S73~iY_xgX?~velAO?W{<)C1nqYVxnq!0nk7@ zl;R&LS%V%$U4VzKz`{HP$z0`MZYt$dc@pq995OFsx;b@ua$I+T>J5Hw&IleVPJ3x$ z!0+>Q-{=e7;>_>M*-qx0lSqjYQ(b`|MRsMv>>NXS8gJl!bYIp8AbkfZ4!VoGjXYec zbntr|hmq>TFYvW0927}i7^ilX0~F5Tz$rt>l)q%xFZoiM6v}f0d86zJgGH~9=(;`X z3RZcN%BY|AjO$)DS|Z_rAHIOokHF}pmbSrI`}<%f^2#5|u@r zo!bq|`4#(crKDR7pF^0MU2}Vk26m7&)e+Ur8P=|5jgNl&HX}EeCnCO60i-7eg{;YS zg+x`w@Ln9k=rwx}lF~@H{kixr<72fmkfy08q$d*v#vIQc;%ML zbh8~9NZrCd@Iz2~g}ITMfJFOO7&^N7u0QalA73yvUUBG|*2L_Xh#7RsdV#Ik)TR)r zcZ1|Vty@=>6&`%JNxPu0)t7yf_?(HzFJGV&4iT{yAV+uoLSf(Jz7c zxWaxMVn`k0c-yBrIA~_8jhTz{G>maK+1Wnrok^NjxzyxQUH2|%2B=j7TT%~~_SQq) z%jmco_@EVQk~PpM5+hwQ3X64?OCqpRhABVtVlnal4nyt|MiQ}N6^8HcPhb=_C^8{Y z*@;urEBhnr<7%K2SQH7AAlE`+Jbp`@Ya2~5Z0X?F+$Nbxq-_h9U#e}1AnY^sI-xqy z>jR8>>gvbp1KQw53n-I~#;cBhQi!ghj?`V`2(ASgO|teed= z(vH~!9aG$di=6{Ed|0gjgNYaV;NK@A7sc?~f$YMMP&3l)7wi#>-luHH7ZSWZO|Hny zCwT13zjdcB68ZaoL5E9aC>O4Em>laAz#J3u1p>N`$Qq=d2RJbh%DNpUDgen>2%A*= z4TUYuVOqEQ-0^n)ARGY^9Av?CJ24_rw*7!titRMY;Zc5ViMQW=oElIK!>hlKihA%R zg;~7O?kGKUE80n9NR&|`N#$w)Y`LXz145-5d#h5) zQobvzFKtUZ4-jRxgrGPps-}nZj%s1v_s<>wUJ_f3h#K9G#cfyTmXg2Uin-sSp(WGn)UYTjTBhAr^oBk^as>=AaiZvg$Q z$%9_z(Q|6QPAq4}RT^U;WxACSF`?SG9M7Ml{J6B)FMv=7ExQqDaSt_;U!&wVyC^o} zXZ)P#gU=B|in?*mSCy*r<$ge)M?*dp9scJwYeEz!ZQKj8jo)RN0m($&Jcz&E)zT=N zlbrqB;GFXv+$$-J1drl1!(2nsmYG>T2MJ%bTgxGQg-@)%Cxh;Xfg$=c9n&}JnS{T6 z2htr!A0T2%cZwv?uD4=-3)3f!o~X2?;b5EuK8n^PUy^Hwa3MsZBEQU9B+xfdT~%Iy zqCDP#Mp1L`_pG&vM)`2eEaH@f9yBG2S}}{q;tS0#dbL`_n1<+n@fcv-Z^eV;58^Og zpk1K&SvM3}D#(^K^$Pg9HNTr9hm+pqfEs#L4?wzqm0iCIiIw*;cOBzH7|;#JPC_*? z9B!PEmU5#@T2vQ7#$SOZS+sG(^&(aQV}dIs8%4Xak#M>f=(NQYa`4F9f-uJwKZ-tx z0gVC^UBrG9)O`lyn!(V;JX@#bE;UTw#Ku@woo z48UmVs9W7HW=7dUqGCWfyKw>f=i4UlG2A!$a^X0LX?juIivDnB4=lTq731+_$eV;T z_70d9=Tm%aUIv`|tm;aTkp*TX+QMufqCcd^(3EucPA|?VuurR+K((yotFdE74b=@8 zqY`6X_=g=P;{hTn<#5wLJIC=~mGzx}1Hji0Uu>HM^I7CW7-s?VB$fo4Y@0aL=H`tQ z3mTsc!I9a3psc0EVOAqq`tm%{6tS6l|6>(O9<7au&46L|Pq-my0kQ`D95&Vh>#&ZwtZ;A^Uiz%$KLzA)@anZj*1F9qmhy!N1caXaUPy+4D2(%u$@1S~6Gzb{)ITY6lvV8iiTW44*{x~>^dFNYzkfY4 z^SgX{xE!W#R`uA5FLv;{giSk1IPy?RJ(@XxH`pJKOx8BG+0fKN|bkM>~Rlw%f zeqoAZk^e|p<@o*dp?zu}A)X4UJA{Ns&Tmo=fucl~`{TK-2$y>JXPRv-O~=rdxfRz9 zUYnFCHPY6uozbp~CN{ZawG2Mn_%DpD2^2VtMuISaXL2!cg-kXYn4b{PPB8DWKiUAs1U~OsNm`R%cWP4-~^OkLaF1HYz8KxAB^6bw$u+Hd47g zRv%5}MOj^`gxpME*};b`EBDepgaGpe+hET2hv`g9_Zvhg*rrox-98Td&OY(LoHl?` ztj4bLOkJIiY4Xs$^YONa@gcceMz6(KPwK1>Xz(+Gl^5+KvhGMBok3fd$IPk$&_ z5k zvPzlqM+fHj5#Sg!G&2ed(EWUTW@K=YfN&=gD_EKC#=8&x;JYV)`TD|Q`Xr=A`yi+g z=^b*hW4^EO!DcoT9)&?CmbL#QZukZU<)|cebNJR-I%}*EJ%2fWmt9D%Cz@;n5+{wQ z-^z-7VnE#+!=k!5)jQ55-cW0uem>0{-l6ygDl0XmTzwuiH?uR-v-?@0Upg!DVB>}U zn}HeO=OQT{z1_jc$85mIS}?Z4gEek4qcokI5u^*#g-KoE=0MzIy>#ylT>8^zgC+I- zHPHWEy~!I5T>rTg|G9vhXd0V=|FINp)+^hfpn-r65tA>Q=>F?cjMaelL|H-lBGA;g zYUu?7L5B$w6iln(v_ff1wbHh=-B*PO>K}X{w6U^-m7%fl7)r#KntAADI2H4rE3<+n z)#quKD-5?vZherwe(&8#Df2j;tR=0BdG`ywUhv^zafkyPPvHmvURE<9>oK97QU&Ea zh>BrHK|_l&mwlSJ-YU-NG1F?Wo(j@vn43-ZPS#P1qE_$xqF?Ad?0THKYjzu1{%^*cj9aic5+k8U;%J32;}mVOU?& zeJ{vsg*7i1xNm>oq7DXDb)nvaCra{@pcuBitF|G3( zW^0)=Hyt@6zc$IWd7POVV-z z9<@AXz{f?qciGDH=?r-Gm_44jq7} z4Ibwo(ynNAZk3jfNK6UOjZ%6Nb5qXn_kW1?&%*2cPBtUGB?V?BGF6CR~yoF zV#VN77q9ZO+tVoH>@}~)P_Bcc|wG> zCumnH{h`BT&#Wd%-hegNpI{Q|Z@Q&z?aXg}<)f97A-x=f7rDowwMj`xEF__;r((Z; z;I;eY-l}dElRlS`mO%wK!94OF>)Z<2{gL8S?HqnZyA@9qw{eZs!sd(!#|Ld!SuhtKF^YusEbQN2xEbK`Li{Ll(ynMkL zz(mMb)9@bTlHbh><-EG{&W!jdd_65FexIcJ)nw7VE3!6QD2KTF4X$xLcY#)>?V~R1 zTW-rSHsl>leYg_aD^$<=IW9&@Hq|G2W~Fw26iULqFNS3k?x@2aV{im~{i}{+e&Kf= zL`Q)OxIZ#N{csbAu^nQ5kqm~;jTQVl0NkN&x9J6rAhU+|X(@^3?w!tAp61vWFO#P_ zXy(9WGnJqOR%5I5IM2T>`y|Ze%l=EuH*m&p?A+uF_Q8z)fwY(Tnrnw?vPqo6;HUQI za#32b`@Ng5T$#lcP9E}i@ROXvSX=k-ikM1L(6wPsX`c*CM5_!%!?jNdf#-@pAp7U} z;d(spe*DknFqaaQeg!8sfpUT3WYvw*{V#CX&m@{0XN-c|n5sLD#ewPzJJU;#>Qbz} z6UH}fdW4Wa`ZH%<)E#tS2l+P=XNGwEVhs@}YXfzbe4&zJWAzAt~CY zPXDOpXERi!f^lTFBK2Xh=>?d^UPTjg1WwSSSD8`b!4oKLtKYOGZWGF)c*2K$-=1D1 zkq}y}QE%T$EFZ`7W(?sJX%SF`L}|)KaaQUAXa)*cR1I(*%DzEmV`MH-0P6b|QdMqN zA+H8V+sfFjvb1HihA6)Kv1@!5*l5;9bPawi!ZZR4wkd2Xb%uySP2L3BU62IZF{b!?3 z)KgiW%XNhVZphqjlECt$U+78KS)vSy-WWWREnKUqa20`Cto13_0K!|8ifkSkkl-=x z7WXt>qd;xQ8Pat+DXCO*r)X*}Oeu&1>)HN5Q%QKPjMa0PyXnA7=+R2vXmYi@VLMx` zR6O2zE)UWH>kO_vtM1XG5WMabuDXojsiPo4}xi=EsIK);?y;4jqelie%PL;RNE{;{6OQ7iYjHkJ%rV&C#)qM#$VerA+c zFyQlD-NS{4gWV5O{3w=P*L|YjKFAo02?kZzQJW&&u+_0hy2TKjV2}oGH#bbp?YEu* zwd9PSyb$eeNw~xS9;)=05GZgIBh5dmnYVY_FObS5~o9%K@i~xlYRiC()wExv~R7H35Y%1w!UvoA9F8 zxiZTERR2`C88hNTkmU)YVXh~tk1XPN33&=#<-@j|lVl%-z;EceDD=88t4bZ&XCO@L z+@WoCNB|TrU?fhRxcl8k8d&9 zzcXI&)nl6U{YIPFom;CCuBb@(%`qy1F&5!8(3&k|Wis7h;|Brk8x7g%6 zRrjxvkztwhKT!Xxi1lBt1NrACGOhiUGXGnye?5w(pfzz|sQ-Cod2~^&oIJbE@E^$k zeX{5q6o5;Za7Va8FQc(Y=C;;WWt$e4D!&G8iJ^u$J6}fzF!eV5&ybZTr&LbBT-@yx_^Z~pt^E8oq^x9<~|>BUet7?~0#8`;Y{?2+-fFMD$7P?#u@ zL1Roeo2BUl+>>nCBs7gk7jo9fa7<)mwUrxLEWo$ZwnUCW6Lo^0F?k?@ zA!smyG*m0a(<0A|Pu3Q%ue1nk*7bb}_5KjKK+r0s(ZQJao3{PvX&Vg6$f&W@06Om= z1V99ty@ls#T%CM_O;QLgiZ-9UhV8CqRlJCpMq)B4cihx`FgpD61;!QH`5hldmdb28 z3){V*=J+TpxW{ubKG#!J_>{ki@6~yl7CXnU@sg#LmmIyN1I(X%vPA>{joZfS%&i3a$@t3n zZuNrXKMGT~xIT%FQF1b5<4Qp;nOTkbGaWKYJSs(hB=G$ZayTlKWvP|-dIWX5z;=Do z__)G~URCReZr!!JbgHc(mgfxlHJMFX-J!BEr%wM;#`1?1rFVOC%_)%qJOhha96y&58f` zhv7zXJ01<7JUpZ43$|b9nkZRqhY%1i^#aoGpXV?48@^F=ms$U0&*iRC4J($~Sv9pd zFU@k2C;Y%$5i71zNR10eO^dqXD%y*L=o;C0VYM1^N#_QIn->x}YR1R|tt*mFs1zb@ z-7qD`O0@|8txUv1gCE|zRz&UC?2VHMxk^JMrB0}{NU#@IUzE3+cK57)@DegffKbX{7c~roOSG0 zQYBo!KLYO@mz(5J5xm?uFTnzfPB)TSO@%R*c%|*NnL+W-xChbe)QWN`a%w)RnHJZS2O$9wst%lE$l^+ z%r#SB&t;U6reV6Sw*u5fqs(>0uWcuzI;e}N^GP}opOw&1F!!a<7MKe@j562@Ka5rp zLxT4DSdjPGP&?#RHjUbEqWbt{6T7OX+O9iesEe=(eOW_-u7@{p_XR*`4|Tm220K-~ z0`5iI6Pev$xgD75`0d7pJ71qTtkj5>rVW;;fmyP@9L0Qu+d(#+Hu&ov{5L~A=E*okgl z?+7pAvJ3b*GXXAurNiHz9r>}|;N;9@`pHdM^x47Kxrp#1nbx3L>*1x&`(gGRqRpG3PUw&~f z)5$U~JvZpKe}xrd{rPi)?{y3Vvu@X2H{XNyOPV+FyPOT6wUl66ht2qG@PF$)_7hdI z!#>-8)SG`*s-~`ei+_oq$q!jDX7!2wQ49YqHaQ;tLi}fyV|`@*57htG!oWw-f8`o` z`tS4|%x8Nrl>e!PVLt`u#FAjO=aE^!u{uGze*@tgAi(JbWQgrwo%H|C^ivMQ*0u{0N&HMi=w zWyytylaS$$%5lAG2B|Y@`)zhkU^~%zc$auyaMp!EOEYSxC;w5mER|S(+O7iwT1xWufb3GTdZ^+(Cw}D{LVA5W;4W-f+qrrM)Kw=T9N^TB&Gvs9S zjF?OHv0eG$pfIQXMpZ&ndHPdc zK{?qOM5lg9t2{n?G*|;*@+r7p_t~6+7J~`WN^sQ<62)qw##y46NPI&TX5C`VufzNX zd{yn3$hgch#GO3xV*#rsu(*Ep@Ty;V`d*C5$`z#;UeN&-9sw3Y9d3rBtlr%60d6sH zRpmI%pvLBb79hTIeImb5pYA zQyvp~f!R zGh@%Csa=lb;a8ZB$RKn#9ody8QJtq;S5{N-^f7XAjnzo)G$uN`p_Al`V{GN3nALs^ zS`P7v78@?VNobllR3tiS2cBIGBa~JxE+99RgEwJI^0_*gaS) zdi`TK!dfhc(HN89N#AX>jJ;CDZA{*yKVsAgmD^&n_}GU0N*p3M>1?uaR0!3X*Xnl% zGytFQSWRv?G1KdD!5&?q127^wDFH?uY$laQoC8DxbACrU_G;Y`X(r(=`|@#4gK(l` zi~BfTybg?a?l-89Lf*4|Wyrjbm z5~BHEl$&gRb>pDToAF8l;-Tx`2jO6T#8UYs@ht1@hDjN40nd4a_gGm9ny87G^ z>cc`y zM%YmdBNMqbT)I*wnPnLgIb_u6lcz}TnWH0~wVL$tX@-j=gy^!e0WG;FwnqDgWW)W*m|e;PAc7V!M~ zW>2DuGr|AP*z1#)W~|aI^D)pUZYCVbOHu67l3S5ph;uj#&5f}2_(xbKWB`EIOO)2Q z#E*Voc0P4p%2mw;CDf=?$(1J^TD7Rs7_BHxHrRs>Tdue)4w-{8E$U0{klV=Q(fuyq zP$aqTcF}}w<&(p41$VgZ~_f%Bs~e7v+M`D-#Q?!;JrH> z^JL&Va3AeK4!~cnK^~w02|&M3V7}rF<&6iLEeJrN|KQh-h9mk5Bn&^$hY0vdAfRNI z_$D4r7vd{2=o;edXAngoplp{X08qPI{HssV5$z=%CJ*8(HOL|WP_qkh>fFM#4r&o6-L&F3$G@(t)q8|3%PE*I4oFd(5(!dGq}XzX1d zf~M$;C8ble>ZZ$Yg!e3YLV=D)Y#-s8{!wDshPcD{olE<>UiYf7Zy__Tj;2J_cWPk? z!|LA3ott_18#VEk{8eVrBP>QHW$>DJ3lqosAzpq~j#&Uxzkp3*daku8#n@sjV&FR# zBJcM>+zTe(!%5u8|Ip*VOA*coPOMf+{F}aHsT}6=>5l9_x&9KHpQX7f%S&0^RK}hB zbjPdnQttx%1;@Md(i5gLfNz6o^OS)AM zN^H-Xl&8-alJD$4Q?%^1sNbu2*)bk3ipe03k6QZ?KHo-ghM&n!_5dV_=a|g+$7c5*Ttj^;kPL0BlTDam<3%%Zyjb4yT z>-kw}VIU^r8NF}%6!J=rD)6yNMIq0EVq%;y#I|wK#;m<$dS1j5eOq*hF!CFPd+~9Y zy}~tSIldqj;s4JGV(HPKz^wn#?))&GA><{4bf4+ToT6gdmg#iMBMN1Dw2Brf18xr_`uVXcRe0ALZ_CXy| z>knmH%UeQ{%8o9@J!9(O$eJ=$&F7lB>mWmM@J3TvGTvHQA&2PPH?*V{V>IoDh#fOo#W4ZimsiF`tg zn$mAcQiMb0PSM`EO;;n~9aGbreS%T5Xme(pI5L)nZca{?!V@{rCSgL{%WmNz$Mv`guitf`$H+Rp1aMi4{wasrNwW3yTif-4iP@HLA3@ojI3zbt^ zn3q#o7~(hUjN9s;<&Qz>zekNFx?N(Pb1#eCxh0BVd5|f{0VOAgnbXPTyF3DR)Xh=q zjT0+6nysMGO1NX^TA|aWY&qp|3y07fIx$6$%;u=@V5N#7tkWtf4fZFyzN4mQEz!%j ze{e1&6&uY{F6MRTc8h2p#JS_scfc??-NfkY6k|jlXTg!#jLyxsBo#m&A*}b;>?5a7 zC38em@;G_a0r#Q0{F(AuoqpDa$a|n740?kW@4kzpnfmG~(@du18iMw|Dm?bP?QlI6 ziUN9*Znz1O#z}IQqxNjd$0fqqmI)a2z`C;9jt5VRIt?COX66=TPejr;^Yx-Ml?ewJ z3XZ46;_m5}>|FiGv#>CF;^}u^6J*w*nMQgF@T4ri0rzOFHEm8#+%_PXlg^Pzw#diW zk1_nR22?p;)SSkjBB%?+J%LMx`_|SZ+ zxiBqh|FC77l-l!Sm}+?DA+o&qb!XXYXu9yE9{RL4@ou*{VE9O>8VL`xHPHU)8sO#? z1<)*%FMv%qMOc6#{bK>>Qg41?};ye+xXj~3q{js2dIf0~8z_!V4 z?Q&kFS>F+g!&^LXUd-Ns-&7mfX*bom2S{4(5>}X9@qAyod|To4jEcN0cc`a4j{uu$ zcKU4&i~1<%9TwUUASL3MrJH=~aYhk3rpGPb@Tgq$(M-1MVvIkB={P=5o!Xr;0dJzEn^@!(9B@CP0DE z&U4KY6|sGwBY&;dKW^C+m4;)Sf%6&vjqIe%ne8JBdcSaIwWu{CPl5QpuL&a z#*)tES43jJoCiXY^ukp;NylUlMpSKLhYv>7iQ9-~H;DT}81mvgeTmiWY5dknG<7zS zl|Yw_Px)EO5Vd2rZlvuLquo4mI%y|C+bibT--ZAb<<;C7IfIrks%kY`M~o8*!rlv z;Ij4)3`P@Yt7?or1Rq11i8{E~oAvIEaknhk5MirhE_#9#oS8R*GXTxad1;&O-WF)? z$}5R?>nfm2mLSRt#C{27Uzv-`xBrLWF$9IK9a?QG*t_(ik8ql>*&C%!j~n{f;D?>9 zci_5wbKeMAsMy6bF5veVvUZWif?3@_+O$~)?H7MEYjx@PWTw=#X0df|))$V@U8NC;-&5z|i z)oJhYX_F zuCQr66h+3I!Xfmeawo>cb>vV*w81KU4E1e?M*>%QV`}hYJ^{7-8nX0r;Iyv{Bc^IU zc4Y9?uA;T)^~3fQ+jOEG@dz}#eH|&iFJ4@XD1PV?xb0&)rQK%ImT^S5H?1 zn|OAV`F$g3d^8-OYv#ROZgon#Ur3sTA-k-qE0jJEc|_>*@jXBWcan|2VgxIL!eb;v4YVnAIvkq z;gBe6k$PV5uu&azDd)l>4%V|`*6GYLiU;nSmbMKIkZtUkYT}_#XE=k_728&ha=?1E zwe;zS#f5MzMhs|>jpSLGC=$vE;3MsvD-mLULCVs3!d;hU59r=~s`3_w7s4^MSsGV) z`TC~)#s&yze%yfZ!X9dD0VALQ|BU@Lx!??Q?lHn!DdARbtnaBko@X4JwO-+!=t;9y z+147`E&7cfa4iw4!?=yrxb87o<^7B_y+`b(MGjPlX``I&$h1|$KIBU#&0@VoVaNfQ z1xyV04r!TB_Z3MV?+Va`^oZ0CGj}NbN$cp+ z?gLa9>Ifc-zgrLRYTOjiU7J^RyNnnd&4>P&1yi6_KNESLhw2-;Xk$diZW!98SB(=# zb*Zu!6s<90Q{wi|e)Ng%sVnVt=thF8N|O>KH2bPHLb(Z%%VL zcOAD-j&m7oh~ZQZ0KN$R|2F17XkckIN#`R}>0-(ULJXeu(@NzC%~Zw537_{cc{F6DYWD`Xoud&`?P@OV%)drueywu zHM;EsvyUtnK<%#cKgpnfpd@| z^>90K@mos~!#O>|)MBeH=SUA#Szf3$?&J#^vphdhdoe$lX zHO?1XnN1@cvZ?|hm}TwYQHnUZGxPmzURPivwxA(@XiCemq*n`HA!E_CA4(tXKI?uf z2cjJVIFYTgc)x1wsh5gM0ufUj+z+Gfb49(^tnt5C3|?fQ+2l_X z5vPSvBKvHi@FqOYeGn>p`(q3Ig+}pys+jO&L65M)xOO0PDEu_I@dc?YEo_ebMWDcS z(7HEokRH;24!gi7!(6=r#*cWvQm!#c?E~`n33f+bm*QI_~`}jWD+WlKdAR=ID8MCqrU? zW3VcSf~w77F=X(A6t|k$n~O?FNl#+M2dkg-)B7YQLA%wa1On64i1yO8_QV-3fNw~Y zyK2)xiZwN#?hTiZmg?o6u_57CufC_ZB&I)iZYa!||!Qh9^a6n3H5z>KUsSyN_>6PR-zo(B5~{>R~>x`h?fJC4D2 znT_c&8AX$%7vjWp!g;C(skby)z$-yOu~7~db&yEK4{sDbO2Ouos?I%T%V)f|*2&M> z*0|Lzy@&V4igf>gPr_|;3Ikb+E#7aE+>?9=0WubO;y!tF+hhdDhDQ`VZ(h)*<6Qk! zZ1mTk4|YZQ{nc0$8)Rkgp_o(>eIaM6x5becD_NudC?zaGbrW9#z+iTufR)F`2m48? z=C3?|il`5v6(;-FM~cf6fhuJ)Ulv$!*N02jsauY>s@1dW&H`oFZsLEWN`9KXxV=eOqb+6H_T`;)zp)B9X>n35L9pHEs&4Ih68ifZEU|vuG6?n}M`wVjEj7b)JC`SNQ!j_;Z7R8d%#Ripg2_B|l z9Q!X_!X}nn232Zq{`_U)_&adwZtvW;aMn3TrV-| zjk;;BCiJQ?vbz5`1;=18=xtt`(NHjavNL|#R6D(vJYMJl0%$@y0CCa~OKUYwk3HBs zDl_(S7v7Z-IvmGlK+9JY|+EgTr6sfK=X-1yJEvHc-0n3S#`j^*Ao zpjcdZ>t?RJrhC^`@uBl4=@U|P63lMHD_{6=6TBGZn+!lFXnDT-&iFI^6Rwm}XCr-# zvJpVjCnoBjZG79^H6-=mC|r6Y9!uemrk?_q28Q#K(PL>$p4dZ0*~l zfJ|JA0&*rCddp7;5#`d?{hO>`)zCb3n&IdkcBfG3zW=tODrVY=`i_verg504S0;t8 z`aY4HLT_gXzTlO}2~&??_-4lq^p-~-^}sZrM2qz@FO`WRs)7wBNi_EY#`rw%Xt`*X z!XHCSHs&isv7B|boJw!nFIIrGd7*M`@KIIV-3K6{^$m+qo4~*gd?NoqAC>8#=K4S) zhTo43Q7nNNDzuyZ1DaP4eXyofFtMWT}FAvpsM?X_SN{8jbi)vZ0I_n z#GDwZBNQKYLQc9b2!P(OFAC6RXIYKiCwg@Lp@bL~YWJ7?At>L~hWDn2t8O!wv`2Iw zg+2gl|N0#HGfG%_2~l9NN8q>N+8AHwZTt}5^NoTbS%;iXsuYEXRI8WzQuBvO8QJ%i z8t99uGV(KD!90v5pkDxE_Di|aBuB4d+o3-GoK$Mv|LgL8J2&PB)O9LyoZ}n8%kvUO z!>LMJo84J1|CdU__aq?Xsz@I9C&BoK8V%r{L+?(*tPXG*bd|5!RlorMx>LD$VkG8S zQyi~JB9XZcQhSnQKh6jTidM5zk*Kl;sDMR6w#C6uVGh$6N$(0XP%1-mWPn%QUh*1a zwnnqSP9rVnW41;Hv$u2uoy zlrUjRd%$Z(2FlTSY`wYu8rz|~8OWj}fc_4X=ENVxvTa)cm;2r={RXFdC;zh(zfbZI zXw~O^afyDx3nfEp&3%m1L+k*Eb9qTF5c@m(uPWr)+ei&+jL?%>|`qB@$; zSV}wSWH|T`7Gd7mBW=!**3H6<&<*JF2V9>k8GlyRq+^L_1G$1GyB<;=4m0E#3{sJ( zjd3q<=j;=oB;_zck>{ktI|%?Yz)R!6fhA;v+`(YT)$xU=(MjNSAW>-jr-%6gu}Nmv zJ(H%aJAaT-uHqlU%#ndPq0ZV*)+IZSosp{w~JY!j|)9)R77aV8KoATh}+cFiN#CUlDM%he;NsOwg%2;rWp zlfnE)LI?O4ZUJvA*Rl6w2>YoNPFK!VdFm=F>x|1=UOKmJn z3WFz4UPP}XL4*Xoyxw)p*RpGn0DLmkxtf=*na?h?fnLgGuS~${i`lDZ5%gQpd-fX< zB237~&$0quKD4S9oAA*_8>1S-$X*NxZa{<**&9|gSpNHdU10-aoF!2jdx zEra9Ol5Js07Be$5Gcz+-%(9r7xh!TTi|IgOotb-8u9aI>yp4;973z@fl$h8+p8oIr7r_^h%B>25JU91hFo(&8YBtxlTmws8 zq&XvP`m*?jAwNXKIpgM z-#}(mg*!$3cHu&7#8bT-_wo6#87~V!e-Xm11fYgNStfN2xLSIryvaU89Z^gGEdKkT zU3&iUFZsgtG=|Unk|pUAQ0!*O)p0?_r5E!r(V=;3!EN8VL1x)! z731VP+lSI%zQbR^#RXZnwaarvMGv1J9fD{v{UVZ@o=x}f-~yu`A=#L?b8M;~Vu+c5 zAD>6x#I?uY<6u$cmJxLkLeJ&}#OaEiKr69L66`7%4N5nC=kCU^Ut3h_XEn0g z-uTP0B%;~Se+R&a36bEazU>llCm6cSK9Mu)3# z>IO*D0u3AOk!N6P3i8^t80R-U-5-4BOwPTzg*CnUP?5sRTgA;Nu`=Xiy|@n$(ns`7 zrEKESygc9|X4pNxwwY{zUP<=jB)Xo9Xt}hCV`Ozt-yteDft&j00q6>7aG%LV6^OVHCY!cnru-8ms8Qa50Q6-+iK;@^4a z0liY&JT;=~`#p8H#VgWbedkH>tvG=1T4WM^%U^45LSK!k`jD{#NLd2H`8lKte?eb^ z9-eF$JUN2H&hS##Zk1#XlguE*lMVWY9i`-*Y#JXuW6Y#^LDBq1U0vw<&VQd;MQPTKn8>>*p;4Es@`w}Sgh&WSy7u5RBOhP9Pj z#YlZ;HKU89mbniN;LGs+;Z&E48Pe4l_nATP@U$({Jk+-WAx}UwKoY0x{p&c%JOddb z(&lp6rNuC_Yqw`nHiLLhYX-BBf{ys@md+9FVZy(c2KM%UleHY-7 z@>yU{#l!0S9+DqFJJU6$4UP`>IK7*fdi)A~&OB!JM7+u12h<2%l11`44_xfUH|^j~UL5JUZ%kR{Ch7YjhE}`={-Z*H_T+9D7fsNIO4% z9{XCm{s6|mZO9_CD*^4L7*z=6l6a|`Z>a3c^*Qxr>+E~-jgOIY-1&Xpd*}Y;w?7zP zE|3F z);ZM=au*PPc5BPY4T>A!P`TPJR2EDf8+Dm|q1V2B=>$|?(w-l;9rwt65=4)+R)+t` z{I2rd_cBv`xqXzsylA=iR2!k$VZkuD z3!*}ri{bTR(8M@+j9CnWOo{o_qIo2j5|japgaovTMn370iWFhb;-zZ0M)bZ@Pz9Et z6C1^wo&$1~8(Z_t>Y;(se-f?JmB~ACq|-0j8f03xdgoXsu|k$r ze*#x52#k;`4qPyQ(90Z0QaXRZu?K+|)`}q&eUwJyBt8F@sUN_%jze-J@{es--fFvN5o~^d_Uu zoFaaIXD!8=N06eB5!{Tr4bP1GSmEAH@6qDfX61>AIfkF zB@cv}}Ls^670Le?fc%HmkbrPw#2vZTp%dCxQFKK%&p6laNngu(S)D*SD)U(g> zs(=@oIx;d{sI8~|3KY;G=LU*J(?MRG=TCWr!6ysQUlC( zvxfZPQP)xXVe8p z@YiF=u}xc=Qstl8XzNnT!3I|^K)@~(rdcQIU=sUyer{#i_LyFG z5e7&*DFyVPkA)8-i|B0?+@1Q{NuDrTj)>of+wI3h06E2}u`Hqnyrz5T>|`W$*6rY^ ziL5$vq_YdtXrv#KbsIgR{j^odD8tqPEy723KKCa)nV%)1e4ZvW#+%UjA#JeJbgt=F zA4Tu6AJZ|tMxuPoLm83|Q_!=*Tz)?K?v%}G4(ys%?MACz!5gVvc+Nb7MXE42J2fC+ zKg&ZX0fvq!dTr7Y%!ev+qu5vr(<$!AlXr+S5}D1N&y#_0syVY~8!-2BBDmRL)f_$F z$`Z=ENVbh}){9`OY#pNe_9$f0#l9;jXqo@S*1RCs6a5JmJ8U)o4@R%5DL;l1C2A@d z%#7lJoqqp*n|xlozm_OvC?S7!KBT5>GwvD_0HL{c41b4nYbc-zNtXsT-MxZN@2O0X zX?9bnWXQ2!ne+#9-jINtdOzL@qZtej-FCQ<`vgP+j`XIR;_B|D!Bdghh@&8w1ZS1G zt*x&4C&C=0n~GPBxJc$}UXMh-JAc|SffI*=177lF^akF%T65N$u&#=gP4rq}y@FC}zS87qnXY{VC|x`MJ{w%h zQEuWqX1s%FdoO0WjliGmpDXab^%Lf>04M4Ph!38KUY>~aU>Z_j=`~lZ-N9~Lb#QiW?itg$XY~Od^7W1hO2j}u2G4dH=|Onoz|Z(bh<)Cx?)9J zk?2eP89Bf1Ahcz?ZXT6esZLMN9Qijp9E2Q?=yrva<8_RX?dbd>Y)0=ckx(;j2E@$M z7hc?PmMW9H~6XXtvF#WDNQ`%knoxx!q??{gb)vC@^2GWR13)X#h zoAUaF%ZUs}MLF|_KBwYV?AG8{+n27D3Y=XC%DqO`^C1h|%Bw*Yb>EwWcOYJa9Az^k zsp&Xy^69=Nc;-8INGHV7(pPxv5IIq@d{04x14rmM%^WOczP z(x-q14dP{{UAd;pKsVWkis;&HI$va0Q@o}fx`FQf-UtWgE(aLBw&<*x3TZ}r<%G>) z4=vEmT`r|J=K4#&Xx2NTSzx|`#oWPbQ_%cAjFoU}Jzdb}7eymBH$&?5{j<`AN$iE{ z&LpP*6@<{J4CmVpeb(hi*KQ5v@Rwap_-ih;`63Nmc82a=$#(~qVV#$C-1STE^~@9M&?QkPsR2Tf)NH>eO#P(W|J{fH0*@2?Y$ z87%dgL<%$E>iuJ;Rva!7_L}(}Ls<ci zm~QY*tZhM+IW+pY@hDjvXd6Xp42AHbVd*0cro|V=z&f~pGfSBfl?Mjdej5{Cq{b`2 z==z4heq3xda0~p-&Z-Ms4qK~*-9T3i>sBNuxa3vQx#FF3T{s~pJ1!FXmi$8o;Kos) z@`D<R?-}g(QL+28D~~AHHm@6oQRM^>FqT5t6uW<#%EbHadJ!QX-f^9N zkriICz3Qa5MQ%SM4vvATLRJts;}n6hw(E9?{A(Oza|Zanx8+L78|Jf6CUlAJGA0ti zb8vSe<%ovYlO0ic39(i-LUY#5ondZ%{+*h3{6HtAZsUW8F;7c$+k%%etx&{~o(m6^onV`0L9Bg|TpMpIV&jY^(QCj0npW6*Q+j=bX!0L`4^H;A*jWPn!=({If-B~{) z(f0cFPerNV1ATHcZy2G0Bk`#4$0LnLJNEtXGBTWG-Iw*Yz-D69xPKc{`;S5;jg1GC z6YKA?&yi0R~F z*i6j0?I=YL1@X*9zZqHyl z0AQ**G=MXm*FxL-adB#h$y2|(w>yu!jl;e_NWdcoA@u_gArh`l6GXynh+(_V zojjh{z-XTCCB>F)#Gtzs1y$-sc4#^_@tKPyf8SYqFaq(Gstss0FKGxp3rovCXmZzx zGUs3;5MXuxHA^7$0{;dxI$l0k7A_lVC};fBs;{2S+*|3yNmdlcjtZdPm6wkH+zd8( zd%a5ps%An^Zyy1)j$r#f1)CE&l8=?`)1BaOwhZl7SF$mO$L{;ft%MVcoi!+}xkj^Z z_6vQ2&X4V%|A9+&Q)N`blL@)tax>LbcYUl+n&UaiNL`}RTH>5x2d{(LVho40I`a8a zUVaFXu$i-U!q?RucC^S!HN?;sw*`ftC_m9RcavR9(Iq!jG=V8D}955ESK5+Vda&sl@cU zLk6J-?{q?DHL`fq%BvGNEiQ@!E-Sqaw})4;Ec;TLAT0QKf|LkUwKhCrLn64<(dn!u zanW+zry89=W*`)-xvGO?Yqc*8C({l@=xrDRmDNvG9nR~D1X-<))O8AyfLG9m*^^kc ztU>&3W~nqwo>Y4?ikn?+$a3-Tt`?hd{UD*t!sKI(s}uA1gu5I#15q_Gxri{M`m1s^ zXJuwdn=*pRVxH;5*`lp%DFjU)#|Ry4w@1r`SCLM@@OScP{S&NYPHvCER8DfBdj|zbJ~9ZxviNtZ@hl-{ z!|;{t(_B+@b(6Y8*AOarJb3wXeZ9XxES@cKCKb$sVV_2CvK7qXWLR|^WGalDS(I|E z$dK?Am2su>P#m(zO5dQ}aq0L#sKc4YO>)D5$|7@_Zb|FXaBW!T(JSzG2AmA>HR8ea zKncRuu{!l306CS#?Yf-t*-)J#Axax(3R)!#04d?|Hv;{uEqU}Vs|a$?L>SDR&;B~%=H#=PwE zEerP?MzD2mCe%zKJX3*ZB2A|*E#CvETA~|c-cG%b^sy9!ZSJtE9N-_3}mSs`O*I2_5Ol@#gbJt8csWV9sIlaupIHrSZ6rPBGDDoz~^BoY+Pkg z(OE21EarR-$p_=Fx?(B$ePEP}6`$2nwAE>U7D;Hq)g30uq8t)#H7AULz3sXKTempu z&biLj`&?db>ls(jJ?QpieUGT$(QZy=b@#Z^JFVO|2*Az5fWmi_gF%j|rpxIkZQ8po z-+GVO+oqI$B^3J=)!v1s4Q9WvB-ts#$Rp&y0ea5YMNOK{srrsQVcEj?ju2}KYUo1r zWj3f>-+HNhZc%w!LfmSJE+7tAeqfBq-2;)ql8G*g+hZQ5mI)jpl}XHEs@11Frb<`e zLyCIvge<%&9p}N<+@qstR(cCuAe4BkC~_ZXD{`m3TBdMoeL*OXB>lovzPg`T#7TQ~ zmWZ3&OV+HDa41`$^hVOYB$;NT*;-(}zyB1;r=_W+Q^@6Zz5Uwqc$I~5Jy+cq2mEI) zsTKbq0sNgq{~}F=NVklaW|XAbQX`tug&+KcX4pa9B64dg;kXBUTZ=^TONREotMHyZYuOp z7XetWAaZtk^!)zwUSAYqA)CMk=skbfU(PYn^s|^zC5Dqf)sfO@x94d2-hAIVomwl5 z@=dQ@9H2yA_vzf#az}NFjwOu@7M5hvlTmLW0H%2ElBA8~iTxr94M}6!M<71>dT5ag zLnSO$?Z}-FlJq8Kg#oZMJoXE3koBX+0-2KJe=~} zrC;9`3NX^qQUIFnD4~osi67*F@-5cr$!*7EDw5d#1K=TQTc(W~c%IBG1l|u4QBgl$ zW2o-q8Q+AT6c~Zn)h`MBCXNbf94ZWHk#v^T?p1}OahLhe`pp`UQwx*x#!*E znD+$nB)uNnMQ8d^xJ{kv`*Qk>S*u`KDd5JEV~Uw6kWz67N>kDOWRSN~`DR_jCGR=8 zB}3*K+xPJI(B{8pHmBjr{6Bu(e^*MTGN6u7|DwXIdb-&>dIfij_im;R$RTy^-U4T&Wt{&|c4VOyykL4!d5Hfd0hvNYn1^q9-GT`G0exCgP&wc;Hw%!4tIe+c@E#PCl|M(vCuj|(R z0MN@%|61=?$p7L;6$)Ah@h`vCsQ<-}IvP~!FF%(AP~QK#?@$6L4g|_So?m0)nH3Tg z2#7c$2nbQy*91_kG>9}%Ea1P~F=&bgjK>EU_<^Q2M~}MiXwb+S|4t6IbUG95mpO}H zh~UEbiRiSuKr@Uhhh~*HHzsW|$|$EpTt)M2-lAd&BlmU1KDjBh0gL*((vIUFAGQYi z%B;bx!uIR)9-;2X++~9>B&6+4Sm32pjz=tjS5=4BB8FwYK3VLpIn1BQ`2nXK-i8S zt4BDcw!a=pAo_P+Sn+1_Nbw~>>|pOWuCjGHJm;vP=4$$|qGo8J@wx2gd4PN)Bwlq_ z!`i@&75m#ued_XvQ^=cPiNR^BHmv))&~Pvbgl$2H`w{o31mQ87aR-EF6tjd+JA=tuZ+FDgVdABBFcaiBzeL~Y1PT*Sf~DgfOk$5_zjNFwo8u!vY5cl4&fs@nR< zVsqE?8<;WQbcICdM$BNeuXw+oLc=%NVGEx5KV~_g5O(%`KPFkM4wNxS7{$J3%|;bn zx6vOy2Y-P>Gw+EnA%e+D9`}lVAsvV|QU)x!De6lxPHzXwPZ)2!^%es{I8{ca~xQs6I zX5_NQkw6Iw`95i|W?nl_vGU0~^-y<^RF)mQxlUy;`8-j;z9}Vx5)P zOvKOkE^$DlU!Y!+izg;uc504k$IJajE_jbqULRS#-BM?XjLbq}9>Dlw6kAK<*`%ml zQFa)UpZsjQs{oA1{k{<$rdG{`AGQJwaWQ+16t;Pw?CHntm9PXGP&|7 z2dfWFL>QkU3wwfk5WMd0TePfVw}RK;A0gV7Fn?iz7%}j~yD~GttbBmMv2fLazf>x| z%uV?5bV9bjf!9m?5?fgmhagw$xmA|;Vphe?7S+L^WC2W!H2AR6C3RTAiPX!`u=HnX zYd5*_5>-YGoV4XXtxbS&E`2pY!0K9*$Rwq-#x4slrZ5k+2x<|gU$-?hm5R?TfI2p| zIe=`XwHr{gHxu`u-jMc|awpHID2y#FJycaCD^yi_0BMRxPa&a5Men4vUKc6bK6{mZ zPDDm)P60&S?x&m2XuV3Txx&;~oBbq|^{vBsX{P4MLt@#}2Pj>RDTiKF=O`VF?iXC+ zwYNN%KAL+F=Q!a-`W0LYLTa%U!QWkw>QT#=> z)D14ce#Fphv0w>q{XoEqh3%&O@&}x(=mZmSUKhw$4TID5wL_+`l@z6k>`ENH!~9zA4;Pbw)1N z&mASbm(V>y=4|fIQxe{=zaubp92Ht(FsGN1)&~fB_kIo14WB{T(ZBJD6W{2cQ-H6b zdI0u+Z3gvr$|9<2Wt~yiBTyu^I+1R7#u)j>kbB#p(6p&Wl|_kjV+9O>8ehFU$xYRI zw?6YOg8i`(hqot|dR*)Ksj%m_7t~wB+zVL$LZ-5B-&>tZVm^)79Ik8*P4GJV87R~3 zY}Jr1z4CP>$;|a)^ehFvc3njDbe>dD8H!Amk&Nw7|n<|7Z5C zyOO4s+7s=c8S1{?#P|q39Lh1lWWVL0B?h==ag`%@J`W#4{=(KHnk^6!Y-Vc{oD~7C z$ZWWUTZn3RzJnhix?_=U+kgB|dIKUXPw+gsaqLn&y`=_lo{pwZMXA+&pI;Dg^U8p* z0@|Lm=um9+VI(NN@r?`I>2a+ur12K0Qrogk7Ni8}wDz`n76<~OaYFO@7l%a*z_ftI z<+W*3k{k5d32RK%Wj|z$U3xerN36>G7uZr>)ucXEWhNAp&7AL4cCTy z2AiQ8H;We>2j!RY?`^P!W2i#TQ+u?|;1m}x#4KwmPO;QYPL)-*YW-=K>D~yFsX+4p zvm3Hoj5W>7tJf!Cj&A{83Qo(0sM&onLA2G}+fTRa<&nhM0x_z0`V2Tt`%HUHUw1k9 zKR>5^K@r90!U=xMvSKMKY%j=cfn?)kz}SJwSgVU#P0&cUY^S!t-Q+V||v z3DsX2?{*8##*-B?@eGY#hyPWzkAMSFt0NB{Lwje)B<8{%ey(M(Gw_(7M6e70qdYq4 z(wn`>xEB@z3OnQNOyaRI$%~6i2@Zj2%M0<0_!F6-vHK4ia}EH%->AoD0g8V*NWv?H zVBx!^K#}sy6n7)KN(ru1G(AT#TsC~QUx;YN1-Z)NxbWA9F0*f4x1%j20o?oF9pzzT zug&f3)ki77O!aAS-9-k!b1R>?>)YeVVASqlga&o3&P>X=(W+Uz>y2=JsFJxEK>YdO zRy*v9zGb(p^=D;rbT#vl z>3tH6 zj0L3*L6BTz-quLVyA#?b{a2rWU?d#(nJJvdE`o25#X>gRB~!{u72gKTLIW5Y-*RzP z%7vHbUl@yXNrgI;DvUDJQLMfN4A=J44+b;`4~7beF|^80=q=yMJ5oJ#FV=lk%o#Da z+zh;`mLLX7U9^9II;8}O;cA_XBlBR!XdC~IgvELkUI@~&#O)$hO#rDTkggUmXXC-q z9M3gKGvTKh(HJ#DM9|8z>yVBcNQJ+dFR zSU8XQC^1~*iut#`@0xo=&&yFJkmIBt%@hXo+JFEtH?GfQ-InZ;rtj#vb7^zGb+6Pc zUosFzQ}e5LD2XO4kFC06hCi!VVoVlc%gT1-MX3(l7Inq(9XaF72=wQ$-mQxi3Y+uL zq#`ew8PUq*bU3zNbuz9GC~oS)cZJDuqvK=!j{Q@%iF4io^;UR~maA#QugDQ<$&Y&C z8{Pt7`+OC9DI69>nk78h`95ly;~9=^w^2*@4#rh6`cC{n8>7Ulc|rQR*{wEW(^`km zyWal(9kL}*6#+YFtGY^j zXmP?>T&Ma4JwcOBC^%78+&|bON!HdF=d1%@l?X}Aa}OiiX5ENOxfBsMj5Bl%HH zB$O~$o>G0BTsC<1fi9WcI9!P)IXQyN%6gMwEFTp-fUWX@pBfa2|BM!LY}*iviTD|S z4*A0~-%vwdjJneyDv!1w=66k+?yx-Bv?^|%^c-=T!+5;2KEc%?Z=L69r2m`7NEYkZ zCt``JP3JtXy3&BAIoN3POdKQB@W)OWqo3w=s`ZA*8*vl%)m$rNi%%70*@H!i^wBnU{+$Lu#q&Yt3bkH%eoTK{aF*uHR=M7ga5; zQ~pc6K3_N>S;YVjy=*?7bAPxCU3$jKRvvLbbK4Q|(D7jcOYrj311JWYhXH+2y~yuUwwp_NuxoSH;ezazV5C%e8V75V!@&XKU{2%^cY-Mn za2&@^w<#SRYIGc(ipqb63hM0Z_aix%Wq{_?5Wk-JY+1c4%FezXx(={>>VdPVrWf+X?Qb}hSb7TJM-5M|{K z|9ahbwOZ{-=u=xNnL#Q9UsxrWH97UkO;#>6SwHrAHCi-+>u)CHoY`N`V`ITM0_C{G zp!Bys5$N>p`mxe%6$(~k;tF222TLI8kgl1H>ffZvXNhH?q(X%9fluu_pQUA35y5f0 zwJ%nnPqv;UOOMXmiA&6u-J%i#`Y6Zd17V|lcwk6(y--xyQnImRxCF?`dX4pLuBw|!A( zb}O^|Iadh2vR%4$^=Y0-;HLXGYtSA&P%btpGo3teuK!rN&Nl80{qwd7G%9Fp`#>5D z+(X>mY>KDCQz{j#4j1U9Kad!h6Z(@o9>!eDbI>wK{kVX=RnR(m=B7#*xvo=&!ByLM zFg&;vC`A$dq85y%UOVIfOO}4dA3o(6ho9Gf_4Ke~_bHpIP_lV10C_KsL3jq?OWE0< zPwju;FYxU}l8p})(W>?!fNLp4*p3<5^i*HnO_L4g+9W%)migaH5R(uw@}5fIWNCd; zNV_o+@-u1t1;K77C#;Sc2F2XXnSHd0M>{Zx@kNjH`(*h=7P=D=pEuBCz4MEUtmr8a zRA`QQ60e-fd$V`G4A|VzS>ECwb0qpB?N4?gxcDMiFLV2ytqt%;0UnIo(aG8rsp`v) z!B{l6Tb5ZZr_DQ=D`do=DelcTH+_M0|n+ z&@P;cN>}WXmUx`CJ}K56+L4Dtqc@(9UdWJfp`@2aA+||KIU_k)vw7ss(j8l}F#Pwu z@f)feeTp*l9q|L)^W2|(H|p@+7?kfg{)Cj93T|hl<(E7@0HWj;;7s63_b{07c;ALv zHcS|3AI}cSC1SVXXHJl7Fx*)$R)49bAw#npq!*+>?`ovhyuk1>ukvZ8;Ko+V`u?Mk zOr3P1>sfpW!}ua)*8I3^bCg-XW2HWBo5xv^pex`w&)^3aTCDxVn`5+)p5DsBQ#pwy zmHIKBeB724Fey(hvEOp(lBbB&9{!;+!Q0ce)o>`ISbQoEj^f))mz9VIdJBZTBMzdsZ*`(RKYc;h(?x2mYza2U zKI82bxTal7hIxu9cP#U{@4iv5J6v`m9@JajD_x3~0q2NwLu>*ImLgY-{^?@RKsiw& z`8!&Y32|x+Qc3c)>C^M#p#${beksI42L6I@c-Gb+*+9QRSW*b_g{N9C)l_){UfS>88)$T=8~O*M`H!}$(wske=Mw9N4O)xKE0%2n9Dwt+zxhmBJ1u}WfW-0=Fa z{rng%kImSuD*oiNPCdeXqIUmfKr|G1YUoM)z0!rh(x}l@ms3MkrfVyqs}K8$Vp^S8 zzoIQw4Z0o<5}YmU%>GJpi)@pJ_6>(}OSlh_cRHXY)XtV9hcnL#3GMcSc6^17SgGA0 z=@QznnEC)BvOOBy$#hL#c0_R1%xQzgSv3nKZX4tp4;7gOhYaEVW+g$QvOKMdJGT>1 z8Q#S}atP3Q=Pnv#r(;tmwBv^ohAd`Xt(3MyRxb;US_+)8aZMUaj zu7D;i>st7+H=gAz;HX4cYEJ#h03^A@ zlFGbMJg((T8#^EB)z1rP%L``Hx&NZHs6EsQz(C-2Q)p}!=T3H7+dH7yR)(r6Srq*; zy(?<8lEZ!m1%6U4XnL``y}KN!A?WXYnr;B*Qvx-SQ+~M0=H}*8Vz1CRFoQou8DfflJDj;h`Kn6McBV6UU-wV{LhleVxSP5myU%Y>lA6REFE zN4hB80nf*CzIB0Nj1LQCEhmuf&&=41cPmkT$_(~Q9k0q~$`%;m;>{vHz&LrqFMp49 z#RbhNLntK-_%D4L23AmX*et6@Ba(w02gz(DA()SWTKWg8%4QON2SQc5T~B=K-yzVdVVuRwCjs@$*XkQc=8$q{M!(!f4;uc=m8b@Z!y2M zq6d@*7V#f`v16?37vLZuAuwr|W1v*PUwZwZ|7l~?zyB-hbB@cG1~KFp!)qZA{h$mf zvkXyF)`?QnDYK(NB67=E3O|yMQ?JY zH<5swV%|@8Z$94(oaes3y+LKvV+p|qhh_s!=(8nR1(}Ib4VVO+@O%yUlIELxbmN`V1+_(u1*VO{O_Jl$@?NoWxWAkm52?n9C5CihdEsr10;<6> zak14e>V#b!HsPh}^~Jc{p>M$ZbxOM9xmjAJC!n6sdr12sj*nMDvgsengnhcDUXhkjW5W zp=lnIjI+oHI}D5=6x!MP8M_X6v(d2O2V@2kn9%#g!)ck{Ygk{8$pcK0;hsKDOlDbf0S%u|zd7FCM zT*fB=Z;QNyM|Hu9G=Ilce*~z!h!?Lk!|YP#V@Ok)Jn_V^&_3k|n7UmP8-DbXJU~Eb z)H`}bO1_Uow@Ch)$_c>=mBdj*%{x=hd>p?rn0BqEWcaW8%z;&8#gFPrD+iD29~vM5trar=iQ}1G>Yjmj#f;J)jFHfuopkk{TH^D})b~ll61@`sln(WwK}>r5j7-GL zNrd7pcSZW>5@GUZgbExQq0x_?x~|aZ(;}i-%!FM5EB!G{m?{CTdbj8(%uO~I`iguQum9?Ng+&g#=>IcXPFUxe184R539+g`^ zf@;$08GjYEDfZL!#drp{)wpyeDb{8TB;X~d67xBa>I0f9*cn(lMlABJtM>wM4q zV)Ob)GzIC<=vliLlVIAb+B)Ay2Qu{RD-7~M$p_9mylqrPeTg+_shQ-94gkIw7|DIR;ox*NS=3(-`x0fZzgkmM>?JYK ztr#^`?R51qoGMv|nv1W{GzCL0VAvY|(gjf3Hwh2D} zM{SNZy8Q0-fpNk8jd4NzjdA^F#QgiZSmTcm`XYw^pSO&k+^o^3x<*HAQyZBVdof5vVW%v<3)F< zOpukegy1o5k(t)x>|2&rZL%kifFai1Q4J%>M4k1cs6sq3OO^D& z$SsY4ofFrq;TL<0Lt?R0#zEFKeOmM(j4?}N%eOCdp`KQr4YqOf;u37APD8W6!0bV$ zy568X(p8{M+PE4Gg3_&y{m-q~NX{zc7CIcQR1pRQUB8yIg9mgj^|fI4`nHVx=8ZV; z7?P}0e01gYDnka|Bdu{oqS=M&IaeVOtwM0>80Y)120OG%CIo{F>#?fDU_X8eA8~j^ z=-Lx4M+Jr;D6E9*T4mZ`MGk!fqF1qhC4J{7nv7FL=Hm+s$9uDs;5sI5HIZYOG&@4& z#VCq5ZDULCq&%Ottzpy+EFA3uXGdvN9M2$(pRiRL=!(TR@g)(l9^x)rtYOY+I&+PsaPh7HYxY0I916PMk`IynRfE z2`#>eH!P!DL{oHmWw5Y}HLKg`l#Ya;pQHG&$v4bZLW{QYjgC%MR?>=lF4!F8YLgQ; z^_0 zXr3bA@1$ZL`bs@H0O?7U!>o!-?v{a%KMoU1l|jd15t`Dt;5uzaV1gz_SEy!LK`Q>~ z@)Sy^-i`#TzPAB+SN|-ljG=vRB^D**gm*yAXl7gbM)scp9BjH(soO3Y_1h2i> zCgNY=(QFG$Nt#1Ag;$pYzDO3sCf9=dzGFULu6Qy#pq<`G06}EGQ?gJ6&0`Ze0%p43 ztj0eiF><#|=D36?B%H?_T>W*`FL?yfw7z^c$9+n=px9?^EAt2sr`ZhMh1%nQhIQJ# zhah8K=9=8UTGpU_i0OCnJoBfWL>o%mtd3^&NbL@Ai(^a|*b9m}3q4}_+otM?R_l$e2XTQ9nM99x(G4Z@NNMPRwnLFD;Wz0uhb^HM zZYxuKVCaIx8crY*3aV1!AF?h2r=}lmyj^4itjehoZa}kCti+1M3x9BQkqlh^_lyPi zdx@J_J<9rJtX=YrlPK5-?Ju^Zm;PVWnjbcao6oRP{e7XjA0(N!XN?q=cI2}vBB96# z%DwoLFA>WnDm^_{!4~X9CuRyHq8NndjEyInEh$rf6vd9AFvyP1XAG&R*;EY7E`&JT zCsb(|O#}X&m5^3m@kq;JlJ87oyjkDhtG4ytq!26`SYmy}xaZ}#H4sWqw_oH`G3)eI zE6TDY(@L5Ms&|$**j4z$nlqeXls+rJy0=B*)N`s1H{yf@T2}8o%8SZ*;<>Z8a)nJB zDfl#|=2a5~jNBcJCD1CGi%&H{8U*j+7?G~kIRF>lCB^QF)gkzh7Af|7RZ&zn7W!G^ zP0+2S7FeY=rT&^(-gDCGPKv5s(5P}K+6{QpIYTZIM6WW{Mkr2=;<2Q1>ploN;Z#PP(>0g}_3CG0WdvTO4fZZID@^K`DQVLgq6>s;pp> zE!;YP!8_|rqo$0DL&Sw46aALCCAs0+ILnYSO@2F+ptdkJYmj(_8DYodBBRNhVE!ke z!zrRksYa?ueH3-9V_xvsATGT0C?YJIg$oXkkN9t2bfXW3 zvdZp9R>Yf}a*kLZbc{=LPdefJKV@ABJXG5spF50a390N$${L|8EgD;rElJA0WDAic zk$sRQTV&#j3_{sO$smN%v!{iUHJ*JLOV3iq|IAF@d(;1ZK6mc*yTA2&e&?KP<}8Ue zwnu|(588;MYF4#6rtF0V^cnj{1_;tJd{MU!S~xcMr^uzRy|O>pQ#NVK6BpJsAVlA1 zfm3~;#%e~#PjmZ0f*d598P&mg>~UN;omlSH`S+vZ7f+~u$ugvSL9Zd;k{Bi|qsJNV zSTcw)P+mBym9O=}P#`pkn^~6NcB72;r7F*Br3hY$!!rL`0cpoL`9j)5sP<`7uF||4%6a-_-ZT!@YZP z7H0J>1TJ)&xpK%mr?>Z!RmUWU65iy@yyFvyGx9o_*fCJQwtk zrEIt*uc-Cm)i&(W4dKABj7@DFX2!nDXj*;k@h6|O^IXLzGgDT&6UCf@v(mk6*nXHs zZ}BxvJfihXQElrvo~9sc*pzs`@58m+MlXV2%GTi~qwVebdnK>mT0WTaTSsc>R9Cq9 zHZoyknm9F{wj5%=LEF`KWve1?WOwIz7ed9upNytg4$3`{jkH~w8yOdOWM!_GkXz`> z%}@C>;oxJk`#@f}!MIhZMsKjTaBolJz_|G3$#AvCio-!(R=GUOONqGb>pU+-v2Cbt z2Itm!e#Y5v=_N_}p;JWbbY(ZIL`pJ~ryY(EF^JABzQcPyRA_lN%lO)$f~`_AY5Zkz zsXZf{CuxmG;M{@R)emUri4G|NsNe`JR__|q{E4bOSGe18RVZjgu)L_>(mWR6p2txE+q z$JE})h56I%q|63`%*LtkTkocy&EhZV%ql#Ny-U|H$c)f=@FJrpcJKYc5&0)BBrulkOlW_2nk#Gp2_v`On&gP)DicdKTz1-Sn%SP za9mOjG45#I*(F!jLHajm4MbaiE;yl2-FxR8XdaEc%4$5JHXWs7Sdpf1bfvH{+6v#4 z%-$!+*2q_I^Zb@gErFf3_v;eJ<-q*1+4cJR`dU6j$TdEmnT1hLcFzgVzHFg7+tAxL z$1%~w(E8>LxpU2iG=oY(>Vp&KYwQA0c|%)+b+(pDJy(^3z}=Y?>)NKE+czsc zmqp*JUle4i8+;ohsi3eY_CaE-tB#kbSWRi)y9;g;3~kxCR2+MYWP+E2{tX?e!MG0b zK;9Bg?hEa0yzvKXyY^RnH#GYD%%M>+wswrSd}WnyU+%j{(dtHYxgXr`mKbT4PFI$) zC26^rzs*HmCu zh@t5dQ8LJgEmA<{>+_OF1y8rQngfc<7?RvuJu2^4+qV>Tc?{d1|6BAMefv=O$B~b` zm~MNA1dY%K*{u5w?X8Wam6W@zGc1-44~tGklp$MEJ7&N6h})^YsD`T-@}Ixy5xz*5 zelBlU_kz}Gi;q_%y;TJi6AkcefvFLQ3#ZvMWi`iIla}_y>nF!OaYh@;28XmP9^!7` zJofE}PRnAH1hKSnaUh3rT?jR;8yX_EFBhXPjT|Zv^e#XuXSb+TE;yj3Yg0qY4*6^D z%dHI$p<$Gc-BJ#Gdb&GGVl@zdx?2-mo}bg-uWTesM8vC@$P#zQt60bq>9x(p#+R0j zPe6T#@M?|mjK?JL8jVFF<1IRIw+@|xxg2ajsoVx5uWTJ&t%@IU(bnN85dbP%xSCUzsOgEW>_w6_S5alG-Jm{Ct z`jUR$&qOy%iglJ@ePu-GsRFAW?Xihb38c%))A*2-C>MrHrzReHB^|mo6*HrVQVK=R ztslcrB%4^j7Gu9k^8kKR%Dk%qS%OJFo09eEzS3Q>kB<~lMdvuyA4$dX>X_sn^^SHp zCe_%5%G>vRv<3wXp_wlz%H`)*A!By{9pv1OK~l1lGN^V@`?^`6%W*MH(MK57-K z%YUf8snCwTgb`qgxGi~M?|@0jke__S6Jr0_s@lBiqIL7gwEE1zN#W1>Q`xZ|iLc7p zKMP!$GKu_=x~?~AlPk8{BGSn{E3Xn!F2a=-Ayrhk79BjTMH^#&}K4B*gQfQDoJr(@%QB(YL}LJrS2k- ztqCccge1&2vWW4jpO}5Rd|6@ZMNgTb8gc%~Vw(W!hmdV4ekKk@XJCFa#W*LRm zW!I<=Jy!ExrLV4K%CSx|5=17o0=xyRY_;t=g}Uyw%&-}bcK1u79VO6AavT_|)13S< zW&6!9-~!$+4+OP&1-%xFdx4!7;-VWKyz)6;xJi&i>@Q0vQ)CjF}Ih+ZHZ z+#n$aj~?e3{T_i(*>|t|^W*&esi&1g96zoaTnt@lwTZzGU)5Nke}1@;l_oxS#UiWR zpJ9PTz9vPG&Evw|Z*RLoy6b4&3A4_@&*>6lbh5k|hQ_lU^1DqB)vVsB1B0?RM9f#6 z_il-p%MrDsxm65WZsF*_f+m;vB-PogQ!@g&r*4veCvfS?Mx`+IE-K0}q z$>@8p*NAhe;#zM)IxZq|qVU-Wvtk+(VQocC?qu)C6RGZG9eEp_)v&zxKA%pyGKM?a zNTI%|tUWJQ^=?Pk5zSBdE@4VC#nUeTbf>SJ78RMeI(I<5&LAX{ZV9azV9qqP@Bqcy z@UgNZHm#iHm|&H@z$3fJl{4ntCn6I zN78HyNB^2SYWNa?8P%Y6$xky< z$ZOV+DO-vCI$7iD=e)K)fPpo8<^6eFtPuJ+jvR%&E>7h|A^h`JbX8S-n*-?gTmwV( zjHhNgPP2#EX7uYcu%I^jE}K1>=}^4v*ju3Z?EEJb6TZq$L8p9C~9KVm? zD^Tx6=O&&r#pitYWKM6K<7;lI^PC>?Q$>#bVZ&i}=q6}Y@Vmqowd_j9Z_aKKfRh1O}uZ(+&C|N6&cj_!j7wOii^*9hHJ**KpE#)f5=#pqV$bh>^$2v|E@1Z z{%!BgH!yqf_y5&@{awX62C4rV_hB>+f&EJRyU1fNf4f%YjYDg6l&OPRvyc+yZgdvX zB2UxZt;O1~#SO-B!pG(yX$#V75xB=EUduw@t8XxS7kqc{>ktIjaRCIv*h$^}`gI#O zducmY8!xX5x)72Zu@5|?N05B3*ihb#pg|y>gYVA4b_c%>L2z}1U(G?n2S`jQnqPRf zfdyZ{cyNb@ym6|!Fam2XECh?sL%YbVVxLz-Y=9#%;I~VDD%QuM2yDHmfaLEU+;=s; z%?`LU|IqIwg@2r+;_6MYSVRdeNr zU#&oU$jagvW1UE0&Vf^u%J&oS(h8(Nk(F2l%5-3jRY*dR^Xp?B$uB7pxeNKTiKlOsSRis*}V*Usg;+YKxP0+)EY2_u*%<% zIN6SJ@Y6jKfXfWj32H956oJ(*qu3!UG?`Q{C;+J!4XP=173HshyZ?qH$y_e|g;n&R z#*BmAlBp}0$a4}GC#t>k-(HI$o*& zwgRL=P@lp)#{>B>a8jGYG$62v4ID7zI<$wPNN^n}y8ntq7KV9Nci{5`WaPs}IDQ>E zL}9EUG4?beu$_%OyMMO`LmPlUQ#?yUp$v=!= z$&CGg@ymXA_xi7r`fINEq9&*|Lttt#b&3psh1EA95sEt3O<)BxhQJ1V<0sb|NfH3g zj3s+20oI+M(oqYa{0r<^?PTNO;p%Wx25tmNLecXB=s{}!4Rij0#L4B*MEA|a4y5Qd z@PWEr8CZj@fBZ^!>TR$A+~h+Ld}jQF3wCsca@NzOfa3St0~$^W3-}~)siWYfA3OQZ z`xC?>#|ptQ%#a{#^79uGO2g-4AA)R@2RTa}jPh!0@1TXPH|4HqCS9nAqIHlbqWETjY?rmhmI z>hQO%ohF%$2;{=FVJYIT2>w|#1H?*=lBOVK%_o#|i zJdET)b_XQ?K#G%9O)&APV}Ytjpo+TY7KOv=5b_YEgY7FOScgx06gp9q;5fu&cNL$qzKu&Lyso(Nd2M&XmP1qyrx-rA01MZ#R6f0 NxD3*ZaRn$s{10#kS9bsa delta 56500 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�@=Mii(XP*D4=x1R(U~*G^ zvw9J1Z25@8tuT6U6yUZVQjOF=pDbYwlIXyqng+hO^dPUpoGy-<7V@NLJ8#S{lP@9d zpYf`Z;YFQeo8D!;U_$i8EjPPi{g<-=NE27OEXtWhmjLC3^}I8XTrN^aJ$X!%C6PRA zlyw$d$SUFGpad-l>U5WJAq}TX!&}SX@ukiE2W$H147x*Co?fOkeUqj$^&*U9WB#9) ze#F3?tAPc1YA10b{h(6x%>_obY$^1}CrZo%8T{*>(k6+2!p{QAY^takLzty|-3E@$ zEz{$@Jy7*y7Zylh2@{tX+Q`mHhJZqa^!hq%Bx{$*odv-c{G?h5!ipjYXMznx!|ISm z+U7*MYV{_0qeduI`ipNnw39_i7=pT(a@H1OCTk0SjzN`^`o0=jMVBdIKs`TPEa0#~YnSn>M~s)4`jBaFhzkswJ}Ys@?fenU_BK|c zN;fy&kKk|!oEX$*vzZH`QHg3kt!G(S$?&H=Pe$~bmgzsaqifG<5X?gLdP3FFAkstW z&W0g=S1ob)NVab3!@**PcXDZM?@;xO5Vio9#doV2639W}Q zPyfL_;0_+GOtg3jtSfzHB3y<#0Yg)NSoXb3c)VR$i?YPm_Ku_huX<(+hK1EYYvzMt zA02@v=O0Zc>-Ti44%>bK^5jp4>+Fa4tXG9#zU`@(SI4ZfnrQDIH%CW~y1xnvC>_cm zleduI+Sj4RK+2`Jrk_ULg9wnYdkSGM$MH{tfFg*e^Dm6=XgPF78IQ;p%iF=E9&iC- zKJ7cjBc2H=xkxI+12d{*>%XMAh51A`6Qa9A2O+x?{Jh-x^F2PlAS5>|&;jm~S_iuB zg`f~_gD=|f&=_EUN9kVEE=(et(g$tUfdjmF%u>^N$$M{HuK^Nk{uz^Q>1r)naNm^ zQ5|wXp15_rP6k2bP8MgLsssC;8xPbe9}63 z?K-9g9vIgTf7RJqFW|{RRWlz-D~svK4a`z3-#T~w$zCY-%={rCxuTbLv>eZ}33dnAR3gZuOCGNq2GSTeYbDjpHBKC|e?u~2pdIxCxm3%I+7hAW4Ru%@n70Jd0(7`{}}@eNMov3E{!BLEqC zX7i|0HZw;XS7z}Eo31f)|H?OP;Dj+tPvI-PBw88|#Mlp0Kjl50`LRIhF;_tD!SNW6 z427bDEh~=>;*5RLZ8qiuLb$s+~ajHjh|+E$_;y8kS$7ug{|m#K&I5)%#JykR~Gmt1mvWw29 zAw_-N>BY3nwfkNoTlCA_7Ff<`9Y;utW2+b*k_w%~xSRe-=oZr3J+ZdlPzf0Srg{q# zZ<2gTe7-QnR-|4?*QkoG_f@Pyac$yJCPwt!BfIR?z-LJ@ioc)YVM3r7Gm-t-gG6s_ zrY{@Z8t`gR*`iC%{mq3gyBe5cvG(@D!SlV7n}WO#q>BqSX)daexORL9^*X?{B4CHtRedpI!a8#Q zr`atVznvM&tmxFMVlYFt#EWFNAX3+O!H9D&{36%{lkPOrjbMR`imAfzUhEC)9vR`4 zOUTLkf{I12-*-SL3UDmnMJ41zQNs-Zd{TkIfdn6^8;hbXIil%=awrGit#!$t9=C}epu!^_e5 z%);qtGUNP^0TJZX)1So&WLS;dag0_{9I_BQS01B?K39&m8K|_1?#hg$%#QJn&c8k0 zq3khgqY>4}c(oMLQGGSm$2nz)$S_@XHnGS3>X~KyPwT= zTeO@92KR{>y!hmRP5X^`*^hmzqPCUP~EIxfK;(?iIThlx#msXc~`4`lNm{4#Nsg;&oh-0&MPgluPmtZ z09p&VVr61rwjQe1yY|rUH;07tVQ(wbb>gv+o;^KD`Oa@oL?3IB4}dq^bRX0Q%5;X~ zu9hOQY+zrHkg9f2CJ93iT{tpcyb|n%xGM0w>p%m)B(5KK>ug*N>qPu*9e-L|c+LO}+o@+4AKDjqRf-@}R$X1#Cx9%zVS+`DyORR*kNV+w@}+fsj;E1c z(~3TqLti^w&s`h^l*p>(dz55-sG4`mh;*v8ul7iv{1KBHLT&diOot?!wS-vSx13O^ zTr@-|cJubhT(Mi*T*p?Upk^FisgiYkddj;$98-gi-P?2&_GilMQnQ8@@1P& zIe;CN$56+oZaK9T$7q0quUT>6H!6V+9S2 zsi)&At|1Lp1m*om78iDv2`!O$Sx!mj#~Z%pe)|_~Uo(*i>E<_4Yep+RUt$FkH2V3h zGHx_`%+sjZBELBivk@Kvx%lbm^lWFvSs;(}iC!Pm5xnOBQE&Uuvy(xQ_=K@5*+LB} zLwFhf0eo=;tX4bFM*No#XikT|2-CW`>EJUjxjH;(^^! zHwf5I?w|xM1a3y}ODMccUOWKr%#2PjCp}m( z#-YojZT}X!`%+&6L$GMKV_XibO4z|OHW`1)d*|1zScSvUT*89w4KcOQejwy&wfq55 z7rvuDxA?x)^xd=<=M16L8oz3ZC%l#L+p)ldIXmyS-mWDYBAkBr7puZX1tm&i=VqPz znKEQX?UuPIkbxB;Zc7!?sq!$;TB>FgbaiiSu|c3~Ji`ez`fBsS6i7=P&QwdTdz)$x zXAz@bJTD4k4w7m;)wXYV8&I4%E2dHq#n)2aSJZFYoT)$2&@jXVpPQ!lkp>OlrZ|mj zO%`nJYtG^ZTFmt~g6*FY!!j z0W@`WC}a9L)Qmjpq&c=<`Rv)X#fp1gd7XuH=?XE_*y*KB(vP#g9}P4R>e^UGTk`Ac z=_hC&`PS-@W;>kgmBr5<_^T>!RR)t-o`amknFwzn^rPGtYK46Z0aBJ3|nDPdpMBl16fb zX&pG;j|sAtR-4FH5j)S5(nIE;u_|#FkW5W)q&n*vgo=*_ttrO&Z8C4<2qB{^?X-SE zzcz2%K!c1%C5aF3-bD$oZ_uLNa27K_ITiQ1MUY}~#9Kfw-VNwH?*XG&+fQG>vxa+( zUeKMV)*bOamxnz#Dt|I(41pM}a*{9kAZo!szF^PS3)y@(CNb~OU2ZSw%*?{YbL)^S z+!=Rs_Cbm99-dI?p>4{U;6mWV_YNg@kq0?&T_8H@qmzg*eI7d-<~#1?T?I4-k#J+gF72@B=E0LwZgcgVofTp~EjnM;GlST?C7$dK>OF9#h{hXg z!P~2?xd{3SC^)5nQch6V_4)SA?K>_!-4m1qq&nBwdia4oC*uf*$p!i6`W6r66ii8M|mZ6(otA zND3~hLxQ2wMG)~eNx_wplG|KE4wVB62_P?ON`5Tv_-hpR4lsxO0h!fvJnabDSc*4H zO4c|=+3A`l{5n3jDS7J<(6VME81qVYkLpvb&%mAf`mn_fGFY{4kyHVoNnbZg( z+lvR<%Rcx9#>X1r@wKq|lM#hLBik4c<#bq4YT-IFqf025El~?$p6r8gA{nWkr#j<# zl6kOil2_24?G`OjS-WlU;VQb5yiJn2JhEbxSJYI*19?r5GE}iOUCr&yHxg4KHA2Mq zfBLj&VV4Q7QKC!x)+eTbQ$JBpUr%sO1H8NO?m~KXY6UZ{S}fgrTUz>8hvd(JAtB>D zt_3xQwMIT0GF)l@hp%^xu5{_ThI_}hZQD-Aw%xI9?%1|%tK&{Owr$($pgYNz``qV@ z?|IKVp7+n5qsFy%)wOX|)mpXIoMPYTZ?h^29EziW1*Gg>1gqe1zK1<8TR%a@i2Paq zPR@6$K%JceUN&t_{~aFPsM9o25v1dw0xgh)aWbiEViQXZ9Qg5s&&I!#;ee^O=e{?@ zYhm+KRe>RgT%^W(WL;rHMJFpe;U&2 zHtPb?S%x-fePG*k|R}o*uFGIhig(L6Pz3Dh1ujZ zs_hxkc>77IXYFsh5+@#z2$BU%(xR9jdP8_(x2^qC9cI=!(HSb2_r!k7qljNFZbf{A zDIwH;6ht+sKZZM(RY)l1 z_05vJc544X{6AxTnx(NA2%j~4nTTn;>;S6&HP-h}5nmp?WyvB>LQe4|3J!|4wodAK zY7scMZG>JJmdWry#C&kSO|iL7L-Tp9`c&_%)3!UeGL-~XdeK)sD=}LlMG%JM&g?^~ zC*N)N^^DDwuEd;c>+We!`_GKEm*YIodtmNW_eZRXg;?ASm@ufiJWRQ<`s&o!! zGrXqRD6_2j234}Bj3|VPe%<5{OiTMTaF%g}Eo8FoMjcHiqP%<97 ztd?RvRCWsV)#!l?!u2_7I2t9)Ly3?WT`1HZ2&S7E0*AeM8aN()D$ ze48{noqlevEXPyV$;KqchuEZC(0e5@6f6jL7`yl*C#`gz_ZPOOo^)z1&F0kyHG77zSBa zX`VNgtF%zG4)C>eA7&+ER!@~)F&eK5iu&57Rgk1*brM{0H?y&pF*Eu8B1dRXSSk#2 zdX>!Bz~M>{JOUB2YA_T5wjB53(BXZS0QQ)1m^tQ$U1&Mxwi4C2-nTgia3F(uy#`0% zqbhc_HVoC1u@2MD;aQvXAQ1!@M|@A{-KJfJE~M>&(?DaCcmOz#+m6(QYj`y{^6MIm zrMDM0ANfhWnNn|fWDb_Typ6AW(sx5CwOsmyS@v!vgF-{h+_8t)c6K>QqvCpzqq5S` zYp!22Qks*AfmLc3{rWs?IY5!`Hdh7xitDc~d@-XQ5J}t7lNyLDw{)`cWmRFU8&qRr zmiG;~Z1}&!13_sTnNHA1&3 zE_`PUuk=~vBUlpEEI_q;Ts7Tkd|P885PRDdrqQM_e(_NLiqO`b$r%2A7r4EY*mq`h z&YhYCe8}<;N#4j-SR4L*xtSSnS}7UR#rvnxx(H4zHYY)?wTL~R-JmC zRh$YNem1B=>qieC_h_-N#NZE~BW1+Vh*n^fp)vy5_S*LF(@Gy=IPvgZ zGTR@dVXfyPick;*`YQzZu!FK^XpuMUoMg))Hk(zadiiHYrhe03G8~-ER)a%-E^Lat z-r)TvPhV>MPh$3-RKGU0q@<9uJV^LKZ$=A3ySQ>VT&Ia{M+P%3{kpT6av<|%F+#jD zxW)8SdAkI{vHxU*IKy~k{XA_BVt$Ki?5@V6s{c@2X%dZPJ(`KKXtgz|aQX;yg@5fV zvptV@%qK$MsM`bl$(vhy=DP1R$a9a1!{Ok?q!*rnXVlJGs2f9VNnECUu3%0Tq+v%! zHdHU=Y&qIyz`R8WxLVwbt=bf|dw_05BS(*-ceVjy>x9=*`6FpR>&Y}>_%(Ep@-J;B z5Dc@03OxpJyc*0bw?A|irVRZ$u$@WGzn#gc%r^%7iOa+iJFbi@YG#)&%HRuVN;E=7 zlyPG;Qn@4JxaJL@kKz*4>J52V?T)LqDeSpdAZmw-nb6~#YYJw!=_(79Ii4Mw*J(%* zuy_PUoW>K}<(wD5v?N`Op4JoS_q7q!eq+OzI!l0YD?`_-`1VmU3qLEmM^Wv{SzjDz z?iI<*-x6F-P(?BvSkYWrMWUqx$oYgCEZ;%m#Pfv%0}=XlU(r8S;F0mgZQ0 zPx%RtxG{3GvHA`kdC2!_I2%UZI(1^6Ot}3W%^-aUJG3=eia?w88DEGLE#oRyFkX%D z^@fi@rv0ac*VVwO@yXfkLRaM4$l`UT4D_EI>qM~+`4^^C43;}n``a8hCd>MoO@&*43SsD^J2tk^+2mlWF&wKvC(!X^RW7J;$lISBa$p|jk zp)v~A)(8#;q*<{Ssw<}?Bbk0*5epqfA~B?xkVWgT(7DuKU&AkPrN+>C3wTH2ddz-b zbAFXr-Qq+ofXe0IcBgQEx%$23`_%pC@#aZT5eEASn~#~agc%6d8Pio^HO!)=JZ2nf zw;E~pM7_%APJplRJv)b(R^;)fK5^WXy|cZQws(IWjXz~kR2W@6xY%$qpYp5iJD?JbXlyo|{k45C+K|9Ck3pO%p zPMQAwaPQH%b3+Pn5nOxfohd&zJ$;QO#M$A;d$mFI^G6KVr^K?d!128MZgWcQN|xAd z&s9SSy@7bPeEU&wRdLpCb4(H`Hb<`XDNL&5oid^zzk_ZH`fca9${Yeg7IaEn$ z3t>C4Ma_jaFMS2Q0#C#^XA4I-`U|H72G3Wc(sXh25Rl9C*2ilviw%`Gs=9E!Z*fYR z?`?lsv<#oj4vjMJ+$mudANq)u*Yb+REE*rVrT{Hg#Le}aotpU-LNvMv*F(I)yjWyX->zC~<49jIQ6vPz=Z9Y^^?z84G z)Ci!l@`#cZNhXudaY>jjmCW>a_rx4{R#P*>{lO+}Cfg9c?%mcEtP_33EcX2c z3y3rj=8?CgB<>6%P&%|YbSJ$OS?1cmp!-~Ahp1m*SdDtaO<#!94h_)Y=Kn7AQ^TdR z*cPy@I6w^8PRJy8O5)7OC^QaOkO29XEu{){u z;coT3_&FV47XpjM!o>+fmp=HGC}ZDAp*WO^pmzufL3~ob21|Ow61;*K?~0!GVwWeZ zf#gW4IRLNG`9NJj6#;5=ZSDBOW($TUjXCX zW`mG;NxtU>KoRRX1H4hvWHjkpH(q~xnJf|aKkI21H&#CX3O%lW;vB}`F;-=hP!cxC zr_PT5HMt-E-~(t#%+kEJlF*ZjmK=t)$O}fwm0(fQrTA%HlWq?CmX|u$$&(GGLBNoI z|IKz39;_eXL+oc=o5c9-oCj2@b3V|$+~e?}8;2pEQ7Z1eJS?|P^v45V(=z7Wlrhs8 z;>&S?SV%lm+^)qA!0Y#6eAyT#%!DBsPV`NBqat=3ayu&;T!izCxo5^bqC>YJOW1Nz zZhVxL?3k;~SEEI>zR;8XkE^(Mo3=w$;P*Su~(ZxvzT%%v40tbks z5_PFwYvWxKWJl*H!F@O)0H@ZlXT9@{4<$uz(gsOu3^Ln1R#gxD74(fRlS=L~D#c@s z4@E_GDRzk+LaBDVRw-<9Rv~n67v%z{c1|TR3`@0MQj?KanTeLk%keE!Ssjlze)~2J zy`IylJ88iGA>Q}bVi7O(ne6<}ME?)|T`SePCIxT@!2idN($rK?_LB;!B28ZgK>L5K z5dRcc*(&LMQXwJnr(LD+Q0X#)How zgDVC%QXfT@RP3$XxYgmYGYnPX#*y6dih|ez5(v9PTtJYk|4Ak6o>BU_NrplNQ=Yn? zj1xV<{77&);*_2RHIzg6E!PM9;)q(fC+I(BOoK-DT1!%<&Kp>!I+6=%cvF;vKmeW1$Q9B9uVsEzT;xl1jT8 zBID}9o>?{o-BI!w^_&d1Dbmt3lkt!>4Ww4-L*09(6=H`RSc>YxXobTpWpOIW6D!Ms za$r!6mv3?JkZ$oVr>Zi*=Xlf?>oAWAxP=j!*7gDa3LcbISi16ON2R)vo`#Soy%AQA zkEb7I9=pU?8TnLYbkfZb9?PvEN-XP9%Up6jNPbnW6ZklIMQTsOk5$S-AVn8iSt`8w zTqxiZnala8*~Z{L47I+so82`u&fe{g&K=TE4VuD4?PS>b1$#wHJ-!R%|~{A-Kz z5B{xV-0CV1aDe=)WVNyYaQWQS&F!21W%n;^<#q)G{kK#y?WY@n8Iw-j;xD^@ zVJnn7VD`U^*=d{JpZ)#oI^geiD~%5z>c89sY3;$E-(YCD)nEPn3tJ&W0J(pUTM_!% z-@mQ{{%*Ja3I*K${dvzL{~vZ-QGojYGAE>6#Q#6+xDx;pf7=D80(kz{aTiko*x<hl{2mRt{#BF)my-f5 zo{qA#m^q577i&FSnxnUOU}gbFCWxIWQP={Zo1*P{pm3v(S_&4Q2A#k0|g$1c^GX@_35~>k$%ZQkz+{+RlH$n@JUkhuuyUK?Bqa^1wU5uoH?Gp@O>bc zSdMTC{6U#)L4#Nl~MxBoP-8mEci4-<(R4sQgUAo2{1uAbWhy^^(awJL=yLo zq+~6$jQe{Sw}q#Jh<2GYIB7YpkjaWuTPB#SVHs&hL6s44;;LPmBdvar@4`U$FVjh$ zom8IeJ_%*hLuqFy*H&dqmef(#_hw5|mL7m*s+^d{{b3oJ+I=zZP0+*W@&(!rg5_Hp z^!R!yk!hHwI++Jtm==k%`Tj%Lj%zmp>957@`f3{rd6mxNuYTZ}U}zUdA=+hs_@Y`EsbS@27yHbY(70L|}t! z#RJbxW}ZuPr#|HrFs<|Z-`i8btLp&6I1}yG$sDSp3o{xRu&NU@(`2@Jl8v+ZW3fbn zVu*A3Y)(NsDJ@PUoes*ap3G#NCK81eJZF+lHZ;s$P8JW?i2f9bg)C$PPA1EuH9FAj z_1$Tf3aERkt|>~Jo6bPjDw*8bGkU6&=vsqT)ijzyacO6EsRCd4()wOqC*fE#I!AyJ zCjH_Uv_Cku7JKVa`+KyKUpsQaHm-jn){841;s$+#eD|Lxqjd@pM0qd&S>>YuC7IUl z?~T85HbaT;p?RYAk_Xv)S$yukB5fZcUxQ$C*9Ger_)NRy?!W+4a2|$f<_)agdGe^! zUpS9^$LBm3^H!hn8zu$@>ma-mWr9aPs@5B0<3DtV^>Kly=9uC2hn2biwCY`X~ge6U+-2Q z6HG+S#M(`|gL_uiVL$Bs}(5I~1wDz!b zLeG!ZI{y);i>f=iEl{6<=JR_AeLF!4yg7xRomDIzmC#IMP4uBh z89#hyeUkS%94}|G-_Q*lb|-c-_Bbxvo&NW9BpkJ7BSaDBmAETS{Xcslz59B`aB~sO zNx$SREr#{cVSX{&0GFcf%qg7g++qdTx&qUYQ%^d$6g7cT0q;pA|g3Upa3s;dZ;pg$S3BxsMjkt^HmD$CDfGsg9K zA{Z>gpp~@q*Nsv*mY#CBSDz#Hgxdq%^W2O=sKMUqHAFvV8klLY!(}ijrE@1bH-odc zr7+2+6g#GB;oQTncu`uGREi*lO4?hxj-BdQJs(Q89c?Q&f-71$!AzalB28=ZWhH!V3N>ECdkl`0(ltHVW;y?; zAkKJjktiql8w~h4?!&g6=0ORpshv1l9iH1VYt1V2IA*IS|<=WvOhFmP`8MTAzNmhMW#k z-tGFWBcNtS6g1ShstxmgvaGHBk9+muCVIBz*El3=>>GEZ>ci@uBqRFk-@M#p)u|f7 zdsd#@WHqTk=+UafJP>GdGQpuRXmXbBXnDPiV&N!7@4$j@(1c>rz-KP9`e7!oK)m0m z&9Pz6S6?OJq&kE8u;P{{l6myjfpmxD|tm9L!Q+5F@8S6*?pRoK^@A!A%HA zKS<5Bmr{aNMP)U@ftH1Tz72MLJ>q3&&9S3w8hsOWGe~o})qmmD(-$_^kwZ?*Gi!tD z)F*!Ul`r_DL5xhU@JitafLtj)xw znRnVZ`2SM@{^Ox^XbWGQwBRkXDbB9MBn>%gD-A+B8W~~MFV7j#Ca71ssa@PzibFpK$i;mp>W)qj^q6HI#=(nozZ?k=SgwZhoIh_ z75((@b58D_%l7?~h^Cb`HbVXa<)mvepRH^+mrQwuerCRNv(HVQ z&~OoEQF^jAY0F-DFU>Jy{}kjUTHu0k9^Ap9Y9M9gvK2ACf};1ezw?57dFMUHhmeH8Ya zf?7TLx1OGb=EzL|7B<}XXX&xtJCh0X|*iWQmq zne@yR!q%hbs7X;?u<`zY@OZ0Q=j$98iws?rz1 zmavFDs(553_+&E3;uji+;;fXsE*rw~t(5*;cZ-pNAbhgqT)v^E7eia2V(-v)+wcVT z4)D!II|zNtkD1kFX#MWW?cFZ~!{9WiPh#AyM=8NWqXU92R0JdMu>hq!DGIM9@DlxV zcMJFwA@#dA!8i&+&Aa!ut1O!wRe&!DWh0;JQQC6O+IB(ACzhXKH0pP^%JQvefbWmX zC>4+;EBHK4itb=W<;{(TXm(xsy>XA+O$Ep@PzQ?I9q_A_y18!;Ro|6`hL@?zV!X75 zWfm@Ko_L3y;J5$uP^M4xwZe5p+rwU*{-6hH&ZT!n*kMLFneTl%Bg4DDL7uwZ^KQjU z4yAGYBwbM{UWtE63GG)bmxF=RKuR#Jdg#uO6{3^x$}ZC0j`vEIuE*)H@{tak)NfvB z2`nvlr?HQbPpACsp#ylSwiUGWfE0JL{&emFSBgwohwn?ojArK6D9_tBU2|&fo?Zd& zwZ+90%YS2_GU@ZCNZ$Yx@Ot0Ey?BrurIprnw@d4m^72-t;S3-ojzI8(`clYt zL_QgsOkggB820cUKgUZ)4eu&tNgyK)syb(!2;^MtiPSiywQ$dP#!>3A#vYwmXOd9Q zcZr^{I)*UI=yJx#B%2&E)-naB^hg3KBfwX328Fw0Z1wT(9YoGS#FtqrkzbV70lN`O$tE??DS3ct9-{ zk?j<&tgnG`67)lFtOCmb)f{=KGbAFl+cSLU>&ug1ZOCGJVV%eW%>ZC%I;Iw*Vc?rQ zCXcZwbB*Qglf9yP*%?u0ab>iJP?jy-EXZZQ`=0!9-GIuuF1>I?T70(B3nRH1&&t>7 z6~u`EMsb3+tcc9O7m9!IOw9qCeC^QZ$2~aR$T(2Ohg5D8{9+$?1m**X2bDQ)6l9>; z%uCGrm3fYrZnaRVQafh<%+5Eyu3DHLqoYmJ9eJ#tX$Q6g3zrY%ZUX;#iu4ne z*xv){TPJ15w)DNgUf#w}1d0q-pAt}|Xah^!K8Zr4cf1}8QURQlVa5iOM#Nz3weh{G zlZgjsdE+V%W)V{dHm4^QU3=qemxC+qbt^uk_TTJ&^WuLTTwd9`kQ#YK*sMyUVCWsT zdav!NJ{T885>I-J8dr^hTHgiHdr%N*zcw|)|Jj@i1oP2T|4A(qg_1vihuh0yNY0T7 zY(Qbb1Rf<*a_^Q@%~TJ>`@u3QXhF*u^t*>f2c~SrM8J*DS#>8XH%V7H`WCIm zi>GFxXXx>llv`$O4JC{gS`itp)Xf4w(OjO$|Cfsbc;&yUI?0^xxsj=Ptn4|IIE<;RhfI{y)P8 zHBaRFe)>nOY1cnKD|2~l?f>$R{*5u}tL~_3SRb2-CZ+R2W6AVm3`UvFF@c3G{&T{_ znIJ7C%8KJ`85{wl!Yl!MfrV|?o#jvr$2T-ILI-$+-h8h|P2JB22E=~bbW)kcRs>f+ zoO`Z+Z*IS}WEs4_-%`?j!43)xU2HI%x6rK>>qfQ3%<#}KT{n<*;I&54cG3~_PmP{^le zRWiB%;WeaKkpCSW&Yj*udSKR{$e*hhX-c=puYBYAFd z>Cee^=n#7GXR?>ctdxG^Z9&n1sf~sN;|Rs!<|wH_xx~ltl}n}D6YvN6QM4p&WK2=S zU}Fab^O&NWULePp>D7&T#CIp6-SZ9Vif41N*zr&s*IhPZU1P0UPKAdx@|#)TK?#$H5N-lIC<$xCOVha6>`elt?wT>J>flC_|A^6|LnP{gsSIScRG#J;oqw4Fd2?l7kaX0a zTf8rh_M50jWOJ1L=1C*AAty1xZx)v;mw6Fc9f-#Q5_J}--{%;>E?1!%m37})p8rMW zo2wW{ah6KE@Q`Gpa*3l9mr&S2L=C&qX@qeRIKNN?YY>%d^O-MDTqR^f%6E>9jIUrv zD!bBH9GrgF61?nXgd2s%2zr`^t3Q#uW~NFDdYYDNeDAS9)BKMCZB1O$QayySWzyao zivGcaU&fwhJ#T!p2DP3HxXRG^{Q{w@fS3Y>o+`TiuG|%vy~<_VTUA&Ll`3=?)%+`> zGTfSc^HFne<`N6A)zoQ9iEOlo%>Lq(j>4TIGUsa4=+3fe#WE}VN3Jor`oie~+hhyL zuHukmQdU{;FkV}wI;}5v9Bhc8bzd_fQgzX5d~citY!61W)o$5v?kRb_xmW&0hF3Sg zibkvX*%BM=pNZM(IS&A)P)~snz4kYZm%}Mn&;0iuqXVkRPvj9@IiwF>$Wh0$=_pbAKB0Rg_muidh}S47M+)aTj3Z@m_NG1 zf5kW5g^{iSuJz{=nW_o|^KHU{d$mcwjA5e72y!k32HxYn^gs+xbG>^y{&D3pr{!W) zgsS3#Z2=>Z0W}BR!_hB5k`%JU;1?Q&-m=E)!UaN*U&2!gJ1OS=xW(o6wN+%;&ynFY zW9*m6cxLq*l=?%A5$TqVhC2Xoj5kxs#>BMDgFT`Z-He{!utBism2QE}?x&PPaSKYT z&)aKapxBG2lxLTFO38iZ6R;<_x*H(e>8IHHp4&E9yY2ozX~X_nGp70h{Fuqpj(^SB z|H4+10RT75U%Dz;^v|KSpkKb+L8Mtu0Vsk0vIP9o4pG%n!4pG!_p)b|r2yj~(jpxg zNWYj8UMi1B5JiiJ>OcY$4(GHnjy7GMfyf9x2>hFM%AvG zQ=E>hb=XXUlVTuZ3VJj*_YCeLDNPQqlpoD3Q;6NG zcG(Ytp+Wf}T(ZBN_^w434C^8K7$klx#H93&@23v!9jT_rl{ZaoJxjFb3ao~A|Iv+Q zL+_*oG!=zo*Ml&LyHA%zHajIC6pa}8SJ2+`fCWpV@@V~3V$(`TKjWkhkZ#yW&hrh(N} z6zcH>q}`$v$ZRh;W-#dS1$&tr%dFg)os!Z3i=GQ7b5fyU$wRw~64;}01{^cE)KeCe z4BJ%sa=$HS%Z+&|CpOQfCO=oTRW^FX^pUyq<GTH-*9c2U{x-AHl2!EEtWTJRB=}teeUCR(~qY>1s%jY~8X$J_n-t864tS+a%7}mJNMg(2yP~K=VF%llA2XVjTyn;k^z6CVQLlGfXqM?V zg&ql!OZR<^n(?`KDn%uev}K1u`ePV2+zfv|BNwo*&kclWs&2Nr1h1R(C>K&(8HsVv zabciH_haPUE?hXNF*Q!wMA?`3Um42*u~p_z*@!ff+56jT$p{Htf=KAaK_%;8pl^di zoUQ|^DPj?{B@lA0{uIkVan$jJoXZsaOtGa6RN3opHIulGFT4hh(AMnnO?Ds<1tojg zTcjx?O0^*jvG7ATpXEpGs=Tr$*3OG$mM%7qDSXqupnRy<_J4)1*w(UEz4RLd-n>zI zB(TNh3qS-wG7mkWsTDo0-ytx}K1Sl}z5s-{KgJOB6%4l;dD@uA{D!~^1cSSomU?Bq z3iDBg{LFP>DgLEqvUAa^jlRR5$AWJZ_oJ6YdSGtY=GYGp$^(ERsMYPi_GZ_tr5N zCaaL$Jf%WY%F(I~=X`p=OQl5TYG>;jOGeSAdQctowvx6AK|r2PnbzRcj z+HCgyL79y!Y+>Wf@Fqv%FA}2SgEojEgTMA6ANzx$(20~wt95%=Kix0cE&8pkeHb>` zPfHHbn)G2fEk3Mo+CSYtcmrSURRsTp<5c&dLjbc=TSjb5tZ{!|=_byh|c*NDrX`00bRdbmU~`AtjtBpfP?wgj zVo-TQW*Cn)hd64qEe=>f&9Z-F>-#%mU@euP5gu5XkNXh+yP;6l8KNT?16)ZIiy*q# zE~1koqw*%Tes;bV)M~WZ(r&#bmAzP*u3B}3rV1OQ39`IHL##5-Wwv-Xkd%Uk;HUkFZtFn&%{ox~4}vvTs(2#3;JqkB zhVCp!Iy(!^5(zQf8`9u+si}m9SVOS`vkx`b3h5^s2a6>QhmktmoBFn@6yd^nP7@n4 z;_2U}HYAALUb)StHWb`h^N?-y`$`Zn2WW;*338@3H6sy?FXT4v{n1AA_U3uSz0Cs~fGHf-zQlIWP>=O!hPhVxBpAv_(WLJ0sXNgmX(6_Cw`?`ky+qbAhM zG4P?m!ATv;od!(tvO_SqYnNthDJ{*Odu`un-u=x*#orSGdv}ifS&^iZSy#}_D9aP>*?IbX9#_z%Pg!ZB)|fQenZXIY+k#*3&_|Y^!nT}<_oPhU z!d1w(VnSatFCe0(&!3*07Swj-mOgk8x+`tB3zbxm8{IkCQE3G?OOf7ig9$Ns2?s~!2->7xA;sP!k+4g|zqBzK% zjqZBytR4Q~5i&(vMbkZi335&w>0kLI#icN-A-%8|$P8}2^b4vTJdldvjhh9;*-_14 z>Y_z?jTY`Iq_wt8m|ynSU8New^d&Zbec@^1np>TaF|?KtL_av#4(cXOegaPeZ=&mF zLS`M1S9v*K>4f$+^BrIG~NFn$9UMUrGURM}%#1e6t zi$!vate`3>>t#eA5$9Q08S)NN;TSdZ@NDb+0v$pE7PkN* zcA>=%a7~GS6<4YQr_8qyVm{O+LXNglZUW|E+b-ZJk!rEL`90(BAgyj^_8^~K) zU|)QZH#Ahq!C=^HpU-conChtu7lGb=54Gl!Rr=LfismRIQyIaWdrPtTpz`gP;h3!3~6c=9S?qs`TD$B0J_T({=&0>q{((qZCc^GpU z800mK)h)Uy!r?#*n`o3eEfa41XPz^{{*1c{$L#XJHAQ)+fc<{XzXbq4Nx!~8efiH` z^~ue*b^_tc7fYhF;I+?4!{6#HfPZ5R7qpA&vg?zTcxFajT>O^+NV4dk9R1NIp1q9; zOdR2WAp&|y5ZMbb-$@@!2s0%!abYJ6My{%TMM`-alwmi#vPzYWz7ZS;NtHS9R;ip) z+ch4!Cw9GgU;AwDZSRliKFa58mnquGJJYR&=7Dcu*E}WCd9!gRNSl?uqK>NiL{sqZ2(2L1=wdgd&dK&lnoZ~u3LC$M^Dh8}K=TlB z@{tR;y%y5hJ7V@jt|ZseSt49KUnN;mCojg#;vUNyJypUeG=~nxku%5I3M^TRM507% zh}6hvl$qvvsuSmHpgOV%nCDkNWwA+-mx-$5!-eiW2IZ~Ez3_!)(6#NB7#hw;V>#5X zT7`^wY)+w#ZQG^xYDFv%Z6bjBvx&v+_G5H#xZJENGlr}i`2m<9P*}*?CZSC)1*4-~ zQX@!U8K#uj!Kqa8O3sOjoMWz=%~$vX%)TZ@3$hu^eH$R0_k}tkb{RGdw#5i0duFjq ziOH=}HVP>+uT2$n-f;`;Mj;2))D$i&5bjKlj9N-4WziF=PZq=yMo2(U&|A*Afd~1O zDHq;g5Y*p^DiKutWaFDotvT!*hP-&in8+|iW&xmKXwl*6G06R!GX~f(-yaB8ihA{- zNUPyQTXYGu_05K^c{V^zmN2qZGDK8^0BxAPBGS>53aF>?&A;ly_pl(PgZZla!(A@Q znVh@hlbRrlry!9zAQ^z1vE*vsd->?nG<~tI<}KLU?clK~5|~QMR7#cex5LRN1UULY zi}OLJK(FU^pt?|ZA;N0#-OcW=GNejEV}ymnpqV_Lu=-pz%oI&$ezXWt_8v@@r2{gi zWsagUo6Mxcist-=skq1Rekrn_Bn8k5Ck*qL5KR`ZHs0E-(Jun`0ZGA;hrdl=R3}d2 zgWQv>ZO?vi8}kT3A)>LR187{Ttku@pS-CBb_#E(h(N~0Ptygj<$Y6P0Jdlpq(}O-$ zM7!yeq~)_g5Aa!0mv`T81deWy$PXYG`Gie5c21z}iD|c8J>cYT5)p}-d2FQv*3&Vs z!xA0c*28v129|)Md<4(s5OMtyqFf3iG{1r;e#EKVLE!0jWKUS8@L?w@^eNP<2nv-5 z?Y@pn-6V_pNt@EBiEw{3X9Gj|gziZVYeP&g%*lQ=L7k7IkZFNX56_5hO-#awDClj zs&xA6LqY~#$%nmk3NWg$y;32c!?0C}=~eVa6%^kO(l4t5s8Kzgk;LO8QTxGP5x~Xh z`s{02FPP5}M#IlN(2tOfOY$lhDoDb*WOW!IxVQtH-cjHx%Z{pN6l6`%zv;Ol|{`oYo9X zDEbOAp(j8h_p9dAUN;DdZM%}vN=hu|@ zl}>?8^)+Utp&?r+jK9M$x0z0cJ9We~4i}YrJ_sJitG=71NDR(vMj|DRkAf5nmwiF8 zOmU4D1p)DFg^UEPBEd!BFxnGe$0AU&+}8%UL937;WT)$Zo}DkyukNlPKxllBdw_?Z z+zmw`&v&z8@Wc2$d#n>d*J4@ zd+_Ff1Z0Bhe&;VN|Hf!%%#+#4uINoBMxs&iuyH)(9C`ubx)I>cQrFoAU5y@Fvpc!I zciERCE6rb$7DRD}V7M`ALgRXVg=`1RbVLlzFkV8~rG zRpFcVu(zz^NU>Txy(f--YtPGX`%X!teu_caZqXz1apz{nWt)?UJPrr^H4GCh7f|K9 zg%njR>AQMrA?4nq;S7OsaXa^!V zhmTl}6Yj$!zOOpSCASZh9psYPKaITYw9Kx;IyR)opc!IS95z6C&dHJj^b`?oPJ;7Q z68Rn=-PnOw7ewCnlbI&Pi|k+Pfz&EH!~|NS+h{lh1p>3k4yGicTdCWK9+sc` z=yy2L{*(?ldy@>cLU&sFKqAL8d;_y5>k*8|BZ98z2|_n1<6+S5ok2M<4*-Veede8X zi}k+lRORO(TM!Ba##NsBHmC3YB4LB)C2%#RZT!5aO?5@ls^y|vX=BJlTBZpZP00^g+BH$M5iP~p-t&sLx~9M2 zroT6e8+xhWNW6DC;qZj&ir+%>Vi$w%*kjzn9g zQP=4vCDV0&-yCiBPTZI$?p&c?Z57bu|1i__aGg<)ZBUDMwDVz0yWG&*(o#hY-u{}Q z4SVrl!(syKsI6xAwA?;(4ldC)T+v!tWnbaM-IM#D>xYu}ztT;a>qX2?UA7@SapcTE z;KI>?fzC}M+nY*G422GFEcor-`R7j({a0RU?!Gcttx%j_`CNgOY;7l~xNRU;_yMP7 zH)Tt18$_Ry&Nj|Vz3+CUSX|CEvdlU%q%LCIV5pQni1w6HBz+S~Q5H%s4BN;yHc zDj3Rg6{dPw)Yk9PJk?X4X=rWvR&NDX6g!`L==TSIhYXpw0vKJ0v#P&OP6Z6?=9bbKl$Z$uGOEdQE32*FEy>{!n>0z0y^M_aj=5cg?pu z@lg-kQ!QHiMe8cmu4V9ftbhkZfWK^@ZKrcz3vdaH+$G!(Io4z zF8h*sMSsMRR&LiBSB<@be6K$4Uk@sHi!##!bvx&?ta7u0TZoe%A=P`LR|w(dZ-LCo5oL#}pRt_Fivu=IMxgLhWGzjiG+sWW&- zW?Is%`|5YOrLRZBw`!@M5}1udXLWfh+SGktwvQv|);KMe8qyyo%~xKxz(2OSxK}-_ zuFWm1EyBOzd%K7i-6>HnA2@=#1v4||4Rm?suGiu|9!`R3}u9jm2?d&Vgtwbes$ZR*C(cbjKrT?)Qf5H9c5{QKhAr}^bgX7a{W zH>L$n-(j(Ah5T9Nt9O>A$DiG-@Njuc_BlBR*PL^MnMOYrnUy<7a<9pSyT~@C1)2G( zZkL&MY*+fqn{~#GX?I$>3J;chNQ))qbkxc0UtemfXeiIx&5t(SDW&_Y_~AFP?iml7 zzE!%RAFDf0XMMGW*|I#o`T4o#d0e z!I=Ei!>0W{tlU16K@0Q8Tvfjh8>5Tuom^wTE65D3tjb_p4JUXP|D)e#@3b-S+Jil7 zem@-AW1K$vp|~t7S&2Ih3v`O^<{b`WXY6&3h-~@TVPjIiMSsBz~?N85}HZo7PJbq3abem{HV0nW|-O43F7Q;`NY&*)WLeL`Aj zQe;lh`*rFsnm$N})+c{FS=99Qy@ICPz}a8( zYCAJyBpampyQ7kFKGrNRsQO@4<8b-z-oHEM=vPExC`Cyt%|bRT?3{C7Y)@wMfe_aZ z2LcjXwp>>+m2|}#XD`&(yb_ygCC+E=#@57N!=mqbM_ZAN=)Qhs8(Q>#>9pEW zzoc-@7qxC=A^harjaJZ89?x{<+X_?(LJ?o-M#fsy1hnL|MR(^Tf{=xokW=8tx^QE| z?j;`XMw;SX)Uyd%JxC30#%4W8dnVP9X!}fU6u83RrqV1C4?$2|mf8f*Lwh!k8AdEE zid46@=YS^&KPFDi$sgM&(o|g5gA8e+wNVjzazKy+FAh>4qoL(_VwGNGKr5{^jmd}y zrRzYNCWENVh~V`ZX^ks2u}NvHf~Oiz$r8j21}PtB^&)+tSM|N%RR`|xMMks&`y)>@ zF97uuXiNntg)q$)8T z3>IFwv4~f88h~%>!8R?18*A`Y0mKod$6>hAK7Au%|pl3iGCI0u7NSX z*n>!ow0EW0renuJq%L$fi0Yo^F6>SjM9RYMBIp*=*h26ewy5J68B&N~6F#>DtoFhThEcm@UedGDIL)YsE5aO={*0PnS)JGXl8GWPQG3=W<+V8y)_wgbup z!8f9ovL4&m@ZrF&e+vr__|Z3b7w=K93?3R1S*vfq*24@k(GW5bM2I#v?5nZk5YiEP zyJrZH@`)#S<#8JLGATkT{5|(Y0zB*cPGzFrPW*BR%@Ojlh9T=3vFg(8c z1kItTm{0>Y$V z_?U&|48$1ef*%X!KRZi4mklPK784^0ZcqvJW zLL!I+c#8V)&m`bO@r|#bI+1VhXM$HaG{flMLrZZSROU-2LSYG4n26{;F@!xNkSc!h z8L?>TKYC{SQbn&88Z&GCCnM}Q1+nQP2JL~xONZmI}&&QaQy|A17!8tyM| zT>vPU0lQ^6J}*J)(5k*ni~lOvSU=#m5~Qed$VtL*KXAnQlB6)VmA3@gU4qct3KfhA zvie#aEIGz^j^a~YkMku-13GLkJG=Eg1&i)LfHMbj>IQ@@T@jn%2$i$fjH2FX!|jb7 zUK3eXxL`*qQgmE6CZ*M2aeH5^$5p4&s7Iq_D86bomVb z26ZL?>I^fB9z|g!J(fjA(v;1|alACCgr~+M$*-KhxH+R(4g^($6U@5d9Z#_t(#L4V z40VR9RX9$XRL0%#hX&=#EWNKlkxPb9zKE2*GJ!d{WK236K3uqn{bfj98mT7%H5;?R z+m8S>)8mHAI7ep8<3<_4`TY%q1BxKODV%Au$|HQH#el@$pfOM2BJ&WIDn=Y(epB)A z + + + + + \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/whcshdata.htm b/doc/salome/gui/KERNEL/whcshdata.htm new file mode 100755 index 000000000..0e0412421 --- /dev/null +++ b/doc/salome/gui/KERNEL/whcshdata.htm @@ -0,0 +1,87 @@ + + +KERNEL + + + + + + + + + + diff --git a/doc/salome/gui/KERNEL/whdata/whftdata.js b/doc/salome/gui/KERNEL/whdata/whftdata.js index 9e3b6abd0..071ae6fc7 100755 --- a/doc/salome/gui/KERNEL/whdata/whftdata.js +++ b/doc/salome/gui/KERNEL/whdata/whftdata.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gTEA = new Array(); function aTE(sTopicTitle, sTopicURL) { diff --git a/doc/salome/gui/KERNEL/whdata/whftdata0.htm b/doc/salome/gui/KERNEL/whdata/whftdata0.htm index 3156a4403..f48525808 100755 --- a/doc/salome/gui/KERNEL/whdata/whftdata0.htm +++ b/doc/salome/gui/KERNEL/whdata/whftdata0.htm @@ -1,6 +1,8 @@ - + + + @@ -10,32 +12,31 @@ - + diff --git a/doc/salome/gui/KERNEL/whdata/whfts.htm b/doc/salome/gui/KERNEL/whdata/whfts.htm index 8375a4d93..e2b057984 100755 --- a/doc/salome/gui/KERNEL/whdata/whfts.htm +++ b/doc/salome/gui/KERNEL/whdata/whfts.htm @@ -1,6 +1,8 @@ - + + + @@ -8,9 +10,9 @@ +//--> \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/whdata/whfts.js b/doc/salome/gui/KERNEL/whdata/whfts.js index 2041512fe..2b6678690 100755 --- a/doc/salome/gui/KERNEL/whdata/whfts.js +++ b/doc/salome/gui/KERNEL/whdata/whfts.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gaFileMapping = new Array(); var gaFileTopicMapping = new Array(); diff --git a/doc/salome/gui/KERNEL/whdata/whfwdata.js b/doc/salome/gui/KERNEL/whdata/whfwdata.js index 463bfb00d..e9e8bc6c1 100755 --- a/doc/salome/gui/KERNEL/whdata/whfwdata.js +++ b/doc/salome/gui/KERNEL/whdata/whfwdata.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gWEA = new Array(); function aWE() { diff --git a/doc/salome/gui/KERNEL/whdata/whfwdata0.htm b/doc/salome/gui/KERNEL/whdata/whfwdata0.htm index 81d8b19cf..d6dc00c36 100755 --- a/doc/salome/gui/KERNEL/whdata/whfwdata0.htm +++ b/doc/salome/gui/KERNEL/whdata/whfwdata0.htm @@ -1,6 +1,8 @@ - + + + @@ -10,1089 +12,1059 @@ - + diff --git a/doc/salome/gui/KERNEL/whdata/whgdata.js b/doc/salome/gui/KERNEL/whdata/whgdata.js index 729327323..77e0107f3 100755 --- a/doc/salome/gui/KERNEL/whdata/whgdata.js +++ b/doc/salome/gui/KERNEL/whdata/whgdata.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gIEA = new Array(); function aGE(sName, sDef) { diff --git a/doc/salome/gui/KERNEL/whdata/whgdata0.htm b/doc/salome/gui/KERNEL/whdata/whgdata0.htm index 9fbefcb8f..9d256b1a8 100755 --- a/doc/salome/gui/KERNEL/whdata/whgdata0.htm +++ b/doc/salome/gui/KERNEL/whdata/whgdata0.htm @@ -1,6 +1,8 @@ - + + + diff --git a/doc/salome/gui/KERNEL/whdata/whglo.htm b/doc/salome/gui/KERNEL/whdata/whglo.htm index d00c26063..dc5a67786 100755 --- a/doc/salome/gui/KERNEL/whdata/whglo.htm +++ b/doc/salome/gui/KERNEL/whdata/whglo.htm @@ -1,6 +1,8 @@ - + + + diff --git a/doc/salome/gui/KERNEL/whdata/whglo.js b/doc/salome/gui/KERNEL/whdata/whglo.js index ded3d5791..e0519afcb 100755 --- a/doc/salome/gui/KERNEL/whdata/whglo.js +++ b/doc/salome/gui/KERNEL/whdata/whglo.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gaFileMapping = new Array(); function fileMapping(sBK, sEK, sFileName, nNum) { diff --git a/doc/salome/gui/KERNEL/whdata/whidata.js b/doc/salome/gui/KERNEL/whdata/whidata.js index c8c2a05fd..9f0eb15ed 100755 --- a/doc/salome/gui/KERNEL/whdata/whidata.js +++ b/doc/salome/gui/KERNEL/whdata/whidata.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 // const strings var gIEA = new Array(); function aIE() diff --git a/doc/salome/gui/KERNEL/whdata/whidx.htm b/doc/salome/gui/KERNEL/whdata/whidx.htm index c0aa1758e..0a0deedd0 100755 --- a/doc/salome/gui/KERNEL/whdata/whidx.htm +++ b/doc/salome/gui/KERNEL/whdata/whidx.htm @@ -1,13 +1,15 @@ - + + + - \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/whdata/whidx.js b/doc/salome/gui/KERNEL/whdata/whidx.js index ded3d5791..e0519afcb 100755 --- a/doc/salome/gui/KERNEL/whdata/whidx.js +++ b/doc/salome/gui/KERNEL/whdata/whidx.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gaFileMapping = new Array(); function fileMapping(sBK, sEK, sFileName, nNum) { diff --git a/doc/salome/gui/KERNEL/whdata/whtdata.js b/doc/salome/gui/KERNEL/whdata/whtdata.js index 64bcff920..d5428a7de 100755 --- a/doc/salome/gui/KERNEL/whdata/whtdata.js +++ b/doc/salome/gui/KERNEL/whdata/whtdata.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gTEA = new Array(); function aTE() { @@ -34,6 +35,11 @@ function tocEntry(fn_arguments) if (fn_arguments.length > 3) { this.sRefURL = fn_arguments[3]; + if (this.nType == 4) + { + if(this.sRefURL.lastIndexOf("/")!=this.sRefURL.length-1) + this.sRefURL+="/"; + } if (fn_arguments.length > 4) { this.sItemURL = fn_arguments[4]; diff --git a/doc/salome/gui/KERNEL/whdata/whtdata0.htm b/doc/salome/gui/KERNEL/whdata/whtdata0.htm index a03503327..d89a6fafd 100755 --- a/doc/salome/gui/KERNEL/whdata/whtdata0.htm +++ b/doc/salome/gui/KERNEL/whdata/whtdata0.htm @@ -1,38 +1,40 @@ - + + + - + diff --git a/doc/salome/gui/KERNEL/whdata/whtoc.htm b/doc/salome/gui/KERNEL/whdata/whtoc.htm index 5f8c14e00..54e0cbf26 100755 --- a/doc/salome/gui/KERNEL/whdata/whtoc.htm +++ b/doc/salome/gui/KERNEL/whdata/whtoc.htm @@ -1,9 +1,11 @@ - + + + - + diff --git a/doc/salome/gui/KERNEL/whgdhtml.htm b/doc/salome/gui/KERNEL/whgdhtml.htm index 01b669216..6ffb2947a 100755 --- a/doc/salome/gui/KERNEL/whgdhtml.htm +++ b/doc/salome/gui/KERNEL/whgdhtml.htm @@ -1,9 +1,9 @@ Glossary - + - + diff --git a/doc/salome/gui/KERNEL/whghost.js b/doc/salome/gui/KERNEL/whghost.js index 77751a19e..56e1d5659 100755 --- a/doc/salome/gui/KERNEL/whghost.js +++ b/doc/salome/gui/KERNEL/whghost.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.004 var gbXML=false; var gaDef=new Array(); var gsBgColor="#ffffff"; @@ -8,6 +9,8 @@ var gsMargin="2pt"; var gsIndent="2pt"; var gsActiveBgColor="#cccccc"; var gbWhGHost=false; +var gbShowDef=true; +var gsGloId="Glo_" function setBackground(sBgImage) { @@ -43,22 +46,6 @@ function setIndent(sIndent) gsIndent=sIndent; } -function writeOneItem(oHTML,bDown,aDataCon,aCurIdxSet,n,aPos,nLevel) -{ - - var sHTML=""; - var nIdxSet=aCurIdxSet[n]; - var nIIdx=aPos[nIdxSet]; - var sRawKName = getItemName(aDataCon,nIdxSet,nIIdx); - var sKName=_textToHtml(sRawKName); - var nIndex=insertDef(sKName,_textToHtml_nonbsp(getDef(aDataCon,nIdxSet,nIIdx))); - if(nLevel==1){ - sHTML+="

"+sKName+"

"; - } - oHTML.addHTML(sHTML,1,bDown,true,sRawKName); -} - function insertDef(sKName,sDef) { var nLength=gaDef.length @@ -71,6 +58,7 @@ function showDef(nDef) { if(nDef"; + sHTML+=""+sKName+"

"; + oHTML.addHTML(sHTML,nLength,bDown,true,sRawKName); + if(gbShowDef) + { + setTimeout("showDef(0);",100); + gbShowDef = false; + } + } +} + +function HighLight(nIndex) +{ + var oObj=getElement(getGloId(nIndex)); + if(oObj) + HighLightElement(oObj,gsActiveBgColor,"transparent"); +} + +function getGloId(nIndex) +{ + return gsGloId+nIndex; } function adjustPosition(bDown,aDataCon,aCurIdxSet,nLength,aPos) @@ -146,7 +176,7 @@ function loadGlo() var sLangId=aProj[0].sLangId; for(var i=0;i Index content - + - + @@ -15,11 +15,7 @@ -<p>Your browser does not support frames. We recommend that you update your browser to a version that supports frames.</p><p>To view the Help system without frames click on this<a href="whgdata/whnvp30.htm">hyperlink.</a></p> +<p>Your browser does not support frames. We recommend that you update your browser to a version that supports frames.</p><p>To view the Help system without frames click on this<a href="whgdata/whnvp30.htm">hyperlink.</a></p> \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/whphost.js b/doc/salome/gui/KERNEL/whphost.js index d4c80bbb9..9c91b49c8 100755 --- a/doc/salome/gui/KERNEL/whphost.js +++ b/doc/salome/gui/KERNEL/whphost.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.005 var gaProj=new Array(); var gnChecked=0; var gsProjName=""; @@ -87,7 +88,7 @@ function whCom(sName,sComFile) var strFile= _getFullPath(getPath(), this.msComFile); var oDiv=getElement(this.msDivId); if(oDiv){ - if(gbIE4){ + if(gbIE4||gbOpera7){ var nIFrameHeight=oDiv.style.pixelHeight; var nIFrameWidth=oDiv.style.pixelWidth; var sHTML=""; + gsHTML=""; goDiv = oDiv; setTimeout("delayLoad()", 100); } @@ -119,11 +119,12 @@ function whCom(sName,sComFile) var sHTML=""; if(gbMac&&gbIE4) sHTML+="
"; + else if(gbIE5) + sHTML+="
"; + else if(gbIE4||gbWindows) + sHTML+="
"; else - if (gbIE5) - sHTML+="
"; - else - sHTML+="
"; + sHTML+="
"; sHTML+="
"; return sHTML; } @@ -203,29 +204,68 @@ function getPath() goMan=new whComMan(); function addPane(sName,sFileName) { - goMan.addCom(sName,sFileName); + var oParam=new Object(); + oParam.sName=sName; + var oMsg=new whMessage(WH_MSG_GETPANE, this, 1, oParam); + if (SendMessage(oMsg)) + { + if (oMsg.oParam.bEnable) + goMan.addCom(sName,sFileName); + } + else + goMan.addCom(sName,sFileName); } function setShowPane(sName, bForce) { if ((gsFirstPane == "") || bForce) - gsFirstPane=sName; + { + var oMsg=new whMessage(WH_MSG_GETDEFPANE, this, 1, null); + if (SendMessage(oMsg)) + { + if (oMsg.oParam) + gsFirstPane = oMsg.oParam; + else + gsFirstPane=sName; + } + else + gsFirstPane=sName; + } } function window_OnLoad() { - if(gsProjName!="") + var oMsg=new whMessage(WH_MSG_GETCMD,this,1,null); + var bHidePane=false; + if (SendMessage(oMsg)) { - goMan.init(); - if(gsFirstPane!="") - goMan.show(gsFirstPane); - else - goMan.showById(0); - loadData2(gsProjName); + if(oMsg.oParam>0) + { + if(oMsg.oParam==1) + gsFirstPane="toc"; + else if(oMsg.oParam==2) + gsFirstPane="idx"; + else if(oMsg.oParam==3) + gsFirstPane="fts"; + else if(oMsg.oParam==4) + gsFirstPane="glo"; + } + else if(oMsg.oParam==0) + { + bHidePane=true; + } } - else if (gServerEnabled) + goMan.init(); + if(gsProjName!="") + loadData2(gsProjName); + if (bHidePane) + { + gsFirstPane=""; + var oMsg1=new whMessage(WH_MSG_HIDEPANE, this, 1, null) + SendMessage(oMsg1); + } + else { - goMan.init(); if(gsFirstPane!="") goMan.show(gsFirstPane); else @@ -249,7 +289,7 @@ function loadData2(strFile) function addProject(bPreferXML,sXMLName,sHTMLName) { var bLoadXML=bPreferXML; - if(!gbIE4&&!gbNav6) + if(!gbIE4&&!gbNav6&&!gbOpera7) return; if(gbIE4&&!gbIE5) bLoadXML=false; @@ -257,6 +297,8 @@ function addProject(bPreferXML,sXMLName,sHTMLName) bLoadXML=true; if(gbIE55||gbNav6) bLoadXML=true; + if(gbOpera7) + bLoadXML=false; if(bLoadXML) addProjectXML(sXMLName); else @@ -316,6 +358,8 @@ function putDataXML(xmlDoc,sdocPath) var sURL=RmtProject[i].getAttribute("url"); if(sURL) { + if(sURL.lastIndexOf("/")!=sURL.length-1) + sURL+="/"; aRProj[nCount]=new Object(); aRProj[nCount++].sPPath=_getFullPath(aRProj[0].sPPath,sURL); } @@ -326,11 +370,23 @@ function putDataXML(xmlDoc,sdocPath) { // on Netscape 6.0 under some situation the xml file cannot be loaded. // so we use pure html instead. - setTimeout("redirectToList();",100); + if (gnChecked == 0) + setTimeout("redirectToList();",100); + else + { + gnChecked++; + setTimeout("checkRemoteProject();", 1); + } } } } +function onLoadXMLError() +{ + gnChecked++; + setTimeout("checkRemoteProject();", 1); +} + function redirectToList() { if(gbReDirectThis) @@ -346,7 +402,7 @@ function putProjectInfo(aRProj) if(gnChecked!=0) { if(aRProj[0].sLangId!=gaProj[0].sLangId) - alert("The project: "+aRProj[0].sPPath+" is using a different language to the main project, which will cause the index and full text search functionality to be disabled for this remote project."); + alert("The merged Help system "+aRProj[0].sPPath+" is using a different language from the master Help system, which will cause the index and full-text search functionality to be disabled in the merged Help system."); } gaProj[gnChecked]=aRProj[0]; for(var i=1;i project description - + - + diff --git a/doc/salome/gui/KERNEL/whproj.js b/doc/salome/gui/KERNEL/whproj.js index 0e235159b..ae38fa994 100755 --- a/doc/salome/gui/KERNEL/whproj.js +++ b/doc/salome/gui/KERNEL/whproj.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gaProj=new Array(); gaProj[0]=new project(""); @@ -41,6 +42,8 @@ function addGlo(sFile) function addRemoteProject(sProjRelPath) { + if(sProjRelPath.lastIndexOf("/")!=sProjRelPath.length-1) + sProjRelPath+="/"; gaProj[gaProj.length]=new project(sProjRelPath); } diff --git a/doc/salome/gui/KERNEL/whproj.xml b/doc/salome/gui/KERNEL/whproj.xml index d16f189af..4bd4a8de7 100755 --- a/doc/salome/gui/KERNEL/whproj.xml +++ b/doc/salome/gui/KERNEL/whproj.xml @@ -1,3 +1,3 @@ - - + + diff --git a/doc/salome/gui/KERNEL/whproxy.js b/doc/salome/gui/KERNEL/whproxy.js index 222927a0a..d0ee29813 100755 --- a/doc/salome/gui/KERNEL/whproxy.js +++ b/doc/salome/gui/KERNEL/whproxy.js @@ -1,3 +1,4 @@ +// WebHelp 5.10.001 var gbInited=false; var gWndStubPage=null; function getStubPage() @@ -60,4 +61,14 @@ function SendMessage(oMessage) return false; } -var gbWhProxy=true; \ No newline at end of file +var gbWhProxy=true; + +var gbPreview=false; +gbPreview=false; +if (gbPreview) + document.oncontextmenu=contextMenu; + +function contextMenu() +{ + return false; +} diff --git a/doc/salome/gui/KERNEL/whres.xml b/doc/salome/gui/KERNEL/whres.xml index 9634684e9..f3f010a3f 100755 --- a/doc/salome/gui/KERNEL/whres.xml +++ b/doc/salome/gui/KERNEL/whres.xml @@ -1,4 +1,4 @@ - + @@ -6,9 +6,13 @@ + + + + @@ -18,7 +22,11 @@ + + + + @@ -28,13 +36,21 @@ + + + + + + + + @@ -57,6 +73,7 @@ + @@ -160,14 +177,14 @@ - - - - + + + + diff --git a/doc/salome/gui/KERNEL/whskin_banner.htm b/doc/salome/gui/KERNEL/whskin_banner.htm index afe2d3f06..39ed797e6 100755 --- a/doc/salome/gui/KERNEL/whskin_banner.htm +++ b/doc/salome/gui/KERNEL/whskin_banner.htm @@ -1,13 +1,14 @@ About WebHelp                                                                                    - + - + + KERNEL + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/whskin_info.htm b/doc/salome/gui/KERNEL/whskin_info.htm index a68fcd5ce..3092cac5d 100755 --- a/doc/salome/gui/KERNEL/whskin_info.htm +++ b/doc/salome/gui/KERNEL/whskin_info.htm @@ -1,20 +1,20 @@ -WebHelp 5.00 +WebHelp 5.50 - + -

WebHelp 5.00 System Info

+

WebHelp 5.50 System Info

- + - + - - - + + +
Start Page kernel.html
Start Page kernel.htm
Skin Name Default
Generating Time 14:23 03/03/2004
Generating Time 13:17 03/01/2005
Language ID 1033
Compile Script webhelp5_compile_script.xml
Compile Build Version 10.00.949
Product Name WebHelp 5.00
Authoring Tool Name RoboHelp 2002
Compile Build Version 13.10.606
Product Name WebHelp 5.50
Authoring Tool Name RoboHelp X5
\ No newline at end of file diff --git a/doc/salome/gui/KERNEL/whskin_mbars.htm b/doc/salome/gui/KERNEL/whskin_mbars.htm index 66e8c5329..c4fa48af8 100755 --- a/doc/salome/gui/KERNEL/whskin_mbars.htm +++ b/doc/salome/gui/KERNEL/whskin_mbars.htm @@ -1,6 +1,9 @@ - + WebHelp Navigation Mini-bar + + +\n"; + document.write(sStyle); +} + +function window_OnLoad() +{ + if(document.body) + { + if(gsBgImage&&gsBgImage.length>0) + { + document.body.background=gsBgImage; + } + if(gsBgColor&&gsBgColor.length>0) + { + document.body.bgColor=gsBgColor; + } + } + fnOnload(); + window_onResize(); +} + +function window_onResize() +{ + var oDiv = getElement("divlist"); + var oTitle = getElement("p_title"); + var oButton = getElement("tb_button"); + if (oDiv && oTitle && oButton) + { + oDiv.style.height = document.body.offsetHeight - oTitle.offsetHeight - oButton.offsetHeight - 8; + } +} +goTableFont=new whFont("Verdana","8pt","#000000","normal","normal","none"); +goFont=new whFont("Verdana","8pt","#000000","normal","normal","none"); +goHoverFont=new whFont("Verdana","8pt","#666666","normal","normal","none"); + + +setBackgroundcolor("White"); + +setFont("Table", "Tahoma","8pt","Navy","Normal","Normal","none"); +setListBackgroundcolor("White"); + +setFont("Normal", "Tahoma","8pt","Black","Normal","Normal","none"); +setFont("Hover", "Tahoma","8pt","Navy","Normal","Normal","underline"); +setActiveBgColor("Silver"); + +window.onload=window_OnLoad; +window.onresize = window_onResize; +writeStyle(); +//--> + + + + +

Select a topic, then click Display

+
+
+
+ + + +
+ + + + \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/whskin_plist.htm b/doc/salome/gui/KERNEL/whskin_plist.htm index 35f0155b8..f7cf6d1d5 100755 --- a/doc/salome/gui/KERNEL/whskin_plist.htm +++ b/doc/salome/gui/KERNEL/whskin_plist.htm @@ -1,47 +1,38 @@ Navigation Pane - + - + \ No newline at end of file diff --git a/doc/salome/gui/KERNEL/whskin_tbars.htm b/doc/salome/gui/KERNEL/whskin_tbars.htm index 8b705444c..6cb490239 100755 --- a/doc/salome/gui/KERNEL/whskin_tbars.htm +++ b/doc/salome/gui/KERNEL/whskin_tbars.htm @@ -1,6 +1,9 @@ - + WebHelp Navigation Toolbar + + + "; + var sStyle=""; document.write(sStyle); } } } -function button(sText, nWidth, nHeight) +function button(sText,nWidth,nHeight) { - this.sText = sText; - this.nWidth = nWidth; - this.nHeight = nHeight; + this.sText=sText; + this.nWidth=nWidth; + this.nHeight=nHeight; - this.aImgs = new Array(); - var i = 0; - while (button.arguments.length > i + 3) + this.aImgs=new Array(); + var i=0; + while(button.arguments.length>i+3) { - this.aImgs[i] = button.arguments[3 + i]; - i ++; + this.aImgs[i]=button.arguments[3+i]; + i++; } } -// project info +//project info function setRelStartPage(sPath) { - if (gsPPath.length == 0) + if(gsPPath.length==0) { - gsPPath = _getFullPath(_getPath(document.location.href), _getPath(sPath)); - gsStartPage = _getFullPath(_getPath(document.location.href), sPath); - gsRelCurPagePath = _getRelativeFileName(gsStartPage, document.location.href); + gsPPath=_getFullPath(_getPath(document.location.href),_getPath(sPath)); + gsStartPage=_getFullPath(_getPath(document.location.href),sPath); + gsRelCurPagePath=_getRelativeFileName(gsStartPage,document.location.href); } } -function getImage(oImage, sType) +function getImage(oImage,sType) { var sImg=""; - if (oImage && oImage.aImgs && (oImage.aImgs.length > 0)) + if(oImage&&oImage.aImgs&&(oImage.aImgs.length>0)) { - sImg+="\""+ 0) - sImg+=" width=" + oImage.nWidth; - if (oImage.nHeight > 0) - sImg+=" height=" + oImage.nHeight; - sImg+=" border=no>"; + sImg+="\""+sType+"\"0) + sImg+=" width="+oImage.nWidth; + if(oImage.nHeight>0) + sImg+=" height="+oImage.nHeight; + sImg+=" border=0>"; } return sImg; } function addTocInfo(sTocPath) { - gaPaths[gaPaths.length] = sTocPath; + gaPaths[gaPaths.length]=sTocPath; } -function addAvenueInfo(sName, sPrev, sNext) +function addAvenueInfo(sName,sPrev,sNext) { - gaAvenues[gaAvenues.length] = new avenueInfo(sName, sPrev, sNext); + gaAvenues[gaAvenues.length]=new avenueInfo(sName,sPrev,sNext); } -function addButton(sType, nStyle, sText, sHref, sOnClick, sOnMouseOver, sOnLoad, nWidth, nHeight, sImg1, sImg2, sImg3) +function addButton(sType,nStyle,sText,sHref,sOnClick,sOnMouseOver,sOnLoad,nWidth,nHeight,sImg1,sImg2,sImg3) { - var sButton = ""; + var sButton=""; var nBtn=gaButtons.length; - if (sType == "prev") + if(sType=="prev") { - if (canGo(false)) + if(canGo(false)) { - var sTitle = "Previous Topic"; - goPrev = new button(sText, nWidth, nHeight, sImg1, sImg2, sImg3); - sButton = ""; - if (nStyle == BTN_TEXT) - sButton += goPrev.sText; + var sTitle="Previous Topic"; + goPrev=new button(sText,nWidth,nHeight,sImg1,sImg2,sImg3); + sButton=""; + if(nStyle==BTN_TEXT) + sButton+=goPrev.sText; else - sButton += getImage(goPrev, sTitle); - sButton += ""; + sButton+=getImage(goPrev,sTitle); + sButton+=""; } } - else if (sType == "next") + else if(sType=="next") { - if (canGo(true)) + if(canGo(true)) { - var sTitle = "Next Topic"; - goNext = new button(sText, nWidth, nHeight, sImg1, sImg2, sImg3); - sButton = ""; - if (nStyle == BTN_TEXT) - sButton += goNext.sText; + var sTitle="Next Topic"; + goNext=new button(sText,nWidth,nHeight,sImg1,sImg2,sImg3); + sButton=""; + if(nStyle==BTN_TEXT) + sButton+=goNext.sText; else - sButton += getImage(goNext, sTitle); - sButton += ""; + sButton+=getImage(goNext,sTitle); + sButton+=""; } } - else if (sType == "show") + else if(sType=="show") { - if (isTopicOnly()) + if(isTopicOnly()&&(!gbOpera6||gbOpera7)) { - var sTitle = "Show Navigation Component"; - goShow = new button(sText, nWidth, nHeight, sImg1, sImg2, sImg3); - sButton = ""; - if (nStyle == BTN_TEXT) - sButton += goShow.sText; + var sTitle="Show Navigation Component"; + goShow=new button(sText,nWidth,nHeight,sImg1,sImg2,sImg3); + sButton=""; + if(nStyle==BTN_TEXT) + sButton+=goShow.sText; else - sButton += getImage(goShow, sTitle); - sButton += ""; + sButton+=getImage(goShow,sTitle); + sButton+=""; } } - else if (sType == "hide") + else if(sType=="hide") { - if (!isTopicOnly()) + if(!isTopicOnly()&&!gbOpera6) { - var sTitle = "Hide Navigation Component"; - goHide = new button(sText, nWidth, nHeight, sImg1, sImg2, sImg3); - sButton = ""; - if (nStyle == BTN_TEXT) - sButton += goHide.sText; + var sTitle="Hide Navigation Component"; + goHide=new button(sText,nWidth,nHeight,sImg1,sImg2,sImg3); + sButton=""; + if(nStyle==BTN_TEXT) + sButton+=goHide.sText; else - sButton += getImage(goHide, sTitle); - sButton += ""; + sButton+=getImage(goHide,sTitle); + sButton+=""; } } - else if (sType == "shownav") + else if(sType=="shownav") { - - if (isShowHideEnable()) + if(isShowHideEnable()) { - var sTitle = "Show Navigation Component"; - goShowNav = new button(sText, nWidth, nHeight, sImg1, sImg2, sImg3); - sButton = ""; - if (nStyle == BTN_TEXT) - sButton += goShowNav.sText; + var sTitle="Show Navigation Component"; + goShowNav=new button(sText,nWidth,nHeight,sImg1,sImg2,sImg3); + sButton=""; + if(nStyle==BTN_TEXT) + sButton+=goShowNav.sText; else - sButton += getImage(goShowNav, sTitle); - sButton += ""; + sButton+=getImage(goShowNav,sTitle); + sButton+=""; } } - else if (sType == "hidenav") + else if(sType=="hidenav") { - if (isShowHideEnable()) + if(isShowHideEnable()) { - var sTitle = "Hide Navigation Component"; - goHideNav = new button(sText, nWidth, nHeight, sImg1, sImg2, sImg3); - sButton = ""; - if (nStyle == BTN_TEXT) - sButton += goHideNav.sText; + var sTitle="Hide Navigation Component"; + goHideNav=new button(sText,nWidth,nHeight,sImg1,sImg2,sImg3); + sButton=""; + if(nStyle==BTN_TEXT) + sButton+=goHideNav.sText; else - sButton += getImage(goHideNav, sTitle); - sButton += ""; + sButton+=getImage(goHideNav,sTitle); + sButton+=""; } } - else if (sType == "synctoc") + else if(sType=="synctoc") { - if (gaPaths.length > 0) + if(gaPaths.length>0) { - var sTitle = "Sync TOC"; - goSync = new button(sText, nWidth, nHeight, sImg1, sImg2, sImg3); - sButton = ""; - if (nStyle == BTN_TEXT) - sButton += goSync.sText; + var sTitle="Sync TOC"; + goSync=new button(sText,nWidth,nHeight,sImg1,sImg2,sImg3); + sButton=""; + if(nStyle==BTN_TEXT) + sButton+=goSync.sText; else - sButton += getImage(goSync, sTitle); - sButton += ""; + sButton+=getImage(goSync,sTitle); + sButton+=""; } } - else if (sType == "websearch") + else if(sType=="websearch") { - if (gsSearchFormHref.length > 0) + if(gsSearchFormHref.length>0) { - var sTitle = "WebSearch"; - goWebSearch = new button(sText, nWidth, nHeight, sImg1, sImg2, sImg3); - sButton = ""; - if (nStyle == BTN_TEXT) - sButton += goWebSearch.sText; + var sTitle="WebSearch"; + goWebSearch=new button(sText,nWidth,nHeight,sImg1,sImg2,sImg3); + sButton=""; + if(nStyle==BTN_TEXT) + sButton+=goWebSearch.sText; else - sButton += getImage(goWebSearch, sTitle); - sButton += ""; + sButton+=getImage(goWebSearch,sTitle); + sButton+=""; } } - else if (sType == "searchform") + else if(sType=="searchform") { - gaButtons[nBtn] = "NeedSearchForm"; - gaTypes[nBtn] = sType; + gaButtons[nBtn]="NeedSearchForm"; + gaTypes[nBtn]=sType; } - if (sButton.length != 0) + if(sButton.length!=0) { - if (nStyle == BTN_TEXT) - sButton += " "; - gaButtons[nBtn] = "" + sButton + ""; - gaTypes[nBtn] = sType; + if(nStyle==BTN_TEXT) + sButton+=" "; + gaButtons[nBtn]=""+sButton+""; + gaTypes[nBtn]=sType; } } function isSyncEnabled() { - if (!gbCheckSync) + if(!gbCheckSync) { var oMsg=new whMessage(WH_MSG_ISSYNCSSUPPORT,this,1,null); if(SendMessage(oMsg)) @@ -250,30 +250,30 @@ function isSyncEnabled() function isInPopup() { - return (window.name.indexOf("BSSCPopup") != -1); + return (window.name.indexOf("BSSCPopup")!=-1); } function getIntopicBar(sAlign) { - var sHTML = ""; - if (gaButtons.length > 0) + var sHTML=""; + if(gaButtons.length>0) { - sHTML += "
"; + sHTML+="
"; - sHTML += ""; - for (var i = 0; i < gaButtons.length; i++) + sHTML+="
"; + for(var i=0;i 0) + if(isInPopup()) return; + if(gaButtons.length>0) { - var sHTML = ""; - if (nAligns != 0) + var sHTML=""; + if(nAligns!=0) { - sHTML += "
" - if (nAligns & 1) - sHTML += ""; - if (nAligns & 2) - sHTML += ""; - if (nAligns & 4) - sHTML += ""; - sHTML += "
" + getIntopicBar("left") + "" + getIntopicBar("center") + "" + getIntopicBar("right") + "
"; + sHTML+="" + if(nAligns&1) + sHTML+=""; + if(nAligns&2) + sHTML+=""; + if(nAligns&4) + sHTML+=""; + sHTML+="
"+getIntopicBar("left")+""+getIntopicBar("center")+""+getIntopicBar("right")+"
"; document.write(sHTML); } } @@ -302,45 +302,45 @@ function writeIntopicBar(nAligns) function sendAveInfoOut() { - if (!isInPopup()) - setTimeout("sendAveInfo();", 100); + if(!isInPopup()) + setTimeout("sendAveInfo();",100); } function sendAveInfo() { - var oMsg = new whMessage(WH_MSG_AVENUEINFO, this, 1, gaAvenues); + var oMsg=new whMessage(WH_MSG_AVENUEINFO,this,1,gaAvenues); SendMessage(oMsg); } function onNext() { - var oMsg = new whMessage(WH_MSG_NEXT, this, 1, null); + var oMsg=new whMessage(WH_MSG_NEXT,this,1,null); SendMessage(oMsg); } function onPrev() { - var oMsg = new whMessage(WH_MSG_PREV, this, 1, null); + var oMsg=new whMessage(WH_MSG_PREV,this,1,null); SendMessage(oMsg); } function createSyncInfo() { - var oParam = new Object(); - if (gsPPath.length == 0) - gsPPath = _getPath(document.location.href); - oParam.sPPath = gsPPath; - oParam.sTPath = document.location.href; - oParam.aPaths = gaPaths; + var oParam=new Object(); + if(gsPPath.length==0) + gsPPath=_getPath(document.location.href); + oParam.sPPath=gsPPath; + oParam.sTPath=document.location.href; + oParam.aPaths=gaPaths; return oParam; } function syncWithShow() { - if (isTopicOnly()) + if(isTopicOnly()) show(); - else + else { sync(); showTocPane(); @@ -349,86 +349,86 @@ function syncWithShow() function showTocPane() { - var oMsg = new whMessage(WH_MSG_SHOWTOC, this, 1, null); + var oMsg=new whMessage(WH_MSG_SHOWTOC,this,1,null); SendMessage(oMsg); } function sendSyncInfo() { - if (!isInPopup()) + if(!isInPopup()) { - var oParam = null; - if (gaPaths.length > 0) + var oParam=null; + if(gaPaths.length>0) { - oParam = createSyncInfo(); + oParam=createSyncInfo(); } - var oMsg = new whMessage(WH_MSG_SYNCINFO, this, 1, oParam); + var oMsg=new whMessage(WH_MSG_SYNCINFO,this,1,oParam); SendMessage(oMsg); } } function sendInvalidSyncInfo() { - if (!isInPopup()) + if(!isInPopup()) { - var oMsg = new whMessage(WH_MSG_SYNCINFO, this, 1, null); + var oMsg=new whMessage(WH_MSG_SYNCINFO,this,1,null); SendMessage(oMsg); } } function enableWebSearch(bEnable) { - if (!isInPopup()) + if(!isInPopup()) { - var oMsg = new whMessage(WH_MSG_ENABLEWEBSEARCH, this, 1, bEnable); + var oMsg=new whMessage(WH_MSG_ENABLEWEBSEARCH,this,1,bEnable); SendMessage(oMsg); } } function autoSync(nSync) { - if (nSync == 0) return; - if (isInPopup()) return; - if (isOutMostTopic()) + if(nSync==0) return; + if(isInPopup()) return; + if(isOutMostTopic()) sync(); } function isOutMostTopic() { - if (gnOutmostTopic == -1) + if(gnOutmostTopic==-1) { - var oMessage = new whMessage(WH_MSG_ISINFRAMESET, this, 1 , null); - if (SendMessage(oMessage)) - gnOutmostTopic = 0; + var oMessage=new whMessage(WH_MSG_ISINFRAMESET,this,1,null); + if(SendMessage(oMessage)) + gnOutmostTopic=0; else - gnOutmostTopic = 1; + gnOutmostTopic=1; } - return (gnOutmostTopic == 1); + return (gnOutmostTopic==1); } function sync() { - if (gaPaths.length > 0) + if(gaPaths.length>0) { - var oParam = createSyncInfo(); - var oMessage = new whMessage(WH_MSG_SYNCTOC, this, 1, oParam); + var oParam=createSyncInfo(); + var oMessage=new whMessage(WH_MSG_SYNCTOC,this,1,oParam); SendMessage(oMessage); } } -function avenueInfo(sName, sPrev, sNext) +function avenueInfo(sName,sPrev,sNext) { - this.sName = sName; - this.sPrev = sPrev; - this.sNext = sNext; + this.sName=sName; + this.sPrev=sPrev; + this.sNext=sNext; } function getCurrentAvenue() { - var oParam = new Object(); - oParam.sAvenue = null; - var oMessage = new whMessage(WH_MSG_GETCURRENTAVENUE, this, 1, oParam); + var oParam=new Object(); + oParam.sAvenue=null; + var oMessage=new whMessage(WH_MSG_GETCURRENTAVENUE,this,1,oParam); SendMessage(oMessage); return oParam.sAvenue; } @@ -437,37 +437,37 @@ function unRegisterListener() { sendInvalidSyncInfo(); enableWebSearch(false); - if (whtopic_foldUnload) + if(whtopic_foldUnload) whtopic_foldUnload(); } function onSendMessage(oMsg) { - var nMsgId = oMsg.nMessageId; - if (nMsgId == WH_MSG_GETAVIAVENUES) + var nMsgId=oMsg.nMessageId; + if(nMsgId==WH_MSG_GETAVIAVENUES) { - oMsg.oParam.aAvenues = gaAvenues; + oMsg.oParam.aAvenues=gaAvenues; return false; } - else if (nMsgId == WH_MSG_GETTOCPATHS) + else if(nMsgId==WH_MSG_GETTOCPATHS) { - if (isOutMostTopic()) + if(isOutMostTopic()) { - oMsg.oParam.oTocInfo = createSyncInfo(); + oMsg.oParam.oTocInfo=createSyncInfo(); return false; } else return true; } - else if (nMsgId == WH_MSG_NEXT) + else if(nMsgId==WH_MSG_NEXT) { goAvenue(true); } - else if (nMsgId == WH_MSG_PREV) + else if(nMsgId==WH_MSG_PREV) { goAvenue(false); } - else if (nMsgId == WH_MSG_WEBSEARCH) + else if(nMsgId==WH_MSG_WEBSEARCH) { websearch(); } @@ -476,60 +476,60 @@ function onSendMessage(oMsg) function goAvenue(bNext) { - var sTopic = null; - var sAvenue = getCurrentAvenue(); - var nAvenue = -1; - if (sAvenue != null && sAvenue != "") + var sTopic=null; + var sAvenue=getCurrentAvenue(); + var nAvenue=-1; + if(sAvenue!=null&&sAvenue!="") { - for (var i = 0; i < gaAvenues.length ; i ++) + for(var i=0;i 0 && bNext) + if(gaAvenues[i].sNext!=null&&gaAvenues[i].sNext.length>0&&bNext) { - sTopic = gaAvenues[i].sNext; + sTopic=gaAvenues[i].sNext; break; } - else if (gaAvenues[i].sPrev != null && gaAvenues[i].sPrev.length > 0 && !bNext) + else if(gaAvenues[i].sPrev!=null&&gaAvenues[i].sPrev.length>0&&!bNext) { - sTopic = gaAvenues[i].sPrev; + sTopic=gaAvenues[i].sPrev; break; } } } - if (sTopic != null && sTopic != "") + if(sTopic!=null&&sTopic!="") { - if (gsPPath != null && gsPPath != "") + if(gsPPath!=null&&gsPPath!="") { - sFullTopicPath = _getFullPath(gsPPath, sTopic); - document.location = sFullTopicPath; + sFullTopicPath=_getFullPath(gsPPath,sTopic); + document.location=sFullTopicPath; } } } function canGo(bNext) { - for (var i = 0; i < gaAvenues.length ; i ++) + for(var i=0;i 0 && bNext) || - (gaAvenues[i].sPrev != null && gaAvenues[i].sPrev.length > 0 && !bNext)) + if((gaAvenues[i].sNext!=null&&gaAvenues[i].sNext.length>0&&bNext)|| + (gaAvenues[i].sPrev!=null&&gaAvenues[i].sPrev.length>0&&!bNext)) return true; } return false; @@ -537,34 +537,34 @@ function canGo(bNext) function show() { - if (gsStartPage != "") - window.location = gsStartPage + "#" + gsRelCurPagePath; + if(gsStartPage!="") + window.location=gsStartPage+"#"+gsRelCurPagePath; } function hide() { - if (goFrame != null) + if(goFrame!=null) { - goFrame.location = window.location; + goFrame.location=window.location; } } function isTopicOnly() { - if (gnTopicOnly == -1) + if(gnTopicOnly==-1) { - var oParam = new Object(); - oParam.oFrame = null; - var oMsg = new whMessage(WH_MSG_GETSTARTFRAME, this, 1, oParam); - if (SendMessage(oMsg)) + var oParam=new Object(); + oParam.oFrame=null; + var oMsg=new whMessage(WH_MSG_GETSTARTFRAME,this,1,oParam); + if(SendMessage(oMsg)) { - goFrame = oParam.oFrame; - gnTopicOnly = 0; + goFrame=oParam.oFrame; + gnTopicOnly=0; } else - gnTopicOnly = 1; + gnTopicOnly=1; } - if (gnTopicOnly == 1) + if(gnTopicOnly==1) return true; else return false; @@ -572,88 +572,150 @@ function isTopicOnly() function websearch() { - if (gbNav4) + if(gbNav4) { - if (document.ehelpform) + if(document.ehelpform) document.ehelpform.submit(); } else { - if (window.ehelpform) + if(window.ehelpform) window.ehelpform.submit(); } } function addSearchFormHref(sHref) { - gsSearchFormHref = sHref; + gsSearchFormHref=sHref; enableWebSearch(true); } function searchB(nForm) { - var sValue = eval("document.searchForm" + nForm + ".searchString.value"); - var oMsg = new whMessage(WH_MSG_SEARCHTHIS, this, 1, sValue); + var sValue=eval("document.searchForm"+nForm+".searchString.value"); + var oMsg=new whMessage(WH_MSG_SEARCHTHIS,this,1,sValue); SendMessage(oMsg); } function getSearchFormHTML() { - var sHTML = ""; - gnForm ++; - var sFormName = "searchForm" + gnForm; - var sButton = "
" - sButton += ""; - if ("" == "text") + var sHTML=""; + gnForm++; + var sFormName="searchForm"+gnForm; + var sButton="" + sButton+=""; + if(""=="text") { - sButton+=""; + sButton+=""; } - else if ("" == "image") + else if(""=="image") { - sButton+="" + sButton+="" sButton+=""; } - sButton += "
"; - sHTML ="" + sButton + ""; + sButton+=""; + sHTML=""+sButton+""; return sHTML; } function showHidePane(bShow) { var oMsg=null; - if (bShow) - oMsg=new whMessage(WH_MSG_SHOWPANE, this, 1, null); + if(bShow) + oMsg=new whMessage(WH_MSG_SHOWPANE,this,1,null); else - oMsg=new whMessage(WH_MSG_HIDEPANE, this, 1, null); + oMsg=new whMessage(WH_MSG_HIDEPANE,this,1,null); SendMessage(oMsg); } function isShowHideEnable() { - if (gbIE4) + if(gbIE4) return true; else return false; } + +function PickupDialog_Invoke() +{ + if(!gbIE4||gbMac) + { + if(typeof(_PopupMenu_Invoke)=="function") + return _PopupMenu_Invoke(PickupDialog_Invoke.arguments); + } + else + { + if(PickupDialog_Invoke.arguments.length>2) + { + var sPickup="whskin_pickup.htm"; + var sPickupPath=gsPPath+sPickup; + if(gbIE4) + { + var sFrame=PickupDialog_Invoke.arguments[1]; + var aTopics=new Array(); + for(var i=2;i1) + { + var nWidth=300; + var nHeight=180; + var nScreenWidth=screen.width; + var nScreenHeight=screen.height; + var nLeft=(nScreenWidth-nWidth)/2; + var nTop=(nScreenHeight-nHeight)/2; + if(gbIE4) + { + var vRet=window.showModalDialog(sPickupPath,aTopics,"dialogHeight:"+nHeight+"px;dialogWidth:"+nWidth+"px;resizable:yes;status:no;scroll:no;help:no;center:yes;"); + if(vRet) + { + var sURL=vRet.m_url; + if(sFrame) + window.open(sURL,sFrame); + else + window.open(sURL,"_self"); + } + } + } + else if(aTopics.length==1) + { + var sURL=aTopics[0].m_sURL + if(sFrame) + window.open(sURL,sFrame); + else + window.open(sURL,"_self"); + } + } + } + } +} + if(window.gbWhUtil&&window.gbWhMsg&&window.gbWhVer&&window.gbWhProxy) { - RegisterListener("bsscright", WH_MSG_GETAVIAVENUES); - RegisterListener("bsscright", WH_MSG_GETTOCPATHS); - RegisterListener("bsscright", WH_MSG_NEXT); - RegisterListener("bsscright", WH_MSG_PREV); - RegisterListener("bsscright", WH_MSG_WEBSEARCH); - if (gbMac && gbIE4) + RegisterListener("bsscright",WH_MSG_GETAVIAVENUES); + RegisterListener("bsscright",WH_MSG_GETTOCPATHS); + RegisterListener("bsscright",WH_MSG_NEXT); + RegisterListener("bsscright",WH_MSG_PREV); + RegisterListener("bsscright",WH_MSG_WEBSEARCH); + if(gbMac&&gbIE4) { - if (typeof(window.onunload) != "unknown") - whtopic_foldUnload = window.onunload; + if(typeof(window.onunload)!="unknown") + if(window.onunload.toString!=unRegisterListener.toString) + whtopic_foldUnload=window.onunload; } else { - if (window.onunload) - whtopic_foldUnload = window.onunload; + if(window.onunload) + if(window.onunload.toString!=unRegisterListener.toString) + whtopic_foldUnload=window.onunload; } - window.onunload = unRegisterListener; + window.onunload=unRegisterListener; setButtonFont("show","","10pt","","","",""); gbWhTopic=true; diff --git a/doc/salome/gui/KERNEL/whutils.js b/doc/salome/gui/KERNEL/whutils.js index 7fa6c28a8..85fae7e05 100755 --- a/doc/salome/gui/KERNEL/whutils.js +++ b/doc/salome/gui/KERNEL/whutils.js @@ -1,19 +1,26 @@ +// WebHelp 5.10.004 var gsFileName=""; +var gsDivName=""; var xmlDoc=null; var sdocPath=null; var gsInsertBeforeEndHTML=""; var sReplaceStringsSrc=new Array(); +var gsDivName="dataDiv"; +var gnLoadDivNum=0; sReplaceStringsSrc[0]="&"; sReplaceStringsSrc[1]=">"; sReplaceStringsSrc[2]="<"; sReplaceStringsSrc[3]="""; -sReplaceStringsSrc[4]=" "; +sReplaceStringsSrc[4]=String.fromCharCode(8364); +sReplaceStringsSrc[5]=" "; + var sReplaceStringsDst=new Array(); sReplaceStringsDst[0]="&"; sReplaceStringsDst[1]=">"; sReplaceStringsDst[2]="<"; sReplaceStringsDst[3]="\""; -sReplaceStringsDst[4]=" "; +sReplaceStringsDst[4]=String.fromCharCode(128); +sReplaceStringsDst[5]=" "; var goHighLighted=null; function _getRelativePath(strParentPath,strCurrentPath) @@ -45,7 +52,7 @@ function _getRelativePath(strParentPath,strCurrentPath) return strCurrentPath; } -function _getRelativeFileName(strParentPath, strCurrentPath) +function _getRelativeFileName(strParentPath,strCurrentPath) { strParentPath=_replaceSlash(strParentPath); strParentPath=_getPath(strParentPath); @@ -108,7 +115,7 @@ function _getFullPath(sPath,sRelPath) { sRelPath=sRelPath.substring(nPathPos+3); sFullPath=sFullPath.substring(0,sFullPath.length-1); - var nPos2 = sFullPath.lastIndexOf("/"); + var nPos2=sFullPath.lastIndexOf("/"); if(nPos2!=-1) sFullPath=sFullPath.substring(0,nPos2+1); else @@ -123,7 +130,7 @@ function _getFullPath(sPath,sRelPath) function _isAbsPath(strPath) { var strUpper=strPath.toUpperCase(); - return (strUpper.indexOf(":")!=-1); + return (strUpper.indexOf(":")!=-1||strUpper.indexOf("\\\\")==0); } function _replaceSlash(strURL) @@ -166,21 +173,29 @@ function insertItemIntoArray(oArray,i,obj) function loadData(sFileName) { - if(!getElement("dataDiv")) + var i=gnLoadDivNum; + var sName=gsDivName+gnLoadDivNum++; + loadData_2(sFileName,sName); +} + +function loadData_2(sFileName,sDivName) +{ + if(!getElement(sDivName)) { - if(!insertDataDiv()) + if(!insertDataDiv(sDivName)) { gsFileName=sFileName; + gsDivName=sDivName; return; } } var sHTML=""; if(gbMac) - sHTML+=""; + sHTML+=""; else - sHTML+=""; + sHTML+=""; - var oDivCon=getElement("dataDiv"); + var oDivCon=getElement(sDivName); if(oDivCon) { if(gbNav6) @@ -231,21 +246,21 @@ function checkState() if(state==4) { var err=xmlDoc.parseError; - if(err.errorCode!=0) - alert(err.reason); - else + if(err.errorCode==0) putDataXML(xmlDoc,sdocPath); + else + onLoadXMLError(); } } } -function insertDataDiv() +function insertDataDiv(sName) { var sHTML=""; if(gbMac) - sHTML+="
"; + sHTML+="
"; else - sHTML+="
"; + sHTML+="
"; if((gbIE5||gbNav6)&&document.body) document.body.insertAdjacentHTML("beforeEnd",sHTML); else @@ -264,7 +279,7 @@ function insertWhenBodyReady() { document.body.insertAdjacentHTML("beforeEnd",gsInsertBeforeEndHTML); gsInsertBeforeEndHTML=""; - loadData(gsFileName); + loadData_2(gsFileName,gsDivName); } else { @@ -274,9 +289,12 @@ function insertWhenBodyReady() function window_BUnload() { - var oDivCon=getElement("dataDiv"); - if(oDivCon) - oDivCon.innerHTML=""; + for(var i=0;i='0'&&sBStr.charAt(i)<='9') + { + sNum+=sBStr.charAt(i++); + } + if(sNum!=""){ + var nNum=parseInt(sNum,16); + sText+=String.fromCharCode(nNum); + sBStr=sBStr.substring(i); + } + nPos=sBStr.indexOf('%'); + } + sText+=sBStr; + return sText; +} + +function excapeSingleQuotandSlash(str) +{ + if(str==null) return null; + var nPos=0; + var sRes=""; + var nPosNew=str.indexOf("\\",nPos); + while(nPosNew!=-1){ + sRes+=str.substring(nPos,nPosNew+1)+"\\"; + nPos=nPosNew+1; + nPosNew=str.indexOf("\\",nPos); + } + if(nPos=4) +if(!gbOpera&&!gbKonqueror&&!gbSafari) // opera can mimic IE or Netscape by settings. { - if(navigator.appName=="Netscape") + gbIE=(navigator.appName.indexOf("Microsoft")!=-1); + gbNav=(gAgent.indexOf('mozilla')!=-1) && ((gAgent.indexOf('spoofer')==-1) && (gAgent.indexOf('compatible')==-1)); + if(gnVerMajor>=4) { - gbNav4=true; - if(gnVerMajor>=5) - gbNav6=true; + if(navigator.appName=="Netscape") + { + gbNav4=true; + if(gnVerMajor>=5) + gbNav6=true; + } + gbIE4=(navigator.appName.indexOf("Microsoft")!=-1); + } + if(gbNav6) + { + var nPos=gAgent.indexOf("gecko"); + if(nPos!=-1) + { + var nPos2=gAgent.indexOf("/", nPos); + if(nPos2!=-1) + { + var nVersion=parseFloat(gAgent.substring(nPos2+1)); + if(nVersion>=20010726) + { + gbNav61=true; + if (nVersion>=20020823) + gbNav7=true; + } + } + } + }else if(gbIE4) + { + var nPos=gAgent.indexOf("msie"); + if(nPos!=-1) + { + var nVersion=parseFloat(gAgent.substring(nPos+5)); + if(nVersion>=5) + { + gbIE5=true; + if(nVersion>=5.5) + gbIE55=true; + } + } } - gbIE4=(navigator.appName.indexOf("Microsoft")!=-1); } -if(gbNav6) +else if (gbOpera) { - document.gnPageWidth=innerWidth; - document.gnPageHeight=innerHeight; - var nPos=gAgent.indexOf("netscape"); + var nPos = gAgent.indexOf("opera"); if(nPos!=-1) { - var nVersion=parseFloat(gAgent.substring(nPos+10)); - if(nVersion>=6.1) - gbNav61=true; + var nVersion=parseFloat(gAgent.substring(nPos+6)); + if(nVersion>=6) + { + gbOpera6=true; + if(nVersion>=7) + gbOpera7=true; + } } -}else if(gbIE4) +} +else if (gbKonqueror) { - var nPos=gAgent.indexOf("msie"); + var nPos = gAgent.indexOf("konqueror"); if(nPos!=-1) { - var nVersion=parseFloat(gAgent.substring(nPos+5)); - if(nVersion>=5) - gbIE5=true; - if(nVersion>=5.5) - gbIE55=true; + var nVersion = parseFloat(gAgent.substring(nPos+10)); + if (nVersion >= 3) + { + gbKonqueror3=true; + } } } diff --git a/doc/salome/tui/KERNEL/doxyfile b/doc/salome/tui/KERNEL/doxyfile index 29f6496ce..64247b6b5 100755 --- a/doc/salome/tui/KERNEL/doxyfile +++ b/doc/salome/tui/KERNEL/doxyfile @@ -60,7 +60,6 @@ INPUT = ../../../share/salome/idl/SALOME_ModuleCatalog.idl \ ../../../share/salome/idl/SALOMEDS.idl \ ../../../share/salome/idl/SALOME_Exception.idl \ ../../../share/salome/idl/SALOMEDS_Attributes.idl \ - ../../../share/salome/idl/SALOME_Session.idl \ ../../../share/salome/idl/SALOME_Component.idl \ ../../../share/salome/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.hxx \ ../../../share/salome/src/NamingService/SALOME_NamingService.hxx \ diff --git a/idl/Makefile.in b/idl/Makefile.in index 40542236a..9ac8e2c24 100644 --- a/idl/Makefile.in +++ b/idl/Makefile.in @@ -18,7 +18,6 @@ IDL_FILES = \ SALOME_RessourcesCatalog.idl \ SALOMEDS.idl \ SALOMEDS_Attributes.idl \ - SALOME_Session.idl \ SALOME_Component.idl \ SALOME_ContainerManager.idl \ SALOME_TestComponent.idl \ diff --git a/idl/SALOMEDS.idl b/idl/SALOMEDS.idl index 15e651164..7c0844a31 100644 --- a/idl/SALOMEDS.idl +++ b/idl/SALOMEDS.idl @@ -36,6 +36,7 @@ #define _SALOMEDS_IDL_ #include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" /*! This package contains the interfaces used for creation, managment @@ -98,7 +99,6 @@ during each working session. interface AttributeStudyProperties; interface UseCaseIterator; interface UseCaseBuilder; - interface Callback; /*! List of attributes of %SObjects */ @@ -367,6 +367,17 @@ during each working session. void RemovePostponed(in long theUndoLimit); void UndoPostponed(in long theWay); + + boolean DumpStudy(in string thePath, in string theBaseName, in boolean isPublished); + +/*! + Private method, returns an implementation of this Study. + \param theHostname is a hostname of the caller + \param thePID is a process ID of the caller + \param isLocal is set True if the Study is launched locally with the caller +*/ + long GetLocalImpl(in string theHostname, in long thePID, out boolean isLocal); + }; //========================================================================== @@ -403,6 +414,7 @@ during each working session. Defines the instance to the %SComponent. */ void DefineComponentInstance (in SComponent aComponent,in Object ComponentIOR) raises(LockProtection); + /*! \brief Deletion of a %SComponent Removes a %SComponent. @@ -605,22 +617,6 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin */ boolean GetAvailableRedos(); -/*! - This method is called when adding an object into study. - It sets the callback for addition of the given %SObject. - \param theCallback New assigned callback. - \return The previous callback. -*/ - Callback SetOnAddSObject(in Callback theCallback); -/*! - This method is called when adding an object into study. - It sets the callback for removal of the given %SObject. - - \return The previous callback. - \param theCallback New assigned callback. -*/ - Callback SetOnRemoveSObject(in Callback theCallback); - /*! Puts name attribute with the given string value to the given %SObject @@ -778,6 +774,29 @@ Gets the list of open studies an object into a study, which is protected for modifications. */ SObject Paste(in SObject theObject) raises (SALOMEDS::StudyBuilder::LockProtection); + +/*! \brief Object conversion. + + Converts an object into IOR. + \return IOR +*/ + string ConvertObjectToIOR(in Object theObject); +/*! \brief Object conversion. + + Converts IOR into an object. + \return An object +*/ + Object ConvertIORToObject(in string theIOR); + +/*! + Private method, returns an implementation of this StudyManager. + \param theHostname is a hostname of the caller + \param thePID is a process ID of the caller + \param isLocal is set True if the StudyManager is launched locally with the caller +*/ + long GetLocalImpl(in string theHostname, in long thePID, out boolean isLocal); + + }; @@ -795,7 +814,7 @@ Gets the list of open studies */ //========================================================================== - interface SObject + interface SObject : SALOME::GenericObj { /*! Name of the %SObject */ @@ -885,6 +904,14 @@ Gets the list of open studies Returns empty string if there is no IOR attribute. */ string GetIOR(); + +/*! + Private method, returns an implementation of this SObject. + \param theHostname is a hostname of the caller + \param thePID is a process ID of the caller + \param isLocal is set True if the SObject is launched locally with the caller +*/ + long GetLocalImpl(in string theHostname, in long thePID, out boolean isLocal); }; @@ -894,7 +921,7 @@ Gets the list of open studies %Generic attribute is a base interface for all attributes which can be assigned to the SObjects created in the study. */ //========================================================================== - interface GenericAttribute + interface GenericAttribute : SALOME::GenericObj { /*! \brief Exception locking all changes @@ -909,13 +936,19 @@ Gets the list of open studies */ void CheckLocked() raises (LockProtection); - string Store(); - - void Restore(in string theData); - string Type(); + string GetClassType(); + SObject GetSObject(); + +/*! + Private method, returns an implementation of this GenericAttribute. + \param theHostname is a hostname of the caller + \param thePID is a process ID of the caller + \param isLocal is set True if the GenericAttribute is launched locally with the caller +*/ + long GetLocalImpl(in string theHostname, in long thePID, out boolean isLocal); }; @@ -951,7 +984,7 @@ Gets the list of open studies The search is started from the first %SComponent in the list. */ //========================================================================== - interface SComponentIterator + interface SComponentIterator : SALOME::GenericObj { /*! Activates the %SComponentIterator. @@ -982,7 +1015,7 @@ Moves the iterator to the next %SComponent in the list. levels. */ //========================================================================== - interface ChildIterator + interface ChildIterator : SALOME::GenericObj { /*! @@ -1017,7 +1050,7 @@ Activates the %ChildIterator for all child levels. This interface contains a set of methods used for iteration over the objects in the use case. */ - interface UseCaseIterator + interface UseCaseIterator : SALOME::GenericObj { /*! Activates the %UseCaseIterator. @@ -1046,7 +1079,7 @@ Activates the %UseCaseIterator. Use case in the study represents a user-managed subtree, containing all or some of the objects which exist in the study. The %UseCaseBuilder interface contains a set of methods used for management of the use case in the study. */ - interface UseCaseBuilder + interface UseCaseBuilder : SALOME::GenericObj { /*! Adds to the use case an object as a child of the current object of the use case. @@ -1108,25 +1141,6 @@ Activates the %UseCaseIterator. UseCaseIterator GetUseCaseIterator(in SObject theObject); }; //========================================================================== - //========================================================================== -/*! \brief The callback interface - - The %StudyBuilder can be created with the method NewBuilder. While invocation of this method a new object of the class Callback is created - and this object is assigned to the newly created Builder as callback which should be called when adding and removing of the ojects. -*/ - interface Callback - { -/*! - Invokes the corresponding method Append of the %UseCaseBuilder. -*/ - void OnAddSObject(in SObject theObject); -/*! - Invokes the corresponding method Remove of the %UseCaseBuilder. -*/ - void OnRemoveSObject(in SObject theObject); - }; - - //========================================================================== /*! \brief %Driver interface This class represents a common tool for all components integrated into SALOME application, that allows them to communicate with the study. It contains a set of methods which diff --git a/idl/SALOME_Comm.idl b/idl/SALOME_Comm.idl index a01eca1a6..e1736c616 100644 --- a/idl/SALOME_Comm.idl +++ b/idl/SALOME_Comm.idl @@ -1,3 +1,6 @@ +#ifndef _SALOME_COMM_IDL_ +#define _SALOME_COMM_IDL_ + #include "SALOME_Exception.idl" module SALOME { @@ -20,33 +23,40 @@ module SALOME { interface Sender { TypeOfDataTransmitted getTypeOfDataTransmitted(); - Sender buildOtherWithProtocol(in TypeOfCommunication type); void release(); }; + interface SenderDouble : Sender { + SenderDouble buildOtherWithProtocol(in TypeOfCommunication type); + }; + + interface SenderInt : Sender { + SenderInt buildOtherWithProtocol(in TypeOfCommunication type); + }; + //No compulsory copy between double and CORBA::Double - interface CorbaDoubleNCSender : Sender { + interface CorbaDoubleNCSender : SenderDouble { unsigned long getSize(); vectorOfDouble sendPart(in unsigned long n1,in unsigned long n2); vectorOfDouble send(); }; //Compulsory copy between double and CORBA::Double - interface CorbaDoubleCSender : Sender { + interface CorbaDoubleCSender : SenderDouble { unsigned long getSize(); //unsigned long getSize2(); vectorOfDouble sendPart(in unsigned long n1,in unsigned long n2); }; //No compulsory copy between int and CORBA::Long - interface CorbaLongNCSender : Sender { + interface CorbaLongNCSender : SenderInt { unsigned long getSize(); vectorOfLong sendPart(in unsigned long n1,in unsigned long n2); vectorOfLong send(); }; //Compulsory copy between int and CORBA::Long - interface CorbaLongCSender : Sender { + interface CorbaLongCSender : SenderInt { unsigned long getSize(); vectorOfLong sendPart(in unsigned long n1,in unsigned long n2); }; @@ -63,6 +73,12 @@ module SALOME { void close(in param p); }; + interface MPISenderDouble : SenderDouble,MPISender { + }; + + interface MPISenderInt : SenderInt,MPISender { + }; + interface SocketSender : Sender { typedef struct Parameter { unsigned long lstart; @@ -78,4 +94,11 @@ module SALOME { void send(); }; + interface SocketSenderDouble : SenderDouble,SocketSender { + }; + + interface SocketSenderInt : SenderInt,SocketSender { + }; }; + +#endif diff --git a/idl/SALOME_Component.idl b/idl/SALOME_Component.idl index f60922c42..bb0990030 100644 --- a/idl/SALOME_Component.idl +++ b/idl/SALOME_Component.idl @@ -21,20 +21,26 @@ // // File : SALOME_Component.idl // Author : Paul RASCLE, EDF -// $Header: /dn05/salome/CVS/SALOME_ROOT/idl/SALOME_Component.idl +// $Header: #ifndef _SALOME_COMPONENT_IDL_ #define _SALOME_COMPONENT_IDL_ /*! - -This is a package of interfaces used for connecting new components to %SALOME application. It also contains a set of interfaces used -for management of %MED component in %SALOME application. +This is a package of interfaces used for connecting new components to %SALOME +application. It also contains a set of interfaces used for management of %MED +component in %SALOME application. */ module Engines { -/*! + /*! + A byte stream which is used for binary data transfer between different + components + */ + typedef sequence TMPFile; + + /*! General Key Value Structure to set or get properties, for component -*/ + */ struct KeyValuePair { string key; @@ -45,135 +51,234 @@ module Engines interface Component ; -/*! \brief Interface of the %Container + /*! \brief Interface of the %Container + This interface defines the process of loading and registration + of new components in %SALOME application + */ - This interface defines the process of loading and registration - of new components in %SALOME application -*/ interface Container { -/*! - Loads into the container a new component, registers it and starts it's CORBA servant. - \param nameToRegister Name of the component which will be registered in Registry (or Name Service) - \param componentName Name of the constructed library of the %component - \return a loaded component -*/ - Component load_impl(in string nameToRegister, in string componentName); + /*! + Loads a new component class (dynamic library). + \param componentName like COMPONENT, (Python or C++ implementation) + try to make a Python import of COMPONENT, + then a lib open of libCOMPONENTEngine.so + \return true if load successfull or already done, false otherwise + */ + boolean load_component_Library(in string componentName); -/*! - Loads into the container a new component, registers it and starts it's CORBA servant. - \param nameToRegister Name used to register in Naming Service, the component instance - \param componentName Name of the %component - \return a new instance of the component or the registered component if already registered or Nil if not possible -*/ - Component instance(in string nameToRegister, in string componentName); + /*! + Creates a new servant instance of a component. + Component library must be loaded. + \param componentName Name of the component which will be registered + in Registry and Name Service, + (instance number suffix added to the registered name) + \param studyId 0 if instance is not associated to a study, + >0 otherwise (== study id) + \return a loaded component + */ + Component create_component_instance(in string componentName, + in long studyId); -/*! - Stops the component servant, and deletes all related objects - \param component_i Component to be removed -*/ + /*! + Finds a servant instance of a component + \param registeredName Name of the component in Registry or Name Service, + without instance suffix number + \param studyId 0 if instance is not associated to a study, + >0 otherwise (== study id) + \return the first instance found with same studyId + */ + Component find_component_instance(in string registeredName, + in long studyId); + + /*! + Find a servant instance of a component, or create a new one. + Loads the component library if needed. + Only applicable to multiStudy components. + \param nameToRegister Name of the component which will be registered + in Registry (or Name Service) + \param componentName Name of the constructed library of the %component + (not used any more, give empty string) + \return a loaded component + */ + Component load_impl(in string nameToRegister, + in string componentName); + + /*! + Stops the component servant, and deletes all related objects + \param component_i Component to be removed + */ void remove_impl(in Component component_i); -/*! - Discharges all components from the container. -*/ + /*! + Discharges all components from the container. + */ void finalize_removal() ; -/*! - Determines whether the server has been loaded or not. -*/ + /*! + Determines whether the server has been loaded or not. + */ void ping(); -/*! - Name of the %container -*/ + + /*! + Name of the %container + */ readonly attribute string name ; -/*! - Name of the machine containing this container (location of the container). -*/ - readonly attribute string machineName ; -/*! - Returns True if the %container has been killed -*/ - boolean Kill_impl() ; -/*! - Shutdown the Container process. -*/ + + /*! + Shutdown the Container process. + */ oneway void Shutdown(); -/*! - Returns the hostname of the container -*/ + + /*! + Returns the hostname of the container + */ string getHostName(); -/*! - Returns the PID of the container -*/ + + /*! + Returns the PID of the container + */ long getPID(); + + /*! + Returns True if the %container has been killed. + Kept for Superv compilation but can't work, unless oneway... + TO REMOVE ! + */ + boolean Kill_impl() ; + + // -------------------------- removed ------------------------------- + + /*! + Loads into the container a new component, registers it and starts it's + CORBA servant. + \param nameToRegister Name used to register in Naming Service, + the component instance + \param componentName Name of the %component + \return a new instance of the component or the registered component + if already registered or Nil if not possible + */ + // Component instance(in string nameToRegister, in string componentName); + + + /*! + Name of the machine containing this container (location of the container). + */ + // readonly attribute string machineName ; + + }; -/*! \brief Interface of the %component - This interface is used for interaction between the %container and the %component and between - the components inside the container. -*/ + + + /*! \brief Interface of the %component + This interface is used for interaction between the %container and the + %component and between the components inside the container. + */ interface Component { -/*! - The name of the instance of the %Component -*/ + /*! + The name of the instance of the %Component + */ readonly attribute string instanceName ; -/*! - The name of the interface of the %Component -*/ + + /*! + The name of the interface of the %Component + */ readonly attribute string interfaceName ; -/*! - Determines whether the server has already been loaded or not. -*/ + + /*! + Determines whether the server has already been loaded or not. + */ void ping(); -/*! - Deactivates the %Component. -*/ + +// /*! +// Set study associated to component instance +// \param studyId +// (=0: multistudy component instance, +// >0: study id associated to this instance +// \return false if already set with a different value (change not possible) +// */ +// boolean setStudyId(in long studyId); + + /*! + get study associated to component instance + \return -1: not initialised (Internal Error) + 0: multistudy component instance + >0: study id associated to this instance + */ + long getStudyId(); + + /*! + Deactivates the %Component. + -- TO BE USED BY CONTAINER ONLY (Container housekeeping) -- + use remove_impl from Container instead ! + */ void destroy() ; -/*! - Returns the container that the %Component refers to. -*/ + + /*! + Returns the container that the %Component refers to. + */ Container GetContainerRef() ; -/*! - Gives a sequence of (key=string,value=any) to the component. - Base class component stores the sequence in a map. - The map is cleared before. - This map is for use by derived classes. -*/ + + /*! + Gives a sequence of (key=string,value=any) to the component. + Base class component stores the sequence in a map. + The map is cleared before. + This map is for use by derived classes. + */ void setProperties(in FieldsDict dico); -/*! - returns a previously stored map (key=string,value=any) as a sequence. - See setProperties(in FieldsDict dico). -*/ + + /*! + returns a previously stored map (key=string,value=any) as a sequence. + See setProperties(in FieldsDict dico). + */ FieldsDict getProperties(); -/*! - This method is used by the %SUPERVISOR component. It sets the names of the graph and of the node. - \param aGraphName Name of graph - \param aNodeName Name of node -*/ + + /*! + This method is used by the %SUPERVISOR component. It sets the names of + the graph and of the node. + \param aGraphName Name of graph + \param aNodeName Name of node + */ void Names( in string aGraphName , in string aNodeName ) ; -/*! - Returns True if the %Component has been killed. -*/ + + /*! + Returns True if the %Component has been killed. + */ boolean Kill_impl() ; -/*! - Returns True if the activity of the %Component has been stopped. (It's action can't be resumed) -*/ + + /*! + Returns True if the activity of the %Component has been stopped. + (It's action can't be resumed) + */ boolean Stop_impl() ; -/*! - Returns True if the activity of the %Component has been suspended. (It's action can be resumed) -*/ + + /*! + Returns True if the activity of the %Component has been suspended. + (It's action can be resumed) + */ boolean Suspend_impl() ; -/*! - Returns True if the activity of the %Component has been resumed. -*/ + + /*! + Returns True if the activity of the %Component has been resumed. + */ boolean Resume_impl() ; -/*! - Returns the Cpu used (long does not run with python !...) -*/ + + /*! + Returns the Cpu used (long does not run with python !...) + */ long CpuUsed_impl() ; + + /*! + Returns a python script, which is being played back reproduces + the data model of component + */ + TMPFile DumpPython(in Object theStudy, + in boolean isPublished, + out boolean isValidScript); + } ; } ; diff --git a/idl/SALOME_ContainerManager.idl b/idl/SALOME_ContainerManager.idl index d8a57247e..7d4e96c24 100644 --- a/idl/SALOME_ContainerManager.idl +++ b/idl/SALOME_ContainerManager.idl @@ -1,6 +1,7 @@ #ifndef _SALOME_CONTAINERMANAGER_IDL_ #define _SALOME_CONTAINERMANAGER_IDL_ +#include "SALOME_Exception.idl" #include "SALOME_Component.idl" module Engines @@ -9,7 +10,8 @@ module Engines /*! Type to describe properties of wanted resource. */ -struct MachineParameters { +struct MachineParameters +{ string container_name; string hostname; string OS; @@ -17,6 +19,7 @@ struct MachineParameters { long cpu_clock; long nb_proc_per_node; long nb_node; + boolean isMPI; }; /*! @@ -24,15 +27,29 @@ struct MachineParameters { */ typedef sequence MachineList; +/*! + exception thrown if a computer is not found in the catalog +*/ + exception NotFound {}; + + /*! \brief Interface of the %containerManager - This interface is used for interaction with the unique instance of ContainerManager + This interface is used for interaction with the unique instance + of ContainerManager */ interface ContainerManager { - Container FindOrStartContainer( in string containerName, in MachineList possibleComputers); + Container FindOrStartContainer( in MachineParameters params, + in MachineList possibleComputers); + string FindBest(in MachineList possibleComputers); - MachineList GetFittingResources( in MachineParameters params, in string componentName ); + + MachineList GetFittingResources( in MachineParameters params, + in string componentName ) + raises (SALOME::SALOME_Exception); + void Shutdown(); + void ShutdownContainers(); } ; }; diff --git a/idl/SALOME_MPIContainer.idl b/idl/SALOME_MPIContainer.idl index c23e1c061..13e135f6b 100644 --- a/idl/SALOME_MPIContainer.idl +++ b/idl/SALOME_MPIContainer.idl @@ -31,16 +31,12 @@ module Engines { interface MPIContainer:Container,MPIObject { - // start MPI container executable - MPIContainer start_MPIimpl( in string ContainerName, in short nbproc ); - - // shutdown corba server - void MPIShutdown() ; - // asynchronous version to load and remove parallel component in parallel - oneway void SPload_impl(in string nameToRegister, in string componentName); - oneway void SPremove_impl(in Component component_i); - oneway void SPfinalize_removal(); + oneway void Asload_component_Library(in string componentName); + oneway void Ascreate_component_instance(in string componentName,in long studyId); + oneway void Asload_impl(in string nameToRegister, in string componentName); + oneway void Asremove_impl(in Component component_i); + oneway void Asfinalize_removal(); }; } ; diff --git a/resources/CatalogResources.xml b/resources/CatalogResources.xml index 99939a378..f83a16243 100644 --- a/resources/CatalogResources.xml +++ b/resources/CatalogResources.xml @@ -1,8 +1,48 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/KERNELCatalog.xml b/resources/KERNELCatalog.xml index 4bad252ff..298eadd2d 100644 --- a/resources/KERNELCatalog.xml +++ b/resources/KERNELCatalog.xml @@ -16,7 +16,7 @@ Salome Other NRI - 2.2.0 + 3.1.0a GUI Neutral Context 1 @@ -27,7 +27,7 @@ SalomeTestComponent Other NRI - 2.1.0 + 3.1.0a GUI Neutral Context 1 'linux' ~ OS @@ -37,7 +37,7 @@ SALOME_TestComponentPy Other NRI - 2.1.0 + 3.1.0a GUI Neutral Context 1 'linux' ~ OS diff --git a/resources/Plugin.in b/resources/Plugin.in new file mode 100755 index 000000000..3d4fad5e5 --- /dev/null +++ b/resources/Plugin.in @@ -0,0 +1,10 @@ +! Description of available plugins +! ******************************** +! +a148e300-5740-11d1-a904-080036aaa103.Location: FWOSPlugin +! +! standard attribute drivers plugin +! +ad696000-5b34-11d1-b5ba-00a0c9064368.Location: @CAS_STDPLUGIN@ +ad696001-5b34-11d1-b5ba-00a0c9064368.Location: @CAS_STDPLUGIN@ +ad696002-5b34-11d1-b5ba-00a0c9064368.Location: @CAS_STDPLUGIN@ diff --git a/salome_adm/Makefile.in b/salome_adm/Makefile.in index 2982ad06c..4dfafb94b 100644 --- a/salome_adm/Makefile.in +++ b/salome_adm/Makefile.in @@ -41,5 +41,7 @@ uninstall-idl: distclean: +clean: + distclean-other: diff --git a/salome_adm/unix/SALOMEconfig.h.in b/salome_adm/unix/SALOMEconfig.h.in index e79eb7ae8..c1be35bd0 100644 --- a/salome_adm/unix/SALOMEconfig.h.in +++ b/salome_adm/unix/SALOMEconfig.h.in @@ -19,9 +19,17 @@ See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org ------------------------------------------------------------------------------------*/ +#ifndef SALOME_CONFIG_H +#define SALOME_CONFIG_H + #define DEBUG #define QUOTE(x) #x #define CORBA_CLIENT_HEADER(x) QUOTE(x@IDL_CLN_H@) #define CORBA_SERVER_HEADER(x) QUOTE(x@IDL_SRV_H@) +#ifndef @MACHINE@ + #define @MACHINE@ +#endif + +#endif diff --git a/salome_adm/unix/config_files/ac_cxx_bool.m4 b/salome_adm/unix/config_files/ac_cxx_bool.m4 index d28ee01dc..69da63dec 100644 --- a/salome_adm/unix/config_files/ac_cxx_bool.m4 +++ b/salome_adm/unix/config_files/ac_cxx_bool.m4 @@ -29,7 +29,7 @@ dnl dnl @version $Id$ dnl @author Luc Maisonobe dnl -AC_DEFUN(AC_CXX_BOOL, +AC_DEFUN([AC_CXX_BOOL], [AC_CACHE_CHECK(whether the compiler recognizes bool as a built-in type, ac_cv_cxx_bool, [AC_LANG_SAVE diff --git a/salome_adm/unix/config_files/ac_cxx_depend_flag.m4 b/salome_adm/unix/config_files/ac_cxx_depend_flag.m4 index 9e3d4ecc9..9dc8b0fd3 100644 --- a/salome_adm/unix/config_files/ac_cxx_depend_flag.m4 +++ b/salome_adm/unix/config_files/ac_cxx_depend_flag.m4 @@ -27,7 +27,7 @@ dnl dnl @version $Id$ dnl @author Marc Tajchman dnl -AC_DEFUN(AC_DEPEND_FLAG, +AC_DEFUN([AC_DEPEND_FLAG], [AC_CACHE_CHECK(which flag for dependency information generation, ac_cv_depend_flag, [AC_LANG_SAVE @@ -44,12 +44,14 @@ dnl on utilise donc gnu pour generer les dependances. DEPCXX=g++ DEPCXXFLAGS="-Wno-deprecated" DIFFFLAGS="-w" + MACHINE="OSF1" ;; *) DEPCC=${CC-cc} DEPCXX=${CXX-c++} DEPCXXFLAGS="\${CXXFLAGS}" DIFFFLAGS="-b -B" + MACHINE="PCLINUX" ;; esac C_DEPEND_FLAG= @@ -137,5 +139,6 @@ dnl use g++ option -MG : asume unknown file will be construct later AC_SUBST(DEPCXXFLAGS) AC_SUBST(C_DEPEND_FLAG) AC_SUBST(CXX_DEPEND_FLAG) + AC_SUBST(MACHINE) ]) ]) diff --git a/salome_adm/unix/config_files/ac_cxx_mutable.m4 b/salome_adm/unix/config_files/ac_cxx_mutable.m4 index 86f5fa730..3d87bacb8 100644 --- a/salome_adm/unix/config_files/ac_cxx_mutable.m4 +++ b/salome_adm/unix/config_files/ac_cxx_mutable.m4 @@ -28,7 +28,7 @@ dnl dnl @version $Id$ dnl @author Luc Maisonobe dnl -AC_DEFUN(AC_CXX_MUTABLE, +AC_DEFUN([AC_CXX_MUTABLE], [AC_CACHE_CHECK(whether the compiler supports the mutable keyword, ac_cv_cxx_mutable, [AC_LANG_SAVE diff --git a/salome_adm/unix/config_files/ac_cxx_namespaces.m4 b/salome_adm/unix/config_files/ac_cxx_namespaces.m4 index 53e9317d6..76b815ace 100644 --- a/salome_adm/unix/config_files/ac_cxx_namespaces.m4 +++ b/salome_adm/unix/config_files/ac_cxx_namespaces.m4 @@ -27,7 +27,7 @@ dnl dnl @version $Id$ dnl @author Luc Maisonobe dnl -AC_DEFUN(AC_CXX_NAMESPACES, +AC_DEFUN([AC_CXX_NAMESPACES], [AC_CACHE_CHECK(whether the compiler implements namespaces, ac_cv_cxx_namespaces, [AC_LANG_SAVE diff --git a/salome_adm/unix/config_files/ac_cxx_partial_specialization.m4 b/salome_adm/unix/config_files/ac_cxx_partial_specialization.m4 index 93589ff80..634d3c640 100644 --- a/salome_adm/unix/config_files/ac_cxx_partial_specialization.m4 +++ b/salome_adm/unix/config_files/ac_cxx_partial_specialization.m4 @@ -28,7 +28,7 @@ dnl @version $Id$ dnl @author Luc Maisonobe dnl -AC_DEFUN(AC_CXX_PARTIAL_SPECIALIZATION, +AC_DEFUN([AC_CXX_PARTIAL_SPECIALIZATION], [AC_CACHE_CHECK(whether the compiler supports partial specialization, ac_cv_cxx_partial_specialization, [AC_LANG_SAVE diff --git a/salome_adm/unix/config_files/ac_cxx_typename.m4 b/salome_adm/unix/config_files/ac_cxx_typename.m4 index 7ec2ad39e..bb1424673 100644 --- a/salome_adm/unix/config_files/ac_cxx_typename.m4 +++ b/salome_adm/unix/config_files/ac_cxx_typename.m4 @@ -26,7 +26,7 @@ dnl dnl @version $Id$ dnl @author Luc Maisonobe dnl -AC_DEFUN(AC_CXX_TYPENAME, +AC_DEFUN([AC_CXX_TYPENAME], [AC_CACHE_CHECK(whether the compiler recognizes typename, ac_cv_cxx_typename, [AC_LANG_SAVE diff --git a/salome_adm/unix/config_files/check_boost.m4 b/salome_adm/unix/config_files/check_boost.m4 index 789167b4c..215ce8cf5 100644 --- a/salome_adm/unix/config_files/check_boost.m4 +++ b/salome_adm/unix/config_files/check_boost.m4 @@ -31,7 +31,10 @@ BOOST_CPPFLAGS="" boost_ok=no if test -z ${BOOSTDIR}; then - AC_MSG_WARN(You must provide BOOSTDIR variable) + AC_CHECK_HEADER(boost/shared_ptr.hpp,boost_ok=yes,boost_ok=no) + if test boost_ok = no ; then + AC_MSG_WARN(You must provide BOOSTDIR variable) + fi else AC_MSG_RESULT(\$BOOSTDIR = ${BOOSTDIR}) AC_CHECKING(for boost/shared_ptr.hpp header file) diff --git a/salome_adm/unix/config_files/check_cas.m4 b/salome_adm/unix/config_files/check_cas.m4 index 3b3f654f9..99fd4be6b 100644 --- a/salome_adm/unix/config_files/check_cas.m4 +++ b/salome_adm/unix/config_files/check_cas.m4 @@ -37,6 +37,7 @@ AC_SUBST(CAS_OCAF) AC_SUBST(CAS_DATAEXCHANGE) AC_SUBST(CAS_LDFLAGS) AC_SUBST(CAS_LDPATH) +AC_SUBST(CAS_STDPLUGIN) OWN_CONFIG_H=no @@ -72,6 +73,19 @@ case $host_os in esac AC_MSG_CHECKING(for OpenCascade directories) + +if test -z $CASROOT; then + AC_MSG_RESULT(CASROOT not defined) + for d in `echo $LD_LIBRARY_PATH | sed -e "s/:/ /g"` ; do + if test -f $d/libTKernel.so ; then + AC_MSG_RESULT(libTKernel.so detected in $d) + CASROOT=$d + CASROOT=`echo ${CASROOT} | sed -e "s,[[^/]]*$,,;s,/$,,;s,^$,.,"` + break + fi + done +fi + if test -d ${CASROOT}/${casdir}/lib; then CAS_LDPATH="-L$CASROOT/$casdir/lib " AC_MSG_RESULT(yes) @@ -91,12 +105,17 @@ if test -z $CASROOT; then else occ_ok=yes OCC_VERSION_MAJOR=0 + OCC_VERSION_MINOR=0 ff=$CASROOT/inc/Standard_Version.hxx if test -f $ff ; then grep "define OCC_VERSION_MAJOR" $ff > /dev/null if test $? = 0 ; then OCC_VERSION_MAJOR=`grep "define OCC_VERSION_MAJOR" $ff | awk '{i=3 ; print $i}'` fi + grep "define OCC_VERSION_MINOR" $ff > /dev/null + if test $? = 0 ; then + OCC_VERSION_MINOR=`grep "define OCC_VERSION_MINOR" $ff | awk '{i=3 ; print $i}'` + fi fi fi @@ -113,9 +132,25 @@ dnl test c++ compiler flag for unsigned character dnl cascade headers CPPFLAGS_old="$CPPFLAGS" - CAS_CPPFLAGS="-DOCC_VERSION_MAJOR=$OCC_VERSION_MAJOR -DLIN -DLINTEL -DCSFDB -DNO_CXX_EXCEPTION -DNo_exception -DHAVE_CONFIG_H -DHAVE_LIMITS_H -DHAVE_WOK_CONFIG_H -I$CASROOT/inc" +case $host_os in + linux*) + CAS_CPPFLAGS="-DOCC_VERSION_MAJOR=$OCC_VERSION_MAJOR -DLIN -DLINTEL -DCSFDB -DNO_CXX_EXCEPTION -DNo_exception -DHAVE_CONFIG_H -DHAVE_LIMITS_H -DHAVE_WOK_CONFIG_H -I$CASROOT/inc" + ;; + osf*) + CAS_CPPFLAGS="-DOCC_VERSION_MAJOR=$OCC_VERSION_MAJOR -DLIN -DLINTEL -DCSFDB -DNo_exception -DHAVE_CONFIG_H -DHAVE_LIMITS_H -DHAVE_WOK_CONFIG_H -I$CASROOT/inc" + ;; +esac CPPFLAGS="$CPPFLAGS $CAS_CPPFLAGS" + if test -n $KERNEL_ROOT_DIR; then + if test -d $KERNEL_ROOT_DIR/include/salome; then + CAS_CPPFLAGS="$CAS_CPPFLAGS -I$KERNEL_ROOT_DIR/include/salome" + CPPFLAGS="$CPPFLAGS -I$KERNEL_ROOT_DIR/include/salome" + fi + fi + CAS_CPPFLAGS="$CAS_CPPFLAGS -I${ROOT_BUILDDIR}/include/salome" + CPPFLAGS="$CPPFLAGS -I${ROOT_BUILDDIR}/salome_adm/unix" + echo echo echo testing config.h @@ -179,14 +214,23 @@ else CAS_KERNEL="$CAS_LDPATH -lTKernel -lTKMath" # E.A. compatibility version 4 and 5.x - CAS_OCAF="$CAS_LDPATH -lPTKernel -lTKCAF -lFWOSPlugin -lTKPShape -lTKPCAF -lTKStdSchema -lTKShapeSchema -lPAppStdPlugin" + CAS_OCAF="$CAS_LDPATH -lPTKernel -lTKPShape -lTKCDF -lTKCAF -lTKShapeSchema -lTKPCAF -lFWOSPlugin -lTKStdSchema" if test $OCC_VERSION_MAJOR -lt 5 ; then CAS_OCAF="$CAS_OCAF -lTKPAppStd" fi - CAS_OCAF="$CAS_OCAF -lTKCDF" + if test -f $CASROOT/$casdir/lib/libPAppStdPlugin.so ; then + # this library is absent in CASCADE 5.2.3 + CAS_OCAF="$CAS_OCAF -lPAppStdPlugin" + CAS_STDPLUGIN="PAppStdPlugin" + fi + if test -f $CASROOT/$casdir/lib/libStdPlugin.so ; then + # this libraries are only for CASCADE 5.2.3 + CAS_STDPLUGIN="StdPlugin" + CAS_OCAF="$CAS_OCAF -lStdPlugin -lStdLPlugin -lTKLCAF -lTKPLCAF -lTKStdLSchema" + fi CAS_VIEWER="$CAS_LDPATH -lTKOpenGl -lTKV3d -lTKService" - CAS_MODELER="$CAS_LDPATH -lTKG2d -lTKG3d -lTKGeomBase -lTKBRep -lTKGeomAlgo -lTKTopAlgo -lTKPrim -lTKBool -lTKHLR -lTKFillet -lTKOffset" + CAS_MODELER="$CAS_LDPATH -lTKG2d -lTKG3d -lTKGeomBase -lTKBRep -lTKGeomAlgo -lTKTopAlgo -lTKPrim -lTKBO -lTKBool -lTKHLR -lTKFillet -lTKOffset -lTKFeat" # E.A. compatibility version 4 and 5.x CAS_DATAEXCHANGE="$CAS_LDPATH -lTKXSBase -lTKIGES -lTKSTEP -lTKShHealing" diff --git a/salome_adm/unix/config_files/check_cppunit.m4 b/salome_adm/unix/config_files/check_cppunit.m4 new file mode 100644 index 000000000..10c91812d --- /dev/null +++ b/salome_adm/unix/config_files/check_cppunit.m4 @@ -0,0 +1,108 @@ + +AC_DEFUN([CHECK_CPPUNIT],[ + +AC_CHECKING(for cppunit) + +cppunit_ok=yes + +dnl were is cppunit ? + +AC_ARG_WITH(cppunit, + [ --with-cppunit=DIR directory path to CPPUNIT installation ], + [CPPUNITHOME="$withval" + AC_MSG_RESULT("select $withval as path to CPPUNIT") + ]) + +AC_ARG_WITH(cppunit_inc, + [ --with-cppunit_inc=DIR directory path to CPPUNIT includes ], + [CPPUNIT_INCLUDES="$withval" + AC_MSG_RESULT("select $withval as path to CPPUNIT includes") + ]) + +if test -z $CPPUNITHOME; then + AC_MSG_RESULT(CPPUNITHOME not defined) + exits_ok=no + if test "x$exits_ok" = "xno"; then + for d in /usr/local /usr ; do + AC_CHECK_FILE(${d}/lib/libcppunit.so,exits_ok=yes,exits_ok=no) + if test "x$exits_ok" = "xyes"; then + CPPUNITHOME=$d + AC_MSG_RESULT(libcppunit.so detected in $d/lib) + fi + done + fi + if test "x$exits_ok" = "xno"; then + for d in `echo $LD_LIBRARY_PATH | sed -e "s/:/ /g"` ; do + if test -f $d/libcppunit.so ; then + AC_MSG_RESULT(libcppunit.so detected in $d) + CPPUNITHOME=$d + CPPUNITHOME=`echo ${CPPUNITHOME} | sed -e "s,[[^/]]*$,,;s,/$,,;s,^$,.,"` + exits_ok=yes + break + fi + done + fi + if test "x$exits_ok" = "xyes"; then + if test -z $CPPUNIT_INCLUDES; then + CPPUNIT_INCLUDES=$CPPUNITHOME"/include" + fi + fi +else + if test -z $CPPUNIT_INCLUDES; then + CPPUNIT_INCLUDES="$CPPUNITHOME/include" + fi +fi + +if test "x$cppunit_ok" = xno -o ! -d "$CPPUNITHOME" ; then + AC_MSG_RESULT(no) + AC_MSG_WARN(cppunit not found) + cppunit_ok=no +else + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + CPPFLAGS_old=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -I$CPPUNIT_INCLUDES" + CPPFLAGS="$CPPFLAGS $QT_INCLUDES" + + AC_CHECK_HEADER(cppunit/extensions/HelperMacros.h,cppunit_ok=yes,cppunit_ok=no) + + CPPFLAGS=$CPPFLAGS_old + + if test "x$cppunit_ok" = xno ; then + AC_MSG_RESULT(no) + AC_MSG_WARN(cppunit not found) + else + cppunit_ok=yes + fi + + if test "x$cppunit_ok" = "xno" + then + AC_MSG_RESULT(unable to found cppunit headers and library) + AC_MSG_RESULT(CPPUNITHOME environment variable may be wrong) + else + if test "x$CPPUNIT_INCLUDES" = "x/usr/include" + then + CPPUNIT_INCLUDES="" + else + CPPUNIT_INCLUDES="-I$CPPUNIT_INCLUDES" + fi + if test "x$CPPUNITHOME" = "x/usr" + then + CPPUNIT_LIBS=" -lcppunit" + else + CPPUNIT_LIBS="-L$CPPUNITHOME/lib -lcppunit" + fi + + AC_SUBST(CPPUNIT_INCLUDES) + AC_SUBST(CPPUNIT_LIBS) + AC_SUBST(cppunit_ok) + + AC_MSG_RESULT(yes) + fi + +fi + +AC_LANG_RESTORE + +])dnl +dnl \ No newline at end of file diff --git a/salome_adm/unix/config_files/check_hdf5.m4 b/salome_adm/unix/config_files/check_hdf5.m4 index b3658afc1..b20db13ac 100644 --- a/salome_adm/unix/config_files/check_hdf5.m4 +++ b/salome_adm/unix/config_files/check_hdf5.m4 @@ -48,7 +48,12 @@ then AC_MSG_WARN(undefined HDF5HOME variable which specify hdf5 installation directory) else LOCAL_INCLUDES="-I$HDF5HOME/include" - LOCAL_LIBS="-L$HDF5HOME/lib" + if test "x$HDF5HOME" = "x/usr" + then + LOCAL_LIBS="" + else + LOCAL_LIBS="-L$HDF5HOME/lib" + fi fi dnl hdf5 headers diff --git a/salome_adm/unix/config_files/check_lam.m4 b/salome_adm/unix/config_files/check_lam.m4 index 9a303a054..994a2b0a5 100644 --- a/salome_adm/unix/config_files/check_lam.m4 +++ b/salome_adm/unix/config_files/check_lam.m4 @@ -41,7 +41,12 @@ if test "$WITHLAM" = yes; then if test "$LAM_HOME"; then MPI_INCLUDES="-I$LAM_HOME/include" - MPI_LIBS="-L$LAM_HOME/lib" + if test "x$LAM_HOME" = "x/usr" + then + MPI_LIBS="" + else + MPI_LIBS="-L$LAM_HOME/lib" + fi fi CPPFLAGS_old="$CPPFLAGS" diff --git a/salome_adm/unix/config_files/check_lsf.m4 b/salome_adm/unix/config_files/check_lsf.m4 index 5fb9e0b10..a172d477d 100755 --- a/salome_adm/unix/config_files/check_lsf.m4 +++ b/salome_adm/unix/config_files/check_lsf.m4 @@ -43,7 +43,12 @@ AC_DEFUN([CHECK_LSF], dnl LIB directory - LSF_LDFLAGS="-L${LSF_LIBDIR}" + if test "x${LSF_LIBDIR}" = "x/usr/lib" + then + LSF_LDFLAGS="" + else + LSF_LDFLAGS="-L${LSF_LIBDIR}" + fi LSF_LIBS="" saved_LDFLAGS=${LDFLAGS} saved_LIBS=${LIBS} @@ -70,6 +75,9 @@ AC_DEFUN([CHECK_LSF], dnl AM_CONDITIONAL(WITH_LSF, test $WITH_LSF = 1) lsf_ok=$WITH_LSF + if test $lsf_ok = no ; then + lsf_ok= + fi AC_SUBST(WITH_LSF) ]) diff --git a/salome_adm/unix/config_files/check_mico.m4 b/salome_adm/unix/config_files/check_mico.m4 index b839d1e5c..5d97e2aa1 100644 --- a/salome_adm/unix/config_files/check_mico.m4 +++ b/salome_adm/unix/config_files/check_mico.m4 @@ -84,7 +84,12 @@ fi if test "x$mico_ok" = "xyes" then - MICO_LDFLAGS="-L$MICO_LIB" + if test "x$MICO_LIB" = "x/usr/lib" + then + MICO_LDFLAGS="" + else + MICO_LDFLAGS="-L$MICO_LIB" + fi LIBS_old=$LIBS MICO_LIBS="$MICO_LDFLAGS -lmico$MICO_VERSION -ldl" diff --git a/salome_adm/unix/config_files/check_mpi.m4 b/salome_adm/unix/config_files/check_mpi.m4 index d746ac055..e8255a2e4 100644 --- a/salome_adm/unix/config_files/check_mpi.m4 +++ b/salome_adm/unix/config_files/check_mpi.m4 @@ -41,7 +41,12 @@ if test "$WITHMPI" = yes; then if test "x$withval" != "xyes"; then MPI_HOME=$withval MPI_INCLUDES="-I$MPI_HOME/include" - MPI_LIBS="-L$MPI_HOME/lib" + if test "x$MPI_HOME" = "x/usr" + then + MPI_LIBS="" + else + MPI_LIBS="-L$MPI_HOME/lib" + fi fi CPPFLAGS_old="$CPPFLAGS" diff --git a/salome_adm/unix/config_files/check_mpich.m4 b/salome_adm/unix/config_files/check_mpich.m4 index de0e6d50a..c5971aa35 100644 --- a/salome_adm/unix/config_files/check_mpich.m4 +++ b/salome_adm/unix/config_files/check_mpich.m4 @@ -41,7 +41,12 @@ if test "$WITHMPICH" = yes; then if test "$MPICH_HOME"; then MPI_INCLUDES="-I$MPICH_HOME/include" - MPI_LIBS="-L$MPICH_HOME/lib" + if test "x$MPICH_HOME" = "x/usr" + then + MPI_LIBS="" + else + MPI_LIBS="-L$MPICH_HOME/lib" + fi fi CPPFLAGS_old="$CPPFLAGS" diff --git a/salome_adm/unix/config_files/check_msg2qm.m4 b/salome_adm/unix/config_files/check_msg2qm.m4 new file mode 100755 index 000000000..8d0c5474f --- /dev/null +++ b/salome_adm/unix/config_files/check_msg2qm.m4 @@ -0,0 +1,57 @@ +# Check availability of Qt's msg2qm tool binary distribution +# +# Author : Jerome Roy (CEA, 2003) +# + +AC_DEFUN([CHECK_MSG2QM],[ + +AC_CHECKING(for msg2qm) + +msg2qm_ok=no + +AC_ARG_WITH(msg2qm, + [ --with-msg2qm=DIR root directory path of MSG2QM installation], + MSG2QM_DIR="$withval",MSG2QM_DIR="") + +if test "x$MSG2QM_DIR" == "x" ; then + +# no --with-MSG2QM-dir option used + + if test "x$MSG2QM_ROOT" != "x" ; then + + # MSG2QM_ROOT environment variable defined + MSG2QM_DIR=$MSG2QM_ROOT + + else + + # search MSG2QM binaries in PATH variable + AC_PATH_PROG(TEMP, msg2qm) + if test "x$TEMP" != "x" ; then + MSG2QM_DIR=`dirname $TEMP` + fi + + fi +# +fi + +# look for msg2qm in ${MSG2QM_DIR} directory +if test -f ${MSG2QM_DIR}/msg2qm ; then + msg2qm_ok=yes + MSG2QM="${MSG2QM_DIR}/msg2qm" + AC_MSG_RESULT(Using MSG2QM executable in ${MSG2QM_DIR}) +else + # if not found, look for msg2qm in ${MSG2QM_DIR}/bin directory + if test -f ${MSG2QM_DIR}/bin/msg2qm ; then + msg2qm_ok=yes + MSG2QM="${MSG2QM_DIR}/bin/msg2qm" + AC_MSG_RESULT(Using MSG2QM executable in ${MSG2QM_DIR}/bin) + else + AC_MSG_WARN("Cannot find MSG2QM executable") + fi +fi + +AC_SUBST(MSG2QM) +AC_MSG_RESULT(for MSG2QM: $msg2qm_ok) + +])dnl + diff --git a/salome_adm/unix/config_files/check_omniorb.m4 b/salome_adm/unix/config_files/check_omniorb.m4 index f3d5abcdb..1f63365bf 100644 --- a/salome_adm/unix/config_files/check_omniorb.m4 +++ b/salome_adm/unix/config_files/check_omniorb.m4 @@ -99,7 +99,12 @@ dnl omniORB_ok=yes if test "x$omniORB_ok" = "xyes" then - OMNIORB_LDFLAGS="-L$OMNIORB_LIB" + if test "x$OMNIORB_LIB" = "x/usr/lib" + then + OMNIORB_LDFLAGS="" + else + OMNIORB_LDFLAGS="-L$OMNIORB_LIB" + fi LIBS_old=$LIBS LIBS="$LIBS $OMNIORB_LDFLAGS -lomnithread" diff --git a/salome_adm/unix/config_files/check_opengl.m4 b/salome_adm/unix/config_files/check_opengl.m4 index ad1ccbd1e..dd43d25a0 100644 --- a/salome_adm/unix/config_files/check_opengl.m4 +++ b/salome_adm/unix/config_files/check_opengl.m4 @@ -49,7 +49,12 @@ if test "x$local_opengl" = "xyes" ; then if test -f "${opengl_dir}/include/GL/gl.h" ; then OpenGL_ok=yes OGL_INCLUDES="-I${opengl_dir}/include" - OGL_LIBS="-L${opengl_dir}/lib" + if test "x${opengl_dir}" = "x/usr" + then + OGL_LIBS="" + else + OGL_LIBS="-L${opengl_dir}/lib" + fi AC_MSG_RESULT(select OpenGL distribution in ${opengl_dir}) else AC_MSG_RESULT(no gl.h header file in ${opengl_dir}/include/GL) @@ -91,13 +96,23 @@ then for i in $dirs; do if test -r "$i/libGL.so"; then dnl AC_MSG_RESULT(in $i) - OGL_LIBS="-L$i" + if test "x$i" = "x/usr/lib" + then + OGL_LIBS="" + else + OGL_LIBS="-L$i" + fi break fi # under IRIX ? if test -r "$i/libGL.sl"; then dnl AC_MSG_RESULT(in $i) - OGL_LIBS="-L$i" + if test "x$i" = "x/usr/lib" + then + OGL_LIBS="" + else + OGL_LIBS="-L$i" + fi break fi done diff --git a/salome_adm/unix/config_files/check_openpbs.m4 b/salome_adm/unix/config_files/check_openpbs.m4 index 9598285c9..014545886 100644 --- a/salome_adm/unix/config_files/check_openpbs.m4 +++ b/salome_adm/unix/config_files/check_openpbs.m4 @@ -30,7 +30,12 @@ AC_DEFUN([CHECK_OPENPBS], CPPFLAGS=${saved_CPPFLAGS} AC_SUBST(OPENPBS_INCLUDES) - OPENPBS_LIBDIR="-L${OPENPBS}/lib" + if test "x${OPENPBS}" = "x/usr" + then + OPENPBS_LIBDIR="" + else + OPENPBS_LIBDIR="-L${OPENPBS}/lib" + fi OPENPBS_LIBS="-lpbs" saved_LDFLAGS=${LDFLAGS} saved_LIBS=${LIBS} @@ -51,6 +56,9 @@ AC_DEFUN([CHECK_OPENPBS], fi WITHOPENPBS=$openpbs_ok + if test x$WITHOPENPBS = x ; then + WITHOPENPBS=no + fi AC_SUBST(WITHOPENPBS) ]) diff --git a/salome_adm/unix/config_files/check_pthreads.m4 b/salome_adm/unix/config_files/check_pthreads.m4 index 983bfc200..80aef2aad 100644 --- a/salome_adm/unix/config_files/check_pthreads.m4 +++ b/salome_adm/unix/config_files/check_pthreads.m4 @@ -29,7 +29,7 @@ dnl@author (C) Ruslan Shevchenko , 1998 dnl@id $Id$ dnl ---------------------------------------------------------------- dnl CHECK_PTHREADS -AC_DEFUN(CHECK_PTHREADS,[ +AC_DEFUN([CHECK_PTHREADS],[ AC_CXX_OPTION(-pthread,CPPFLAGS,flag=yes,flag=no) if test $flag = no; then diff --git a/salome_adm/unix/config_files/check_pyqt.m4 b/salome_adm/unix/config_files/check_pyqt.m4 index cb99775f8..ee024efaf 100644 --- a/salome_adm/unix/config_files/check_pyqt.m4 +++ b/salome_adm/unix/config_files/check_pyqt.m4 @@ -2,6 +2,11 @@ dnl Copyright (C) 2003 CEA/DEN, EDF R&D AC_DEFUN([CHECK_PYQT],[ AC_REQUIRE([CHECK_PYTHON])dnl +AC_REQUIRE([CHECK_QT])dnl +AC_REQUIRE([CHECK_SIP])dnl + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS AC_ARG_WITH(pyqt, [ --with-pyqt=DIR root directory path to PyQt installation ], @@ -24,68 +29,278 @@ AC_ARG_WITH(pyuic, AC_CHECKING(for pyqt) -pyqt_ok=no +pyqt_ok=yes -if test "x$PYQTDIR" = x; then - PYQTDIR="/usr" +dnl look for pyuic +pyqt_uic_ok=no +if test "x$PYUIC" != x; then + dnl try withval value + AC_CHECK_FILE($PYUIC,pyqt_uic_ok=yes,pyqt_uic_ok=no) fi - -if test "x$PYQT_SIPS" = x; then - PYQT_SIPS="/usr/share/sip/qt" +if test "x$pyqt_uic_ok" == "xno"; then + dnl try ${PYQTDIR} + if test "x${PYQTDIR}" != "x"; then + if test -d ${PYQTDIR} ; then + AC_CHECK_FILE(${PYQTDIR}/pyuic,pyqt_uic_ok=yes,pyqt_uic_ok=no) + if test "x$pyqt_uic_ok" == "xyes"; then + PYUIC="${PYQTDIR}/pyuic" + fi + fi + fi fi - -if test -d $PYQTDIR/lib/python${PYTHON_VERSION}/site-packages; then - PYQTLIB=$PYQTDIR/lib/python${PYTHON_VERSION}/site-packages -else - if test -d $PYQTDIR/lib; then - PYQTLIB=$PYQTDIR/lib - else - PYQTLIB=$PYQTDIR +if test "x$pyqt_uic_ok" == "xno"; then + dnl try ${SIPDIR} + if test "x${SIPDIR}" != "x"; then + if test -d ${SIPDIR} ; then + AC_CHECK_FILE(${SIPDIR}/pyuic,pyqt_uic_ok=yes,pyqt_uic_ok=no) + if test "x$pyqt_uic_ok" == "xyes"; then + PYUIC="${SIPDIR}/pyuic" + fi + fi + fi +fi +if test "x$pyqt_uic_ok" == "xno"; then + dnl try ${PYTHONHOME}/bin + if test "x${PYTHONHOME}" != "x"; then + if test -d ${PYTHONHOME}/bin ; then + AC_CHECK_FILE(${PYTHONHOME}/bin/pyuic,pyqt_uic_ok=yes,pyqt_uic_ok=no) + if test "x$pyqt_uic_ok" == "xyes"; then + PYUIC="${PYTHONHOME}/bin/pyuic" + fi + fi + fi +fi +if test "x$pyqt_uic_ok" == "xno"; then + dnl try /usr/bin + AC_CHECK_FILE(/usr/bin/pyuic,pyqt_uic_ok=yes,pyqt_uic_ok=no) + if test "x$pyqt_uic_ok" == "xyes"; then + PYUIC="/usr/bin/pyuic" fi fi - -if test -d $PYQTDIR/bin; then - PYQTBIN=$PYQTDIR/bin -else - PYQTBIN=$PYQTDIR +if test "x$pyqt_uic_ok" == "xno"; then + pyqt_ok=no fi -if test "x$PYUIC" = x; then - PYUIC="$PYQTBIN/pyuic" +dnl look for PyQt libs +pyqt_lib_ok=no +if test "x${PYQTDIR}" != "x"; then + dnl try {PYQTDIR} + AC_CHECK_FILE(${PYQTDIR}/libqtcmodule.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + if test "x${PYQTDIR}" = "x/usr/lib" + then + PYQT_LIBS="-lqtcmodule" + else + PYQT_LIBS="-L${PYQTDIR} -lqtcmodule" + fi + else + AC_CHECK_FILE(${PYQTDIR}/qt.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + if test "x${PYQTDIR}" = "x/usr/lib" + then + PYQT_LIBS="" + else + PYQT_LIBS="-L${PYQTDIR}" + fi + fi + fi + if test "x$pyqt_lib_ok" == "xno"; then + dnl try {PYQTDIR}/lib + if test -d {PYQTDIR}/lib; then + AC_CHECK_FILE(${PYQTDIR}/lib/libqtcmodule.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + PYQT_LIBS="-L${PYQTDIR}/lib -lqtcmodule" + else + AC_CHECK_FILE(${PYQTDIR}/lib/qt.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + PYQT_LIBS="-L${PYQTDIR}/lib" + fi + fi + fi + fi + if test "x$pyqt_lib_ok" == "xno"; then + dnl try {PYQTDIR}/lib/python${PYTHON_VERSION}/site-packages + if test -d {PYQTDIR}/lib/python${PYTHON_VERSION}/site-packages; then + AC_CHECK_FILE(${PYQTDIR}/lib/python${PYTHON_VERSION}/site-packages/libqtcmodule.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + PYQT_LIBS="-L${PYQTDIR}/lib/python${PYTHON_VERSION}/site-packages -lqtcmodule" + else + AC_CHECK_FILE(${PYQTDIR}/lib/python${PYTHON_VERSION}/site-packages/qt.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + PYQT_LIBS="-L${PYQTDIR}/lib/python${PYTHON_VERSION}/site-packages" + fi + fi + fi + fi fi - -AC_CHECK_FILE("$PYUIC",pyqt_ok=yes,pyqt_ok=no) - -if test "x$pyqt_ok" = xyes ; then - AC_CHECK_FILES("$PYQTLIB/qt.py",pyqt_ok=yes,pyqt_ok=no) +if test "x$pyqt_lib_ok" == "xno"; then + dnl try ${SIPDIR} + if test "x${SIPDIR}" != "x"; then + if test -d ${SIPDIR} ; then + AC_CHECK_FILE(${SIPDIR}/libqtcmodule.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + if test "x${SIPDIR}" = "x/usr/lib" + then + PYQT_LIBS="-lqtcmodule" + else + PYQT_LIBS="-L${SIPDIR} -lqtcmodule" + fi + else + AC_CHECK_FILE(${SIPDIR}/qt.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + if test "x${SIPDIR}" = "x/usr/lib" + then + PYQT_LIBS="" + else + PYQT_LIBS="-L${SIPDIR}" + fi + fi + fi + fi + fi fi - -if test "x$pyqt_ok" = xno ; then - AC_CHECK_FILES("$PYQTLIB/qt/qt.py",pyqt_ok=yes,pyqt_ok=no) +if test "x$pyqt_lib_ok" == "xno"; then + dnl try ${PYTHONHOME}/lib/python${PYTHON_VERSION}/site-packages + if test "x${PYTHONHOME}" != "x"; then + if test -d ${PYTHONHOME}/lib/python${PYTHON_VERSION}/site-packages ; then + AC_CHECK_FILE(${PYTHONHOME}/lib/python${PYTHON_VERSION}/site-packages/libqtcmodule.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + PYQT_LIBS="-L${PYTHONHOME}/lib/python${PYTHON_VERSION}/site-packages -lqtcmodule" + else + AC_CHECK_FILE(${PYTHONHOME}/lib/python${PYTHON_VERSION}/site-packages/qt.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + PYQT_LIBS="-L${PYTHONHOME}/lib/python${PYTHON_VERSION}/site-packages" + fi + fi + fi + fi fi - -if test "x$pyqt_ok" = xyes ; then - AC_CHECK_FILE("$PYQTLIB/libqtcmodule.so",pyqt_ok=yes,pyqt_ok=no) +if test "x$pyqt_lib_ok" == "xno"; then + dnl try /usr/lib/python${PYTHON_VERSION}/site-packages + AC_CHECK_FILE(/usr/lib/python${PYTHON_VERSION}/site-packages/libqtcmodule.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + PYQT_LIBS="-L/usr/lib/python${PYTHON_VERSION}/site-packages -lqtcmodule" + else + AC_CHECK_FILE(/usr/lib/python${PYTHON_VERSION}/site-packages/qt.so,pyqt_lib_ok=yes,pyqt_lib_ok=no) + if test "x$pyqt_lib_ok" == "xyes"; then + PYQT_LIBS="-L/usr/lib/python${PYTHON_VERSION}/site-packages" + fi + fi +fi +if test "x$pyqt_lib_ok" == "xno"; then + pyqt_ok=no fi -if test "x$pyqt_ok" = xyes ; then - AC_CHECK_FILES("$PYQT_SIPS/qtmod.sip",pyqt_ok=yes,pyqt_ok=no) +dnl look for PyQt sips +pyqt_sips_ok=no +dnl try ${PYQT_SIPS} or ${PYQT_SIPS}/qt +if test "x${PYQT_SIPS}" != "x"; then + AC_CHECK_FILE(${PYQT_SIPS}/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no) + if test "x$pyqt_sips_ok" == "xno"; then + AC_CHECK_FILE(${PYQT_SIPS}/qt/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no) + if test "x$pyqt_sips_ok" == "xyes"; then + PYQT_SIPS="${PYQT_SIPS}/qt" + fi + fi fi -if test "x$pyqt_ok" = xyes ; then - AC_CHECK_FILE("$PYQT_SIPS/copying.sip",pyqt_ok=yes,pyqt_ok=no) +if test "x$pyqt_sips_ok" == "xno"; then + dnl try ${PYQTDIR}/sip + if test "x${PYQTDIR}" != "x"; then + if test -d ${PYQTDIR}/sip ; then + AC_CHECK_FILE(${PYQTDIR}/sip/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no) + if test "x$pyqt_sips_ok" == "xyes"; then + PYQT_SIPS="${PYQTDIR}/sip" + else + AC_CHECK_FILE(${PYQTDIR}/sip/qt/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no) + if test "x$pyqt_sips_ok" == "xyes"; then + PYQT_SIPS="${PYQTDIR}/sip/qt" + fi + fi + fi + fi fi - -if test "x$pyqt_ok" = xyes ; then - PYQT_ROOT=$PYQTDIR +if test "x$pyqt_sips_ok" == "xno"; then + dnl try ${SIPDIR}/sip + if test "x${SIPDIR}" != "x"; then + if test -d ${SIPDIR}/sip ; then + AC_CHECK_FILE(${SIPDIR}/sip/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no) + if test "x$pyqt_sips_ok" == "xyes"; then + PYQT_SIPS="${SIPDIR}/sip" + else + AC_CHECK_FILE(${SIPDIR}/sip/qt/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no) + if test "x$pyqt_sips_ok" == "xyes"; then + PYQT_SIPS="${SIPDIR}/sip/qt" + fi + fi + fi + fi +fi +if test "x$pyqt_sips_ok" == "xno"; then + dnl try /usr/share/sip + if test -d /usr/share/sip ; then + AC_CHECK_FILE(/usr/share/sip/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no) + if test "x$pyqt_sips_ok" == "xyes"; then + PYQT_SIPS="/usr/share/sip" + else + AC_CHECK_FILE(/usr/share/sip/qt/qglobal.sip,pyqt_sips_ok=yes,pyqt_sips_ok=no) + if test "x$pyqt_sips_ok" == "xyes"; then + PYQT_SIPS="/usr/share/sip/qt" + fi + fi + fi +fi +if test "x$pyqt_sips_ok" == "xno"; then + pyqt_ok=no +else PYQT_INCLUDES="-I$PYQT_SIPS" - PYQT_LIBS="-L$PYQTLIB -lqtcmodule" - AC_SUBST(PYQT_ROOT) - AC_SUBST(PYQT_INCLUDES) - AC_SUBST(PYQT_LIBS) - AC_SUBST(PYQT_SIPS) - AC_SUBST(PYUIC) + + dnl Additional sip flags required for correct wrappers compilation + AC_MSG_CHECKING(which qt classes should be excluded) + + PYQT_SIPFLAGS="" + + CXXFLAGS_old=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $QT_INCLUDES" + LIBS_old=$LIBS + LIBS="$LIBS $QT_LIBS" + + AC_TRY_COMPILE([#include ], + [new QCDEStyle();],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_STYLE_CDE") + AC_TRY_COMPILE([#include ], + [new QInterlaceStyle();],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_STYLE_INTERLACE") + AC_TRY_COMPILE([#include ], + [new QMotifStyle();],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_STYLE_MOTIF") + AC_TRY_COMPILE([#include ], + [new QMotifPlusStyle();],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_STYLE_MOTIFPLUS") + AC_TRY_COMPILE([#include ], + [new QPlatinumStyle();],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_STYLE_PLATINUM") + AC_TRY_COMPILE([#include ], + [new QSGIStyle();],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_STYLE_SGI") + AC_TRY_COMPILE([#include ], + [new QWindowsStyle();],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_STYLE_WINDOWS") + AC_TRY_COMPILE([#include ], + [new QWindowsXPStyle();],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_STYLE_WINDOWSXP") + + LIBS="$LIBS -lqassistantclient" + AC_TRY_LINK([#include ], + [new QAssistantClient("foo");],,PYQT_SIPFLAGS="$PYQT_SIPFLAGS -x Qt_ASSISTANTCLIENT") + + AC_MSG_RESULT(done) + + CXXFLAGS=$CXXFLAGS_old + LIBS=$LIBS_old fi +AC_SUBST(PYQT_INCLUDES) +AC_SUBST(PYQT_LIBS) +AC_SUBST(PYQT_SIPS) +AC_SUBST(PYUIC) +AC_SUBST(PYQT_SIPFLAGS) + +AC_LANG_RESTORE + +AC_MSG_RESULT(for pyqt: $pyqt_ok) + ])dnl dnl diff --git a/salome_adm/unix/config_files/check_qt.m4 b/salome_adm/unix/config_files/check_qt.m4 index b27de2779..3faa1e990 100644 --- a/salome_adm/unix/config_files/check_qt.m4 +++ b/salome_adm/unix/config_files/check_qt.m4 @@ -37,6 +37,14 @@ if test "x$QTDIR" = "x" then AC_MSG_RESULT(please define QTDIR variable) qt_ok=no +else + AC_MSG_RESULT(QTDIR is $QTDIR) + qt_inc_ok=no + QTINC="" + AC_CHECK_FILE(${QTDIR}/include/qt3/qglobal.h,QTINC="/qt3",QTINC="") + QT_VERS=`grep "QT_VERSION_STR" ${QTDIR}/include${QTINC}/qglobal.h | sed -e 's%^#define QT_VERSION_STR\([[:space:]]*\)%%g' -e 's%\"%%g'` + AC_MSG_RESULT(Qt version is $QT_VERS) + QT_VERS="Qt_"`echo $QT_VERS | sed -e 's%\"%%g' -e 's%\.%_%g'` fi if test "x$qt_ok" = "xyes" @@ -81,7 +89,7 @@ QT_ROOT=$QTDIR if test "x$qt_ok" = "xyes" then CPPFLAGS_old=$CPPFLAGS - CPPFLAGS="$CPPFLAGS -I$QTDIR/include" + CPPFLAGS="$CPPFLAGS -I$QTDIR/include${QTINC}" AC_LANG_CPLUSPLUS AC_CHECK_HEADER(qaction.h,qt_ok=yes ,qt_ok=no) @@ -96,8 +104,8 @@ then AC_MSG_RESULT(QTDIR environment variable may be wrong) else AC_MSG_RESULT(yes) - QT_INCLUDES="-I${QT_ROOT}/include -DQT_THREAD_SUPPORT" - QT_MT_INCLUDES="-I${QT_ROOT}/include -DQT_THREAD_SUPPORT" + QT_INCLUDES="-I${QT_ROOT}/include${QTINC} -DQT_THREAD_SUPPORT" + QT_MT_INCLUDES="-I${QT_ROOT}/include${QTINC} -DQT_THREAD_SUPPORT" fi fi @@ -105,10 +113,15 @@ if test "x$qt_ok" = "xyes" then AC_MSG_CHECKING(linking qt library) LIBS_old=$LIBS - LIBS="$LIBS -L$QTDIR/lib -lqt-mt $OGL_LIBS" + if test "x$QTDIR" = "x/usr" + then + LIBS="$LIBS -lqt-mt $OGL_LIBS" + else + LIBS="$LIBS -L$QTDIR/lib -lqt-mt $OGL_LIBS" + fi CXXFLAGS_old=$CXXFLAGS - CXXFLAGS="$CXXFLAGS -I$QTDIR/include" + CXXFLAGS="$CXXFLAGS $QT_INCLUDES" AC_CACHE_VAL(salome_cv_lib_qt,[ AC_TRY_LINK( @@ -127,8 +140,14 @@ then AC_MSG_RESULT(QTDIR environment variable may be wrong) else AC_MSG_RESULT(yes) - QT_LIBS="-L$QTDIR/lib -lqt-mt" - QT_MT_LIBS="-L$QTDIR/lib -lqt-mt" + if test "x$QTDIR" = "x/usr" + then + QT_LIBS=" -lqt-mt" + QT_MT_LIBS=" -lqt-mt" + else + QT_LIBS="-L$QTDIR/lib -lqt-mt" + QT_MT_LIBS="-L$QTDIR/lib -lqt-mt" + fi fi LIBS=$LIBS_old @@ -143,6 +162,7 @@ AC_SUBST(QT_ROOT) AC_SUBST(QT_INCLUDES) AC_SUBST(QT_LIBS) AC_SUBST(QT_MT_LIBS) +AC_SUBST(QT_VERS) AC_LANG_RESTORE diff --git a/salome_adm/unix/config_files/check_qwt.m4 b/salome_adm/unix/config_files/check_qwt.m4 index 4e541d70d..f1b456dda 100644 --- a/salome_adm/unix/config_files/check_qwt.m4 +++ b/salome_adm/unix/config_files/check_qwt.m4 @@ -22,19 +22,36 @@ AC_ARG_WITH(qwt_inc, ]) if test -z $QWTHOME; then + AC_MSG_RESULT(QWTHOME not defined) exits_ok=no - AC_CHECK_FILE("/usr/local/lib/libqwt.so",exits_ok=yes,exits_ok=no) + if test "x$exits_ok" = "xno"; then + for d in /usr/local /usr ; do + AC_CHECK_FILE(${d}/lib/libqwt.so,exits_ok=yes,exits_ok=no) + if test "x$exits_ok" = "xyes"; then + QWTHOME=$d + AC_MSG_RESULT(libqwt.so detected in $d/lib) + fi + done + fi + if test "x$exits_ok" = "xno"; then + for d in `echo $LD_LIBRARY_PATH | sed -e "s/:/ /g"` ; do + if test -f $d/libqwt.so ; then + AC_MSG_RESULT(libqwt.so detected in $d) + QWTHOME=$d + QWTHOME=`echo ${QWTHOME} | sed -e "s,[[^/]]*$,,;s,/$,,;s,^$,.,"` + exits_ok=yes + break + fi + done + fi if test "x$exits_ok" = "xyes"; then - QWTHOME="/usr/local/lib" - if test -z $QWT_INCLUDES; then - QWT_INCLUDES="/usr/local/include/qwt" - fi - else - QWTHOME="/usr/lib" if test -z $QWT_INCLUDES; then - QWT_INCLUDES="/usr/include/qwt" + QWT_INCLUDES=$QWTHOME"/include/qwt" + if test ! -d $QWT_INCLUDES; then + QWT_INCLUDES=$QWTHOME"/include" + fi fi - fi + fi else if test -z $QWT_INCLUDES; then QWT_INCLUDES="$QWTHOME/include" @@ -50,7 +67,7 @@ else AC_LANG_CPLUSPLUS CPPFLAGS_old=$CPPFLAGS CPPFLAGS="$CPPFLAGS -I$QWT_INCLUDES" - CPPFLAGS="$CPPFLAGS -I$QTDIR/include" + CPPFLAGS="$CPPFLAGS $QT_INCLUDES" AC_CHECK_HEADER(qwt.h,qwt_ok=yes,qwt_ok=no) @@ -67,10 +84,21 @@ if test "x$qwt_ok" = "xyes" then AC_MSG_CHECKING(linking qwt library) LIBS_old=$LIBS - LIBS="$LIBS -L$QTDIR/lib -lqt-mt -L$QWTHOME/lib -lqwt" + if test "x$QTDIR" = "x/usr" + then + LIBS="$LIBS -lqt-mt" + else + LIBS="$LIBS -L$QTDIR/lib -lqt-mt" + fi + if test "x$QWTHOME" = "x/usr/lib" + then + LIBS="$LIBS -lqwt" + else + LIBS="$LIBS -L$QWTHOME/lib -lqwt" + fi CXXFLAGS_old=$CXXFLAGS - CXXFLAGS="$CXXFLAGS -I$QTDIR/include -I$QWT_INCLUDES" + CXXFLAGS="$CXXFLAGS $QT_INCLUDES -I$QWT_INCLUDES" AC_CACHE_VAL(salome_cv_lib_qwt,[ AC_TRY_LINK( @@ -92,7 +120,12 @@ then AC_MSG_RESULT(QWTHOME environment variable may be wrong) else QWT_INCLUDES="-I$QWT_INCLUDES" - QWT_LIBS="-L$QWTHOME/lib -lqwt" + if test "x$QWTHOME" = "x/usr/lib" + then + QWT_LIBS=" -lqwt" + else + QWT_LIBS="-L$QWTHOME/lib -lqwt" + fi AC_SUBST(QWT_INCLUDES) AC_SUBST(QWT_LIBS) diff --git a/salome_adm/unix/config_files/check_sip.m4 b/salome_adm/unix/config_files/check_sip.m4 index 84c2beaf7..245f2382e 100644 --- a/salome_adm/unix/config_files/check_sip.m4 +++ b/salome_adm/unix/config_files/check_sip.m4 @@ -2,6 +2,7 @@ dnl Copyright (C) 2003 CEA/DEN, EDF R&D AC_DEFUN([CHECK_SIP],[ AC_REQUIRE([CHECK_PYTHON])dnl +AC_REQUIRE([CHECK_QT])dnl sip_ok=yes @@ -13,75 +14,146 @@ AC_ARG_WITH(sip, AC_PATH_PROG(SIP, sip) ]) -if test "x$SIP" = "x" -then +if test "x$SIP" = "x" ; then sip_ok=no AC_MSG_RESULT(sip not in PATH variable) else - version=`sip -V` + version=`$SIP -V` + AC_MSG_RESULT(sip version is $version) case "$version" in 3.2*) - SIP_VERS=old ;; + SIP_VERS=v3_old ;; 3.3*) - SIP_VERS=old ;; + SIP_VERS=v3_old ;; 3.4*) - SIP_VERS=new ;; + SIP_VERS=v3_old ;; 3.5*) - SIP_VERS=new ;; + SIP_VERS=v3_old ;; 3.6*) - SIP_VERS=new ;; + SIP_VERS=v3_old ;; 3.7*) - SIP_VERS=new ;; + SIP_VERS=v3_old ;; 3.8*) - SIP_VERS=new ;; + SIP_VERS=v3_old ;; 3.9*) - SIP_VERS=new ;; + SIP_VERS=v3_old ;; 3.10*) - SIP_VERS=new2 ;; + SIP_VERS=v3_new ;; + 4.1*) + SIP_VERS=v4_old ;; + 4.2*) + SIP_VERS=v4_new ;; *) AC_MSG_RESULT(sip version $version not supported) - SIP_VERS=no ;; + SIP_VERS=unsupported ;; esac - sip_ok=no - if test "x$SIP_VERS" = "xold" - then - dnl old install : includes and libs are in python install or in SIPDIR - AC_MSG_RESULT(old install detected) - sip_ok=yes - SIP_ROOT="$SIPDIR" - SIP_INCLUDES="${PYTHON_INCLUDES} -I${SIPDIR}" - SIP_LIBS="-L${PYTHON_PREFIX}/lib/python${PYTHON_VERSION}/site-packages -L${SIPDIR} -lsip" + sip_ok=no + dnl Search sip.h file + if test "x$SIPDIR" != "x" ; then + dnl look for sip.h in ${SIPDIR} + AC_CHECK_FILE(${SIPDIR}/sip.h,sip_ok=yes,sip_ok=no) + if test "x$sip_ok" == "xyes" ; then + SIP_INCLUDES="-I${SIPDIR}" + fi + if test "x$sip_ok" == "xno" ; then + dnl look for sip.h in ${SIPDIR}/include/python${PYTHON_VERSION} + if test -d ${SIPDIR}/include/python${PYTHON_VERSION} ; then + AC_CHECK_FILE(${SIPDIR}/include/python${PYTHON_VERSION}/sip.h,sip_ok=yes,sip_ok=no) + if test "x$sip_ok" == "xyes" ; then + SIP_INCLUDES="-I${SIPDIR}/include/python${PYTHON_VERSION}" + fi + fi + fi fi - - if test "x$SIP_VERS" = "xnew" - then - sip_ok=yes - if test -d ${SIPDIR}/include/python${PYTHON_VERSION} ; then - AC_MSG_RESULT(new install with include dir detected) - dnl new install with include dir : includes and libs are in python install or in SIPDIR/include - SIP_ROOT="$SIPDIR" - SIP_INCLUDES="${PYTHON_INCLUDES} -I${SIPDIR}/include/python${PYTHON_VERSION}" - SIP_LIBS="-L${SIPDIR}/lib/python${PYTHON_VERSION}/site-packages -lsip" - else - dnl new install without include dir : includes and libs are in SIPDIR - AC_MSG_RESULT(new install without include dir detected) - sip_ok=yes - SIP_ROOT="$SIPDIR" - SIP_INCLUDES="-I${SIPDIR}" - SIP_LIBS="-L${SIPDIR} -lsip" - fi + if test "x$sip_ok" == "xno" ; then + dnl look for sip.h in ${PYTHON_PREFIX}/include/python${PYTHON_VERSION} + if test -d ${PYTHON_PREFIX}/include/python${PYTHON_VERSION} ; then + AC_CHECK_FILE(${PYTHON_PREFIX}/include/python${PYTHON_VERSION}/sip.h,sip_ok=yes,sip_ok=no) + if test "x$sip_ok" == "xyes" ; then + SIP_INCLUDES="${PYTHON_INCLUDES}" + fi + fi + fi + if test "x$sip_ok" == "xno" ; then + dnl look for sip.h in /usr/include/python${PYTHON_VERSION} + if test -d /usr/include/python${PYTHON_VERSION} ; then + AC_CHECK_FILE(/usr/include/python${PYTHON_VERSION}/sip.h,sip_ok=yes,sip_ok=no) + if test "x$sip_ok" == "xyes" ; then + SIP_INCLUDES="/usr/include/python${PYTHON_VERSION}" + fi + fi fi + + dnl Search (lib)sip.so file + sip_lib_ok=no + if test "x$SIPDIR" != "x" ; then + dnl look for (lib)sip.so in ${SIPDIR} + AC_CHECK_FILE(${SIPDIR}/libsip.so,sip_lib_ok=yes,sip_lib_ok=no) + if test "x$sip_lib_ok" == "xyes" ; then + if test "x${SIPDIR}" = "x/usr/lib" + then + SIP_LIBS="-lsip" + else + SIP_LIBS="-L${SIPDIR} -lsip" + fi + else + AC_CHECK_FILE(${SIPDIR}/sip.so,sip_lib_ok=yes,sip_lib_ok=no) + if test "x$sip_lib_ok" == "xyes" ; then + if test "x${SIPDIR}" = "x/usr/lib" + then + SIP_LIBS="" + else + SIP_LIBS="-L${SIPDIR}" + fi + fi + fi - if test "x$SIP_VERS" = "xnew2" - then - dnl new2 install : includes and libs are in python install - AC_MSG_RESULT(new2 install detected) - sip_ok=yes - AC_CHECK_FILE($PYTHON_PREFIX/include/python$PYTHON_VERSION/sip.h,sip_ok=$sip_ok,sip_ok=no) - SIP_INCLUDES="${PYTHON_INCLUDES}" - AC_CHECK_FILE($PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages/libsip.so,sip_ok=$sip_ok,sip_ok=no) - SIP_LIBS="-L${PYTHON_PREFIX}/lib/python${PYTHON_VERSION}/site-packages -lsip" + if test "x$sip_lib_ok" == "xno" ; then + dnl look for (lib)sip.so in ${SIPDIR}/lib/python${PYTHON_VERSION}/site-packages + if test -d ${SIPDIR}/lib/python${PYTHON_VERSION}/site-packages ; then + AC_CHECK_FILE(${SIPDIR}/lib/python${PYTHON_VERSION}/site-packages/libsip.so,sip_lib_ok=yes,sip_lib_ok=no) + if test "x$sip_lib_ok" == "xyes" ; then + SIP_LIBS="-L${SIPDIR}/lib/python${PYTHON_VERSION}/site-packages -lsip" + else + AC_CHECK_FILE(${SIPDIR}/lib/python${PYTHON_VERSION}/site-packages/sip.so,sip_lib_ok=yes,sip_lib_ok=no) + if test "x$sip_lib_ok" == "xyes" ; then + SIP_LIBS="-L${SIPDIR}/lib/python${PYTHON_VERSION}/site-packages" + fi + fi + fi + fi + fi + if test "x$sip_lib_ok" == "xno" ; then + dnl look for (lib)sip.so in ${PYTHON_PREFIX}/lib/python${PYTHON_VERSION}/site-packages + if test -d ${PYTHON_PREFIX}/lib/python${PYTHON_VERSION}/site-packages ; then + AC_CHECK_FILE(${PYTHON_PREFIX}/lib/python${PYTHON_VERSION}/site-packages/libsip.so,sip_lib_ok=yes,sip_lib_ok=no) + if test "x$sip_lib_ok" == "xyes" ; then + SIP_LIBS="-L${PYTHON_PREFIX}/lib/python${PYTHON_VERSION}/site-packages -lsip" + else + AC_CHECK_FILE(${PYTHON_PREFIX}/lib/python${PYTHON_VERSION}/site-packages/sip.so,sip_lib_ok=yes,sip_lib_ok=no) + if test "x$sip_lib_ok" == "xyes" ; then + SIP_LIBS="-L${PYTHON_PREFIX}/lib/python${PYTHON_VERSION}/site-packages" + fi + fi + fi + fi + if test "x$sip_lib_ok" == "xno" ; then + dnl look for (lib)sip.so in /usr/lib/python${PYTHON_VERSION}/site-packages + if test -d /usr/lib/python${PYTHON_VERSION}/site-packages ; then + AC_CHECK_FILE(/usr/lib/python${PYTHON_VERSION}/site-packages/libsip.so,sip_lib_ok=yes,sip_lib_ok=no) + if test "x$sip_lib_ok" == "xyes" ; then + SIP_LIBS="-L$/usr/lib/python${PYTHON_VERSION}/site-packages -lsip" + else + AC_CHECK_FILE(/usr/lib/python${PYTHON_VERSION}/site-packages/sip.so,sip_lib_ok=yes,sip_lib_ok=no) + if test "x$sip_lib_ok" == "xyes" ; then + SIP_LIBS="-L/usr/lib/python${PYTHON_VERSION}/site-packages" + fi + fi + fi + fi + if test "x$sip_lib_ok" == "xno" ; then + sip_ok=no fi fi diff --git a/salome_adm/unix/config_files/check_vtk.m4 b/salome_adm/unix/config_files/check_vtk.m4 index 4b4b1454f..df9245b5d 100644 --- a/salome_adm/unix/config_files/check_vtk.m4 +++ b/salome_adm/unix/config_files/check_vtk.m4 @@ -55,6 +55,21 @@ else LXLIB="" fi +if test "x$x_libraries" = "x/usr/lib" +then + LXLIB="" +fi + +if test "x$x_libraries" = "x/usr/lib" +then + LXLIB="" +fi + +if test "x$x_libraries" = "x/usr/lib" +then + LXLIB="" +fi + LOCAL_INCLUDES="$OGL_INCLUDES" LOCAL_LIBS="-lvtkCommon -lvtkGraphics -lvtkImaging -lvtkFiltering -lvtkIO -lvtkRendering -lvtkHybrid $OGL_LIBS $LXLIB -lX11 -lXt" TRY_LINK_LIBS="-lvtkCommon $OGL_LIBS $LXLIB -lX11 -lXt" @@ -62,7 +77,14 @@ TRY_LINK_LIBS="-lvtkCommon $OGL_LIBS $LXLIB -lX11 -lXt" if test -z $VTKHOME then AC_MSG_WARN(undefined VTKHOME variable which specify where vtk was compiled) -else + if test -f /usr/include/vtk/vtkPlane.h ; then + AC_MSG_RESULT(trying /usr) + VTKHOME="/usr" + fi +fi + +if test ! -z $VTKHOME +then LOCAL_INCLUDES="-I$VTKHOME/include/vtk $LOCAL_INCLUDES" LOCAL_LIBS="-L$VTKHOME/lib/vtk $LOCAL_LIBS" TRY_LINK_LIBS="-L$VTKHOME/lib/vtk $TRY_LINK_LIBS" diff --git a/salome_adm/unix/config_files/libtool.m4 b/salome_adm/unix/config_files/libtool.m4 index 8c5cd7d5a..f28545379 100644 --- a/salome_adm/unix/config_files/libtool.m4 +++ b/salome_adm/unix/config_files/libtool.m4 @@ -22,7 +22,7 @@ ## the same distribution terms that you use for the rest of that program. # serial 40 AC_PROG_LIBTOOL -AC_DEFUN(AC_PROG_LIBTOOL, +AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl # Save cache, so that ltconfig can load it @@ -52,7 +52,7 @@ AC_SUBST(LIBTOOL)dnl exec 5>>./config.log ]) -AC_DEFUN(AC_LIBTOOL_SETUP, +AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.13)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl @@ -137,16 +137,16 @@ esac ]) # AC_LIBTOOL_DLOPEN - enable checks for dlopen support -AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) +AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) # AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's -AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) # AC_ENABLE_SHARED - implement the --enable-shared flag # Usage: AC_ENABLE_SHARED[(DEFAULT)] # Where DEFAULT is either `yes' or `no'. If omitted, it defaults to # `yes'. -AC_DEFUN(AC_ENABLE_SHARED, [dnl +AC_DEFUN([AC_ENABLE_SHARED], [dnl define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE(shared, changequote(<<, >>)dnl @@ -172,14 +172,14 @@ enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl ]) # AC_DISABLE_SHARED - set the default shared flag to --disable-shared -AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no)]) # AC_ENABLE_STATIC - implement the --enable-static flag # Usage: AC_ENABLE_STATIC[(DEFAULT)] # Where DEFAULT is either `yes' or `no'. If omitted, it defaults to # `yes'. -AC_DEFUN(AC_ENABLE_STATIC, [dnl +AC_DEFUN([AC_ENABLE_STATIC], [dnl define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE(static, changequote(<<, >>)dnl @@ -205,7 +205,7 @@ enable_static=AC_ENABLE_STATIC_DEFAULT)dnl ]) # AC_DISABLE_STATIC - set the default static flag to --disable-static -AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no)]) @@ -213,7 +213,7 @@ AC_ENABLE_STATIC(no)]) # Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] # Where DEFAULT is either `yes' or `no'. If omitted, it defaults to # `yes'. -AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl +AC_DEFUN([AC_ENABLE_FAST_INSTALL], [dnl define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE(fast-install, changequote(<<, >>)dnl @@ -239,11 +239,11 @@ enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl ]) # AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install -AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no)]) # AC_PROG_LD - find the path to the GNU or non-GNU linker -AC_DEFUN(AC_PROG_LD, +AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH(gnu-ld, [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) @@ -313,7 +313,7 @@ test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_PROG_LD_GNU ]) -AC_DEFUN(AC_PROG_LD_GNU, +AC_DEFUN([AC_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. if $LD -v 2>&1 &5; then @@ -324,7 +324,7 @@ fi]) ]) # AC_PROG_NM - find the path to a BSD-compatible name lister -AC_DEFUN(AC_PROG_NM, +AC_DEFUN([AC_PROG_NM], [AC_MSG_CHECKING([for BSD-compatible nm]) AC_CACHE_VAL(ac_cv_path_NM, [if test -n "$NM"; then @@ -358,7 +358,7 @@ AC_MSG_RESULT([$NM]) ]) # AC_CHECK_LIBM - check for math library -AC_DEFUN(AC_CHECK_LIBM, +AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case "$lt_target" in @@ -385,7 +385,7 @@ esac # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and # top_srcdir appropriately in the Makefiles. -AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case "$enable_ltdl_convenience" in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes @@ -406,7 +406,7 @@ AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl # not flat and you're not using automake, define top_builddir and # top_srcdir appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. -AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, main, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then @@ -427,13 +427,13 @@ AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl ]) dnl old names -AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl -AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl -AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl -AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl -AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl -AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl -AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl +AC_DEFUN([AM_PROG_LIBTOOL], [indir([AC_PROG_LIBTOOL])])dnl +AC_DEFUN([AM_ENABLE_SHARED], [indir([AC_ENABLE_SHARED], $@)])dnl +AC_DEFUN([AM_ENABLE_STATIC], [indir([AC_ENABLE_STATIC], $@)])dnl +AC_DEFUN([AM_DISABLE_SHARED], [indir([AC_DISABLE_SHARED], $@)])dnl +AC_DEFUN([AM_DISABLE_STATIC], [indir([AC_DISABLE_STATIC], $@)])dnl +AC_DEFUN([AM_PROG_LD], [indir([AC_PROG_LD])])dnl +AC_DEFUN([AM_PROG_NM], [indir([AC_PROG_NM])])dnl dnl This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL])dnl diff --git a/salome_adm/unix/config_files/production.m4 b/salome_adm/unix/config_files/production.m4 index dfa8b39e9..dd6bce2d1 100644 --- a/salome_adm/unix/config_files/production.m4 +++ b/salome_adm/unix/config_files/production.m4 @@ -29,7 +29,7 @@ dnl author Patrick GOLDBRONN dnl # AC_ENABLE_PRODUCTION -AC_DEFUN(AC_ENABLE_PRODUCTION, [dnl +AC_DEFUN([AC_ENABLE_PRODUCTION], [dnl define([AC_ENABLE_PRODUCTION_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE(production, changequote(<<, >>)dnl @@ -68,10 +68,10 @@ fi ]) # AC_DISABLE_PRODUCTION - set the default flag to --disable-production -AC_DEFUN(AC_DISABLE_PRODUCTION, [AC_ENABLE_PRODUCTION(no)]) +AC_DEFUN([AC_DISABLE_PRODUCTION], [AC_ENABLE_PRODUCTION(no)]) # AC_ENABLE_DEBUG -AC_DEFUN(AC_ENABLE_DEBUG, [dnl +AC_DEFUN([AC_ENABLE_DEBUG], [dnl define([AC_ENABLE_DEBUG_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE(debug, changequote(<<, >>)dnl @@ -102,5 +102,5 @@ fi ]) # AC_DISABLE_DEBUG - set the default flag to --disable-debug -AC_DEFUN(AC_DISABLE_DEBUG, [AC_ENABLE_DEBUG(no)]) +AC_DEFUN([AC_DISABLE_DEBUG], [AC_ENABLE_DEBUG(no)]) diff --git a/salome_adm/unix/config_files/pyembed.m4 b/salome_adm/unix/config_files/pyembed.m4 index 78cf7f8d2..a1a2a34e6 100644 --- a/salome_adm/unix/config_files/pyembed.m4 +++ b/salome_adm/unix/config_files/pyembed.m4 @@ -22,7 +22,7 @@ dnl dnl This macro defines the PYTHON_EMBED_{CFLAGS,LDFLAGS,LIBS} substitutions dnl that should be used when embedding the python interpreter into a program. dnl AM_INIT_PYTHON_EMBED -AC_DEFUN(AM_INIT_PYTHON_EMBED, +AC_DEFUN([AM_INIT_PYTHON_EMBED], [AC_REQUIRE([AM_PATH_PYTHON]) AC_REQUIRE([AM_INIT_PYEXEC_MOD]) @@ -75,7 +75,7 @@ dnl table for python. The first argument should be the output filename. dnl The second argument gives the names of all the modules you want to build dnl into the executable. dnl AM_PYTHON_CREATE_CONFIG_C(CONFIG_C, MODULE ...) -AC_DEFUN(AM_PYTHON_CREATE_CONFIG_C, +AC_DEFUN([AM_PYTHON_CREATE_CONFIG_C], [AC_REQUIRE([AM_INIT_PYTHON_EMBED]) AC_MSG_CHECKING(for config.c.in) changequote(,)dnl diff --git a/salome_adm/unix/config_files/python.m4 b/salome_adm/unix/config_files/python.m4 index b99b9d138..a8013e290 100644 --- a/salome_adm/unix/config_files/python.m4 +++ b/salome_adm/unix/config_files/python.m4 @@ -34,7 +34,7 @@ dnl while those distributed as `classes' are installed under PYTHON_SITE dnl (eg, ./python1.5/site-packages). The default is to install as dnl a `module'. -AC_DEFUN(CHECK_PYTHON, +AC_DEFUN([CHECK_PYTHON], [ AC_ARG_WITH(python, [ --with-python=DIR root directory path of python installation ], diff --git a/salome_adm/unix/depend.in b/salome_adm/unix/depend.in index 09a46645a..080bf9a17 100644 --- a/salome_adm/unix/depend.in +++ b/salome_adm/unix/depend.in @@ -32,6 +32,11 @@ $(srcdir)/Dependencies: .depend depend:.depend +# when use the path as regexp, prevent taking "." for "any symbol" +srcdir_re = $(subst .,[.],$(srcdir)) +top_srcdir_re = $(subst .,[.],$(top_srcdir)) +top_builddir_re = $(subst .,[.],$(top_builddir)) + # we had Makefile target, because we want Makefile rebuild before include .depend .depend: $(LIB_DEP) $(TEST_SRC) $(BIN_DEP) @touch .depend @@ -44,9 +49,9 @@ depend:.depend obj=`basename $$dep .c`.lo; \ sed '\%^'"$$obj"':%,\%[^\\]$$%d' <$@ >$@- && mv $@- $@; \ $(CC) $(C_DEPEND_FLAG) $(CPPFLAGS) $$dep 2>/dev/null | \ - sed 's% $(srcdir)/% $$(srcdir)/%g' | \ - sed 's% $(top_srcdir)/% $$(top_srcdir)/%g' | \ - sed 's% $(top_builddir)/% $$(top_builddir)/%g' | \ + sed 's% $(srcdir_re)/% $$(srcdir)/%g' | \ + sed 's% $(top_srcdir_re)/% $$(top_srcdir)/%g' | \ + sed 's% $(top_builddir_re)/% $$(top_builddir)/%g' | \ sed 's/\.o/.lo/' >>$@; \ ;; \ *.cc) \ @@ -54,9 +59,9 @@ depend:.depend obj=`basename $$dep .cc`.lo; \ sed '\%^'"$$obj"':%,\%[^\\]$$%d' <$@ >$@- && mv $@- $@; \ $(CXX) $(CXX_DEPEND_FLAG) $(CXXFLAGS) $(CPPFLAGS) $$dep 2>/dev/null | \ - sed 's% $(srcdir)/% $$(srcdir)/%g' | \ - sed 's% $(top_srcdir)/% $$(top_srcdir)/%g' | \ - sed 's% $(top_builddir)/% $$(top_builddir)/%g' | \ + sed 's% $(srcdir_re)/% $$(srcdir)/%g' | \ + sed 's% $(top_srcdir_re)/% $$(top_srcdir)/%g' | \ + sed 's% $(top_builddir_re)/% $$(top_builddir)/%g' | \ sed 's/\.o/.lo/' >>$@; \ ;; \ *.cxx) \ @@ -64,9 +69,9 @@ depend:.depend obj=`basename $$dep .cxx`.lo; \ sed '\%^'"$$obj"':%,\%[^\\]$$%d' <$@ >$@- && mv $@- $@; \ $(CXX) $(CXX_DEPEND_FLAG) $(CXXFLAGS) $(CPPFLAGS) $$dep 2>/dev/null | \ - sed 's% $(srcdir)/% $$(srcdir)/%g' | \ - sed 's% $(top_srcdir)/% $$(top_srcdir)/%g' | \ - sed 's% $(top_builddir)/% $$(top_builddir)/%g' | \ + sed 's% $(srcdir_re)/% $$(srcdir)/%g' | \ + sed 's% $(top_srcdir_re)/% $$(top_srcdir)/%g' | \ + sed 's% $(top_builddir_re)/% $$(top_builddir)/%g' | \ sed 's/\.o/.lo/' >>$@; \ ;; \ esac; \ diff --git a/salome_adm/unix/make_commence.in b/salome_adm/unix/make_commence.in index 620cfd9ff..8cc3f4c46 100644 --- a/salome_adm/unix/make_commence.in +++ b/salome_adm/unix/make_commence.in @@ -55,6 +55,11 @@ LSF_INCLUDES = @LSF_INCLUDES@ LSF_LIBDIR = @LSF_LDFLAGS@ LSF_LIBS = @LSF_LIBS@ +# CPPUNIT + +CPPUNIT_INCLUDES = @CPPUNIT_INCLUDES@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ + # JAVA #JAVA_INCLUDES = @JAVA_INCLUDES@ @@ -77,10 +82,13 @@ QT_INCLUDES = @QT_INCLUDES@ QT_MT_INCLUDES = @QT_INCLUDES@ -DQT_THREAD_SUPPORT QT_LIBS = @QT_LIBS@ QT_MT_LIBS = @QT_MT_LIBS@ +QT_VERS = @QT_VERS@ MOC = @MOC@ UIC = @UIC@ +# msg2qm +MSG2QM = @MSG2QM@ #QWT @@ -98,6 +106,7 @@ PYQT_SIPS = @PYQT_SIPS@ PYQT_LIBS = @PYQT_LIBS@ PYQT_INCLUDES = @PYQT_INCLUDES@ PYUIC = @PYUIC@ +PYQT_SIPFLAGS = @PYQT_SIPFLAGS@ # openGL OGL_INCLUDES=@OGL_INCLUDES@ @@ -113,12 +122,6 @@ HDF5_INCLUDES=@HDF5_INCLUDES@ HDF5_LIBS=@HDF5_LIBS@ HDF5_MT_LIBS=@HDF5_MT_LIBS@ -# MED2 - -MED2_INCLUDES=@MED2_INCLUDES@ -MED2_LIBS=@MED2_LIBS@ -MED2_MT_LIBS=@MED2_MT_LIBS@ - # OpenCasCade OCC_INCLUDES=@CAS_CPPFLAGS@ @@ -192,6 +195,7 @@ CXXFLAGS+= $(CORBA_CXXFLAGS) # add corba libs when link salome application ! #LDFLAGS+= $(CORBA_LIBS) LIBS+=$(CORBA_LIBS) +LIBSFORBIN+=$(CORBA_LIBS) DOXYGEN = @DOXYGEN@ @@ -275,8 +279,8 @@ ac_cxx_mutable.m4 check_mico.m4 libtool.m4 \ ac_cxx_namespaces.m4 check_omniorb.m4 pyembed.m4 \ ac_cxx_partial_specialization.m4 check_opengl.m4 python.m4 \ ac_cxx_typename.m4 check_pthreads.m4 check_cas.m4 \ -ac_cc_warnings.m4 check_qt.m4 check_med2.m4 \ -check_swig.m4 check_boost.m4 +ac_cc_warnings.m4 check_qt.m4 check_swig.m4 \ +check_boost.m4 $(top_srcdir)/aclocal.m4: $(ACLOCAL_SRC:%=@KERNEL_ROOT_DIR@/salome_adm/unix/config_files/%) cd $(top_srcdir) ; aclocal --acdir=adm_local/unix/config_files -I @KERNEL_ROOT_DIR@/salome_adm/unix/config_files diff --git a/salome_adm/unix/make_conclude.in b/salome_adm/unix/make_conclude.in index 2b8f95495..d5d4a5d14 100644 --- a/salome_adm/unix/make_conclude.in +++ b/salome_adm/unix/make_conclude.in @@ -38,6 +38,7 @@ LIB_OBJ = $(LIB_OBJ_CXX) $(LIB_OBJ_CC) $(LIB_OBJ_C) $(LIB_CLIENT_OBJ:%.o=%.lo) $ # LIB_BUILD = $(LIB:%.la=$(top_builddir)/lib/salome/%.la) LIB_BUILD = $(patsubst %.la, $(top_builddir)/lib/salome/%.la, $(filter %.la, $(LIB))) LIB_BUILD_A = $(patsubst %.a, $(top_builddir)/lib/salome/%.a, $(filter %.a, $(LIB))) +LIB_BUILD_SO = $(patsubst %.so, $(top_builddir)/lib/salome/%.so, $(filter %.so, $(LIB))) ifneq ($(findstring cmodule.la,$(filter %.la, $(LIB))),) LIB_SWIG = $(patsubst %cmodule.la,%.so, $(filter %.la, $(LIB))) @@ -45,7 +46,7 @@ else LIB_SWIG = endif -lib: $(LIB_BUILD) $(LIB_CLIENT_PY) +lib: $(LIB_BUILD) $(LIB_BUILD_SO) $(LIB_CLIENT_PY) # we don't build static library ! $(LIB_BUILD): $(top_builddir)/lib/salome/%.la: %.la @@ -58,7 +59,7 @@ $(LIB_BUILD): $(top_builddir)/lib/salome/%.la: %.la ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<).0 \ $(patsubst %.la, %.so, $@).0 || true - if test "X$(LIB_SWIG)" != X; then \ + if ! test -z $(LIB_SWIG) ; then \ ln -sf $(patsubst %.la,%.so, $(CURDIR)/.libs/$<) $(top_builddir)/lib/salome/_$(LIB_SWIG) || true;\ fi; @@ -66,8 +67,12 @@ $(LIB_BUILD_A): $(top_builddir)/lib/salome/%.a: %.a -$(RM) $@ ln -sf $(CURDIR)/$< $@ || true +$(LIB_BUILD_SO): $(top_builddir)/lib/salome/%.so: %.so + -$(RM) $@ + ln -sf $(CURDIR)/$< $@ || true + $(LIB): $(LIB_OBJ) - @$(LT) --mode=link $(CXX) -rpath $(libdir) -o $@ $(CXXFLAGS) $(LIB_OBJ) $(LDFLAGS) $(LIBS) + @$(LT) --mode=link $(CXX) -shared -rpath $(libdir) -o $@ $(CXXFLAGS) $(LIB_OBJ) $(LDFLAGS) $(LIBS) # transform idl reference in appropriate obj file BIN_CLIENT_SRC = $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_CXX)) @@ -147,20 +152,32 @@ $(DEST_HEADERS): $(inc_builddir)/%: % cp -f $< $@ # build resources file (icons and messages) : .qm file from .po file -resources: $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm) +RESOURCES_FILES_ALL := $(notdir $(wildcard $(srcdir)/resources/*)) +RESOURCES_FILES_ALL := $(filter-out CVS, $(RESOURCES_FILES_ALL)) +RESOURCES_FILES_ALL := $(filter-out %.po, $(RESOURCES_FILES_ALL)) +RESOURCES_FILES ?= $(RESOURCES_FILES_ALL) + +resources: resources-po resources-cp + +resources-po: $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm) + +resources-cp: $(RESOURCES_FILES:%=$(top_builddir)/share/salome/resources/%) + +$(RESOURCES_FILES:%=$(top_builddir)/share/salome/resources/%): $(top_builddir)/share/salome/resources/% : % + cp -fr $< $@; # Make installation directories if they don't exist. $(libdir) $(includedir) $(bindir) $(datadir) $(idldir) $(sharedpydir): $(INSTALL) -d $@ && chmod 755 $@ # Install the library, the public header files, and programs. -install: $(LIB) $(BIN) $(TEST_PROGS) $(libdir) $(includedir) $(bindir) $(datadir) $(idldir) install-python install-sharedpyqt install-qm +install: $(LIB) $(BIN) $(TEST_PROGS) $(libdir) $(includedir) $(bindir) $(datadir) $(idldir) install-python install-sharedpyqt install-qm install-res @for f in X $(LIB); do \ if test $$f != X; then \ ($(LT_INSTALL_LIB) $$f $(libdir)/. || exit 1); \ fi; \ done - @if test "X$(LIB_SWIG)" != X; then \ + @if ! test -z $(LIB_SWIG) ; then \ (cd $(libdir); ln -sf $(patsubst %.so, %cmodule.so, $(LIB_SWIG)) _$(LIB_SWIG) || true); \ fi; @for f in X $(BIN); do \ @@ -213,6 +230,15 @@ install-qm: resources fi; \ done +# generic rule to install resources files (png, ini ...): +install-res: resources + $(INSTALL) -d $(datadir)/resources + @for f in X $(RESOURCES_FILES:%=$(top_builddir)/share/salome/resources/%); do \ + if test $$f != X; then \ + ($(INSTALL_DATA) $$f $(datadir)/resources/. || exit 1); \ + fi; \ + done + # Removes those things that `make install' (would have) installed. uninstall: @if test "X$(LIB)" != X; then \ @@ -353,11 +379,7 @@ distclean: clean $(SWIG) $(SWIG_FLAGS) -o $@ $< $(top_builddir)/share/salome/resources/%.qm: %.po - if test -e ${KERNEL_ROOT_DIR}/bin/salome/msg2qm ; then \ - ${KERNEL_ROOT_DIR}/bin/salome/msg2qm $< $@ ; \ - else \ - $(top_builddir)/bin/salome/msg2qm $< $@ ; \ - fi + $(MSG2QM) $< $@ ; \ #------------------------------------------------------------------------------ # The following section of this makefile contains dependencies between the diff --git a/salome_adm/unix/make_module.in b/salome_adm/unix/make_module.in index 2d08f49ba..cb1312023 100644 --- a/salome_adm/unix/make_module.in +++ b/salome_adm/unix/make_module.in @@ -45,13 +45,18 @@ depend: done # copy all resources files in common directory +RESOURCES_FILES_ALL := $(notdir $(wildcard $(srcdir)/resources/*)) +RESOURCES_FILES_ALL := $(filter-out CVS, $(RESOURCES_FILES_ALL)) +RESOURCES_FILES_ALL := $(filter-out %.po, $(RESOURCES_FILES_ALL)) +RESOURCES_FILES ?= $(RESOURCES_FILES_ALL) + resources: $(RESOURCES_FILES:%=$(top_builddir)/share/salome/resources/%) @@SETX@; for d in $(SUBDIRS); do \ (cd $$d && $(MAKE) $@) || exit 1; \ done $(RESOURCES_FILES:%=$(top_builddir)/share/salome/resources/%): $(top_builddir)/share/salome/resources/% : % - cp -f $< $@ + cp -fr $< $@; data: @if test "X$(top_builddir)" = "X."; then \ diff --git a/src/Basics/BasicsGenericDestructor.cxx b/src/Basics/BasicsGenericDestructor.cxx new file mode 100644 index 000000000..91585a2ae --- /dev/null +++ b/src/Basics/BasicsGenericDestructor.cxx @@ -0,0 +1,192 @@ +// SALOME Basics : general SALOME definitions and tools (C++ part - no CORBA) +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGenericDestructor.cxx +// Author : Antoine YESSAYAN, Paul RASCLE, EDF +// Module : SALOME +// $Header$ + +#include +#include +#include + +#include "BasicsGenericDestructor.hxx" + +using namespace std; + +void HouseKeeping(); + +std::list PROTECTED_DELETE::_objList; +pthread_mutex_t PROTECTED_DELETE::_listMutex; + +std::list *GENERIC_DESTRUCTOR::Destructors = 0; +static bool atExitSingletonDone = false ; + +// ============================================================================ +/*! + * deleteInstance deletes only once the object. Only object present on the + * static list of PROTECTED_DELETE* are deleted, then removed of the list. + * The operation is protected by a mutex. + */ +// ============================================================================ + +void PROTECTED_DELETE::deleteInstance(PROTECTED_DELETE *anObject) + { + if (std::find(_objList.begin(), _objList.end(),anObject) == _objList.end()) + return; + else + { + int ret; + ret = pthread_mutex_lock(&_listMutex); // acquire lock, an check again + if (std::find(_objList.begin(), _objList.end(), anObject) + != _objList.end()) + { + DEVTRACE("PROTECTED_DELETE::deleteInstance1 " << anObject); + delete anObject; + DEVTRACE("PROTECTED_DELETE::deleteInstance2 " << &_objList); + _objList.remove(anObject); + } + ret = pthread_mutex_unlock(&_listMutex); // release lock + } + } + +// ============================================================================ +/*! + * To allow a further destruction of a PRTECTED_DELETE object, it must be added + * to the static list of PROTECTED_DELETE* + */ +// ============================================================================ + +void PROTECTED_DELETE::addObj(PROTECTED_DELETE *anObject) +{ + DEVTRACE("PROTECTED_DELETE::addObj " << anObject); + _objList.push_back(anObject); +} + +// ============================================================================ +/*! + * Herited classes have there own destructors + */ +// ============================================================================ + +PROTECTED_DELETE::~PROTECTED_DELETE() +{ + DEVTRACE("PROTECTED_DELETE::~PROTECTED_DELETE()"); +} + +// ============================================================================ +/*! + * To execute only once GENERIC_DESTRUCTOR::HouseKeeping et the end of process, + * a dedicated object is created, as a singleton: atExitSingleton. + * When the singleton is created, the HouseKeeping() function is registered in + * atExit(). + * Destructors is a list created on heap, and deleted by HouseKeeping(), with + * the list content. + */ +// ============================================================================ + +class atExitSingleton +{ +public: + atExitSingleton(bool Make_ATEXIT) + { + if (Make_ATEXIT && !atExitSingletonDone) + { + DEVTRACE("atExitSingleton(" << Make_ATEXIT << ")"); + assert(GENERIC_DESTRUCTOR::Destructors == 0); + GENERIC_DESTRUCTOR::Destructors = new std::list; + int cr = atexit(HouseKeeping); + assert(cr == 0); + atExitSingletonDone = true; + } + } + + ~atExitSingleton() + { + DEVTRACE("atExitSingleton::~atExitSingleton()"); + } +}; + +//! static singleton for atExitSingleton class + +static atExitSingleton HouseKeeper = atExitSingleton(false); + +// ============================================================================ +/*! + * Executes all objects of type DESTRUCTOR_OF in the Destructors list. + * Deletes all objects of type DESTRUCTOR_OF in the Destructors list. + * Deletes the list. + */ +// ============================================================================ + +void HouseKeeping( void ) +{ + DEVTRACE("HouseKeeping()"); + assert(GENERIC_DESTRUCTOR::Destructors); + if(GENERIC_DESTRUCTOR::Destructors->size()) + { + std::list::iterator it = + GENERIC_DESTRUCTOR::Destructors->end(); + + do + { + it-- ; + GENERIC_DESTRUCTOR* ptr = *it ; + DEVTRACE("HouseKeeping() " << typeid(ptr).name()); + (*ptr)(); + delete ptr ; + } + while (it != GENERIC_DESTRUCTOR::Destructors->begin()) ; + + DEVTRACE("HouseKeeping() end list "); + GENERIC_DESTRUCTOR::Destructors->clear() ; + assert(GENERIC_DESTRUCTOR::Destructors->size() == 0); + assert(GENERIC_DESTRUCTOR::Destructors->empty()); + DEVTRACE("HouseKeeping()after clear "); + } + + delete GENERIC_DESTRUCTOR::Destructors; + GENERIC_DESTRUCTOR::Destructors = 0; + DEVTRACE("HouseKeeping() very end "); + return ; +} + +// ============================================================================ +/*! + * Adds a destruction object to the list of actions to be performed at the end + * of the process + */ +// ============================================================================ + +const int GENERIC_DESTRUCTOR::Add(GENERIC_DESTRUCTOR &anObject) +{ + DEVTRACE("GENERIC_DESTRUCTOR::Add("<push_back(&anObject); + return Destructors->size(); +} diff --git a/src/Basics/BasicsGenericDestructor.hxx b/src/Basics/BasicsGenericDestructor.hxx new file mode 100644 index 000000000..a5d934dd8 --- /dev/null +++ b/src/Basics/BasicsGenericDestructor.hxx @@ -0,0 +1,186 @@ +// SALOME Basics : general SALOME definitions and tools (C++ part - no CORBA) +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BasicGenericDestructor.hxx +// Author : Antoine YESSAYAN, Paul RASCLE, EDF +// Module : SALOME +// $Header$ + +#ifndef _BASICGENERICDESTRUCTOR_HXX_ +#define _BASICGENERICDESTRUCTOR_HXX_ + +#include +#include +#include +#include +#include +#include +#include + +#if defined BASICS_EXPORTS +#if defined WIN32 +#define BASICS_EXPORT __declspec( dllexport ) +#else +#define BASICS_EXPORT +#endif +#else +#if defined WNT +#define BASICS_EXPORT __declspec( dllimport ) +#else +#define BASICS_EXPORT +#endif +#endif + +//#define _DEVDEBUG_ + +#ifdef _DEVDEBUG_ +#define MYDEVTRACE {std::cerr << __FILE__ << " [" << __LINE__ << "] : ";} +#define DEVTRACE(msg) {MYDEVTRACE; std::cerr< _objList; + +private: + static pthread_mutex_t _listMutex; +}; + +// ============================================================================ +/*! + * The GENERIC_DESTRUCTOR abstract class describes the comportement of any + * destruction object. This type is used to create a list of miscellaneous + * destruction objects. + * + * The only way to use the GENERIC_DESTRUCTOR class is inheritance: + * class SPECIFIC_DESTRUCTOR : public GENERIC_DESTRUCTOR + * + * A generic destructor provides two methods: + * -# a static method to add a destruction (object) to be performed: + * GENERIC_DESTRUCTOR::Add(GENERIC_DESTRUCTOR &anObject); + * The Destruction object is stored in a list of pointer to + * GENERIC_DESTRUCTOR objects. + * -# an object method to execute the destruction : operator()(). + */ +// ============================================================================ + +class GENERIC_DESTRUCTOR +{ +public : + BASICS_EXPORT static std::list *Destructors; + + virtual ~GENERIC_DESTRUCTOR() {}; + BASICS_EXPORT static const int Add(GENERIC_DESTRUCTOR &anObject); + BASICS_EXPORT virtual void operator()(void) = 0; +}; + +// ============================================================================ +/*! + * The DESTRUCTOR_OF class allows the user to program - at any moment - the + * destruction of an object at the end of the process. + * + * Example: the POINT ptrPoint will be destroyed at the end of the process + * (atexit). + * + * POINT *ptrPoint = new POINT ; + * + * DESTRUCTOR_OF *ptrDestruct = new DESTRUCTOR_OF(*ptrPoint); + * + * Note that neither ptrPoint, nor ptrDestruct should be destroyed by the user. + * + * The destruction object must be created dynamically because it suscribes + * itself in the list of destruction to be performed at the end of the process. + */ +// ============================================================================ + +template class DESTRUCTOR_OF : public GENERIC_DESTRUCTOR +{ + +public: + /*! + Programs the destruction at the end of the process, of the object anObject. + This method records in _objectPtr the address of an object to be destroyed + at the end of the process + */ + DESTRUCTOR_OF(TYPE &anObject): + _objectPtr(&anObject) + { + DEVTRACE(" DESTRUCTOR_OF " << typeid(anObject).name() + << " " << _objectPtr << " " << this ); + PROTECTED_DELETE::addObj(_objectPtr); + assert(GENERIC_DESTRUCTOR::Add(*this) >= 0); + } + + /*! + Performs the destruction of the object. + This method really destroys the object pointed by _objectPtr. + It should be called at the end of the process (i.e. at exit). + */ + virtual void operator()(void) + { + if (_objectPtr) + { + DEVTRACE("DESTRUCTOR_OF<>::operator() " << _objectPtr); + if (_objectPtr) PROTECTED_DELETE::deleteInstance(_objectPtr); + _objectPtr = NULL; + } + } + + virtual ~DESTRUCTOR_OF() + { + DEVTRACE("~DESTRUCTOR_OF() " << this); + assert(!_objectPtr); + } + +private: + TYPE *_objectPtr; +}; + +# endif diff --git a/src/Basics/Makefile.in b/src/Basics/Makefile.in new file mode 100644 index 000000000..612581468 --- /dev/null +++ b/src/Basics/Makefile.in @@ -0,0 +1,52 @@ +# Basics: General purpose C++ +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE (EDF) +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS= \ + BasicsGenericDestructor.hxx + +EXPORT_PYSCRIPTS = + +# Libraries targets + +LIB = libSALOMEBasics.la +LIB_SRC = BasicsGenericDestructor.cxx + +LIBS= @LIBS@ +#LDFLAGS+= + + +@CONCLUDE@ diff --git a/src/Basics/Test/BasicMainTest.hxx b/src/Basics/Test/BasicMainTest.hxx new file mode 100644 index 000000000..54b2db9ee --- /dev/null +++ b/src/Basics/Test/BasicMainTest.hxx @@ -0,0 +1,69 @@ +#ifndef _BASICMAINTEST_HXX_ +#define _BASICMAINTEST_HXX_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// ============================================================================ +/*! + * Main program source for Unit Tests with cppunit package does not depend + * on actual tests, so we use the same for all partial unit tests. + */ +// ============================================================================ + +int main(int argc, char* argv[]) +{ + // --- Create the event manager and test controller + CPPUNIT_NS::TestResult controller; + + // --- Add a listener that colllects test result + CPPUNIT_NS::TestResultCollector result; + controller.addListener( &result ); + + // --- Add a listener that print dots as test run. +#ifdef WIN32 + CPPUNIT_NS::TextTestProgressListener progress; +#else + CPPUNIT_NS::BriefTestProgressListener progress; +#endif + controller.addListener( &progress ); + + // --- Get the top level suite from the registry + + CPPUNIT_NS::Test *suite = + CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest(); + + // --- Adds the test to the list of test to run + + CPPUNIT_NS::TestRunner runner; + runner.addTest( suite ); + runner.run( controller); + + // --- Print test in a compiler compatible format. + + std::ofstream testFile; + testFile.open("UnitTestsResult", std::ios::out | std::ios::trunc); + //CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr ); + CPPUNIT_NS::CompilerOutputter outputter( &result, testFile ); + outputter.write(); + + // --- Run the tests. + + bool wasSucessful = result.wasSuccessful(); + testFile.close(); + + // --- Return error code 1 if the one of test failed. + + return wasSucessful ? 0 : 1; +} + +#endif diff --git a/src/Basics/Test/Makefile.in b/src/Basics/Test/Makefile.in new file mode 100644 index 000000000..c98aadb0c --- /dev/null +++ b/src/Basics/Test/Makefile.in @@ -0,0 +1,61 @@ +# Basics: General purpose C++ +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE (EDF) +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS= BasicMainTest.hxx + +EXPORT_PYSCRIPTS = + +# Libraries targets + +LIB = +LIB_SRC = + +# Executables targets + +BIN = +BIN_SRC = + +CXXFLAGS += @CPPUNIT_INCLUDES@ +CPPFLAGS += @CPPUNIT_INCLUDES@ + +LIBS= @LIBS@ @CPPUNIT_LIBS@ + +LDFLAGS+= + +LDFLAGSFORBIN+= + +@CONCLUDE@ diff --git a/src/CASCatch/CASCatch_CatchSignals.cxx b/src/CASCatch/CASCatch_CatchSignals.cxx new file mode 100644 index 000000000..955743f00 --- /dev/null +++ b/src/CASCatch/CASCatch_CatchSignals.cxx @@ -0,0 +1,314 @@ +#include "CASCatch_CatchSignals.hxx" + +#include "CASCatch_Failure.hxx" +#include "CASCatch_ErrorHandler.hxx" +#include + +#define MAX_HANDLER_NUMBER 6 + + +//================================================================================ +/*! Public - + * \brief creates a CASCatch_CatchSignals + */ +//================================================================================ +CASCatch_CatchSignals::CASCatch_CatchSignals() + :myIsActivated(Standard_False) +{ + + Standard_Integer i = 0; + for(; i<=MAX_HANDLER_NUMBER; i++) + mySigStates[i] = NULL; +} + +#ifndef WNT + +//================================ UNIX part ================================================== + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef LIN +#include +#endif + +//============================== +typedef void (ACT_SIGIO_HANDLER)(void) ; + +ACT_SIGIO_HANDLER *ADR_ACT_SIGIO_HANDLER = NULL ; + +typedef void (* SIG_PFV) (int); + +#ifdef SUN +# include +#endif + +#ifdef SOLARIS +# include +# include +# include +# include +#endif + +#include +#include + +#ifdef LIN +# include +# include +#else +# ifdef SA_SIGINFO +# ifndef AIX +# include +# endif +# endif +#endif + + +#ifdef IRIX +# include +# include +#endif + + +//================================================================================ +/*! Private - + * \brief universal handler for signals + */ +//================================================================================ +static void Handler(const OSD_Signals theSig, const OSD_Signals) +{ + sigset_t set; + sigemptyset(&set); + sigaddset(&set, theSig); + sigprocmask(SIG_UNBLOCK, &set, NULL) ; + + TCollection_AsciiString aMessage(theSig); + aMessage+=" signal detected"; + + CASCatch_Failure::Raise(aMessage.ToCString()); +} + + +#ifdef SA_SIGINFO +//================================================================================ +/*! Private - + * \brief handler for SIGSEGV signal + */ +//================================================================================ +static void SegvHandler(const OSD_Signals, const Standard_Address, const Standard_Address) +{ + sigset_t set; + sigemptyset(&set); + sigaddset(&set, SIGSEGV); + sigprocmask (SIG_UNBLOCK, &set, NULL); + + CASCatch_Failure::Raise("SIGSEGV detected"); +} +#endif + + +//================================================================================ +/*! Public - + * \brief activates a signals handling + */ +//================================================================================ +void CASCatch_CatchSignals::Activate() +{ + if(myIsActivated) return; + + struct sigaction act; + + Standard_Integer i = 0; + for(; i<=MAX_HANDLER_NUMBER; i++) + mySigStates[i] = new struct sigaction(); //Initialize structures + + int stat; + act.sa_handler = (SIG_PFV) &Handler ; + sigemptyset(&act.sa_mask) ; + + + stat = sigaction(SIGHUP,&act,(struct sigaction*)mySigStates[0]); // ...... hangup + stat = sigaction(SIGFPE,&act,(struct sigaction*) mySigStates[1]); // ...... floating point exception + stat = sigaction(SIGINT,&act,(struct sigaction*)mySigStates[2]); // ...... interrupt + stat = sigaction(SIGQUIT,&act,(struct sigaction*)mySigStates[3]); // ...... quit + stat = sigaction(SIGBUS,&act,(struct sigaction*)mySigStates[4]); // ...... bus error + stat = sigaction(SIGILL,&act,(struct sigaction*)mySigStates[5]); // ...... illegal instruction + +#ifdef SA_RESTART + act.sa_flags = SA_RESTART ; +#else + act.sa_flags = 0 ; +#endif + act.sa_handler = (SIG_PFV) &SegvHandler ; + +#ifdef SA_SIGINFO // OSF,SOLARIS,IRIX + act.sa_flags = act.sa_flags | SA_SIGINFO ; +# ifdef SOLARIS + act.sa_sigaction = (void(*)(int, siginfo_t *, void*)) &SegvHandler ; +# endif +#endif + + stat = sigaction( SIGSEGV , &act , (struct sigaction*)mySigStates[6]); // ...... segmentation violation + + myIsActivated = Standard_True; +} + + +//================================================================================ +/*! Public - + * \brief deactivates a signals handling + */ +//================================================================================ +void CASCatch_CatchSignals::Deactivate() +{ + if(!myIsActivated) return; + + struct sigaction oact; + int stat; + + stat = sigaction(SIGHUP,(struct sigaction*)mySigStates[0],&oact); // ...... hangup + stat = sigaction(SIGFPE,(struct sigaction*)mySigStates[1],&oact); // ...... floating point exception + stat = sigaction(SIGINT,(struct sigaction*)mySigStates[2],&oact); // ...... interrupt + stat = sigaction(SIGQUIT,(struct sigaction*)mySigStates[3],&oact); // ...... quit + stat = sigaction(SIGBUS,(struct sigaction*)mySigStates[4],&oact); // ...... bus error + stat = sigaction(SIGILL,(struct sigaction*)mySigStates[5],&oact); // ...... illegal instruction + stat = sigaction(SIGSEGV,(struct sigaction*)mySigStates[6],&oact); // ...... segmentation violation + + + Standard_Integer i = 0; + for(; i<=MAX_HANDLER_NUMBER; i++) + delete (struct sigaction*)mySigStates[i]; + + myIsActivated = Standard_False; +} + + + +#else +//====================================== WNT part ==================================================== +#include + +#include +#include +#include + +#define _OSD_FPX ( _EM_DENORMAL | _EM_INEXACT | _EM_UNDERFLOW | _EM_ZERODIVIDE | _EM_OVERFLOW) //Mask these exceptions + +//================================================================================ +/*! Private - + * \brief handler for unexpected exceptions + */ +//================================================================================ +static Standard_Integer WntHandler(const Standard_Address theExceptionInfo) +{ + LPEXCEPTION_POINTERS lpXP = ( LPEXCEPTION_POINTERS )theExceptionInfo; + DWORD dwExceptionCode = lpXP -> ExceptionRecord -> ExceptionCode; + + TCollection_AsciiString aMessage((Standard_Integer)dwExceptionCode); + aMessage+=" Exception code - unexpected exception"; + + CASCatch_Failure::Raise(aMessage.ToCString()); + + return EXCEPTION_EXECUTE_HANDLER; +} + +void SIGWntHandler(int , int ) ; +static void (*SIGWNTHANDLER)(int) = ( void (*)(int) ) ( &SIGWntHandler ) ; + + +//================================================================================ +/*! Private - + * \brief handler for signals + */ +//================================================================================ +static void SIGWntHandler(const int signum , const int theCode) +{ + + void (*OLDSIGWNTHANDLER)(int) ; + switch( signum ) { + case SIGFPE : + _fpreset() ; + _clearfp() ; + _controlfp ( _OSD_FPX, _MCW_EM ); + OLDSIGWNTHANDLER = signal( signum , SIGWNTHANDLER ); + + if(theCode == _FPE_UNDERFLOW || theCode == _FPE_INEXACT) return; + CASCatch_Failure::Raise ("Floating point error"); + break; + case SIGSEGV : + OLDSIGWNTHANDLER = signal( signum , SIGWNTHANDLER ); + CASCatch_Failure::Raise("Access violation"); + break; + case SIGILL : + OLDSIGWNTHANDLER = signal( signum , SIGWNTHANDLER ); + CASCatch_Failure::Raise("Illegal instruction" ); + break; + } +} + + +//================================================================================ +/*! Public - + * \brief activates a signals handling + */ +//================================================================================ +void CASCatch_CatchSignals::Activate() +{ + if(myIsActivated) return; + + mySigStates[0] = SetUnhandledExceptionFilter (( LPTOP_LEVEL_EXCEPTION_FILTER )&WntHandler); + + myFloatOpWord = _controlfp(0, 0); + _controlfp ( _OSD_FPX, _MCW_EM ); //Enable floating point exceptions + + mySigStates[1] = signal( SIGSEGV , SIGWNTHANDLER ); + mySigStates[2] = signal( SIGFPE , SIGWNTHANDLER ); + mySigStates[3] = signal( SIGILL , SIGWNTHANDLER ); + + myIsActivated = Standard_True; +} + +//================================================================================ +/*! Public - + * \brief deactivates a signals handling + */ +//================================================================================ +void CASCatch_CatchSignals::Deactivate() +{ + if(!myIsActivated) return; + + SetUnhandledExceptionFilter (( LPTOP_LEVEL_EXCEPTION_FILTER )mySigStates[0]); + + _controlfp ( myFloatOpWord, _MCW_EM ); + + signal( SIGSEGV , ( void (*)(int) )mySigStates[1]); + signal( SIGFPE , ( void (*)(int) )mySigStates[2]); + signal( SIGILL , ( void (*)(int) )mySigStates[3]); + + Standard_Integer i = 0; + for(; i<=MAX_HANDLER_NUMBER; i++) + mySigStates[i] = NULL; + + myIsActivated = Standard_False; +} + +#endif + +//================================================================================ +/*! Private - + * \brief deactivates a signals handling + */ +//================================================================================ +void CASCatch_CatchSignals::Destroy() +{ + if(myIsActivated) Deactivate(); +} + diff --git a/src/CASCatch/CASCatch_CatchSignals.hxx b/src/CASCatch/CASCatch_CatchSignals.hxx new file mode 100644 index 000000000..27134aa52 --- /dev/null +++ b/src/CASCatch/CASCatch_CatchSignals.hxx @@ -0,0 +1,44 @@ + +#ifndef _CASCatch_CatchSignals_HeaderFile +#define _CASCatch_CatchSignals_HeaderFile + +#include + +/*! + * \class CASCatch_CatchSignals + * \brief This class controls an exception handling + * + */ +class CASCatch_CatchSignals { + +public: + + // Methods PUBLIC + // +Standard_EXPORT CASCatch_CatchSignals(); +Standard_EXPORT void Destroy() ; +~CASCatch_CatchSignals() { Destroy(); } +Standard_EXPORT void Activate() ; +Standard_EXPORT void Deactivate() ; + +private: + +/*!\var mySigStates[7], private + * \brief stores signals' handler functions + */ +Standard_Address mySigStates[7]; + +/*!\var myFloatOpWord + * \brief stores a float operation word, private + */ +Standard_Integer myFloatOpWord; + +/*!\var myIsActivated + * \brief stores a flag whether a catcher is activated, private] + */ +Standard_Boolean myIsActivated; + +}; + + +#endif diff --git a/src/CASCatch/CASCatch_ErrorHandler.cxx b/src/CASCatch/CASCatch_ErrorHandler.cxx new file mode 100644 index 000000000..a8784301e --- /dev/null +++ b/src/CASCatch/CASCatch_ErrorHandler.cxx @@ -0,0 +1,103 @@ + +#ifdef NO_CXX_EXCEPTION + +#include "CASCatch_ErrorHandler.hxx" + +// During setjmp()/longjmp() K_SETJMP_CASCatch is non zero (try) +// So if there is an abort request and if K_SETJMP_CASCatch is non zero, the abort +// request will be ignored. If the abort request do a raise during a setjmp +// or a longjmp, there will be a "terminating SEGV" impossible to handle. + + +Standard_EXPORT int K_SETJMP_CASCatch = 0 ; + +static Handle(CASCatch_Failure) GlbError; //Last caught Error, Null if there is no error + +static CASCatch_ErrorHandler* Top = 0; //The top of the Errors Stack + +//======================================================================= +//function : CASCatch_ErrorHandler +//purpose : Constructor +//======================================================================= +CASCatch_ErrorHandler::CASCatch_ErrorHandler () +{ + Previous = Top; + Top = this; + CaughtError.Nullify(); + GlbError.Nullify(); +} + +//======================================================================= +//function : ~CASCatch_ErrorHandler +//purpose : Destructor : Delete the ErrorHandler and Abort if there is a 'Error'. +//======================================================================= +CASCatch_ErrorHandler::~CASCatch_ErrorHandler() +{ + Top = Top->Previous; + if( !GlbError.IsNull() ) Abort(); +} + +//======================================================================= +//function : Abort: make a longjmp to the saved Context. +//purpose : Abort if there is a non null 'Error' +//======================================================================= +void CASCatch_ErrorHandler::Abort () +{ + //==== Check if can do the "longjmp" ======================================= + if(Top == NULL || Top->Label == NULL) { + cout << "*** Abort *** an exception was raised, but no catch was found." << endl; + cout << "\t... The exception is:" << GlbError; + exit(1); + } + +#ifdef DO_ABORT + if ( K_SETJMP_CASCatch ) + cout << "Recursive abort ===> Terminating SEGV ..." << endl ; + K_SETJMP_CASCatch = 1 ; +#endif + + longjmp(Top->Label, Standard_True); +} + +//======================================================================= +//function : Catches +//purpose : If there is a 'Error', and it is in good type +// returns True and clean 'Error', else returns False. +//======================================================================= +Standard_Boolean CASCatch_ErrorHandler::Catches + (const Handle(Standard_Type)& AType) +{ +#ifdef DO_ABORT + K_SETJMP_CASCatch = 0 ; +#endif + if(GlbError.IsNull()) + return Standard_False; + + if(GlbError->IsKind(AType)){ + CaughtError = GlbError; + GlbError.Nullify(); + return Standard_True; + } else { + return Standard_False; + } +} + +//======================================================================= +//function : LastCaughtError +//purpose : +//======================================================================= +Handle(CASCatch_Failure) CASCatch_ErrorHandler::LastCaughtError() +{ + return Top->CaughtError; +} + +//======================================================================= +//function : Error +//purpose : +//======================================================================= +void CASCatch_ErrorHandler::Error(const Handle(CASCatch_Failure)& aError) +{ + GlbError = aError; +} + +#endif diff --git a/src/CASCatch/CASCatch_ErrorHandler.hxx b/src/CASCatch/CASCatch_ErrorHandler.hxx new file mode 100644 index 000000000..e5b417157 --- /dev/null +++ b/src/CASCatch/CASCatch_ErrorHandler.hxx @@ -0,0 +1,73 @@ + +#ifndef _CASCatch_ErrorHandler_HeaderFile +#define _CASCatch_ErrorHandler_HeaderFile + +#include "CASCatch_Failure.hxx" + +#include +#include + + +extern int K_SETJMP_CASCatch ; + +/*! + * \class CASCatch_ErrorHandler + * \brief This class is an exception handler, private + * + */ +class CASCatch_ErrorHandler +{ + friend class CASCatch_Failure; // To execute the raise exception. + + public: + + Standard_EXPORT CASCatch_ErrorHandler(); + Standard_EXPORT ~CASCatch_ErrorHandler(); + Standard_EXPORT Standard_Boolean Catches (const Handle(Standard_Type)&); + + private: + Standard_EXPORT static void Abort(); + Standard_EXPORT static void Error(const Handle(CASCatch_Failure)&); + Standard_EXPORT static Handle(CASCatch_Failure) LastCaughtError(); + + //==== The fields =========================================================== + private: + CASCatch_ErrorHandler* Previous; + Handle(CASCatch_Failure) CaughtError; + + public: + jmp_buf Label; + +}; + +#undef CASCatch_TRY +#define CASCatch_TRY try + +#undef CASCatch_CATCH +#define CASCatch_CATCH catch + + +#ifdef NO_CXX_EXCEPTION +# undef CASCatch_TRY +# undef CASCatch_CATCH + +# if defined(DO_ABORT) + +# define DoesNotAbort_CASCatch(aHandler) !(K_SETJMP_CASCatch = setjmp(aHandler.Label)) + +# define CASCatch_TRY CASCatch_ErrorHandler _Function; \ + K_SETJMP_CASCatch = 1 ; \ + if(DoesNotAbort_CASCatch(_Function)) + +# else //If DO_ABORT is not defined +# define DoesNotAbort_CASCatch(aHandler) !setjmp(aHandler.Label) + +# define CASCatch_TRY CASCatch_ErrorHandler _Function; \ + if(DoesNotAbort_CASCatch(_Function)) +# endif //DO_ABORT + + +# define CASCatch_CATCH(Error) else if(_Function.Catches(STANDARD_TYPE(Error))) +#endif //NO_CXX_EXCEPTION + +#endif //_CASCatch_ErrorHandler_HeaderFile diff --git a/src/CASCatch/CASCatch_Failure.cxx b/src/CASCatch/CASCatch_Failure.cxx new file mode 100644 index 000000000..70eb8a7b8 --- /dev/null +++ b/src/CASCatch/CASCatch_Failure.cxx @@ -0,0 +1,107 @@ +#include "CASCatch_Failure.hxx" +#include "CASCatch_ErrorHandler.hxx" +#include +#include +#include + +IMPLEMENT_STANDARD_HANDLE( CASCatch_Failure, Standard_Transient ) +IMPLEMENT_STANDARD_RTTIEXT( CASCatch_Failure, Standard_Transient ) + + +#ifndef NO_CXX_EXCEPTION +static Handle(CASCatch_Failure) RaisedError; +#endif + +//================================================================================ +/*! Public - + * \brief creates a CASCatch_Failure + */ +//================================================================================ +CASCatch_Failure::CASCatch_Failure () { myMessage = "Signal detected";} + + +//================================================================================ +/*! Public - + * \brief creates a CASCatch_Failure with a message + * \param an exception message + */ +//================================================================================ +CASCatch_Failure::CASCatch_Failure (const Standard_CString AString) +{ + if(AString) { + myMessage = new Standard_Character[strlen(AString) + 1]; + strcpy(myMessage,AString); + } +} + +//================================================================================ +/*! Public - + * \brief returns the last caught exception + */ +//================================================================================ +Handle(CASCatch_Failure) CASCatch_Failure::Caught() +{ +#ifdef NO_CXX_EXCEPTION + return CASCatch_ErrorHandler::LastCaughtError(); +#else + return RaisedError ; +#endif +} + +//================================================================================ +/*! Public - + * \brief raises a CASCatch_Failure exception + * \param an exception message + */ +//================================================================================ +void CASCatch_Failure::Raise (const Standard_CString AString) +{ + Handle(CASCatch_Failure) E = new CASCatch_Failure() ; + E->Reraise (AString) ; +} + + +//================================================================================ +/*! Public - + * \brief re-raises a CASCatch_Failure exception + * \param an exception message + */ +//================================================================================ +void CASCatch_Failure::Reraise (const Standard_CString AString) +{ + if(AString){ + myMessage = new Standard_Character[strlen(AString) + 1]; + strcpy(myMessage,AString); + } + +#ifdef NO_CXX_EXCEPTION + CASCatch_ErrorHandler::Error(this) ; + CASCatch_ErrorHandler::Abort(); +#else + RaisedError = this ; + Throw() ; +#endif +} + +//================================================================================ +/*! Public - + * \brief returns an exception message + */ +//================================================================================ +Standard_CString CASCatch_Failure::GetError() const +{ + return myMessage; +} + +//================================================================================ +/*! Public - + * \brief Is called when using standard C++ exceptions + */ +//================================================================================ +void CASCatch_Failure::Throw() const +{ +#ifndef NO_CXX_EXCEPTION + throw CASCatch_Failure() ; +#endif +} + diff --git a/src/CASCatch/CASCatch_Failure.hxx b/src/CASCatch/CASCatch_Failure.hxx new file mode 100644 index 000000000..9da57013c --- /dev/null +++ b/src/CASCatch/CASCatch_Failure.hxx @@ -0,0 +1,41 @@ +#ifndef _CASCATCH_FAILURE_HeaderFile +#define _CASCATCH_FAILURE_HeaderFile + +#include +#include +DEFINE_STANDARD_HANDLE( CASCatch_Failure, Standard_Transient ) + +#include + +/*! + * \class CASCatch_Failure + * \brief This class presents an exception to be thrown + * + */ +class CASCatch_Failure : public Standard_Transient +{ + +public: + +Standard_EXPORT CASCatch_Failure(); +Standard_EXPORT CASCatch_Failure(const Standard_CString aString); +Standard_EXPORT void Reraise(const Standard_CString aMessage) ; +Standard_EXPORT Standard_CString GetError() const; +Standard_EXPORT static Handle_CASCatch_Failure Caught() ; +Standard_EXPORT static void Raise(const Standard_CString aMessage = "") ; +Standard_EXPORT virtual void Throw() const;public: + +public: + +DEFINE_STANDARD_RTTI( CASCatch_Failure ) + +private: +/*!\var myMessage + * \brief stores an exception message + */ +Standard_CString myMessage; + +}; + + +#endif diff --git a/src/CASCatch/Makefile.in b/src/CASCatch/Makefile.in index 838e3e086..f6e17c1e8 100644 --- a/src/CASCatch/Makefile.in +++ b/src/CASCatch/Makefile.in @@ -1,45 +1,26 @@ -# SALOME Utils : general SALOME's definitions and tools -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# # File : Makefile.in -# Author : Marc Tajchman (CEA) +# Author : Sergey RUIN (OCN) # Module : SALOME -# $Header$ top_srcdir=@top_srcdir@ top_builddir=../.. srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl +VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_srcdir)/idl @COMMENCE@ # header files -EXPORT_HEADERS= CASCatch_SignalsHandler.h +EXPORT_HEADERS= CASCatch_Failure.hxx \ + CASCatch_CatchSignals.hxx \ + CASCatch_ErrorHandler.hxx # Libraries targets LIB = libCASCatch.la -LIB_SRC = CASCatch_SignalsHandler.cxx + +LIB_SRC = CASCatch_Failure.cxx \ + CASCatch_ErrorHandler.cxx \ + CASCatch_CatchSignals.cxx CPPFLAGS += $(OCC_INCLUDES) CXXFLAGS += $(OCC_CXXFLAGS) diff --git a/src/Communication/Makefile.in b/src/Communication/Makefile.in index 736fbe560..e859ea4fb 100644 --- a/src/Communication/Makefile.in +++ b/src/Communication/Makefile.in @@ -17,7 +17,7 @@ EXPORT_HEADERS = \ # Libraries targets LIB = libSalomeCommunication.la -LIB_SRC = SALOME_Comm_i.cxx SenderFactory.cxx Receiver.cxx MultiCommException.cxx SALOMEMultiComm.cxx ReceiverFactory.cxx +LIB_SRC = SALOME_Comm_i.cxx SenderFactory.cxx MultiCommException.cxx SALOMEMultiComm.cxx ReceiverFactory.cxx LIB_SERVER_IDL = SALOME_Comm.idl SALOME_Exception.idl # Executables targets diff --git a/src/Communication/MultiCommException.hxx b/src/Communication/MultiCommException.hxx index fe029fc4a..6313ab5e4 100644 --- a/src/Communication/MultiCommException.hxx +++ b/src/Communication/MultiCommException.hxx @@ -3,8 +3,13 @@ #include +#if defined WNT && defined COMMUNICATION_EXPORTS +#define COMMUNICATION_EXPORT __declspec( dllexport ) +#else +#define COMMUNICATION_EXPORT +#endif -class MultiCommException { +class COMMUNICATION_EXPORT MultiCommException { private: std::string _message; public: diff --git a/src/Communication/Receiver.hxx b/src/Communication/Receiver.hxx index 56c65ad7e..d155e3360 100644 --- a/src/Communication/Receiver.hxx +++ b/src/Communication/Receiver.hxx @@ -5,16 +5,38 @@ /*! Abstract class factorizing common methods of all the receivers. All of the receivers have to inheritate from it. */ +template class Receiver { public: - virtual void *getValue(long &size)=0; + virtual T *getValue(long &size)=0; virtual ~Receiver() {} protected: - virtual void *getValue(long &size,SALOME::Sender_ptr sender); - static inline void *getLocalValue(long &size,SALOME_Sender_i* servant); - virtual void *getDistValue(long &size)=0; + virtual T *getValue(long &size,senderPtr sender); + static inline T *getLocalValue(long &size,senderSrv* servant); + virtual T *getDistValue(long &size)=0; }; +template +T *Receiver::getLocalValue(long &size,senderSrv* servant) +{ + const T *src=(const T *)servant->getData(size); + long lgr=size*servant->getSizeOf(); + void *ret=new char[lgr]; + memcpy(ret,src,lgr); + return (T *)ret; + //return (void *)servant->getData(size); +} + +template +T *Receiver::getValue(long &size,senderPtr sender) +{ + senderSrv* data=senderSrv::find(sender); + if(data) + return getLocalValue(size,data); + else + return getDistValue(size); +} + #endif diff --git a/src/Communication/ReceiverFactory.cxx b/src/Communication/ReceiverFactory.cxx index f3f0da6b1..1a2bd9125 100644 --- a/src/Communication/ReceiverFactory.cxx +++ b/src/Communication/ReceiverFactory.cxx @@ -23,116 +23,141 @@ using namespace std; #endif /*! - This method performs the transfert with the remote sender given. If it fails with this sender it tries with an another protocol (CORBA by default). + This method performs the transfert of double array with the remote SenderDouble given. If it fails with this SenderDouble it tries with an another protocol (CORBA by default). */ -void *ReceiverFactory::getValue(SALOME::Sender_ptr sender,long &size)throw(MultiCommException) +double *ReceiverFactory::getValue(SALOME::SenderDouble_ptr sender,long &size)throw(MultiCommException) { - void *ret; + double *ret; try{ ret=getValueOneShot(sender,size); } catch(MultiCommException&) { - SALOME::Sender_ptr newSender=sender->buildOtherWithProtocol(SALOME::CORBA_); + SALOME::SenderDouble_ptr newSender=sender->buildOtherWithProtocol(SALOME::CORBA_); + MESSAGE("PROTOCOL CHANGED TO CORBA"); + sender->release(); + ret=getValueOneShot(newSender,size); + CORBA::release(newSender); + } + return ret; +} + +/*! + This method performs the transfert of int array with the remote SenderInt given. If it fails with this SenderInt it tries with an another protocol (CORBA by default). + */ +int *ReceiverFactory::getValue(SALOME::SenderInt_ptr sender,long &size)throw(MultiCommException) +{ + int *ret; + try{ + ret=getValueOneShot(sender,size); + } + catch(MultiCommException&) + { + SALOME::SenderInt_ptr newSender=sender->buildOtherWithProtocol(SALOME::CORBA_); MESSAGE("PROTOCOL CHANGED TO CORBA"); sender->release(); - CORBA::release(sender); ret=getValueOneShot(newSender,size); + CORBA::release(newSender); } return ret; } /*! - This method performs the transfert with the remote sender given. If it fails an exception is thrown. + This method performs the transfert with the remote SenderDouble given. If it fails an exception is thrown. */ -void *ReceiverFactory::getValueOneShot(SALOME::Sender_ptr sender,long &size)throw(MultiCommException) +double *ReceiverFactory::getValueOneShot(SALOME::SenderDouble_ptr sender,long &size)throw(MultiCommException) { SALOME::CorbaDoubleNCSender_ptr cncD_ptr; SALOME::CorbaDoubleCSender_ptr cwcD_ptr; - SALOME::CorbaLongNCSender_ptr cncL_ptr; - SALOME::CorbaLongCSender_ptr cwcL_ptr; #ifdef HAVE_MPI2 - SALOME::MPISender_ptr mpi_ptr=SALOME::MPISender::_narrow(sender); + SALOME::MPISenderDouble_ptr mpi_ptr=SALOME::MPISenderDouble::_narrow(sender); +#endif +#ifdef HAVE_SOCKET + SALOME::SocketSenderDouble_ptr sock_ptr=SALOME::SocketSenderDouble::_narrow(sender); +#endif + cncD_ptr=SALOME::CorbaDoubleNCSender::_narrow(sender); + cwcD_ptr=SALOME::CorbaDoubleCSender::_narrow(sender); + if(!CORBA::is_nil(cncD_ptr)) + { + CORBA::release(sender); + CorbaDNoCopyReceiver rec(cncD_ptr); + return rec.getValue(size); + } + else if(!CORBA::is_nil(cwcD_ptr)) + { + CORBA::release(sender); + CorbaDWithCopyReceiver rec(cwcD_ptr); + return rec.getValue(size); + } +#ifdef HAVE_MPI2 + else if(!CORBA::is_nil(mpi_ptr)) + { + CORBA::release(sender); + MPIReceiver rec(mpi_ptr); + return rec.getValue(size); + } #endif #ifdef HAVE_SOCKET - SALOME::SocketSender_ptr sock_ptr=SALOME::SocketSender::_narrow(sender); + else if(!CORBA::is_nil(sock_ptr)) + { + CORBA::release(sender); + SocketReceiver rec(sock_ptr); + return rec.getValue(size); + } #endif - switch(sender->getTypeOfDataTransmitted()) + else { - case SALOME::DOUBLE_: - cncD_ptr=SALOME::CorbaDoubleNCSender::_narrow(sender); - cwcD_ptr=SALOME::CorbaDoubleCSender::_narrow(sender); - if(!CORBA::is_nil(cncD_ptr)) - { - CORBA::release(sender); - CorbaDNoCopyReceiver rec(cncD_ptr); - return rec.getValue(size); - } - else if(!CORBA::is_nil(cwcD_ptr)) - { - CORBA::release(sender); - CorbaDWithCopyReceiver rec(cwcD_ptr); - return rec.getValue(size); - } + throw MultiCommException("Unknown sender protocol"); + return 0; + } +} + +/*! + This method performs the transfert with the remote SenderInt given. If it fails an exception is thrown. + */ +int *ReceiverFactory::getValueOneShot(SALOME::SenderInt_ptr sender,long &size)throw(MultiCommException) +{ + SALOME::CorbaLongNCSender_ptr cncL_ptr; + SALOME::CorbaLongCSender_ptr cwcL_ptr; #ifdef HAVE_MPI2 - else if(!CORBA::is_nil(mpi_ptr)) - { - CORBA::release(sender); - MPIReceiver rec(mpi_ptr); - return rec.getValue(size); - } + SALOME::MPISenderInt_ptr mpi_ptr=SALOME::MPISenderInt::_narrow(sender); #endif #ifdef HAVE_SOCKET - else if(!CORBA::is_nil(sock_ptr)) - { - CORBA::release(sender); - SocketReceiver rec(sock_ptr); - return rec.getValue(size); - } + SALOME::SocketSenderInt_ptr sock_ptr=SALOME::SocketSenderInt::_narrow(sender); #endif - else - { - throw MultiCommException("Unknown sender protocol"); - return 0; - } - case SALOME::INT_: - cncL_ptr=SALOME::CorbaLongNCSender::_narrow(sender); - cwcL_ptr=SALOME::CorbaLongCSender::_narrow(sender); - if(!CORBA::is_nil(cncL_ptr)) - { - CORBA::release(sender); - CorbaINoCopyReceiver rec(cncL_ptr); - return rec.getValue(size); - } - else if(!CORBA::is_nil(cwcL_ptr)) - { - CORBA::release(sender); - CorbaIWithCopyReceiver rec(cwcL_ptr); - return rec.getValue(size); - } + cncL_ptr=SALOME::CorbaLongNCSender::_narrow(sender); + cwcL_ptr=SALOME::CorbaLongCSender::_narrow(sender); + if(!CORBA::is_nil(cncL_ptr)) + { + CORBA::release(sender); + CorbaINoCopyReceiver rec(cncL_ptr); + return rec.getValue(size); + } + else if(!CORBA::is_nil(cwcL_ptr)) + { + CORBA::release(sender); + CorbaIWithCopyReceiver rec(cwcL_ptr); + return rec.getValue(size); + } #ifdef HAVE_MPI2 - else if(!CORBA::is_nil(mpi_ptr)) - { - CORBA::release(sender); - MPIReceiver rec(mpi_ptr); - return rec.getValue(size); - } + else if(!CORBA::is_nil(mpi_ptr)) + { + CORBA::release(sender); + MPIReceiver rec(mpi_ptr); + return rec.getValue(size); + } #endif #ifdef HAVE_SOCKET - else if(!CORBA::is_nil(sock_ptr)) - { - CORBA::release(sender); - SocketReceiver rec(sock_ptr); - return rec.getValue(size); - } + else if(!CORBA::is_nil(sock_ptr)) + { + CORBA::release(sender); + SocketReceiver rec(sock_ptr); + return rec.getValue(size); + } #endif - else - { - throw MultiCommException("Unknown sender protocol"); - return 0; - } - default: - throw MultiCommException("unknown type of data transfered"); + else + { + throw MultiCommException("Unknown sender protocol"); return 0; } } diff --git a/src/Communication/ReceiverFactory.hxx b/src/Communication/ReceiverFactory.hxx index e5072c999..28eac49f6 100644 --- a/src/Communication/ReceiverFactory.hxx +++ b/src/Communication/ReceiverFactory.hxx @@ -12,9 +12,11 @@ class ReceiverFactory { public: - static void *getValue(SALOME::Sender_ptr sender,long &size)throw(MultiCommException); + static double *getValue(SALOME::SenderDouble_ptr sender,long &size)throw(MultiCommException); + static int *getValue(SALOME::SenderInt_ptr sender,long &size)throw(MultiCommException); private: - static void *getValueOneShot(SALOME::Sender_ptr sender,long &size)throw(MultiCommException); + static double *getValueOneShot(SALOME::SenderDouble_ptr sender,long &size)throw(MultiCommException); + static int *getValueOneShot(SALOME::SenderInt_ptr sender,long &size)throw(MultiCommException); }; #endif diff --git a/src/Communication/Receivers.cxx b/src/Communication/Receivers.cxx index a5d65ae15..19ea8c164 100644 --- a/src/Communication/Receivers.cxx +++ b/src/Communication/Receivers.cxx @@ -5,42 +5,40 @@ using namespace std; #define TAILLE_SPLIT 100000 #define TIMEOUT 20 -template -CorbaNCNoCopyReceiver::CorbaNCNoCopyReceiver(CorbaSender mySender):_mySender(mySender){ +template +CorbaNCNoCopyReceiver::CorbaNCNoCopyReceiver(CorbaSender mySender):_mySender(mySender){ } -template -CorbaNCNoCopyReceiver::~CorbaNCNoCopyReceiver(){ +template +CorbaNCNoCopyReceiver::~CorbaNCNoCopyReceiver(){ _mySender->release(); - CORBA::release(_mySender); } -template -void *CorbaNCNoCopyReceiver::getDistValue(long &size) +template +T *CorbaNCNoCopyReceiver::getDistValue(long &size) { TSeqCorba seq=_mySender->send(); size=seq->length(); - return seq->get_buffer(1); + return (T *)seq->get_buffer(1); } -template -void *CorbaNCNoCopyReceiver::getValue(long &size) +template +T *CorbaNCNoCopyReceiver::getValue(long &size) { - return Receiver::getValue(size,_mySender); + return Receiver::getValue(size,_mySender); } -template -CorbaNCWithCopyReceiver::CorbaNCWithCopyReceiver(CorbaSender mySender):_mySender(mySender){ +template +CorbaNCWithCopyReceiver::CorbaNCWithCopyReceiver(CorbaSender mySender):_mySender(mySender){ } -template -CorbaNCWithCopyReceiver::~CorbaNCWithCopyReceiver(){ +template +CorbaNCWithCopyReceiver::~CorbaNCWithCopyReceiver(){ _mySender->release(); - CORBA::release(_mySender); } -template -void *CorbaNCWithCopyReceiver::getDistValue(long &size){ +template +T *CorbaNCWithCopyReceiver::getDistValue(long &size){ size=_mySender->getSize(); long n; T *ret=new T[size]; @@ -59,24 +57,23 @@ void *CorbaNCWithCopyReceiver::getDistValue(long return ret; } -template -void *CorbaNCWithCopyReceiver::getValue(long &size) +template +T *CorbaNCWithCopyReceiver::getValue(long &size) { - return Receiver::getValue(size,_mySender); + return Receiver::getValue(size,_mySender); } -template -CorbaWCNoCopyReceiver::CorbaWCNoCopyReceiver(CorbaSender mySender):_mySender(mySender){ +template +CorbaWCNoCopyReceiver::CorbaWCNoCopyReceiver(CorbaSender mySender):_mySender(mySender){ } -template -CorbaWCNoCopyReceiver::~CorbaWCNoCopyReceiver(){ +template +CorbaWCNoCopyReceiver::~CorbaWCNoCopyReceiver(){ _mySender->release(); - CORBA::release(_mySender); } -template -void *CorbaWCNoCopyReceiver::getDistValue(long &size){ +template +T *CorbaWCNoCopyReceiver::getDistValue(long &size){ size=_mySender->getSize(); long n; T *ret=new T[size]; @@ -95,24 +92,23 @@ void *CorbaWCNoCopyReceiver::getDistValue(long & return ret; } -template -void *CorbaWCNoCopyReceiver::getValue(long &size) +template +T *CorbaWCNoCopyReceiver::getValue(long &size) { - return Receiver::getValue(size,_mySender); + return Receiver::getValue(size,_mySender); } -template -CorbaWCWithCopyReceiver::CorbaWCWithCopyReceiver(CorbaSender mySender):_mySender(mySender){ +template +CorbaWCWithCopyReceiver::CorbaWCWithCopyReceiver(CorbaSender mySender):_mySender(mySender){ } -template -CorbaWCWithCopyReceiver::~CorbaWCWithCopyReceiver(){ +template +CorbaWCWithCopyReceiver::~CorbaWCWithCopyReceiver(){ _mySender->release(); - CORBA::release(_mySender); } -template -void *CorbaWCWithCopyReceiver::getDistValue(long &size){ +template +T *CorbaWCWithCopyReceiver::getDistValue(long &size){ size=_mySender->getSize(); long n; T *ret=new T[size]; @@ -131,26 +127,25 @@ void *CorbaWCWithCopyReceiver::getDistValue(long return ret; } -template -void *CorbaWCWithCopyReceiver::getValue(long &size) +template +T *CorbaWCWithCopyReceiver::getValue(long &size) { - return Receiver::getValue(size,_mySender); + return Receiver::getValue(size,_mySender); } #ifdef HAVE_MPI2 -template -MPIReceiver::MPIReceiver(SALOME::MPISender_ptr mySender):_mySender(mySender){ +template +MPIReceiver::MPIReceiver(CorbaSender mySender):_mySender(mySender){ } -template -MPIReceiver::~MPIReceiver(){ +template +MPIReceiver::~MPIReceiver(){ _mySender->release(); - CORBA::release(_mySender); } -template -void *MPIReceiver::getDistValue(long &size){ +template +T *MPIReceiver::getDistValue(long &size){ int i=0; int myproc; int sproc; @@ -204,10 +199,10 @@ void *MPIReceiver::getDistValue(long &size){ return _v; } -template -void *MPIReceiver::getValue(long &size) +template +T *MPIReceiver::getValue(long &size) { - return Receiver::getValue(size,_mySender); + return Receiver::getValue(size,_mySender); } #endif @@ -221,31 +216,30 @@ void *MPIReceiver::getValue(long &size) #include #include -template -SocketReceiver::SocketReceiver(SALOME::SocketSender_ptr mySender) : _mySender(mySender) +template +SocketReceiver::SocketReceiver(CorbaSender mySender) : _mySender(mySender) { _clientSockfd = -1; _senderDestruc=true; } -template -SocketReceiver::~SocketReceiver() +template +SocketReceiver::~SocketReceiver() { if(_senderDestruc) { _mySender->release(); - CORBA::release(_mySender); } } -template -void *SocketReceiver::getValue(long &size) +template +T *SocketReceiver::getValue(long &size) { - return Receiver::getValue(size,_mySender); + return Receiver::getValue(size,_mySender); } -template -void* SocketReceiver::getDistValue(long &size) +template +T* SocketReceiver::getDistValue(long &size) { int n=0, m; T *v; @@ -296,8 +290,8 @@ void* SocketReceiver::getDistValue(long &size) return v; } -template -void SocketReceiver::initCom() +template +void SocketReceiver::initCom() { try{ _mySender->initCom(); @@ -325,8 +319,8 @@ void SocketReceiver::initCom() } -template -void SocketReceiver::connectCom(const char *dest_address, int port) +template +void SocketReceiver::connectCom(const char *dest_address, int port) { struct sockaddr_in serv_addr; struct hostent * server; @@ -377,8 +371,8 @@ void SocketReceiver::connectCom(const char *dest_address, int port) } -template -void SocketReceiver::closeCom() +template +void SocketReceiver::closeCom() { _mySender->closeCom(); if( _clientSockfd >= 0 ){ diff --git a/src/Communication/Receivers.hxx b/src/Communication/Receivers.hxx index 4fd2581ee..c4309b754 100644 --- a/src/Communication/Receivers.hxx +++ b/src/Communication/Receivers.hxx @@ -10,82 +10,82 @@ /*! Receiver used for transfert with CORBA when no copy is required remotely and locally. */ -template -class CorbaNCNoCopyReceiver : public Receiver +template +class CorbaNCNoCopyReceiver : public Receiver { private: CorbaSender _mySender; public: CorbaNCNoCopyReceiver(CorbaSender mySender); ~CorbaNCNoCopyReceiver(); - void *getValue(long &size); + T *getValue(long &size); private: - void *getDistValue(long &size); + T *getDistValue(long &size); }; /*! Receiver used for transfert with CORBA when copy is not required remotely but required locally. */ -template -class CorbaNCWithCopyReceiver : public Receiver +template +class CorbaNCWithCopyReceiver : public Receiver { private: CorbaSender _mySender; public: CorbaNCWithCopyReceiver(CorbaSender mySender); ~CorbaNCWithCopyReceiver(); - void *getValue(long &size); + T *getValue(long &size); private: - void *getDistValue(long &size); + T *getDistValue(long &size); }; /*! Receiver used for transfert with CORBA when copy is required remotely but not required locally. */ -template -class CorbaWCNoCopyReceiver : public Receiver +template +class CorbaWCNoCopyReceiver : public Receiver { private: CorbaSender _mySender; public: CorbaWCNoCopyReceiver(CorbaSender mySender); ~CorbaWCNoCopyReceiver(); - void *getValue(long &size); + T *getValue(long &size); private: - void *getDistValue(long &size); + T *getDistValue(long &size); }; /*! Receiver used for transfert with CORBA when copy is required both remotely and locally. */ -template -class CorbaWCWithCopyReceiver : public Receiver +template +class CorbaWCWithCopyReceiver : public Receiver { private: CorbaSender _mySender; public: CorbaWCWithCopyReceiver(CorbaSender mySender); ~CorbaWCWithCopyReceiver(); - void *getValue(long &size); + T *getValue(long &size); private: - void *getDistValue(long &size); + T *getDistValue(long &size); }; #ifdef HAVE_MPI2 /*! Receiver for MPI transfert. */ -template -class MPIReceiver : public Receiver +template +class MPIReceiver : public Receiver { private: - SALOME::MPISender_ptr _mySender; + CorbaSender _mySender; public: - MPIReceiver(SALOME::MPISender_ptr mySender); + MPIReceiver(CorbaSender mySender); ~MPIReceiver(); - void *getValue(long &size); + T *getValue(long &size); private: - void *getDistValue(long &size); + T *getDistValue(long &size); }; #endif @@ -96,19 +96,19 @@ class XDR; /*! Receiver for transfert with sockets. */ -template -class SocketReceiver : public Receiver +template +class SocketReceiver : public Receiver { private: - SALOME::SocketSender_ptr _mySender; + CorbaSender _mySender; int _clientSockfd; bool _senderDestruc; public: - SocketReceiver(SALOME::SocketSender_ptr mySender); + SocketReceiver(CorbaSender mySender); ~SocketReceiver(); - void *getValue(long &size); + T *getValue(long &size); private: - void *getDistValue(long &size); + T *getDistValue(long &size); void initCom(); void connectCom(const char *, int); void closeCom(); diff --git a/src/Communication/SALOMEMultiComm.cxx b/src/Communication/SALOMEMultiComm.cxx index c832478ab..bcdf9cbec 100644 --- a/src/Communication/SALOMEMultiComm.cxx +++ b/src/Communication/SALOMEMultiComm.cxx @@ -1,5 +1,7 @@ #include "SALOMEMultiComm.hxx" +#ifndef WNT using namespace std; +#endif SALOMEMultiComm::SALOMEMultiComm():_type(SALOME::CORBA_) { diff --git a/src/Communication/SALOMEMultiComm.hxx b/src/Communication/SALOMEMultiComm.hxx index 2537dc042..8c46251af 100644 --- a/src/Communication/SALOMEMultiComm.hxx +++ b/src/Communication/SALOMEMultiComm.hxx @@ -4,11 +4,17 @@ #include #include CORBA_SERVER_HEADER(SALOME_Comm) +#if defined WNT && defined COMMUNICATION_EXPORTS +#define COMMUNICATION_EXPORT __declspec( dllexport ) +#else +#define COMMUNICATION_EXPORT +#endif + /*! Class is designed to ease the use of multi communication.\n Simply inherite from it your servant class you want to emit data with senders. */ -class SALOMEMultiComm : public virtual POA_SALOME::MultiCommClass { +class COMMUNICATION_EXPORT SALOMEMultiComm : public virtual POA_SALOME::MultiCommClass { protected: SALOME::TypeOfCommunication _type; public: diff --git a/src/Communication/SALOME_Comm_i.cxx b/src/Communication/SALOME_Comm_i.cxx index c9b677a84..71fbdadf8 100644 --- a/src/Communication/SALOME_Comm_i.cxx +++ b/src/Communication/SALOME_Comm_i.cxx @@ -1,4 +1,6 @@ +#ifndef WNT #include +#endif #include "SALOME_Comm_i.hxx" #include "poa.h" #include "omnithread.h" @@ -9,11 +11,13 @@ #include "SenderFactory.hxx" using namespace std; +#ifndef WNT CORBA::ORB_var &getGlobalORB(){ ORB_INIT &init = *SINGLETON_::Instance(); CORBA::ORB_var &orb = init(0,0); return orb; } +#endif /*! Return the C++ data associated to the array to transmit. Used when sender and receiver are collocalized. @@ -30,13 +34,47 @@ int SALOME_Sender_i::getSizeOf() const { } /*! Unique constructor */ -SALOME_Sender_i::SALOME_Sender_i(SALOME::TypeOfDataTransmitted type,const void *tabToSend,long lgrTabToSend,int sizeOf):_tabToSend(tabToSend),_lgrTabToSend(lgrTabToSend),_type(type),_sizeOf(sizeOf){ +SALOME_Sender_i::SALOME_Sender_i(const void *tabToSend,long lgrTabToSend,int sizeOf,bool ownTabToSend):_tabToSend(tabToSend),_lgrTabToSend(lgrTabToSend),_sizeOf(sizeOf),_ownTabToSend(ownTabToSend){ +} + +/*! To force ownerShip status */ +void SALOME_Sender_i::setOwnerShip(bool own) +{ + _ownTabToSend=own; +} + +/*! Method for the remote destroy of the current servant. This method is used by the receiver to destroy the sender when the transfert is complete. + */ +void SALOME_Sender_i::release() +{ + PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this); + _default_POA()->deactivate_object(oid); + _remove_ref(); +} + +SALOME_SenderDouble_i::SALOME_SenderDouble_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend):SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(double),ownTabToSend) +{ +} + +/*! Destructor. + */ +SALOME_SenderDouble_i::~SALOME_SenderDouble_i() +{ + if(_ownTabToSend) + delete [] (double *)_tabToSend; +} + +/*! Return a new sender of the same array but with an another protocol and delegates to the returned sender the ownership of array. + */ +SALOME::SenderDouble_ptr SALOME_SenderDouble_i::buildOtherWithProtocol(SALOME::TypeOfCommunication type) +{ + return SenderFactory::buildSender(type,this); } /*! Method to establish if the CORBA object refered by pCorba is collocalised.\n If it is, the pointer to the servant that incarnates the CORBA object is returned. */ -SALOME_Sender_i *SALOME_Sender_i::find(SALOME::Sender_ptr pCorba){ +SALOME_SenderDouble_i *SALOME_SenderDouble_i::find(SALOME::SenderDouble_ptr pCorba){ PortableServer::ServantBase *ret; try { ret=PortableServer::POA::_the_root_poa()->reference_to_servant(pCorba); @@ -45,33 +83,44 @@ SALOME_Sender_i *SALOME_Sender_i::find(SALOME::Sender_ptr pCorba){ return 0; } ret->_remove_ref(); - return dynamic_cast(ret); + return dynamic_cast(ret); } -/*! Method for the remote destroy of the current servant. This method is used by the receiver to destroy the sender when the transfert is complete. - */ -void SALOME_Sender_i::release() +SALOME_SenderInt_i::SALOME_SenderInt_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend):SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(int),ownTabToSend) { - PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this); - _default_POA()->deactivate_object(oid); - _remove_ref(); } -/*! Return the type of the element that compose the array. Used by receiverfactory to build the correct receiver. +/*! Destructor. */ -SALOME::TypeOfDataTransmitted SALOME_Sender_i::getTypeOfDataTransmitted() +SALOME_SenderInt_i::~SALOME_SenderInt_i() { - return _type; + if(_ownTabToSend) + delete [] (int *)_tabToSend; } /*! Return a new sender of the same array but with an another protocol. */ -SALOME::Sender_ptr SALOME_Sender_i::buildOtherWithProtocol(SALOME::TypeOfCommunication type) +SALOME::SenderInt_ptr SALOME_SenderInt_i::buildOtherWithProtocol(SALOME::TypeOfCommunication type) { return SenderFactory::buildSender(type,this); } -SALOME_CorbaDoubleNCSender_i::SALOME_CorbaDoubleNCSender_i(const double *tabToSend,long lgrTabToSend):SALOME_Sender_i(SALOME::DOUBLE_,tabToSend,lgrTabToSend,sizeof(double)){ +/*! Method to establish if the CORBA object refered by pCorba is collocalised.\n + If it is, the pointer to the servant that incarnates the CORBA object is returned. +*/ +SALOME_SenderInt_i *SALOME_SenderInt_i::find(SALOME::SenderInt_ptr pCorba){ + PortableServer::ServantBase *ret; + try { + ret=PortableServer::POA::_the_root_poa()->reference_to_servant(pCorba); + } + catch(...){ + return 0; + } + ret->_remove_ref(); + return dynamic_cast(ret); +} + +SALOME_CorbaDoubleNCSender_i::SALOME_CorbaDoubleNCSender_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend):SALOME_SenderDouble_i(tabToSend,lgrTabToSend,ownTabToSend),SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(double),ownTabToSend){ } SALOME_CorbaDoubleNCSender_i::~SALOME_CorbaDoubleNCSender_i(){ @@ -92,7 +141,7 @@ SALOME::vectorOfDouble* SALOME_CorbaDoubleNCSender_i::send(){ return c1._retn(); } -SALOME_CorbaDoubleCSender_i::SALOME_CorbaDoubleCSender_i(const double *tabToSend,long lgrTabToSend):SALOME_Sender_i(SALOME::DOUBLE_,tabToSend,lgrTabToSend,sizeof(double)){ +SALOME_CorbaDoubleCSender_i::SALOME_CorbaDoubleCSender_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend):SALOME_SenderDouble_i(tabToSend,lgrTabToSend,ownTabToSend),SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(double),ownTabToSend){ } SALOME_CorbaDoubleCSender_i::~SALOME_CorbaDoubleCSender_i(){ @@ -113,7 +162,7 @@ SALOME::vectorOfDouble* SALOME_CorbaDoubleCSender_i::sendPart(CORBA::ULong offse //////////////////////// -SALOME_CorbaLongNCSender_i::SALOME_CorbaLongNCSender_i(const int *tabToSend,long lgrTabToSend):SALOME_Sender_i(SALOME::INT_,tabToSend,lgrTabToSend,sizeof(int)){ +SALOME_CorbaLongNCSender_i::SALOME_CorbaLongNCSender_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend):SALOME_SenderInt_i(tabToSend,lgrTabToSend,ownTabToSend),SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(int),ownTabToSend){ } SALOME_CorbaLongNCSender_i::~SALOME_CorbaLongNCSender_i(){ @@ -134,7 +183,7 @@ SALOME::vectorOfLong* SALOME_CorbaLongNCSender_i::send(){ return c1._retn(); } -SALOME_CorbaLongCSender_i::SALOME_CorbaLongCSender_i(const int *tabToSend,long lgrTabToSend):SALOME_Sender_i(SALOME::INT_,tabToSend,lgrTabToSend,sizeof(int)){ +SALOME_CorbaLongCSender_i::SALOME_CorbaLongCSender_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend):SALOME_SenderInt_i(tabToSend,lgrTabToSend,ownTabToSend),SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(int),ownTabToSend){ } SALOME_CorbaLongCSender_i::~SALOME_CorbaLongCSender_i(){ @@ -159,7 +208,7 @@ unsigned long SALOME_MPISender_i::_tag1=0; unsigned long SALOME_MPISender_i::_tag2=1; -SALOME_MPISender_i::SALOME_MPISender_i(SALOME::TypeOfDataTransmitted type,const void *tabToSend,long lgrTabToSend,int sizeOf):SALOME_Sender_i(type,tabToSend,lgrTabToSend,sizeOf){ +SALOME_MPISender_i::SALOME_MPISender_i(const void *tabToSend,long lgrTabToSend,int sizeOf,bool ownTabToSend):SALOME_Sender_i(tabToSend,lgrTabToSend,sizeOf,ownTabToSend){ _portName=new char[MPI_MAX_PORT_NAME]; } @@ -203,6 +252,7 @@ SALOME::MPISender::param* SALOME_MPISender_i::getParam() void SALOME_MPISender_i::send() { + _type=getTypeOfDataTransmitted(); _argsForThr=new (void *)[8]; _argsForThr[0]=_portName; _argsForThr[1]=&_lgrTabToSend; @@ -238,6 +288,7 @@ void* SALOME_MPISender_i::myThread(void *args) MPI_Send(argsTab[2],*lgrTabToSend,MPI_INT,*cproc,*tag2,*com); } omni_thread::exit(); + return args; } void SALOME_MPISender_i::close(const SALOME::MPISender::param& p) @@ -252,6 +303,18 @@ void SALOME_MPISender_i::close(const SALOME::MPISender::param& p) delete [] _argsForThr; } +SALOME_MPISenderDouble_i::SALOME_MPISenderDouble_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend) + :SALOME_SenderDouble_i(tabToSend,lgrTabToSend,ownTabToSend),SALOME_MPISender_i(tabToSend,lgrTabToSend,sizeof(double),ownTabToSend) + ,SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(double),ownTabToSend) +{ +} + +SALOME_MPISenderInt_i::SALOME_MPISenderInt_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend) + :SALOME_SenderInt_i(tabToSend,lgrTabToSend,ownTabToSend),SALOME_MPISender_i(tabToSend,lgrTabToSend,sizeof(int),ownTabToSend) + ,SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(int),ownTabToSend) +{ +} + #endif #ifdef HAVE_SOCKET @@ -267,7 +330,7 @@ void SALOME_MPISender_i::close(const SALOME::MPISender::param& p) #include #include -SALOME_SocketSender_i::SALOME_SocketSender_i(SALOME::TypeOfDataTransmitted type,const void *tabToSend,long lgrTabToSend,int sizeOf):SALOME_Sender_i(type,tabToSend,lgrTabToSend,sizeOf){ +SALOME_SocketSender_i::SALOME_SocketSender_i(const void *tabToSend,long lgrTabToSend,int sizeOf,bool ownTabToSend):SALOME_Sender_i(tabToSend,lgrTabToSend,sizeOf,ownTabToSend){ _IPAddress = inetAddress(); _serverSockfd = -1; _clientSockfd = -1; @@ -314,6 +377,7 @@ SALOME::SocketSender::param * SALOME_SocketSender_i::getParam() void SALOME_SocketSender_i::send() { + _type=getTypeOfDataTransmitted(); _argsForThr=new void *[6]; _argsForThr[0]=&_serverSockfd; _argsForThr[1]=&_clientSockfd; @@ -393,6 +457,7 @@ void* SALOME_SocketSender_i::myThread(void *args) xdr_vector( &xp, (char*)tabToSend, *lgrTabToSend, sizeof(int), (xdrproc_t)xdr_int ); xdr_destroy( &xp ); } + return args; } void SALOME_SocketSender_i::initCom() throw(SALOME::SALOME_Exception) @@ -443,7 +508,6 @@ void SALOME_SocketSender_i::initCom() throw(SALOME::SALOME_Exception) void SALOME_SocketSender_i::acceptCom() throw(SALOME::SALOME_Exception) { socklen_t sin_size; - int new_fd; struct sockaddr_in client_addr; SALOME::ExceptionStruct es; @@ -485,6 +549,18 @@ void SALOME_SocketSender_i::endOfCom() delete [] _argsForThr; } +SALOME_SocketSenderDouble_i::SALOME_SocketSenderDouble_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend) + :SALOME_SenderDouble_i(tabToSend,lgrTabToSend,ownTabToSend),SALOME_SocketSender_i(tabToSend,lgrTabToSend,sizeof(double),ownTabToSend) + ,SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(double),ownTabToSend) +{ +} + +SALOME_SocketSenderInt_i::SALOME_SocketSenderInt_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend) + :SALOME_SenderInt_i(tabToSend,lgrTabToSend,ownTabToSend),SALOME_SocketSender_i(tabToSend,lgrTabToSend,sizeof(int),ownTabToSend) + ,SALOME_Sender_i(tabToSend,lgrTabToSend,sizeof(int),ownTabToSend) +{ +} + //CCRT porting #undef _LIBC_POLLUTION_H_ #undef _POSIX_PII_SOCKET diff --git a/src/Communication/SALOME_Comm_i.hxx b/src/Communication/SALOME_Comm_i.hxx index 7b6e8df43..f7f196c62 100644 --- a/src/Communication/SALOME_Comm_i.hxx +++ b/src/Communication/SALOME_Comm_i.hxx @@ -26,26 +26,48 @@ protected: Practically in terms of bytes the size to be transmitted is _lgrTabToSend*_sizeOf */ int _sizeOf; - /*! Type the component of the array*/ - SALOME::TypeOfDataTransmitted _type; + /*! Indicates if _tabToSend has to be deallocated */ + bool _ownTabToSend; - SALOME_Sender_i(SALOME::TypeOfDataTransmitted type,const void *tabToSend,long lgrTabToSend,int sizeOf); + SALOME_Sender_i(const void *tabToSend,long lgrTabToSend,int sizeOf,bool ownTabToSend=false); public: const void *getData(long &size) const; int getSizeOf() const; + void setOwnerShip(bool own); + bool getOwnerShip() const { return _ownTabToSend; } void release(); - SALOME::TypeOfDataTransmitted getTypeOfDataTransmitted(); - SALOME::Sender_ptr buildOtherWithProtocol(SALOME::TypeOfCommunication type); - static SALOME_Sender_i *find(SALOME::Sender_ptr pCorba); + virtual ~SALOME_Sender_i() {} +}; + +class SALOME_SenderDouble_i : public virtual POA_SALOME::SenderDouble, + public virtual SALOME_Sender_i +{ +public: + SALOME_SenderDouble_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend=false); + SALOME::TypeOfDataTransmitted getTypeOfDataTransmitted() { return SALOME::DOUBLE_; } + SALOME::SenderDouble_ptr buildOtherWithProtocol(SALOME::TypeOfCommunication type); + virtual ~SALOME_SenderDouble_i(); + static SALOME_SenderDouble_i *find(SALOME::SenderDouble_ptr pCorba); +}; + +class SALOME_SenderInt_i : public virtual POA_SALOME::SenderInt, + public virtual SALOME_Sender_i +{ +public: + SALOME_SenderInt_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend=false); + SALOME::TypeOfDataTransmitted getTypeOfDataTransmitted() { return SALOME::INT_; } + SALOME::SenderInt_ptr buildOtherWithProtocol(SALOME::TypeOfCommunication type); + virtual ~SALOME_SenderInt_i(); + static SALOME_SenderInt_i *find(SALOME::SenderInt_ptr pCorba); }; /*! Servant class for CORBA sender for double* when no copy of array _tabToSend is required, that is to say double and CORBA::Double are binary equal. */ class SALOME_CorbaDoubleNCSender_i : public POA_SALOME::CorbaDoubleNCSender, - public SALOME_Sender_i + public SALOME_SenderDouble_i { public: - SALOME_CorbaDoubleNCSender_i(const double *tabToSend,long lgrTabToSend); + SALOME_CorbaDoubleNCSender_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend=false); ~SALOME_CorbaDoubleNCSender_i(); CORBA::ULong getSize(); SALOME::vectorOfDouble* sendPart(CORBA::ULong offset, CORBA::ULong length); @@ -55,10 +77,10 @@ public: /*! Servant class for CORBA sender for double* when copy of array _tabToSend is required, that is to say double and CORBA::Double are NOT binary equal. */ class SALOME_CorbaDoubleCSender_i : public POA_SALOME::CorbaDoubleCSender, - public SALOME_Sender_i + public SALOME_SenderDouble_i { public: - SALOME_CorbaDoubleCSender_i(const double *tabToSend,long lgrTabToSend); + SALOME_CorbaDoubleCSender_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend=false); ~SALOME_CorbaDoubleCSender_i(); CORBA::ULong getSize(); SALOME::vectorOfDouble* sendPart(CORBA::ULong offset, CORBA::ULong length); @@ -67,10 +89,10 @@ public: /*! Servant class for CORBA sender for int* when no copy of array _tabToSend is required, that is to say int and CORBA::Long are binary equal. */ class SALOME_CorbaLongNCSender_i : public POA_SALOME::CorbaLongNCSender, - public SALOME_Sender_i + public SALOME_SenderInt_i { public: - SALOME_CorbaLongNCSender_i(const int *tabToSend,long lgrTabToSend); + SALOME_CorbaLongNCSender_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend=false); ~SALOME_CorbaLongNCSender_i(); CORBA::ULong getSize(); SALOME::vectorOfLong* sendPart(CORBA::ULong offset, CORBA::ULong length); @@ -80,22 +102,24 @@ public: /*! Servant class for CORBA sender for int* when copy of array _tabToSend is required, that is to say int and CORBA::Long are NOT binary equal. */ class SALOME_CorbaLongCSender_i : public POA_SALOME::CorbaLongCSender, - public SALOME_Sender_i + public SALOME_SenderInt_i { public: - SALOME_CorbaLongCSender_i(const int *tabToSend,long lgrTabToSend); + SALOME_CorbaLongCSender_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend=false); ~SALOME_CorbaLongCSender_i(); CORBA::ULong getSize(); SALOME::vectorOfLong* sendPart(CORBA::ULong offset, CORBA::ULong length); +#ifndef WNT SALOME::CorbaLongCSender_ptr _this(); +#endif }; #ifdef HAVE_MPI2 /*! Servant class of sender using MPI2. */ -class SALOME_MPISender_i : public POA_SALOME::MPISender, - public SALOME_Sender_i +class SALOME_MPISender_i : public virtual POA_SALOME::MPISender, + public virtual SALOME_Sender_i { private: static unsigned long _tag1; @@ -113,8 +137,10 @@ private: void **_argsForThr; /*! Pointer to thread created on asynchronous invocation*/ omni_thread *_newThr; + /*! Type the component of the array*/ + SALOME::TypeOfDataTransmitted _type; public: - SALOME_MPISender_i(SALOME::TypeOfDataTransmitted type,const void *tabToSend,long lgrTabToSend,int sizeOf); + SALOME_MPISender_i(const void *tabToSend,long lgrTabToSend,int sizeOf,bool ownTabToSend=false); ~SALOME_MPISender_i(); SALOME::MPISender::param* getParam(); void send(); @@ -123,14 +149,30 @@ private: static void* myThread(void *args); }; +class SALOME_MPISenderDouble_i : public POA_SALOME::MPISenderDouble, + public SALOME_SenderDouble_i, + public SALOME_MPISender_i +{ +public: + SALOME_MPISenderDouble_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend=false); +}; + +class SALOME_MPISenderInt_i : public POA_SALOME::MPISenderInt, + public SALOME_SenderInt_i, + public SALOME_MPISender_i +{ +public: + SALOME_MPISenderInt_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend=false); +}; + #endif #ifdef HAVE_SOCKET /*! Servant class of sender using Sockets. */ -class SALOME_SocketSender_i : public POA_SALOME::SocketSender, - public SALOME_Sender_i +class SALOME_SocketSender_i : public virtual POA_SALOME::SocketSender, + public virtual SALOME_Sender_i { private: int _serverSockfd; @@ -140,8 +182,10 @@ private: void **_argsForThr; omni_thread *_newThr; bool _errorFlag; + /*! Type the component of the array*/ + SALOME::TypeOfDataTransmitted _type; public: - SALOME_SocketSender_i(SALOME::TypeOfDataTransmitted type,const void *tabToSend,long lgrTabToSend,int sizeOf); + SALOME_SocketSender_i(const void *tabToSend,long lgrTabToSend,int sizeOf,bool ownTabToSend=false); ~SALOME_SocketSender_i(); SALOME::SocketSender::param* getParam(); void send(); @@ -154,6 +198,22 @@ private: std::string inetAddress(); }; +class SALOME_SocketSenderDouble_i : public POA_SALOME::SocketSenderDouble, + public SALOME_SenderDouble_i, + public SALOME_SocketSender_i +{ +public: + SALOME_SocketSenderDouble_i(const double *tabToSend,long lgrTabToSend,bool ownTabToSend=false); +}; + +class SALOME_SocketSenderInt_i : public POA_SALOME::SocketSenderInt, + public SALOME_SenderInt_i, + public SALOME_SocketSender_i +{ +public: + SALOME_SocketSenderInt_i(const int *tabToSend,long lgrTabToSend,bool ownTabToSend=false); +}; + #endif #endif diff --git a/src/Communication/SenderFactory.cxx b/src/Communication/SenderFactory.cxx index 3b1f81165..04f8056d0 100644 --- a/src/Communication/SenderFactory.cxx +++ b/src/Communication/SenderFactory.cxx @@ -16,25 +16,25 @@ using namespace std; #define SALOME_CorbaLongSender SALOME_CorbaLongCSender_i #endif -SALOME::Sender_ptr SenderFactory::buildSender(SALOMEMultiComm &multiCommunicator,const double *tab,long lgr)throw(MultiCommException){ +SALOME::SenderDouble_ptr SenderFactory::buildSender(SALOMEMultiComm &multiCommunicator,const double *tab,long lgr,bool ownTab)throw(MultiCommException){ switch(multiCommunicator.getProtocol()) { case SALOME::CORBA_: { - SALOME_CorbaDoubleSender * retc=new SALOME_CorbaDoubleSender(tab,lgr); + SALOME_CorbaDoubleSender * retc=new SALOME_CorbaDoubleSender(tab,lgr,ownTab); return retc->_this(); } #ifdef HAVE_MPI2 case SALOME::MPI_: { - SALOME_MPISender_i* retm=new SALOME_MPISender_i(SALOME::DOUBLE_,tab,lgr,sizeof(double)); + SALOME_MPISenderDouble_i* retm=new SALOME_MPISenderDouble_i(tab,lgr,ownTab); return retm->_this(); } #endif #ifdef HAVE_SOCKET case SALOME::SOCKET_: { - SALOME_SocketSender_i* rets=new SALOME_SocketSender_i(SALOME::DOUBLE_,tab,lgr,sizeof(double)); + SALOME_SocketSenderDouble_i* rets=new SALOME_SocketSenderDouble_i(tab,lgr,ownTab); return rets->_this(); } #endif @@ -42,58 +42,61 @@ SALOME::Sender_ptr SenderFactory::buildSender(SALOMEMultiComm &multiCommunicator { multiCommunicator.setProtocol(SALOME::CORBA_); MESSAGE("PROTOCOL CHANGED TO CORBA"); - SALOME_CorbaDoubleSender * retc=new SALOME_CorbaDoubleSender(tab,lgr); + SALOME_CorbaDoubleSender * retc=new SALOME_CorbaDoubleSender(tab,lgr,ownTab); return retc->_this(); } // throw MultiCommException("Communication protocol not implemented"); } } -SALOME::Sender_ptr SenderFactory::buildSender(SALOMEMultiComm &multiCommunicator,const int *tab,long lgr)throw(MultiCommException){ +SALOME::SenderInt_ptr SenderFactory::buildSender(SALOMEMultiComm &multiCommunicator,const int *tab,long lgr,bool ownTab)throw(MultiCommException){ switch(multiCommunicator.getProtocol()) { case SALOME::CORBA_: { - SALOME_CorbaLongSender * retc=new SALOME_CorbaLongSender(tab,lgr); + SALOME_CorbaLongSender * retc=new SALOME_CorbaLongSender(tab,lgr,ownTab); return retc->_this(); } #ifdef HAVE_MPI2 case SALOME::MPI_: { - SALOME_MPISender_i* retm=new SALOME_MPISender_i(SALOME::INT_,tab,lgr,sizeof(int)); + SALOME_MPISenderInt_i* retm=new SALOME_MPISenderInt_i(tab,lgr,ownTab); return retm->_this(); } #endif #ifdef HAVE_SOCKET case SALOME::SOCKET_: { - SALOME_SocketSender_i* rets=new SALOME_SocketSender_i(SALOME::INT_,tab,lgr,sizeof(int)); + SALOME_SocketSenderInt_i* rets=new SALOME_SocketSenderInt_i(tab,lgr,ownTab); return rets->_this(); } #endif default: { multiCommunicator.setProtocol(SALOME::CORBA_); - SALOME_CorbaLongSender * retc=new SALOME_CorbaLongSender(tab,lgr); + SALOME_CorbaLongSender * retc=new SALOME_CorbaLongSender(tab,lgr,ownTab); return retc->_this(); } // throw MultiCommException("Communication protocol not implemented"); } } -SALOME::Sender_ptr SenderFactory::buildSender(SALOME::TypeOfCommunication NewType,SALOME_Sender_i *src) +SALOME::SenderDouble_ptr SenderFactory::buildSender(SALOME::TypeOfCommunication NewType,SALOME_SenderDouble_i *src) { SALOMEMultiComm mc(NewType); long n; - const void *data=src->getData(n); - switch(src->getTypeOfDataTransmitted()) - { - case SALOME::DOUBLE_: - return buildSender(mc,(const double *)data,n); - case SALOME::INT_: - return buildSender(mc,(const int *)data,n); - } - + const double *data=(const double *)src->getData(n); + bool own=src->getOwnerShip(); + src->setOwnerShip(false); + return buildSender(mc,data,n,own); } - +SALOME::SenderInt_ptr SenderFactory::buildSender(SALOME::TypeOfCommunication NewType,SALOME_SenderInt_i *src) +{ + SALOMEMultiComm mc(NewType); + long n; + const int *data=(const int *)src->getData(n); + bool own=src->getOwnerShip(); + src->setOwnerShip(false); + return buildSender(mc,data,n,own); +} diff --git a/src/Communication/SenderFactory.hxx b/src/Communication/SenderFactory.hxx index d85a842ba..39edaa3a1 100644 --- a/src/Communication/SenderFactory.hxx +++ b/src/Communication/SenderFactory.hxx @@ -5,19 +5,44 @@ #include #include CORBA_SERVER_HEADER(SALOME_Comm) +#if defined WNT && defined COMMUNICATION_EXPORTS +#define COMMUNICATION_EXPORT __declspec( dllexport ) +#else +#define COMMUNICATION_EXPORT +#endif + class SALOMEMultiComm; -class SALOME_Sender_i; +class SALOME_SenderDouble_i; +class SALOME_SenderInt_i; /*! This class implements the factory pattern of GoF by making a sender by giving an array and a communicator.It completely hides the type of sender from the user. */ -class SenderFactory +class COMMUNICATION_EXPORT SenderFactory { public: - static SALOME::Sender_ptr buildSender(SALOMEMultiComm &multiCommunicator,const double *tab,long lgr) throw(MultiCommException); - static SALOME::Sender_ptr buildSender(SALOMEMultiComm &multiCommunicator,const int *tab,long lgr) throw(MultiCommException); - static SALOME::Sender_ptr buildSender(SALOME::TypeOfCommunication NewType,SALOME_Sender_i *src); + static SALOME::SenderDouble_ptr buildSender(SALOMEMultiComm &multiCommunicator,const double *tab,long lgr,bool ownTab=false) throw(MultiCommException); + static SALOME::SenderInt_ptr buildSender(SALOMEMultiComm &multiCommunicator,const int *tab,long lgr,bool ownTab=false) throw(MultiCommException); + static SALOME::SenderDouble_ptr buildSender(SALOME::TypeOfCommunication NewType,SALOME_SenderDouble_i *src); + static SALOME::SenderInt_ptr buildSender(SALOME::TypeOfCommunication NewType,SALOME_SenderInt_i *src); +}; + +template +struct mapCppSender { + typedef T SenderVarType; +}; + +template<> +struct mapCppSender +{ + typedef SALOME::SenderInt_var SenderVarType; +}; + +template<> +struct mapCppSender +{ + typedef SALOME::SenderDouble_var SenderVarType; }; #endif diff --git a/src/Communication/libSALOME_Comm.i b/src/Communication/libSALOME_Comm.i new file mode 100644 index 000000000..b4ad75325 --- /dev/null +++ b/src/Communication/libSALOME_Comm.i @@ -0,0 +1,117 @@ +%{ + #include "ReceiverFactory.hxx" + #include "SALOME_Comm_i.hxx" +%} + +%typemap(python,in) SALOME::SenderDouble_ptr +{ + PyObject* pdict = PyDict_New(); + PyDict_SetItemString(pdict, "__builtins__", PyEval_GetBuiltins()); + PyRun_String("import CORBA", Py_single_input, pdict, pdict); + + PyRun_String("o = CORBA.ORB_init([''], CORBA.ORB_ID);", Py_single_input, + pdict, pdict); + + PyObject* orb = PyDict_GetItemString(pdict, "o"); + + // Ask omniORBpy to transform SUPPORT (python Corba) ptr to IOR string + + PyObject* iorSupport = PyObject_CallMethod(orb, "object_to_string", "O", $input); + + if (iorSupport == Py_None) + return NULL; + char * s = PyString_AsString(PyObject_Str(iorSupport)); + + // Ask omniORB to convert IOR string to SALOME::SenderDouble_ptr + + int argc = 0; + char *xargv = ""; + char **argv = &xargv; + CORBA::ORB_var ORB = CORBA::ORB_init(argc, argv); + CORBA::Object_var O = ORB->string_to_object(s); + SALOME::SenderDouble_ptr t = SALOME::SenderDouble::_narrow(O); + $1 = t; +} + +%typemap(python,in) SALOME::SenderInt_ptr +{ + PyObject* pdict = PyDict_New(); + PyDict_SetItemString(pdict, "__builtins__", PyEval_GetBuiltins()); + PyRun_String("import CORBA", Py_single_input, pdict, pdict); + + PyRun_String("o = CORBA.ORB_init([''], CORBA.ORB_ID);", Py_single_input, + pdict, pdict); + + PyObject* orb = PyDict_GetItemString(pdict, "o"); + + // Ask omniORBpy to transform SUPPORT (python Corba) ptr to IOR string + + PyObject* iorSupport = PyObject_CallMethod(orb, "object_to_string", "O", $input); + + if (iorSupport == Py_None) + return NULL; + char * s = PyString_AsString(PyObject_Str(iorSupport)); + + // Ask omniORB to convert IOR string to SALOME::SenderInt_ptr + + int argc = 0; + char *xargv = ""; + char **argv = &xargv; + CORBA::ORB_var ORB = CORBA::ORB_init(argc, argv); + CORBA::Object_var O = ORB->string_to_object(s); + SALOME::SenderInt_ptr t = SALOME::SenderInt::_narrow(O); + $1 = t; +} + +PyObject * getValueForSenderDouble(SALOME::SenderDouble_ptr senderDouble); + +%{ +PyObject * getValueForSenderDouble(SALOME::SenderDouble_ptr senderDouble) +{ + PyObject *py_list; + long size; + double *ret=ReceiverFactory::getValue(senderDouble,size); + py_list = PyList_New(size); + for (int i=0; i < size; i++) + { + int err = PyList_SetItem(py_list, i, Py_BuildValue("d", (double) ret[i])); + if(err) + { + char * message = "Error in SUPPORT::getTypes"; + PyErr_SetString(PyExc_RuntimeError, message); + return NULL; + } + } + PyObject * result = Py_BuildValue("O", py_list); + delete [] ret; + Py_DECREF(py_list); + return result; +} +%} + + +PyObject * getValueForSenderInt(SALOME::SenderInt_ptr senderInt); + +%{ +PyObject * getValueForSenderInt(SALOME::SenderInt_ptr senderInt) +{ + PyObject *py_list; + long size; + int *ret=ReceiverFactory::getValue(senderInt,size); + py_list = PyList_New(size); + for (int i=0; i < size; i++) + { + int err = PyList_SetItem(py_list, i, Py_BuildValue("i", (int) ret[i])); + if(err) + { + char * message = "Error in SUPPORT::getTypes"; + PyErr_SetString(PyExc_RuntimeError, message); + return NULL; + } + } + PyObject * result = Py_BuildValue("O", py_list); + delete [] ret; + Py_DECREF(py_list); + return result; +} +%} diff --git a/src/Container/Component_i.cxx b/src/Container/Component_i.cxx index ff343a2cc..258a7acf7 100644 --- a/src/Container/Component_i.cxx +++ b/src/Container/Component_i.cxx @@ -26,24 +26,61 @@ // Module : SALOME // $Header$ +//#define private protected // for pd_refCount trace #include "SALOME_Component_i.hxx" #include "SALOME_Container_i.hxx" #include "RegistryConnexion.hxx" #include "OpUtil.hxx" #include +#ifndef WNT #include +#endif #include #include "utilities.h" + +#ifndef WNT +#include +#include +#include +#else +#include +int SIGUSR11 = 1000; +#endif + + using namespace std; extern bool _Sleeping ; static Engines_Component_i * theEngines_Component ; +bool Engines_Component_i::_isMultiStudy = true; +bool Engines_Component_i::_isMultiInstance = false; + +//============================================================================= +/*! + * Default constructor, not for use + */ +//============================================================================= + Engines_Component_i::Engines_Component_i() { -// MESSAGE("Component constructor"); + //ASSERT(0); + INFOS("Default Constructor..."); } +//============================================================================= +/*! + * Standard Constructor for generic Component, used in derived class + * Connection to Registry and Notification + * \param orb Object Request broker given by Container + * \parap poa Portable Object Adapter from Container (normally root_poa) + * \param contId container CORBA id inside the server + * \param instanceName unique instance name for this object (see Container_i) + * \param interfaceName component class name + * \param notif use of notification + */ +//============================================================================= + Engines_Component_i::Engines_Component_i(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, PortableServer::ObjectId * contId, @@ -53,63 +90,142 @@ Engines_Component_i::Engines_Component_i(CORBA::ORB_ptr orb, _instanceName(instanceName), _interfaceName(interfaceName), _myConnexionToRegistry(0), - _ThreadId(0) , _ThreadCpuUsed(0) , _Executed(false) , _graphName("") , _nodeName("") { + _ThreadId(0) , + _ThreadCpuUsed(0) , + _Executed(false) , + _graphName("") , + _nodeName(""), + _studyId(-1) +{ MESSAGE("Component constructor with instanceName "<< _instanceName); + //SCRUTE(pd_refCount); _orb = CORBA::ORB::_duplicate(orb); _poa = PortableServer::POA::_duplicate(poa); _contId = contId ; CORBA::Object_var o = _poa->id_to_reference(*contId); // container ior... const CORBA::String_var ior = _orb->object_to_string(o); - _myConnexionToRegistry = new RegistryConnexion(0, 0, ior, "theSession", _instanceName.c_str()); + _myConnexionToRegistry = new RegistryConnexion(0, 0, ior,"theSession", + _instanceName.c_str()); _notifSupplier = new NOTIFICATION_Supplier(instanceName, notif); + //SCRUTE(pd_refCount); } -// Constructeur pour composant parallele: ne pas faire appel au registry!! +//============================================================================= +/*! + * Standard constructor for parallel component + * Connection Notification (no connection to Registry !) + * \param orb Object Request broker given by Container + * \parap poa Portable Object Adapter from Container (normally root_poa) + * \param contId container CORBA id inside the server + * \param instanceName unique instance name for this object (see Container_i) + * \param interfaceName component class name + * \param flag not used... + * \param notif use of notification + */ +//============================================================================= + Engines_Component_i::Engines_Component_i(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, PortableServer::ObjectId * contId, const char *instanceName, const char *interfaceName, int flag, - bool notif ) - : _instanceName(instanceName), - _interfaceName(interfaceName), - _myConnexionToRegistry(0), - _ThreadId(0) , _ThreadCpuUsed(0) , _Executed(false) , _graphName("") , _nodeName("") { -// MESSAGE("Component constructor with instanceName "<< _instanceName); + bool notif ) : + _instanceName(instanceName), + _interfaceName(interfaceName), + _myConnexionToRegistry(0), + _ThreadId(0) , + _ThreadCpuUsed(0) , + _Executed(false) , + _graphName("") , + _nodeName(""), + _studyId(-1) +{ _orb = CORBA::ORB::_duplicate(orb); _poa = PortableServer::POA::_duplicate(poa); _contId = contId ; - // CORBA::Object_var myself = this->_this(); //appel a _this = increment reference _notifSupplier = new NOTIFICATION_Supplier(instanceName, notif); } +//============================================================================= +/*! + * Destructor: call Container for decrement of instances count. + * When instances count falls to 0, the container tries to remove the + * component library (dlclose) + */ +//============================================================================= + Engines_Component_i::~Engines_Component_i() { MESSAGE("Component destructor"); -// delete _myConnexionToRegistry; -// _myConnexionToRegistry = 0 ; + Engines_Container_i::decInstanceCnt(_interfaceName); } -char* Engines_Component_i::instanceName() { +//============================================================================= +/*! + * CORBA method: return name of the instance, unique in this Container + */ +//============================================================================= + +char* Engines_Component_i::instanceName() +{ return CORBA::string_dup(_instanceName.c_str()) ; } -char* Engines_Component_i::interfaceName() { - return CORBA::string_dup(_interfaceName.c_str()) ; +//============================================================================= +/*! + * CORBA method: return name of the component class + */ +//============================================================================= + +char* Engines_Component_i::interfaceName() +{ + return CORBA::string_dup(_interfaceName.c_str()) ; +} + +//============================================================================= +/*! + * CORBA method: Get study Id + * \return -1: not initialised (Internal Error) + * 0: multistudy component instance + * >0: study id associated to this instance + */ +//============================================================================= + +CORBA::Long Engines_Component_i::getStudyId() +{ + return _studyId; } +//============================================================================= +/*! + * CORBA method: Test if instance is alive and responds + */ +//============================================================================= + void Engines_Component_i::ping() { MESSAGE("Engines_Component_i::ping() pid "<< getpid() << " threadid " << pthread_self()); } +//============================================================================= +/*! + * CORBA method: Deactivate this instance. CORBA object is deactivated (do not + * respond any more to CORBA calls), the connection to Regsitry is removed + * (Registry informed of deactivation), internal server reference counter on + * the derived servant class is decremented, to allow destruction of the class + * (delete) by POA, when there are no more references. + * -- TO BE USED BY CONTAINER ONLY (Container housekeeping) -- + */ +//============================================================================= + void Engines_Component_i::destroy() { MESSAGE("Engines_Component_i::destroy()"); + //SCRUTE(pd_refCount); delete _notifSupplier; _notifSupplier = 0; @@ -119,10 +235,19 @@ void Engines_Component_i::destroy() _poa->deactivate_object(*_id) ; CORBA::release(_poa) ; delete(_id) ; + //SCRUTE(pd_refCount); _thisObj->_remove_ref(); + //SCRUTE(pd_refCount); MESSAGE("Engines_Component_i::destroyed") ; } +//============================================================================= +/*! + * CORBA method: return CORBA reference of the Container + * + */ +//============================================================================= + Engines::Container_ptr Engines_Component_i::GetContainerRef() { MESSAGE("Engines_Component_i::GetContainerRef"); @@ -130,11 +255,16 @@ Engines::Container_ptr Engines_Component_i::GetContainerRef() return Engines::Container::_narrow(o); } -PortableServer::ObjectId * Engines_Component_i::getId() -{ -// MESSAGE("PortableServer::ObjectId * Engines_Component_i::getId()"); - return _id ; -} +//============================================================================= +/*! + * CORBA method: + * Gives a sequence of (key=string,value=any) to the component. + * Base class component stores the sequence in a map. + * The map is cleared before. + * This map is for use by derived classes. + * \param dico sequence of (key=string,value=any) + */ +//============================================================================= void Engines_Component_i::setProperties(const Engines::FieldsDict& dico) { @@ -146,6 +276,14 @@ void Engines_Component_i::setProperties(const Engines::FieldsDict& dico) } } +//============================================================================= +/*! + * CORBA method: + * returns a previously stored map (key=string,value=any) as a sequence. + * (see setProperties) + */ +//============================================================================= + Engines::FieldsDict* Engines_Component_i::getProperties() { Engines::FieldsDict_var copie = new Engines::FieldsDict; @@ -161,24 +299,298 @@ Engines::FieldsDict* Engines_Component_i::getProperties() return copie._retn(); } +//============================================================================= +/*! + * CORBA method: used by Supervision to give names to this instance + */ +//============================================================================= + +void Engines_Component_i::Names( const char * graphName , + const char * nodeName ) +{ + _graphName = graphName ; + _nodeName = nodeName ; + // MESSAGE("Engines_Component_i::Names( '" << _graphName << "' , '" + // << _nodeName << "' )"); +} + +//============================================================================= +/*! + * CORBA method: used in Supervision + */ +//============================================================================= + +bool Engines_Component_i::Kill_impl() +{ +// MESSAGE("Engines_Component_i::Kill_i() pthread_t "<< pthread_self() +// << " pid " << getpid() << " instanceName " +// << _instanceName.c_str() << " interface " << _interfaceName.c_str() +// << " machineName " << GetHostname().c_str()<< " _id " << hex << _id +// << dec << " _ThreadId " << _ThreadId << " this " << hex << this +// << dec ) ; + + bool RetVal = false ; +#ifndef WNT + if ( _ThreadId > 0 && pthread_self() != _ThreadId ) + { + RetVal = Killer( _ThreadId , 0 ) ; + _ThreadId = (pthread_t ) -1 ; + } + +#else + if ( _ThreadId > 0 && pthread_self().p != _ThreadId->p ) + { + RetVal = Killer( *_ThreadId , 0 ) ; + _ThreadId = (pthread_t* ) 0 ; + } + +#endif + return RetVal ; +} + +//============================================================================= +/*! + * CORBA method: used in Supervision + */ +//============================================================================= + +bool Engines_Component_i::Stop_impl() +{ + MESSAGE("Engines_Component_i::Stop_i() pthread_t "<< pthread_self() + << " pid " << getpid() << " instanceName " + << _instanceName.c_str() << " interface " << _interfaceName.c_str() + << " machineName " << GetHostname().c_str()<< " _id " << hex << _id + << dec << " _ThreadId " << _ThreadId ); + + + bool RetVal = false ; +#ifndef WNT + if ( _ThreadId > 0 && pthread_self() != _ThreadId ) + { + RetVal = Killer( _ThreadId , 0 ) ; + _ThreadId = (pthread_t ) -1 ; + } +#else + if ( _ThreadId > 0 && pthread_self().p != _ThreadId->p ) + { + RetVal = Killer( *_ThreadId , 0 ) ; + _ThreadId = (pthread_t* ) 0 ; + } +#endif + return RetVal ; +} + +//============================================================================= +/*! + * CORBA method: used in Supervision + */ +//============================================================================= + +bool Engines_Component_i::Suspend_impl() +{ + MESSAGE("Engines_Component_i::Suspend_i() pthread_t "<< pthread_self() + << " pid " << getpid() << " instanceName " + << _instanceName.c_str() << " interface " << _interfaceName.c_str() + << " machineName " << GetHostname().c_str()<< " _id " << hex << _id + << dec << " _ThreadId " << _ThreadId ); + + bool RetVal = false ; +#ifndef WNT + if ( _ThreadId > 0 && pthread_self() != _ThreadId ) +#else + if ( _ThreadId > 0 && pthread_self().p != _ThreadId->p ) +#endif + { + if ( _Sleeping ) + { + return false ; + } + else + { +#ifndef WNT + RetVal = Killer( _ThreadId ,SIGINT ) ; +#else + RetVal = Killer( *_ThreadId ,SIGINT ) ; +#endif + //if ( RetVal ) _Sleeping = true; + + } + } + return RetVal ; +} + +//============================================================================= +/*! + * CORBA method: used in Supervision + */ +//============================================================================= + +bool Engines_Component_i::Resume_impl() +{ + MESSAGE("Engines_Component_i::Resume_i() pthread_t "<< pthread_self() + << " pid " << getpid() << " instanceName " + << _instanceName.c_str() << " interface " << _interfaceName.c_str() + << " machineName " << GetHostname().c_str()<< " _id " << hex << _id + << dec << " _ThreadId " << _ThreadId ); + bool RetVal = false ; +#ifndef WNT + if ( _ThreadId > 0 && pthread_self() != _ThreadId ) +#else + if ( _ThreadId > 0 && pthread_self().p != _ThreadId->p ) +#endif + { + if ( _Sleeping ) + { + _Sleeping = false ; + RetVal = true ; + } + else + { + RetVal = false ; + } + } + return RetVal ; +} + +//============================================================================= +/*! + * CORBA method: + */ +//============================================================================= + +CORBA::Long Engines_Component_i::CpuUsed_impl() +{ + long cpu = 0 ; + if ( _ThreadId || _Executed ) + { + if ( _ThreadId > 0 ) + { +#ifndef WNT + if ( pthread_self() != _ThreadId ) +#else + if ( pthread_self().p != _ThreadId->p ) +#endif + { + if ( _Sleeping ) + { + } + else + { + // Get Cpu in the appropriate thread with that object !... + theEngines_Component = this ; +#ifndef WNT + Killer( _ThreadId ,SIGUSR1 ) ; +#else + Killer( *_ThreadId ,SIGUSR11 ) ; +#endif + } + cpu = _ThreadCpuUsed ; + } + else + { + _ThreadCpuUsed = CpuUsed() ; + cpu = _ThreadCpuUsed ; + // cout << pthread_self() << " Engines_Component_i::CpuUsed_impl " + // << _serviceName << " " << cpu << endl ; + } + } + else + { + cpu = _ThreadCpuUsed ; + // cout << pthread_self() << " Engines_Component_i::CpuUsed_impl " + // << _serviceName << " " << cpu<< endl ; + } + } + else + { + // cout<< pthread_self()<<"Engines_Component_i::CpuUsed_impl _ThreadId " + // <<_ThreadId <<" "<<_serviceName<<" _StartUsed "<<_StartUsed<(_poa->id_to_servant(*_contId)) ; +} + +//============================================================================= +/*! + * C++ method: set study Id + * \param studyId 0 if instance is not associated to a study, + * >0 otherwise (== study id) + * \return true if the set of study Id is OK + * must be set once by Container, at instance creation, + * and cannot be changed after. + */ +//============================================================================= + +CORBA::Boolean Engines_Component_i::setStudyId(CORBA::Long studyId) +{ + ASSERT( studyId >= 0); + CORBA::Boolean ret = false; + if (_studyId < 0) // --- not yet initialized + { + _studyId = studyId; + ret = true; + } + else + if ( _studyId == studyId) ret = true; + return ret; +} + +//============================================================================= +/*! + * C++ method: return CORBA instance id, the id is set in derived class + * constructor, when instance is activated. + */ +//============================================================================= + +PortableServer::ObjectId * Engines_Component_i::getId() +{ +// MESSAGE("PortableServer::ObjectId * Engines_Component_i::getId()"); + return _id ; +} + +//============================================================================= +/*! + * C++ method: used by derived classes for supervision + */ +//============================================================================= + void Engines_Component_i::beginService(const char *serviceName) { - MESSAGE(pthread_self() << "Send BeginService notification for " << serviceName << endl - << "Component instance : " << _instanceName << endl << endl); + MESSAGE(pthread_self() << "Send BeginService notification for " <p = pthread_self().p ; + _ThreadId->x = pthread_self().x ; +#endif _StartUsed = 0 ; _StartUsed = CpuUsed_impl() ; _ThreadCpuUsed = 0 ; _Executed = true ; _serviceName = serviceName ; - if ( pthread_setcanceltype( PTHREAD_CANCEL_ASYNCHRONOUS , NULL ) ) { - perror("pthread_setcanceltype ") ; - exit(0) ; - } - if ( pthread_setcancelstate( PTHREAD_CANCEL_ENABLE , NULL ) ) { - perror("pthread_setcancelstate ") ; - exit(0) ; - } + if ( pthread_setcanceltype( PTHREAD_CANCEL_ASYNCHRONOUS , NULL ) ) + { + perror("pthread_setcanceltype ") ; + exit(0) ; + } + if ( pthread_setcancelstate( PTHREAD_CANCEL_ENABLE , NULL ) ) + { + perror("pthread_setcancelstate ") ; + exit(0) ; + } // MESSAGE(pthread_self() << " Return from BeginService for " << serviceName // << " ThreadId " << _ThreadId << " StartUsed " << _StartUsed // << " _graphName " << _graphName << " _nodeName " << _nodeName ); @@ -194,7 +606,7 @@ void Engines_Component_i::beginService(const char *serviceName) { const char* value; (*it).second >>= value; - // --- todo: replace __GNUC__ test by an autoconf macro AC_CHECK_FUNC... + // ---todo: replace __GNUC__ test by an autoconf macro AC_CHECK_FUNC. #if defined __GNUC__ int ret = setenv(cle.c_str(), value, overwrite); #else @@ -202,7 +614,8 @@ void Engines_Component_i::beginService(const char *serviceName) std::string s(cle); s+='='; s+=value; - //char* cast because 1st arg of linux putenv function is not a const char* !!! + // char* cast because 1st arg of linux putenv function + // is not a const char* ! int ret=putenv((char *)s.c_str()); //End of CCRT porting #endif @@ -211,194 +624,166 @@ void Engines_Component_i::beginService(const char *serviceName) } } +//============================================================================= +/*! + * C++ method: used by derived classes for supervision + */ +//============================================================================= + void Engines_Component_i::endService(const char *serviceName) { _ThreadCpuUsed = CpuUsed_impl() ; - MESSAGE(pthread_self() << " Send EndService notification for " << serviceName << endl - << " Component instance : " << _instanceName << " StartUsed " << _StartUsed << " _ThreadCpuUsed " - << _ThreadCpuUsed << endl << endl); + MESSAGE(pthread_self() << " Send EndService notification for " << serviceName + << endl << " Component instance : " << _instanceName << " StartUsed " + << _StartUsed << " _ThreadCpuUsed "<< _ThreadCpuUsed << endl < 0 && pthread_self() != _ThreadId ) { - RetVal = Killer( _ThreadId , 0 ) ; - _ThreadId = (pthread_t ) -1 ; - } - return RetVal ; -} - -bool Engines_Component_i::Stop_impl() { - MESSAGE("Engines_Component_i::Stop_i() pthread_t "<< pthread_self() - << " pid " << getpid() << " instanceName " - << _instanceName.c_str() << " interface " << _interfaceName.c_str() - << " machineName " << GetHostname().c_str()<< " _id " << hex << _id - << dec << " _ThreadId " << _ThreadId ); - bool RetVal = false ; - if ( _ThreadId > 0 && pthread_self() != _ThreadId ) { - RetVal = Killer( _ThreadId , 0 ) ; - _ThreadId = (pthread_t ) -1 ; - } - return RetVal ; -} +//============================================================================= +/*! + * C++ method: + */ +//============================================================================= -bool Engines_Component_i::Suspend_impl() { - MESSAGE("Engines_Component_i::Suspend_i() pthread_t "<< pthread_self() - << " pid " << getpid() << " instanceName " - << _instanceName.c_str() << " interface " << _interfaceName.c_str() - << " machineName " << GetHostname().c_str()<< " _id " << hex << _id - << dec << " _ThreadId " << _ThreadId ); - bool RetVal = false ; - if ( _ThreadId > 0 && pthread_self() != _ThreadId ) { - if ( _Sleeping ) { - return false ; - } - else { - RetVal = Killer( _ThreadId ,SIGINT ) ; - } - } - return RetVal ; +void SetCpuUsed() +{ + theEngines_Component->SetCurCpu() ; } -bool Engines_Component_i::Resume_impl() { - MESSAGE("Engines_Component_i::Resume_i() pthread_t "<< pthread_self() - << " pid " << getpid() << " instanceName " - << _instanceName.c_str() << " interface " << _interfaceName.c_str() - << " machineName " << GetHostname().c_str()<< " _id " << hex << _id - << dec << " _ThreadId " << _ThreadId ); - bool RetVal = false ; - if ( _ThreadId > 0 && pthread_self() != _ThreadId ) { - if ( _Sleeping ) { - _Sleeping = false ; - RetVal = true ; - } - else { - RetVal = false ; - } - } - return RetVal ; +//============================================================================= +/*! + * C++ method: + */ +//============================================================================= -} - -void SetCpuUsed() { - theEngines_Component->SetCurCpu() ; -} -void Engines_Component_i::SetCurCpu() { +void Engines_Component_i::SetCurCpu() +{ _ThreadCpuUsed = CpuUsed() ; -// MESSAGE(pthread_self() << " Engines_Component_i::SetCurCpu() _ThreadCpuUsed " << _ThreadCpuUsed) ; + // MESSAGE(pthread_self() << + // " Engines_Component_i::SetCurCpu() _ThreadCpuUsed " << _ThreadCpuUsed) ; } -#include -#include -#include +//============================================================================= +/*! + * C++ method: + */ +//============================================================================= -long Engines_Component_i::CpuUsed() { +long Engines_Component_i::CpuUsed() +{ long cpu = 0 ; +#ifndef WNT struct rusage usage ; - if ( _ThreadId || _Executed ) { - if ( getrusage( RUSAGE_SELF , &usage ) == -1 ) { - perror("Engines_Component_i::CpuUsed") ; - return 0 ; - } - cpu = usage.ru_utime.tv_sec - _StartUsed ; -// cout << pthread_self() << " Engines_Component_i::CpuUsed " << " " << _serviceName -// << usage.ru_utime.tv_sec << " - " << _StartUsed << " = " << cpu << endl ; - } - else { -// cout << pthread_self() << "Engines_Component_i::CpuUsed _ThreadId " << _ThreadId << " " << _serviceName -// << " _StartUsed " << _StartUsed << endl ; - } - return cpu ; -} - -CORBA::Long Engines_Component_i::CpuUsed_impl() { - long cpu = 0 ; - if ( _ThreadId || _Executed ) { - if ( _ThreadId > 0 ) { - if ( pthread_self() != _ThreadId ) { - if ( _Sleeping ) { - } - else { -// Get Cpu in the appropriate thread with that object !... - theEngines_Component = this ; - Killer( _ThreadId ,SIGUSR1 ) ; - } - cpu = _ThreadCpuUsed ; - } - else { - _ThreadCpuUsed = CpuUsed() ; - cpu = _ThreadCpuUsed ; -// cout << pthread_self() << " Engines_Component_i::CpuUsed_impl " << _serviceName << " " << cpu -// << endl ; - } + if ( _ThreadId || _Executed ) + { + if ( getrusage( RUSAGE_SELF , &usage ) == -1 ) + { + perror("Engines_Component_i::CpuUsed") ; + return 0 ; + } + cpu = usage.ru_utime.tv_sec - _StartUsed ; + // cout << pthread_self() << " Engines_Component_i::CpuUsed " << " " + // << _serviceName << usage.ru_utime.tv_sec << " - " << _StartUsed + // << " = " << cpu << endl ; } - else { - cpu = _ThreadCpuUsed ; -// cout << pthread_self() << " Engines_Component_i::CpuUsed_impl " << _serviceName << " " << cpu -// << endl ; + else + { + // cout << pthread_self() << "Engines_Component_i::CpuUsed _ThreadId " + // << _ThreadId << " " << _serviceName<< " _StartUsed " + // << _StartUsed << endl ; } - } - else { -// cout << pthread_self() << "Engines_Component_i::CpuUsed_impl _ThreadId " << _ThreadId << " " -// << _serviceName << " _StartUsed " << _StartUsed << endl ; - } +#else + // NOT implementet yet +#endif + + return cpu ; } -// Send message to event channel +//============================================================================= +/*! + * C++ method: Send message to event channel + */ +//============================================================================= -void Engines_Component_i::sendMessage(const char *event_type, const char *message) { +void Engines_Component_i::sendMessage(const char *event_type, + const char *message) +{ _notifSupplier->Send(graphName(), nodeName(), event_type, message); } +//============================================================================= +/*! + * C++ method: return standard library name built on component name + */ +//============================================================================= + string Engines_Component_i::GetDynLibraryName(const char *componentName) { string ret="lib"; @@ -407,11 +792,22 @@ string Engines_Component_i::GetDynLibraryName(const char *componentName) return ret; } -string Engines_Component_i::BuildComponentNameForNS(const char *ComponentName, const char *ContainerName, const char *hostname) +//============================================================================= +/*! + * C++ method: DumpPython default implementation + */ +//============================================================================= + +Engines::TMPFile* Engines_Component_i::DumpPython(CORBA::Object_ptr theStudy, + CORBA::Boolean isPublished, + CORBA::Boolean& isValidScript) { - string ret=Engines_Container_i::BuildContainerNameForNS(ContainerName,hostname); - ret+="/"; - ret+=ComponentName; - return ret; + char* aScript = "def RebuildData(theStudy): pass"; + char* aBuffer = new char[strlen(aScript)+1]; + strcpy(aBuffer, aScript); + CORBA::Octet* anOctetBuf = (CORBA::Octet*)aBuffer; + int aBufferSize = strlen(aBuffer)+1; + Engines::TMPFile_var aStreamFile = new Engines::TMPFile(aBufferSize, aBufferSize, anOctetBuf, 1); + isValidScript = true; + return aStreamFile._retn(); } - diff --git a/src/Container/Container_i.cxx b/src/Container/Container_i.cxx index b65bf13bd..62b58f98a 100644 --- a/src/Container/Container_i.cxx +++ b/src/Container/Container_i.cxx @@ -26,23 +26,37 @@ // Module : SALOME // $Header$ +//#define private public #include +#ifndef WNT #include CORBA_SERVER_HEADER(SALOME_Component) +#else +#include +#endif #include "SALOME_Container_i.hxx" +#include "SALOME_Component_i.hxx" #include "SALOME_NamingService.hxx" -//#include "Utils_SINGLETON.hxx" #include "OpUtil.hxx" #include #include +#ifndef WNT #include #include +#else +#include "../../adm/win32/SALOME_WNT.hxx" +#include +#include +int SIGUSR1 = 1000; +#endif +#include +#include "Container_init_python.hxx" #include "utilities.h" using namespace std; bool _Sleeping = false ; -// Needed by multi-threaded Python +// // Needed by multi-threaded Python --- Supervision int _ArgC ; char ** _ArgV ; @@ -51,15 +65,35 @@ char ** _ArgV ; // Other Containers are started via start_impl of FactoryServer extern "C" {void ActSigIntHandler() ; } +#ifndef WNT extern "C" {void SigIntHandler(int, siginfo_t *, void *) ; } +#else + extern "C" {void SigIntHandler( int ) ; } +#endif -const char *Engines_Container_i::_defaultContainerName="FactoryServer"; + +map Engines_Container_i::_cntInstances_map; +map Engines_Container_i::_library_map; +map Engines_Container_i::_toRemove_map; +omni_mutex Engines_Container_i::_numInstanceMutex ; + +//============================================================================= +/*! + * Default constructor, not for use + */ +//============================================================================= Engines_Container_i::Engines_Container_i () : - _numInstance(0) + _numInstance(0) { } +//============================================================================= +/*! + * Construtor to use + */ +//============================================================================= + Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, char *containerName , @@ -74,219 +108,714 @@ Engines_Container_i::Engines_Container_i (CORBA::ORB_ptr orb, if(activAndRegist) ActSigIntHandler() ; - _ArgC = argc ; - _ArgV = argv ; - _argc = argc ; _argv = argv ; - int i = strlen( _argv[ 0 ] ) - 1 ; - while ( i >= 0 ) { - if ( _argv[ 0 ][ i ] == '/' ) { - _argv[ 0 ][ i+1 ] = '\0' ; - break ; - } - i -= 1 ; - } + string hostname = GetHostname(); MESSAGE(hostname << " " << getpid() << " Engines_Container_i starting argc " << _argc << " Thread " << pthread_self() ) ; - i = 0 ; - while ( _argv[ i ] ) { - MESSAGE(" argv" << i << " " << _argv[ i ]) ; - i++ ; - } - if ( argc != 4 ) { - MESSAGE("SALOME_Container usage : SALOME_Container ServerName -ORBInitRef NameService=corbaname::hostname:tcpipPortNumber") ; -// exit(0) ; - } - SCRUTE(hostname); + int i = 0 ; + while ( _argv[ i ] ) + { + MESSAGE(" argv" << i << " " << _argv[ i ]) ; + i++ ; + } + + if ( argc < 2 ) + { + INFOS("SALOME_Container usage : SALOME_Container ServerName"); + ASSERT(0) ; + } + SCRUTE(argv[1]); + _isSupervContainer = false; + if (strcmp(argv[1],"SuperVisionContainer") == 0) _isSupervContainer = true; - _containerName = BuildContainerNameForNS(containerName,hostname.c_str()); + if (_isSupervContainer) + { + _ArgC = argc ; + _ArgV = argv ; + } _orb = CORBA::ORB::_duplicate(orb) ; _poa = PortableServer::POA::_duplicate(poa) ; + + // Pour les containers paralleles: il ne faut pas enregistrer et activer + // le container generique, mais le container specialise - // Pour les containers paralleles: il ne faut pas enregistrer et activer le container generique, mais le container specialise - if(activAndRegist){ - _id = _poa->activate_object(this); - _NS = new SALOME_NamingService();//SINGLETON_::Instance() ; - //ASSERT(SINGLETON_::IsAlreadyExisting()) ; - _NS->init_orb( CORBA::ORB::_duplicate(_orb) ) ; - CORBA::Object_var obj=_poa->id_to_reference(*_id); - Engines::Container_var pCont - = Engines::Container::_narrow(obj); - SCRUTE(_containerName); - _NS->Register(pCont, _containerName.c_str()); - } + if(activAndRegist) + { + _id = _poa->activate_object(this); + _NS = new SALOME_NamingService(); + _NS->init_orb( CORBA::ORB::_duplicate(_orb) ) ; + CORBA::Object_var obj=_poa->id_to_reference(*_id); + Engines::Container_var pCont + = Engines::Container::_narrow(obj); + + _containerName = _NS->BuildContainerNameForNS(containerName, + hostname.c_str()); + SCRUTE(_containerName); + _NS->Register(pCont, _containerName.c_str()); + MESSAGE("Engines_Container_i::Engines_Container_i : Container name " + << _containerName); + + // Python: + // import SALOME_Container + // pycont = SALOME_Container.SALOME_Container_i(containerIORStr) + + CORBA::String_var sior = _orb->object_to_string(pCont); + string myCommand="pyCont = SALOME_Container.SALOME_Container_i('"; + myCommand += _containerName + "','"; + myCommand += sior; + myCommand += "')\n"; + SCRUTE(myCommand); + + if (!_isSupervContainer) + { + Py_ACQUIRE_NEW_THREAD; +#ifdef WNT + // mpv: this is temporary solution: there is a unregular crash if not + Sleep(2000); + PyRun_SimpleString("import sys\n"); + // first element is the path to Registry.dll, but it's wrong + PyRun_SimpleString("sys.path = sys.path[1:]\n"); +#endif + PyRun_SimpleString("import SALOME_Container\n"); + PyRun_SimpleString((char*)myCommand.c_str()); + Py_RELEASE_NEW_THREAD; + } + } } +//============================================================================= +/*! + * Destructor + */ +//============================================================================= + Engines_Container_i::~Engines_Container_i() { MESSAGE("Container_i::~Container_i()"); delete _id; } +//============================================================================= +/*! + * CORBA attribute: Container name (see constructor) + */ +//============================================================================= + char* Engines_Container_i::name() { return CORBA::string_dup(_containerName.c_str()) ; } -char* Engines_Container_i::machineName() +//============================================================================= +/*! + * CORBA method: Get the hostName of the Container (without domain extensions) + */ +//============================================================================= + +char* Engines_Container_i::getHostName() { string s = GetHostname(); - MESSAGE("Engines_Container_i::machineName " << s); - return CORBA::string_dup(s.c_str()) ; + MESSAGE("Engines_Container_i::getHostName " << s); + return CORBA::string_dup(s.c_str()) ; +} + +//============================================================================= +/*! + * CORBA method: Get the PID (process identification) of the Container + */ +//============================================================================= + +CORBA::Long Engines_Container_i::getPID() +{ + return (CORBA::Long)getpid(); } +//============================================================================= +/*! + * CORBA method: check if servant is still alive + */ +//============================================================================= + void Engines_Container_i::ping() { MESSAGE("Engines_Container_i::ping() pid "<< getpid()); } -// shutdown corba server +//============================================================================= +/*! + * CORBA method, oneway: Server shutdown. + * - Container name removed from naming service, + * - servant deactivation, + * - orb shutdown if no other servants in the process + */ +//============================================================================= + void Engines_Container_i::Shutdown() { MESSAGE("Engines_Container_i::Shutdown()"); - _NS->Destroy_Name(_containerName.c_str()); + _NS->Destroy_FullDirectory(_containerName.c_str()); //_remove_ref(); //_poa->deactivate_object(*_id); if(_isServantAloneInProcess) - _orb->shutdown(0); + { + LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance(); + bp1->deleteInstance(bp1); + _orb->shutdown(0); + } } -//! Kill current container -bool Engines_Container_i::Kill_impl() { - MESSAGE("Engines_Container_i::Kill() pid "<< getpid() << " containerName " - << _containerName.c_str() << " machineName " - << GetHostname().c_str()); - exit( 0 ) ; -} -Engines::Component_ptr Engines_Container_i::load_impl( const char* nameToRegister, - const char* componentName ) { +//============================================================================= +/*! + * CORBA method: load a new component class (Python or C++ implementation) + * \param componentName like COMPONENT + * try to make a Python import of COMPONENT, + * then a lib open of libCOMPONENTEngine.so + * \return true if dlopen successfull or already done, false otherwise + */ +//============================================================================= + +bool +Engines_Container_i::load_component_Library(const char* componentName) +{ - _numInstanceMutex.lock() ; // lock on the instance number - BEGIN_OF( "Container_i::load_impl " << componentName ) ; - _numInstance++ ; - char _aNumI[12]; - sprintf( _aNumI , "%d" , _numInstance ) ; + string aCompName = componentName; - string _impl_name = componentName; - string _nameToRegister = nameToRegister; - string instanceName = _nameToRegister + "_inst_" + _aNumI ; - //SCRUTE(instanceName); + // --- try dlopen C++ component - //string absolute_impl_name = _library_path + "lib" + _impl_name + ".so"; - string absolute_impl_name( _impl_name ) ; - SCRUTE(absolute_impl_name); +#ifndef WNT + string impl_name = string ("lib") + aCompName + string("Engine.so"); +#else + string impl_name = aCompName + string("Engine.dll"); +#endif + SCRUTE(impl_name); + + _numInstanceMutex.lock(); // lock to be alone + // (see decInstanceCnt, finalize_removal)) + if (_toRemove_map[impl_name]) _toRemove_map.erase(impl_name); + if (_library_map[impl_name]) + { + MESSAGE("Library " << impl_name << " already loaded"); + _numInstanceMutex.unlock(); + return true; + } + void* handle; - handle = dlopen( absolute_impl_name.c_str() , RTLD_LAZY ) ; - if ( !handle ) { - INFOS("Can't load shared library : " << absolute_impl_name); - INFOS("error dlopen: " << dlerror()); - _numInstanceMutex.unlock() ; - return Engines::Component::_nil() ; - } +#ifndef WNT + handle = dlopen( impl_name.c_str() , RTLD_LAZY ) ; +#else + handle = dlopen( impl_name.c_str() , 0 ) ; +#endif + if ( handle ) + { + _library_map[impl_name] = handle; + _numInstanceMutex.unlock(); + return true; + } + else + { + INFOS("Can't load shared library : " << impl_name); + INFOS("error dlopen: " << dlerror()); + } + _numInstanceMutex.unlock(); + + // --- try import Python component + + INFOS("try import Python component "<0) otherwise + * \return a loaded component + */ +//============================================================================= - char *error ; - if ( (error = dlerror() ) != NULL) { - INFOS("Can't resolve symbol: " + factory_name); - SCRUTE(error); - _numInstanceMutex.unlock() ; +Engines::Component_ptr +Engines_Container_i::create_component_instance(const char*genericRegisterName, + CORBA::Long studyId) +{ + if (studyId < 0) + { + INFOS("studyId must be > 0 for mono study instance, =0 for multiStudy"); return Engines::Component::_nil() ; } - string component_registerName = _containerName + "/" + _nameToRegister; Engines::Component_var iobject = Engines::Component::_nil() ; - try { - CORBA::Object_var obj = _NS->Resolve( component_registerName.c_str() ) ; - if ( CORBA::is_nil( obj ) ) { -// Instanciate required CORBA object - PortableServer::ObjectId * id ; - id = (Component_factory) ( _orb, _poa, _id, instanceName.c_str() , - _nameToRegister.c_str() ) ; - // get reference from id - obj = _poa->id_to_reference(*id); - iobject = Engines::Component::_narrow( obj ) ; -// _numInstanceMutex.lock() ; // lock on the add on handle_map (necessary ?) - // register the engine under the name containerName.dir/nameToRegister.object - _NS->Register( iobject , component_registerName.c_str() ) ; - MESSAGE( "Container_i::load_impl " << component_registerName.c_str() << " bound" ) ; - } - else { // JR : No ReBind !!! - MESSAGE( "Container_i::load_impl " << component_registerName.c_str() << " already bound" ) ; + string aCompName = genericRegisterName; + if (_library_map[aCompName]) // Python component + { + if (_isSupervContainer) + { + INFOS("Supervision Container does not support Python Component Engines"); + return Engines::Component::_nil(); + } + _numInstanceMutex.lock() ; // lock on the instance number + _numInstance++ ; + int numInstance = _numInstance ; + _numInstanceMutex.unlock() ; + + char aNumI[12]; + sprintf( aNumI , "%d" , numInstance ) ; + string instanceName = aCompName + "_inst_" + aNumI ; + string component_registerName = + _containerName + "/" + instanceName; + + Py_ACQUIRE_NEW_THREAD; + PyObject *mainmod = PyImport_AddModule("__main__"); + PyObject *globals = PyModule_GetDict(mainmod); + PyObject *pyCont = PyDict_GetItemString(globals, "pyCont"); + PyObject *result = PyObject_CallMethod(pyCont, + "create_component_instance", + "ssl", + aCompName.c_str(), + instanceName.c_str(), + studyId); + string iors = PyString_AsString(result); + SCRUTE(iors); + Py_RELEASE_NEW_THREAD; + + CORBA::Object_var obj = _orb->string_to_object(iors.c_str()); iobject = Engines::Component::_narrow( obj ) ; + return iobject._retn(); } - } - catch (...) { - INFOS( "Container_i::load_impl catched" ) ; - } + + //--- try C++ + +#ifndef WNT + string impl_name = string ("lib") + genericRegisterName +string("Engine.so"); +#else + string impl_name = genericRegisterName +string("Engine.dll"); +#endif + void* handle = _library_map[impl_name]; + if ( !handle ) + { + INFOS("shared library " << impl_name <<"must be loaded before instance"); + return Engines::Component::_nil() ; + } + else + { + iobject = createInstance(genericRegisterName, + handle, + studyId); + return iobject._retn(); + } +} + +//============================================================================= +/*! + * CORBA method: Finds a servant instance of a component + * \param registeredName Name of the component in Registry or Name Service, + * without instance suffix number + * \param studyId 0 if instance is not associated to a study, + * >0 otherwise (== study id) + * \return the first instance found with same studyId + */ +//============================================================================= -//Jr _numInstanceMutex.lock() ; // lock on the add on handle_map (necessary ?) - handle_map[instanceName] = handle; - END_OF("Container_i::load_impl"); - _numInstanceMutex.unlock() ; - return Engines::Component::_duplicate(iobject); +Engines::Component_ptr +Engines_Container_i::find_component_instance( const char* registeredName, + CORBA::Long studyId) +{ + Engines::Component_var anEngine = Engines::Component::_nil(); + map::iterator itm =_listInstances_map.begin(); + while (itm != _listInstances_map.end()) + { + string instance = (*itm).first; + SCRUTE(instance); + if (instance.find(registeredName) == 0) + { + anEngine = (*itm).second; + if (studyId == anEngine->getStudyId()) + { + return anEngine._retn(); + } + } + itm++; + } + return anEngine._retn(); } +//============================================================================= +/*! + * CORBA method: find or create an instance of the component (servant), + * load a new component class (dynamic library) if required, + * ---- FOR COMPATIBILITY WITH 2.2 ---- + * ---- USE ONLY FOR MULTISTUDY INSTANCES ! -------- + * The servant registers itself to naming service and Registry. + * \param genericRegisterName Name of the component to register + * in Registry & Name Service + * \param componentName Name of the constructed library of the component + * \return a loaded component + */ +//============================================================================= + +Engines::Component_ptr +Engines_Container_i::load_impl( const char* genericRegisterName, + const char* componentName ) +{ + string impl_name = string ("lib") + genericRegisterName +string("Engine.so"); + Engines::Component_var iobject = Engines::Component::_nil() ; + if (load_component_Library(genericRegisterName)) + iobject = find_or_create_instance(genericRegisterName, impl_name); + return iobject._retn(); +} + + +//============================================================================= +/*! + * CORBA method: Stops the component servant, and deletes all related objects + * \param component_i Component to be removed + */ +//============================================================================= + void Engines_Container_i::remove_impl(Engines::Component_ptr component_i) { ASSERT(! CORBA::is_nil(component_i)); string instanceName = component_i->instanceName() ; MESSAGE("unload component " << instanceName); + _listInstances_map.erase(instanceName); component_i->destroy() ; - MESSAGE("test key handle_map"); - _numInstanceMutex.lock() ; // lock on the remove on handle_map - if (handle_map[instanceName]) // if key does not exist, created & initialized null + _NS->Destroy_Name(instanceName.c_str()); +} + +//============================================================================= +/*! + * CORBA method: Discharges unused libraries from the container. + */ +//============================================================================= + +void Engines_Container_i::finalize_removal() +{ + MESSAGE("finalize unload : dlclose"); + _numInstanceMutex.lock(); // lock to be alone + // (see decInstanceCnt, load_component_Library) + map::iterator ith; + for (ith = _toRemove_map.begin(); ith != _toRemove_map.end(); ith++) + { + void *handle = (*ith).second; + string impl_name= (*ith).first; + if (handle) + { + SCRUTE(handle); + SCRUTE(impl_name); +// dlclose(handle); // SALOME unstable after ... +// _library_map.erase(impl_name); + } + } + _toRemove_map.clear(); + _numInstanceMutex.unlock(); +} + +//============================================================================= +/*! + * CORBA method: Kill the container process with exit(0). + * To remove : never returns ! + */ +//============================================================================= + +bool Engines_Container_i::Kill_impl() +{ + MESSAGE("Engines_Container_i::Kill() pid "<< getpid() << " containerName " + << _containerName.c_str() << " machineName " + << GetHostname().c_str()); + INFOS("==============================================================="); + INFOS("= REMOVE calls to Kill_impl in C++ container ="); + INFOS("==============================================================="); + //exit( 0 ) ; + ASSERT(0); + return false; +} + +//============================================================================= +/*! + * C++ method: Finds an already existing servant instance of a component, or + * create an instance. + * ---- USE ONLY FOR MULTISTUDY INSTANCES ! -------- + * \param genericRegisterName Name of the component instance to register + * in Registry & Name Service, + * (without _inst_n suffix, like "COMPONENT") + * \param componentLibraryName like "libCOMPONENTEngine.so" + * \return a loaded component + * + * example with names: + * aGenRegisterName = COMPONENT (= first argument) + * impl_name = libCOMPONENTEngine.so (= second argument) + * _containerName = /Containers/cli76ce/FactoryServer + * factoryName = COMPONENTEngine_factory + * component_registerBase = /Containers/cli76ce/FactoryServer/COMPONENT + * + * instanceName = COMPONENT_inst_1 + * component_registerName = /Containers/cli76ce/FactoryServer/COMPONENT_inst_1 + */ +//============================================================================= + +Engines::Component_ptr +Engines_Container_i::find_or_create_instance(string genericRegisterName, + string componentLibraryName) +{ + string aGenRegisterName = genericRegisterName; + string impl_name = componentLibraryName; + void* handle = _library_map[impl_name]; + if ( !handle ) { - remove_map[instanceName] = handle_map[instanceName] ; + INFOS("shared library " << impl_name <<"must be loaded before instance"); + return Engines::Component::_nil() ; } - else MESSAGE("pas d'entree handle_map"); - handle_map.erase(instanceName) ; - _numInstanceMutex.unlock() ; - MESSAGE("contenu handle_map"); - map::iterator im ; - for (im = handle_map.begin() ; im != handle_map.end() ; im ++) + else { - MESSAGE("reste " << (*im).first); + // --- find a registered instance in naming service, or create + + string component_registerBase = + _containerName + "/" + aGenRegisterName; + Engines::Component_var iobject = Engines::Component::_nil() ; + try + { + CORBA::Object_var obj = + _NS->ResolveFirst( component_registerBase.c_str()); + if ( CORBA::is_nil( obj ) ) + { + iobject = createInstance(genericRegisterName, + handle, + 0); // force multiStudy instance here ! + } + else + { + iobject = Engines::Component::_narrow( obj ) ; + Engines_Component_i *servant = + dynamic_cast + (_poa->reference_to_servant(iobject)); + ASSERT(servant) + int studyId = servant->getStudyId(); + ASSERT (studyId >= 0); + if (studyId == 0) // multiStudy instance, OK + { + // No ReBind ! + MESSAGE(component_registerBase.c_str()<<" already bound"); + } + else // monoStudy instance: NOK + { + iobject = Engines::Component::_nil(); + INFOS("load_impl & find_component_instance methods " + << "NOT SUITABLE for mono study components"); + } + } + } + catch (...) + { + INFOS( "Container_i::load_impl catched" ) ; + } + return iobject._retn(); } } -void Engines_Container_i::finalize_removal() +//============================================================================= +/*! + * C++ method: create a servant instance of a component. + * \param genericRegisterName Name of the component instance to register + * in Registry & Name Service, + * (without _inst_n suffix, like "COMPONENT") + * \param handle loaded library handle + * \param studyId 0 for multiStudy instance, + * study Id (>0) otherwise + * \return a loaded component + * + * example with names: + * aGenRegisterName = COMPONENT (= first argument) + * _containerName = /Containers/cli76ce/FactoryServer + * factoryName = COMPONENTEngine_factory + * component_registerBase = /Containers/cli76ce/FactoryServer/COMPONENT + * instanceName = COMPONENT_inst_1 + * component_registerName = /Containers/cli76ce/FactoryServer/COMPONENT_inst_1 + */ +//============================================================================= + +Engines::Component_ptr +Engines_Container_i::createInstance(string genericRegisterName, + void *handle, + int studyId) { - MESSAGE("finalize unload : dlclose"); - map::iterator im ; - _numInstanceMutex.lock() ; // lock on the explore remove_map & dlclose - for (im = remove_map.begin() ; im != remove_map.end() ; im ++) + // --- find the factory + + string aGenRegisterName = genericRegisterName; + string factory_name = aGenRegisterName + string("Engine_factory"); + SCRUTE(factory_name) ; + + typedef PortableServer::ObjectId * (*FACTORY_FUNCTION) + (CORBA::ORB_ptr, + PortableServer::POA_ptr, + PortableServer::ObjectId *, + const char *, + const char *) ; + + FACTORY_FUNCTION Component_factory + = (FACTORY_FUNCTION) dlsym(handle, factory_name.c_str()); + + char *error ; + if ( (error = dlerror() ) != NULL) + { + INFOS("Can't resolve symbol: " + factory_name); + SCRUTE(error); + return Engines::Component::_nil() ; + } + + // --- create instance + + Engines::Component_var iobject = Engines::Component::_nil() ; + + try + { + _numInstanceMutex.lock() ; // lock on the instance number + _numInstance++ ; + int numInstance = _numInstance ; + _numInstanceMutex.unlock() ; + + char aNumI[12]; + sprintf( aNumI , "%d" , numInstance ) ; + string instanceName = aGenRegisterName + "_inst_" + aNumI ; + string component_registerName = + _containerName + "/" + instanceName; + + // --- Instanciate required CORBA object + + PortableServer::ObjectId *id ; //not owner, do not delete (nore use var) + id = (Component_factory) ( _orb, _poa, _id, instanceName.c_str(), + aGenRegisterName.c_str() ) ; + + // --- get reference & servant from id + + CORBA::Object_var obj = _poa->id_to_reference(*id); + iobject = Engines::Component::_narrow( obj ) ; + + Engines_Component_i *servant = + dynamic_cast(_poa->reference_to_servant(iobject)); + ASSERT(servant); + //SCRUTE(servant->pd_refCount); + servant->_remove_ref(); // compensate previous id_to_reference + //SCRUTE(servant->pd_refCount); + _listInstances_map[instanceName] = iobject; + _cntInstances_map[aGenRegisterName] += 1; + SCRUTE(aGenRegisterName); + SCRUTE(_cntInstances_map[aGenRegisterName]); + //SCRUTE(servant->pd_refCount); + bool ret_studyId = servant->setStudyId(studyId); + ASSERT(ret_studyId); + + // --- register the engine under the name + // containerName(.dir)/instanceName(.object) + + _NS->Register( iobject , component_registerName.c_str() ) ; + MESSAGE( component_registerName.c_str() << " bound" ) ; + } + catch (...) + { + INFOS( "Container_i::createInstance exception catched" ) ; + } + return iobject._retn(); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +void Engines_Container_i::decInstanceCnt(string genericRegisterName) +{ + string aGenRegisterName =genericRegisterName; + MESSAGE("Engines_Container_i::decInstanceCnt " << aGenRegisterName); + ASSERT(_cntInstances_map[aGenRegisterName] > 0); + _numInstanceMutex.lock(); // lock to be alone + // (see finalize_removal, load_component_Library) + _cntInstances_map[aGenRegisterName] -= 1; + SCRUTE(_cntInstances_map[aGenRegisterName]); + if (_cntInstances_map[aGenRegisterName] == 0) { - void * handle = (*im).second ; - dlclose(handle) ; - MESSAGE("dlclose " << (*im).first); + string impl_name = + Engines_Component_i::GetDynLibraryName(aGenRegisterName.c_str()); + SCRUTE(impl_name); + void* handle = _library_map[impl_name]; + ASSERT(handle); + _toRemove_map[impl_name] = handle; } - remove_map.clear() ; - _numInstanceMutex.unlock() ; - MESSAGE("remove_map.clear()"); + _numInstanceMutex.unlock(); } -void ActSigIntHandler() { +//============================================================================= +/*! + * Retrieves only with container naming convention if it is a python container + */ +//============================================================================= + +bool Engines_Container_i::isPythonContainer(const char* ContainerName) +{ + bool ret=false; + int len=strlen(ContainerName); + if(len>=2) + if(strcmp(ContainerName+len-2,"Py")==0) + ret=true; + return ret; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +void ActSigIntHandler() +{ +#ifndef WNT struct sigaction SigIntAct ; SigIntAct.sa_sigaction = &SigIntHandler ; SigIntAct.sa_flags = SA_SIGINFO ; -// DEBUG 03.02.2005 : the first parameter of sigaction is not a mask of signals (SIGINT | SIGUSR1) : -// it must be only one signal ===> one call for SIGINT and an other one for SIGUSR1 +#endif + +// DEBUG 03.02.2005 : the first parameter of sigaction is not a mask of signals +// (SIGINT | SIGUSR1) : +// it must be only one signal ===> one call for SIGINT +// and an other one for SIGUSR1 +#ifndef WNT if ( sigaction( SIGINT , &SigIntAct, NULL ) ) { perror("SALOME_Container main ") ; exit(0) ; @@ -295,20 +824,38 @@ void ActSigIntHandler() { perror("SALOME_Container main ") ; exit(0) ; } - INFOS(pthread_self() << "SigIntHandler activated") ; + //PAL9042 JR : during the execution of a Signal Handler (and of methods called through Signal Handlers) + // use of streams (and so on) should never be used because : + // streams of C++ are naturally thread-safe and use pthread_mutex_lock ===> + // A stream operation may be interrupted by a signal and if the Handler use stream we + // may have a "Dead-Lock" ===HangUp + //==INFOS is commented + // INFOS(pthread_self() << "SigIntHandler activated") ; +#else + signal( SIGINT, SigIntHandler ); + signal( SIGUSR1, SigIntHandler ); +#endif + } void SetCpuUsed() ; +#ifndef WNT void SigIntHandler(int what , siginfo_t * siginfo , void * toto ) { - MESSAGE(pthread_self() << "SigIntHandler what " << what << endl - << " si_signo " << siginfo->si_signo << endl - << " si_code " << siginfo->si_code << endl - << " si_pid " << siginfo->si_pid) ; + //PAL9042 JR : during the execution of a Signal Handler (and of methods called through Signal Handlers) + // use of streams (and so on) should never be used because : + // streams of C++ are naturally thread-safe and use pthread_mutex_lock ===> + // A stream operation may be interrupted by a signal and if the Handler use stream we + // may have a "Dead-Lock" ===HangUp + //==MESSAGE is commented + // MESSAGE(pthread_self() << "SigIntHandler what " << what << endl + // << " si_signo " << siginfo->si_signo << endl + // << " si_code " << siginfo->si_code << endl + // << " si_pid " << siginfo->si_pid) ; if ( _Sleeping ) { _Sleeping = false ; - MESSAGE("SigIntHandler END sleeping.") ; + // MESSAGE("SigIntHandler END sleeping.") ; return ; } else { @@ -318,132 +865,148 @@ void SigIntHandler(int what , siginfo_t * siginfo , } else { _Sleeping = true ; - MESSAGE("SigIntHandler BEGIN sleeping.") ; + // MESSAGE("SigIntHandler BEGIN sleeping.") ; int count = 0 ; while( _Sleeping ) { sleep( 1 ) ; count += 1 ; } - MESSAGE("SigIntHandler LEAVE sleeping after " << count << " s.") ; + // MESSAGE("SigIntHandler LEAVE sleeping after " << count << " s.") ; } return ; } } - -// Get the PID of the Container - -long Engines_Container_i::getPID() { - return (long)getpid(); -} - -// Get the hostName of the Container - -char* Engines_Container_i::getHostName() { - return((char*)(GetHostname().c_str())); -} - -// Retrieves only with container naming convention if it is a python container -bool Engines_Container_i::isPythonContainer(const char* ContainerName) -{ - bool ret=false; - int len=strlen(ContainerName); - if(len>=2) - if(strcmp(ContainerName+len-2,"Py")==0) - ret=true; - return ret; -} - -string Engines_Container_i::BuildContainerNameForNS(const char *ContainerName, const char *hostname) -{ - string ret="/Containers/"; - ret += hostname; - ret+="/"; - if (strlen(ContainerName)== 0) - ret+=_defaultContainerName; - else - ret += ContainerName; - return ret; +#else // Case WNT +void SigIntHandler( int what ) { + MESSAGE( pthread_self() << "SigIntHandler what " << what << endl ); + if ( _Sleeping ) { + _Sleeping = false ; + MESSAGE("SigIntHandler END sleeping.") ; + return ; + } + else { + ActSigIntHandler() ; + if ( what == SIGUSR1 ) { + SetCpuUsed() ; + } + else { + _Sleeping = true ; + MESSAGE("SigIntHandler BEGIN sleeping.") ; + int count = 0 ; + while( _Sleeping ) { + Sleep( 1000 ) ; + count += 1 ; + } + MESSAGE("SigIntHandler LEAVE sleeping after " << count << " s.") ; + } + return ; + } } +#endif - -/* - * Create one instance of componentName component and register it - * as nameToRegister in naming service +//============================================================================= +/*! + * CORBA method: Create one instance of componentName component + * and register it as genericRegisterName in naming service */ -Engines::Component_ptr Engines_Container_i::instance( const char* nameToRegister, - const char* componentName ) { +//============================================================================= - _numInstanceMutex.lock() ; // lock on the instance number - BEGIN_OF( "Container_i::instance " << componentName ) ; +// Engines::Component_ptr Engines_Container_i::instance( const char* genericRegisterName, +// const char* componentName ) +// { +// _numInstanceMutex.lock() ; // lock on the instance number +// BEGIN_OF( "Container_i::instance " << componentName ) ; - string _nameToRegister = nameToRegister; - string component_registerName = _containerName + "/" + _nameToRegister; +// string _genericRegisterName = genericRegisterName; +// string component_registerName = _containerName + "/" + _genericRegisterName; - Engines::Component_var iobject = Engines::Component::_nil() ; +// Engines::Component_var iobject = Engines::Component::_nil() ; - try { - CORBA::Object_var obj = _NS->Resolve( component_registerName.c_str() ) ; - if (! CORBA::is_nil( obj ) ) { - MESSAGE( "Container_i::instance " << component_registerName.c_str() << " already registered" ) ; - iobject = Engines::Component::_narrow( obj ) ; - } - else{ - string _compo_name = componentName; - string _impl_name = "lib" + _compo_name + "Engine.so"; - SCRUTE(_impl_name); +// try +// { +// CORBA::Object_var obj = _NS->Resolve( component_registerName.c_str() ) ; +// if (! CORBA::is_nil( obj ) ) +// { +// MESSAGE( "Container_i::instance " << component_registerName.c_str() << " already registered" ) ; +// iobject = Engines::Component::_narrow( obj ) ; +// } +// else +// { +// string _compo_name = componentName; +// string _impl_name = "lib" + _compo_name + "Engine.so"; +// SCRUTE(_impl_name); - void* handle; - handle = dlopen( _impl_name.c_str() , RTLD_LAZY ) ; - - if ( handle ) { - string factory_name = _compo_name + "Engine_factory"; - SCRUTE(factory_name) ; - - typedef PortableServer::ObjectId * (*FACTORY_FUNCTION) - (CORBA::ORB_ptr, - PortableServer::POA_ptr, - PortableServer::ObjectId *, - const char *, - const char *) ; - FACTORY_FUNCTION Component_factory = (FACTORY_FUNCTION) dlsym(handle, factory_name.c_str()); - - char *error ; - if ( (error = dlerror() ) == NULL) { - // Instanciate required CORBA object - _numInstance++ ; - char _aNumI[12]; - sprintf( _aNumI , "%d" , _numInstance ) ; - string instanceName = _compo_name + "_inst_" + _aNumI ; - SCRUTE(instanceName); - - PortableServer::ObjectId * id ; - id = (Component_factory) ( _orb, _poa, _id, instanceName.c_str() , - _nameToRegister.c_str() ) ; - // get reference from id - obj = _poa->id_to_reference(*id); - iobject = Engines::Component::_narrow( obj ) ; - - // register the engine under the name containerName.dir/nameToRegister.object - _NS->Register( iobject , component_registerName.c_str() ) ; - MESSAGE( "Container_i::instance " << component_registerName.c_str() << " registered" ) ; - handle_map[instanceName] = handle; - } - else{ - INFOS("Can't resolve symbol: " + factory_name); - SCRUTE(error); - } - } - else{ - INFOS("Can't load shared library : " << _impl_name); - INFOS("error dlopen: " << dlerror()); - } - } - } - catch (...) { - INFOS( "Container_i::instance exception caught" ) ; - } - END_OF("Container_i::instance"); - _numInstanceMutex.unlock() ; - return Engines::Component::_duplicate(iobject); -} +// void* handle; +// handle = dlopen( _impl_name.c_str() , RTLD_LAZY ) ; + +// if ( handle ) +// { +// string factory_name = _compo_name + "Engine_factory"; +// SCRUTE(factory_name) ; + +// typedef PortableServer::ObjectId * (*FACTORY_FUNCTION) +// (CORBA::ORB_ptr, +// PortableServer::POA_ptr, +// PortableServer::ObjectId *, +// const char *, +// const char *) ; +// FACTORY_FUNCTION Component_factory = (FACTORY_FUNCTION) dlsym(handle, factory_name.c_str()); + +// char *error ; +// if ( (error = dlerror() ) == NULL) +// { +// // Instanciate required CORBA object +// _numInstance++ ; +// char _aNumI[12]; +// sprintf( _aNumI , "%d" , _numInstance ) ; +// string instanceName = _compo_name + "_inst_" + _aNumI ; +// SCRUTE(instanceName); + +// PortableServer::ObjectId * id ; +// id = (Component_factory) ( _orb, _poa, _id, instanceName.c_str() , +// _genericRegisterName.c_str() ) ; +// // get reference from id +// obj = _poa->id_to_reference(*id); +// iobject = Engines::Component::_narrow( obj ) ; + +// // register the engine under the name containerName.dir/genericRegisterName.object +// _NS->Register( iobject , component_registerName.c_str() ) ; +// MESSAGE( "Container_i::instance " << component_registerName.c_str() << " registered" ) ; +// _handle_map[instanceName] = handle; +// } +// else +// { +// INFOS("Can't resolve symbol: " + factory_name); +// SCRUTE(error); +// } +// } +// else +// { +// INFOS("Can't load shared library : " << _impl_name); +// INFOS("error dlopen: " << dlerror()); +// } +// } +// } +// catch (...) +// { +// INFOS( "Container_i::instance exception caught" ) ; +// } +// END_OF("Container_i::instance"); +// _numInstanceMutex.unlock() ; +// return Engines::Component::_duplicate(iobject); +// } + +//============================================================================= +/*! + * CORBA attribute: Machine Name (hostname without domain extensions) + */ +//============================================================================= + +// char* Engines_Container_i::machineName() +// { +// string s = GetHostname(); +// MESSAGE("Engines_Container_i::machineName " << s); +// return CORBA::string_dup(s.c_str()) ; +// } + diff --git a/src/Container/Container_init_python.cxx b/src/Container/Container_init_python.cxx new file mode 100644 index 000000000..7a4e58527 --- /dev/null +++ b/src/Container/Container_init_python.cxx @@ -0,0 +1,58 @@ +// SALOME Container : implementation of container and engine for Kernel +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : Container_init_python.cxx +// Author : Paul RASCLE, EDF +// Module : KERNEL +// $Header$ + +#include "Container_init_python.hxx" + +#include "utilities.h" +using namespace std; + +PyThreadState *KERNEL_PYTHON::_gtstate = 0; +PyObject *KERNEL_PYTHON::salome_shared_modules_module = NULL; +PyInterpreterState *KERNEL_PYTHON::_interp = NULL; + +void KERNEL_PYTHON::init_python(int argc, char **argv) +{ + if (Py_IsInitialized()) + { + MESSAGE("Python already initialized"); + SCRUTE(KERNEL_PYTHON::_gtstate); + return; + } + MESSAGE("================================================================="); + MESSAGE("Python Initialization..."); + MESSAGE("================================================================="); + Py_SetProgramName(argv[0]); + Py_Initialize(); // Initialize the interpreter + PySys_SetArgv(argc, argv); + KERNEL_PYTHON::_interp = PyThreadState_Get()->interp; + PyEval_InitThreads(); // Create (and acquire) the interpreter lock + ASSERT(!KERNEL_PYTHON::_gtstate); + KERNEL_PYTHON::_gtstate = PyEval_SaveThread(); // Release global thread state + SCRUTE(KERNEL_PYTHON::_gtstate); +} + diff --git a/src/Container/Container_init_python.hxx b/src/Container/Container_init_python.hxx new file mode 100644 index 000000000..291f6f498 --- /dev/null +++ b/src/Container/Container_init_python.hxx @@ -0,0 +1,86 @@ +// SALOME Container : implementation of container and engine for Kernel +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : Container_init_python.hxx +// Author : Paul RASCLE, EDF +// Module : KERNEL +// $Header$ + +#ifndef _CONTAINER_INIT_PYTHON_HXX_ +#define _CONTAINER_INIT_PYTHON_HXX_ + +#include // must be before Python.h ! +#include + + +// next two MACRO must be used together only once inside a block +// ------------------------------------------------------------- +// protect a sequence of Python calls: +// - Python lock must be acquired for these calls +// - new Python thread state allows multi thread use of the sequence: +// - Python may release the lock within the sequence, so multiple +// thread execution of the sequence may occur. +// - For that case, each sequence call must use a specific Python +// thread state. +// - There is no need of C Lock protection of the sequence. + + +#if defined CONTAINER_EXPORTS +#if defined WIN32 +#define CONTAINER_EXPORT __declspec( dllexport ) +#else +#define CONTAINER_EXPORT +#endif +#else +#if defined WNT +#define CONTAINER_EXPORT __declspec( dllimport ) +#else +#define CONTAINER_EXPORT +#endif +#endif + +#define Py_ACQUIRE_NEW_THREAD \ + PyEval_AcquireLock(); \ + PyThreadState *myTstate = PyThreadState_New(KERNEL_PYTHON::_interp); \ + PyThreadState *myoldTstate = PyThreadState_Swap(myTstate); + +#define Py_RELEASE_NEW_THREAD \ + PyEval_ReleaseThread(myTstate); \ + PyThreadState_Delete(myTstate); + +struct CONTAINER_EXPORT KERNEL_PYTHON +{ +#ifdef WNT + static PyThreadState *get_gtstate() { return KERNEL_PYTHON::_gtstate; } + static PyObject *getsalome_shared_modules_module() { return KERNEL_PYTHON::salome_shared_modules_module; } + static PyInterpreterState *get_interp() { return KERNEL_PYTHON::_interp; } +#endif + static PyThreadState *_gtstate; + static PyObject *salome_shared_modules_module; + static PyInterpreterState *_interp; + + static void init_python(int argc, char **argv); + +}; + +#endif diff --git a/src/Container/Makefile.in b/src/Container/Makefile.in index 1ed861ed0..cd185a90d 100644 --- a/src/Container/Makefile.in +++ b/src/Container/Makefile.in @@ -34,32 +34,39 @@ VPATH=.:@srcdir@:@top_srcdir@/idl @COMMENCE@ -EXPORT_PYSCRIPTS = SALOME_ComponentPy.py SALOME_ContainerPy.py +EXPORT_PYSCRIPTS = SALOME_ComponentPy.py \ + SALOME_ContainerPy.py \ + SALOME_Container.py EXPORT_HEADERS = \ SALOME_Component_i.hxx \ SALOME_Container_i.hxx \ - SALOME_ContainerManager.hxx + SALOME_ContainerManager.hxx \ + Container_init_python.hxx # Libraries targets LIB = libSalomeContainer.la -LIB_SRC = Component_i.cxx Container_i.cxx SALOME_ContainerManager.cxx -LIB_SERVER_IDL = SALOME_Registry.idl SALOME_Component.idl SALOME_ContainerManager.idl +LIB_SRC = Component_i.cxx \ + Container_i.cxx \ + SALOME_ContainerManager.cxx \ + Container_init_python.cxx + +LIB_SERVER_IDL = SALOME_Registry.idl SALOME_Component.idl SALOME_ContainerManager.idl SALOME_Exception.idl LIB_CLIENT_IDL = # Executables targets -BIN = SALOME_Container +BIN = SALOME_Container SALOME_ContainerManagerServer BIN_SRC = SALOME_Container_SignalsHandler.cxx BIN_SERVER_IDL = SALOME_Component.idl SALOME_ContainerManager.idl CPPFLAGS+= $(PYTHON_INCLUDES) $(MPI_INCLUDE) $(OCC_INCLUDES) $(QT_MT_INCLUDES) CXXFLAGS+=$(OCC_CXXFLAGS) -LDFLAGS+= $(QT_MT_LIBS) -lSalomeNS -lRegistry -lOpUtil -lSalomeNotification -lSALOMELocalTrace -lSALOMETraceCollector -lSalomeResourcesManager +LDFLAGS+= $(QT_MT_LIBS) -lSalomeNS -lRegistry -lOpUtil -lSalomeNotification -lSALOMELocalTrace -lSalomeResourcesManager LIBS += @LDEXPDYNFLAGS@ $(PYTHON_LIBS) $(MPI_LIBS) -LDFLAGSFORBIN= $(LDFLAGS) -lSALOMETraceCollector +LDFLAGSFORBIN= $(LDFLAGS) -lSALOMEBasics LIBSFORBIN= $(LIBS) @CONCLUDE@ diff --git a/src/Container/SALOME_ComponentPy.py b/src/Container/SALOME_ComponentPy.py index 10a47c978..642c76e5a 100755 --- a/src/Container/SALOME_ComponentPy.py +++ b/src/Container/SALOME_ComponentPy.py @@ -32,6 +32,7 @@ import os import sys import time import string +import signal from omniORB import CORBA, PortableServer import Engines, Engines__POA import Registry @@ -45,17 +46,20 @@ from thread import * #============================================================================= +_Sleeping = 0 + #define an implementation of the component interface class SALOME_ComponentPy_i (Engines__POA.Component): _orb = None _poa = None _fieldsDict = [] + _studyId = -1 #------------------------------------------------------------------------- def __init__ (self, orb, poa, contID, containerName, - instanceName, interfaceName, notif): + instanceName, interfaceName, notif=0): # Notif for notification services # NOT YET IMPLEMENTED MESSAGE( "SALOME_ComponentPy_i::__init__" + " " + str (containerName) + " " + str(instanceName) + " " + str(interfaceName) ) @@ -72,10 +76,11 @@ class SALOME_ComponentPy_i (Engines__POA.Component): self._StartUsed = 0 self._ThreadCpuUsed = 0 self._Executed = 0 + self._contId = contID naming_service = SALOME_NamingServicePy_i(self._orb) myMachine=getShortHostName() - Component_path = "/Containers/" + myMachine + "/" + self._containerName + "/" + self._interfaceName + Component_path = self._containerName + "/" + self._instanceName MESSAGE( 'SALOME_ComponentPy_i Register' + str( Component_path ) ) naming_service.Register(self._this(), Component_path) @@ -117,7 +122,7 @@ class SALOME_ComponentPy_i (Engines__POA.Component): #------------------------------------------------------------------------- def ping(self): - MESSAGE( "SALOME_ComponentPy_i::ping" ) + MESSAGE( "SALOME_ComponentPy_i::ping() pid " + str(os.getpid()) ) #------------------------------------------------------------------------- @@ -133,14 +138,16 @@ class SALOME_ComponentPy_i (Engines__POA.Component): def destroy(self): MESSAGE( "SALOME_ComponentPy_i::destroy" ) - poa.deactivate_object(self) - CORBA.release(_poa) + self._poa.deactivate_object(self) + CORBA.release(self._poa) #------------------------------------------------------------------------- def GetContainerRef(self): MESSAGE( "SALOME_ComponentPy_i::GetContainerRef" ) - + corbaObj_ptr = self._poa.id_to_reference(self._contId) + return corbaObj_ptr._narrow(Engines.Container) + #------------------------------------------------------------------------- def beginService(self , serviceName ): @@ -185,23 +192,68 @@ class SALOME_ComponentPy_i (Engines__POA.Component): #------------------------------------------------------------------------- - def Kill(self): - MESSAGE( "SALOME_ComponentPy_i::Kill not yet implemented" ) + def Killer(self, ThreadId, signum): + #if ThreadId > 0: + #if signum == 0: + #if pthread_cancel(ThreadId): <- from C++ + # return 0 + #else: + # MESSAGE() + #else: + #if pthread_kill(ThreadId): <- from C++ + # return 0 + #else: + # MESSAGE() + return 1 + + #------------------------------------------------------------------------- + + def Kill_impl(self): + MESSAGE( "SALOME_ComponentPy_i::Kill_impl" ) + RetVal = 0 + if self._ThreadId > 0 & self._ThreadId != get_ident(): + RetVal = Killer(self._ThreadId,0) + self._ThreadId = 0 + return RetVal #------------------------------------------------------------------------- - def Stop(self): - MESSAGE( "SALOME_ComponentPy_i::Stop not yet implemented" ) + def Stop_impl(self): + MESSAGE( "SALOME_ComponentPy_i::Stop_impl" ) + RetVal = 0 + if self._ThreadId > 0 & self._ThreadId != get_ident(): + RetVal = Killer(self._ThreadId,0) + self._ThreadId = 0 + return RetVal #------------------------------------------------------------------------- - def Suspend(self): - MESSAGE( "SALOME_ComponentPy_i::Suspend not yet implemented" ) + def Suspend_impl(self): + MESSAGE( "SALOME_ComponentPy_i::Suspend_impl" ) + global _Sleeping + RetVal = 0 + if self._ThreadId > 0 & self._ThreadId != get_ident(): + if _Sleeping > 0: + return 0 + else: + RetVal = Killer(self._ThreadId, signal.SIGINT) + if RetVal > 0: + _Sleeping = 1 + return RetVal #------------------------------------------------------------------------- - def Resume(self): - MESSAGE( "SALOME_ComponentPy_i::Resume not yet implemented" ) + def Resume_impl(self): + MESSAGE( "SALOME_ComponentPy_i::Resume_impl" ) + global _Sleeping + RetVal = 0 + if self._ThreadId > 0 & self._ThreadId != get_ident(): + if _Sleeping > 0: + _Sleeping = 0 + RetVal = 1 + else: + RetVal = 0 + return RetVal #------------------------------------------------------------------------- @@ -218,4 +270,17 @@ class SALOME_ComponentPy_i (Engines__POA.Component): return 0 #------------------------------------------------------------------------- - + + def DumpPython(self, theStudy, isPublished, isValidScript): + aBuffer = "def RebuildData(theStudy): pass" + aBufferSize = len(aBuffer) + 1 + anOctetBuf = aBuffer._narrow(CORBA.Octet) + aTMPFile = Engines.TMPFile(aBufferSize, aBufferSize, anOctetBuf._this(), 1) + isValidScript = 1 + #return (aBuffer, 1) + return aTMPFile._this() + + #------------------------------------------------------------------------- + + def getStudyId(self): + return self._studyId diff --git a/src/Container/SALOME_Component_i.hxx b/src/Container/SALOME_Component_i.hxx index 620ca1499..c8de1f1aa 100644 --- a/src/Container/SALOME_Component_i.hxx +++ b/src/Container/SALOME_Component_i.hxx @@ -32,7 +32,9 @@ #include #include #include +#ifndef WNT #include +#endif #include #include #include @@ -41,9 +43,25 @@ #include "NOTIFICATION.hxx" class RegistryConnexion; +class Engines_Container_i; + +#if defined CONTAINER_EXPORTS +#if defined WIN32 +#define CONTAINER_EXPORT __declspec( dllexport ) +#else +#define CONTAINER_EXPORT +#endif +#else +#if defined WNT +#define CONTAINER_EXPORT __declspec( dllimport ) +#else +#define CONTAINER_EXPORT +#endif +#endif -class Engines_Component_i: public virtual POA_Engines::Component, - public virtual PortableServer::RefCountServantBase +class CONTAINER_EXPORT Engines_Component_i: + public virtual POA_Engines::Component, + public virtual PortableServer::RefCountServantBase { public: Engines_Component_i(); @@ -64,42 +82,59 @@ public: virtual ~Engines_Component_i(); + // --- CORBA methods + char* instanceName(); char* interfaceName(); - void destroy(); void ping(); + void destroy(); + CORBA::Long getStudyId(); Engines::Container_ptr GetContainerRef(); - PortableServer::ObjectId * getId(); void setProperties(const Engines::FieldsDict& dico); Engines::FieldsDict* getProperties(); + void Names( const char * graphName , const char * nodeName ) ; + bool Kill_impl(); + bool Stop_impl(); + bool Suspend_impl(); + bool Resume_impl(); + CORBA::Long CpuUsed_impl() ; + + virtual Engines::TMPFile* DumpPython(CORBA::Object_ptr theStudy, + CORBA::Boolean isPublished, + CORBA::Boolean& isValidScript); + + + // --- local C++ methods + + PortableServer::ObjectId * getId(); + Engines_Container_i *GetContainerPtr(); + + bool setStudyId(CORBA::Long studyId); + static bool isMultiStudy(); + static bool isMultiInstance(); + static std::string GetDynLibraryName(const char *componentName); + void beginService(const char *serviceName); void endService(const char *serviceName); void sendMessage(const char *event_type, const char *message); - - void Names( const char * graphName , const char * nodeName ) ; char * graphName() ; char * nodeName() ; bool Killer( pthread_t ThreadId , int signum ); - bool Kill_impl(); - bool Stop_impl(); - bool Suspend_impl(); - bool Resume_impl(); void SetCurCpu() ; long CpuUsed() ; - CORBA::Long CpuUsed_impl() ; - static std::string GetDynLibraryName(const char *componentName); - static std::string BuildComponentNameForNS(const char *ComponentName, const char *ContainerName, const char *hostname); protected: + int _studyId; // -1: not initialised; 0: multiStudy; >0: study + static bool _isMultiStudy; + static bool _isMultiInstance; + std::string _instanceName ; std::string _interfaceName ; - std::string _serviceName ; - std::string _graphName ; - std::string _nodeName ; + CORBA::ORB_ptr _orb; PortableServer::POA_ptr _poa; PortableServer::ObjectId * _id; @@ -109,8 +144,16 @@ protected: NOTIFICATION_Supplier* _notifSupplier; std::map_fieldsDict; + std::string _serviceName ; + std::string _graphName ; + std::string _nodeName ; + private: +#ifndef WNT pthread_t _ThreadId ; +#else + pthread_t* _ThreadId ; +#endif long _StartUsed ; long _ThreadCpuUsed ; bool _Executed ; diff --git a/src/Container/SALOME_Container.cxx b/src/Container/SALOME_Container.cxx index dfd501e9f..f6f1884ff 100644 --- a/src/Container/SALOME_Container.cxx +++ b/src/Container/SALOME_Container.cxx @@ -30,13 +30,17 @@ #include #include -//#include "Utils_ORB_INIT.hxx" -//#include "Utils_SINGLETON.hxx" +#ifndef WNT #include -#include "SALOME_NamingService.hxx" +#else +#include +#endif #include "SALOME_Container_i.hxx" #include "utilities.h" +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" #include "SALOMETraceCollector.hxx" +#include "OpUtil.hxx" #ifdef CHECKTIME #include @@ -46,137 +50,111 @@ #include #endif -#include +#include "Container_init_python.hxx" using namespace std; extern "C" void HandleServerSideSignals(CORBA::ORB_ptr theORB); -static PyMethodDef MethodPyVoidMethod[] = {{ NULL, NULL }}; - int main(int argc, char* argv[]) { #ifdef HAVE_MPI2 MPI_Init(&argc,&argv); #endif + // Initialise the ORB. - //ORB_INIT &init = *SINGLETON_::Instance() ; - CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ; - SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + //SRN: BugID: IPAL9541, it's necessary to set a size of one message to be at least 100Mb + //CORBA::ORB_var orb = CORBA::ORB_init( argc , argv ) ; + ORB_INIT &init = *SINGLETON_::Instance() ; + ASSERT(SINGLETON_::IsAlreadyExisting()); + CORBA::ORB_var orb = init(0 , 0 ) ; + + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); INFOS_COMPILATION; BEGIN_OF(argv[0]); - - Py_Initialize() ; - PySys_SetArgv( argc , argv ) ; - Py_InitModule( "InitPyRunMethod" , MethodPyVoidMethod ) ; - - try{ - // Obtain a reference to the root POA. - // obtain the root poa manager - // - long TIMESleep = 500000000; - int NumberOfTries = 40; - int a; - timespec ts_req; - ts_req.tv_nsec=TIMESleep; - ts_req.tv_sec=0; - timespec ts_rem; - ts_rem.tv_nsec=0; - ts_rem.tv_sec=0; - CosNaming::NamingContext_var inc; - PortableServer::POA_var root_poa; - CORBA::Object_var theObj; - CORBA::Object_var obj; - CORBA::Object_var object; - //SALOME_NamingService &naming = *SINGLETON_::Instance() ; - int CONTAINER=0; - const char * Env = getenv("USE_LOGGER"); - int EnvL =0; - if(Env != NULL && strlen(Env)) - EnvL=1; - - CosNaming::Name name; - name.length(1); - name[0].id=CORBA::string_dup("Logger"); - PortableServer::POAManager_var pman; - for(int i = 1; i <= NumberOfTries; i++){ - if(i != 1) - a=nanosleep(&ts_req,&ts_rem); - try{ - obj = orb->resolve_initial_references("RootPOA"); - if(!CORBA::is_nil(obj)) - root_poa = PortableServer::POA::_narrow(obj); - if(!CORBA::is_nil(root_poa)) - pman = root_poa->the_POAManager(); - if(!CORBA::is_nil(orb)) - theObj = orb->resolve_initial_references("NameService"); - if (!CORBA::is_nil(theObj)) - inc = CosNaming::NamingContext::_narrow(theObj); - }catch(CORBA::COMM_FAILURE&){ - MESSAGE( "Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" ); - } - if(!CORBA::is_nil(inc)){ - MESSAGE( "Container: Naming Service was found" ); - if(EnvL == 1){ - for(int j = 1; j <= NumberOfTries; j++){ - if(j != 1) - a=nanosleep(&ts_req, &ts_rem); - try{ - object = inc->resolve(name); - }catch(CosNaming::NamingContext::NotFound){ - MESSAGE( "Container: Logger Server wasn't found" ); - }catch(...){ - MESSAGE( "Container: Unknown exception" ); - } - if(!CORBA::is_nil(object)){ - MESSAGE( "Container: Logger Server was found" ); - CONTAINER = 1; - break; - } - } - } - } - if(CONTAINER == 1 || (EnvL == 0 && !CORBA::is_nil(inc))) - break; + + ASSERT(argc > 1); + SCRUTE(argv[1]); + bool isSupervContainer = false; + if (strcmp(argv[1],"SuperVisionContainer") == 0) isSupervContainer = true; + + if (!isSupervContainer) + { + int _argc = 1; + char* _argv[] = {""}; + KERNEL_PYTHON::init_python(argc,argv); + } + else + { + Py_Initialize() ; + PySys_SetArgv( argc , argv ) ; } - char *containerName = ""; - if(argc > 1){ + char *containerName = ""; + if(argc > 1) + { containerName = argv[1] ; } - - Engines_Container_i * myContainer - = new Engines_Container_i(orb, root_poa, containerName , argc , argv ); - pman->activate(); - + try + { + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); + ASSERT(!CORBA::is_nil(obj)); + PortableServer::POA_var root_poa = PortableServer::POA::_narrow(obj); + + PortableServer::POAManager_var pman = root_poa->the_POAManager(); + + // add new container to the kill list +#ifndef WNT + char aCommand[40]; + sprintf(aCommand, "addToKillList.py %d SALOME_Container", getpid()); + system(aCommand); +#endif + + Engines_Container_i * myContainer + = new Engines_Container_i(orb, root_poa, containerName , argc , argv ); + + pman->activate(); + #ifdef CHECKTIME - Utils_Timer timer; - timer.Start(); - timer.Stop(); - MESSAGE("SALOME_Registry_Server.cxx - orb->run()"); - timer.ShowAbsolute(); + Utils_Timer timer; + timer.Start(); + timer.Stop(); + MESSAGE("SALOME_Registry_Server.cxx - orb->run()"); + timer.ShowAbsolute(); #endif - - HandleServerSideSignals(orb); - }catch(CORBA::SystemException&){ - INFOS("Caught CORBA::SystemException."); - }catch(PortableServer::POA::WrongPolicy&){ - INFOS("Caught CORBA::WrongPolicyException."); - }catch(PortableServer::POA::ServantAlreadyActive&){ - INFOS("Caught CORBA::ServantAlreadyActiveException"); - }catch(CORBA::Exception&){ - INFOS("Caught CORBA::Exception."); - }catch(std::exception& exc){ - INFOS("Caught std::exception - "<deleteInstance(bp1); return 0 ; } diff --git a/src/Container/SALOME_Container.py b/src/Container/SALOME_Container.py new file mode 100644 index 000000000..4dab6de0d --- /dev/null +++ b/src/Container/SALOME_Container.py @@ -0,0 +1,108 @@ +#! /usr/bin/env python +# +# SALOME Container : implementation of container and engine for Kernel +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : SALOME_Container.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + +import os +import sys +import string +from omniORB import CORBA, PortableServer +# import SALOMEDS before other SALOME modules +# (if not, incomplete import done by SALOME module: no load of SALOMEDS_attributes) +import SALOMEDS +import Engines, Engines__POA +reload(Engines) +reload(Engines__POA) +from SALOME_NamingServicePy import * +from SALOME_ComponentPy import * + +from SALOME_utilities import * +from Utils_Identity import getShortHostName + +#============================================================================= + +#define an implementation of the container interface + +class SALOME_Container_i: + _orb = None + _poa = None + _containerName = "" + _naming_service = None + + #------------------------------------------------------------------------- + + def __init__(self ,containerName, containerIORStr): + MESSAGE( "SALOME_Container_i::__init__" ) + self._orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID) + self._poa = self._orb.resolve_initial_references("RootPOA") + self._containerName = containerName + print "SALOME_Container.SALOME_Container_i : _containerName ",self._containerName + #self._naming_service = SALOME_NamingServicePy_i(self._orb) + self._container = self._orb.string_to_object(containerIORStr) + + #------------------------------------------------------------------------- + + def import_component(self, componentName): + MESSAGE( "SALOME_Container_i::import_component" ) + ret=0 + try: + print "try import ",componentName + __import__(componentName) + print "import ",componentName," successful" + ret=1 + except: + import traceback + traceback.print_exc() + print "import ",componentName," not possible" + return ret + + #------------------------------------------------------------------------- + + def create_component_instance(self, componentName, instanceName, studyId): + MESSAGE( "SALOME_Container_i::create_component_instance" ) + comp_iors="" + try: + component=__import__(componentName) + factory=getattr(component,componentName) + comp_i=factory(self._orb, + self._poa, + self._container, + self._containerName, + instanceName, + componentName) + + MESSAGE( "SALOME_Container_i::create_component_instance : OK") + comp_o = comp_i._this() + comp_iors = self._orb.object_to_string(comp_o) + except: + import traceback + traceback.print_exc() + MESSAGE( "SALOME_Container_i::create_component_instance : NOT OK") + return comp_iors + + diff --git a/src/Container/SALOME_ContainerManager.cxx b/src/Container/SALOME_ContainerManager.cxx index d5fad0ae9..de43d8696 100644 --- a/src/Container/SALOME_ContainerManager.cxx +++ b/src/Container/SALOME_ContainerManager.cxx @@ -2,32 +2,77 @@ #include "SALOME_NamingService.hxx" #include "OpUtil.hxx" #include +#ifndef WNT #include +#endif #include +#include "Utils_CorbaException.hxx" #define TIME_OUT_TO_LAUNCH_CONT 21 using namespace std; -const char *SALOME_ContainerManager::_ContainerManagerNameInNS="/ContainerManager"; +const char *SALOME_ContainerManager::_ContainerManagerNameInNS = + "/ContainerManager"; + +//============================================================================= +/*! + * Constructor + * \param orb + * Define a CORBA single thread policy for the server, which avoid to deal + * with non thread-safe usage like Change_Directory in SALOME naming service + */ +//============================================================================= SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb) { - _NS=new SALOME_NamingService(orb); - PortableServer::POA_var root_poa=PortableServer::POA::_the_root_poa(); - PortableServer::ObjectId_var id=root_poa->activate_object(this); - CORBA::Object_var obj=root_poa->id_to_reference(id); - Engines::ContainerManager_var refContMan = Engines::ContainerManager::_narrow(obj); + MESSAGE("constructor"); + _NS = new SALOME_NamingService(orb); + _ResManager = new SALOME_ResourcesManager(orb); + PortableServer::POA_var root_poa = PortableServer::POA::_the_root_poa(); + PortableServer::POAManager_var pman = root_poa->the_POAManager(); + PortableServer::POA_var my_poa; + + CORBA::PolicyList policies; + policies.length(1); + PortableServer::ThreadPolicy_var threadPol = + root_poa->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL); + policies[0] = PortableServer::ThreadPolicy::_duplicate(threadPol); + + my_poa = + root_poa->create_POA("SThreadPOA",pman,policies); + threadPol->destroy(); + PortableServer::ObjectId_var id = my_poa->activate_object(this); + CORBA::Object_var obj = my_poa->id_to_reference(id); + Engines::ContainerManager_var refContMan = + Engines::ContainerManager::_narrow(obj); + _NS->Register(refContMan,_ContainerManagerNameInNS); + MESSAGE("constructor end"); } +//============================================================================= +/*! + * destructor + */ +//============================================================================= + SALOME_ContainerManager::~SALOME_ContainerManager() { + MESSAGE("destructor"); delete _NS; + delete _ResManager; } +//============================================================================= +/*! CORBA method: + * shutdown all the containers, then the ContainerManager servant + */ +//============================================================================= + void SALOME_ContainerManager::Shutdown() { + MESSAGE("Shutdown"); ShutdownContainers(); PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this); _default_POA()->deactivate_object(oid); @@ -35,11 +80,18 @@ void SALOME_ContainerManager::Shutdown() } +//============================================================================= +/*! CORBA Method: + * Loop on all the containers listed in naming service, ask shutdown on each + */ +//============================================================================= + void SALOME_ContainerManager::ShutdownContainers() { + MESSAGE("ShutdownContainers"); _NS->Change_Directory("/Containers"); - vector vec=_NS->list_directory_recurs(); - for(vector::iterator iter=vec.begin();iter!=vec.end();iter++) + vector vec = _NS->list_directory_recurs(); + for(vector::iterator iter = vec.begin();iter!=vec.end();iter++) { SCRUTE((*iter)); CORBA::Object_var obj=_NS->Resolve((*iter).c_str()); @@ -49,52 +101,111 @@ void SALOME_ContainerManager::ShutdownContainers() } } -Engines::Container_ptr SALOME_ContainerManager::FindOrStartContainer(const char *containerName, const Engines::MachineList& possibleComputers) +//============================================================================= +/*! CORBA Method: + * Find a suitable Container in a list of machines, or start one + * \param params Machine Parameters required for the container + * \param possibleComputers list of machines usable for find or start + */ +//============================================================================= + +Engines::Container_ptr +SALOME_ContainerManager:: +FindOrStartContainer(const Engines::MachineParameters& params, + const Engines::MachineList& possibleComputers) { - Engines::Container_ptr ret=FindContainer(containerName,possibleComputers); + Engines::Container_ptr ret = FindContainer(params,possibleComputers); if(!CORBA::is_nil(ret)) return ret; - // Container doesn't exist try to launch it ... - vector vector; - string theMachine=_LoadManager.FindBest(possibleComputers); + MESSAGE("Container doesn't exist try to launch it ..."); + MESSAGE("SALOME_ContainerManager::FindOrStartContainer " << + possibleComputers.length()); + //vector vector; + string theMachine=_ResManager->FindBest(possibleComputers); + MESSAGE("try to launch it on " << theMachine); + string command; - if(theMachine==GetHostname()) - command=_ResManager.BuildCommandToLaunchLocalContainer(containerName); + if(theMachine=="") + { + MESSAGE("SALOME_ContainerManager::FindOrStartContainer : " << + "no possible computer"); + return Engines::Container::_nil(); + } + else if(theMachine==GetHostname()) + { + command=_ResManager->BuildCommandToLaunchLocalContainer(params); + } else - command=_ResManager.BuildTempFileToLaunchRemoteContainer(theMachine,containerName); - _ResManager.RmTmpFile(); + command = + _ResManager->BuildCommandToLaunchRemoteContainer(theMachine,params); + + _ResManager->RmTmpFile(); int status=system(command.c_str()); - if (status == -1) { - MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status -1)"); - return Engines::Container::_nil(); - } - else if (status == 217) { - MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status 217)"); - return Engines::Container::_nil(); - } - else { - int count=TIME_OUT_TO_LAUNCH_CONT; - while ( CORBA::is_nil(ret) && count ) { - sleep( 1 ) ; - count-- ; - if ( count != 10 ) - MESSAGE( count << ". Waiting for FactoryServer on " << theMachine); - string containerNameInNS=BuildContainerNameInNS(containerName,theMachine.c_str()); - SCRUTE(containerNameInNS); - CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str()); - ret=Engines::Container::_narrow(obj); + if (status == -1) + { + MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed " << + "(system command status -1)"); + return Engines::Container::_nil(); + } + else if (status == 217) + { + MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed " << + "(system command status 217)"); + return Engines::Container::_nil(); } - if ( CORBA::is_nil(ret) ) { - MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed"); + else + { + int count=TIME_OUT_TO_LAUNCH_CONT; + while ( CORBA::is_nil(ret) && count ) + { +#ifndef WNT + sleep( 1 ) ; +#else + Sleep(1000); +#endif + count-- ; + if ( count != 10 ) + MESSAGE( count << ". Waiting for FactoryServer on " << theMachine); + string containerNameInNS = + _NS->BuildContainerNameForNS(params,theMachine.c_str()); + SCRUTE(containerNameInNS); + CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str()); + ret=Engines::Container::_narrow(obj); + } + if ( CORBA::is_nil(ret) ) + { + MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed"); + } + return ret; } - return ret; - } } -Engines::MachineList *SALOME_ContainerManager::GetFittingResources(const Engines::MachineParameters& params, const char *componentName) +//============================================================================= +/*! + * + */ +//============================================================================= + +Engines::MachineList * +SALOME_ContainerManager:: +GetFittingResources(const Engines::MachineParameters& params, + const char *componentName) { - vector vec=_ResManager.GetFittingResources(params,componentName); + MESSAGE("SALOME_ContainerManager::GetFittingResources"); Engines::MachineList *ret=new Engines::MachineList; + vector vec; + try + { + vec = _ResManager->GetFittingResources(params,componentName); + } + catch(const SALOME_Exception &ex) + { + INFOS("Caught exception."); + THROW_SALOME_CORBA_EXCEPTION(ex.what(),SALOME::BAD_PARAM); + //return ret; + } + + MESSAGE("Machine list length "<length(vec.size()); for(unsigned int i=0;iFindBest(possibleComputers); + return CORBA::string_dup(theMachine.c_str()); +} + +//============================================================================= +/*! + * + */ +//============================================================================= -Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const char *theMachine) +Engines::Container_ptr +SALOME_ContainerManager:: +FindContainer(const Engines::MachineParameters& params, + const char *theMachine) { - string containerNameInNS(BuildContainerNameInNS(containerName,theMachine)); - SCRUTE(containerNameInNS); + string containerNameInNS(_NS->BuildContainerNameForNS(params,theMachine)); CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str()); if( !CORBA::is_nil(obj) ) return Engines::Container::_narrow(obj); @@ -120,22 +247,25 @@ Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *contai return Engines::Container::_nil(); } -Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const Engines::MachineList& possibleComputers) +//============================================================================= +/*! + * + */ +//============================================================================= + +Engines::Container_ptr +SALOME_ContainerManager:: +FindContainer(const Engines::MachineParameters& params, + const Engines::MachineList& possibleComputers) { + MESSAGE("FindContainer "<resolve_initial_references("RootPOA"); + if(!CORBA::is_nil(obj)) + root_poa = PortableServer::POA::_narrow(obj); + if(!CORBA::is_nil(root_poa)) + pman = root_poa->the_POAManager(); + } + catch(CORBA::COMM_FAILURE&){ + MESSAGE( "Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" ); + } + try{ + SALOME_ContainerManager *cmServ=new SALOME_ContainerManager(orb); + pman->activate(); + orb->run(); + }catch(CORBA::SystemException&){ + MESSAGE("Caught CORBA::SystemException."); + }catch(PortableServer::POA::WrongPolicy&){ + MESSAGE("Caught CORBA::WrongPolicyException."); + }catch(PortableServer::POA::ServantAlreadyActive&){ + MESSAGE("Caught CORBA::ServantAlreadyActiveException"); + }catch(CORBA::Exception&){ + MESSAGE("Caught CORBA::Exception."); + }catch(std::exception& exc){ + MESSAGE("Caught std::exception - "< " + str(componentName) + ' ' + str(studyId) ) + if studyId < 0: + MESSAGE( "Study ID is lower than 0!" ) + return None + else: + self._numInstance = self._numInstance +1 + instanceName = componentName + "_inst_" + `self._numInstance` + comp_iors="" + try: + component=__import__(componentName) + factory=getattr(component,componentName) + comp_i=factory(self._orb, + self._poa, + self._this(), + self._containerName, + instanceName, + componentName) + + MESSAGE( "SALOME_Container_i::create_component_instance : OK") + comp_o = comp_i._this() + self._listInstances_map[instanceName] = comp_i + except: + import traceback + traceback.print_exc() + MESSAGE( "SALOME_Container_i::create_component_instance : NOT OK") + return comp_o + + #------------------------------------------------------------------------- + + def find_component_instance(self, registeredName, studyId): + anEngine = None + keysList = self._listInstances_map.keys() + i = 0 + while i < len(keysList): + instance = keysList[i] + if find(instance,registeredName) == 0: + anEngine = self._listInstances_map[instance] + if studyId == anEngine.getStudyId(): + return anEngine._this() + i = i + 1 + return anEngine._this() + + #------------------------------------------------------------------------- def remove_impl(self, component): MESSAGE( "SALOME_ContainerPy_i::remove_impl" ) - return None + instanceName = component._get_instanceName() + MESSAGE( "unload component " + str(instanceName) ) + self._listInstances_map.remove(instanceName) + component.destroy() + self._naming_service.Destroy_Name(str(instanceName)) #------------------------------------------------------------------------- @@ -179,17 +275,29 @@ class SALOME_ContainerPy_i (Engines__POA.Container): #------------------------------------------------------------------------- def ping(self): - MESSAGE( "SALOME_ContainerPy_i::ping" ) + MESSAGE( "SALOME_ContainerPy_i::ping() pid " + str(os.getpid()) ) return None #------------------------------------------------------------------------- + def getPID(self): + return os.getpid() + + #------------------------------------------------------------------------- + def _get_name(self): MESSAGE( "SALOME_ContainerPy_i::_get_name" ) return self._containerName #------------------------------------------------------------------------- + def getHostName(self): + MESSAGE( "SALOME_ContainerPy_i::_get_MachineName" ) + self._machineName = "localhost" + return self._machineName + + #------------------------------------------------------------------------- + def _get_machineName(self): MESSAGE( "SALOME_ContainerPy_i::_get_MachineName" ) self._machineName = "localhost" diff --git a/src/Container/SALOME_Container_i.hxx b/src/Container/SALOME_Container_i.hxx index 1f0eb93cc..be21173b0 100644 --- a/src/Container/SALOME_Container_i.hxx +++ b/src/Container/SALOME_Container_i.hxx @@ -35,7 +35,9 @@ #include #include #include +#ifndef WNT #include +#endif #include #include #include @@ -43,8 +45,24 @@ class SALOME_NamingService; -class Engines_Container_i: public virtual POA_Engines::Container, - public virtual PortableServer::RefCountServantBase + +#if defined CONTAINER_EXPORTS +#if defined WIN32 +#define CONTAINER_EXPORT __declspec( dllexport ) +#else +#define CONTAINER_EXPORT +#endif +#else +#if defined WNT +#define CONTAINER_EXPORT __declspec( dllimport ) +#else +#define CONTAINER_EXPORT +#endif +#endif + +class CONTAINER_EXPORT Engines_Container_i: + public virtual POA_Engines::Container, + public virtual PortableServer::RefCountServantBase { public: Engines_Container_i(); @@ -56,33 +74,66 @@ public: bool isServantAloneInProcess = true); virtual ~Engines_Container_i(); + // --- CORBA methods - //! Load component in current container - Engines::Component_ptr load_impl(const char* nameToRegister, - const char* componentName); + virtual bool load_component_Library(const char* componentName); + + virtual Engines::Component_ptr + create_component_instance( const char* componentName, + CORBA::Long studyId); // 0 for multiStudy + + Engines::Component_ptr + find_component_instance( const char* registeredName, + CORBA::Long studyId); // 0 for multiStudy + + Engines::Component_ptr + load_impl(const char* nameToRegister, + const char* componentName); - Engines::Component_ptr instance(const char* nameToRegister, - const char* componentName); - //! Unload component from current container void remove_impl(Engines::Component_ptr component_i); void finalize_removal(); + virtual void ping(); char* name(); - char* machineName(); - void ping(); - void Shutdown(); + virtual void Shutdown(); + char* getHostName(); + CORBA::Long getPID(); //! Kill current container bool Kill_impl() ; - char* getHostName(); - CORBA::Long getPID(); + //Engines::Component_ptr instance(const char* nameToRegister, + // const char* componentName); + + // --- local C++ methods + + Engines::Component_ptr + find_or_create_instance( std::string genericRegisterName, + std::string componentLibraryName); + + Engines::Component_ptr + createInstance(std::string genericRegisterName, + void *handle, + int studyId); + static bool isPythonContainer(const char* ContainerName); + static void decInstanceCnt(std::string genericRegisterName); + //??? char* machineName(); + + // --- needed for parallel components, Numerical Platon + + int getArgc() { return _argc; } + char **getArgv() { return _argv; } - static std::string BuildContainerNameForNS(const char *ContainerName, const char *hostname); - static const char *_defaultContainerName; protected: + static std::map _cntInstances_map; + static std::map _library_map; // library names, loaded + static std::map _toRemove_map;// library names to remove + static omni_mutex _numInstanceMutex ; // lib and instance protection + + bool _isSupervContainer; + SALOME_NamingService *_NS ; std::string _library_path; std::string _containerName; @@ -90,16 +141,12 @@ protected: PortableServer::POA_var _poa; PortableServer::ObjectId * _id ; int _numInstance ; - std::map handle_map ; - std::map remove_map ; - omni_mutex _numInstanceMutex ; // if several threads on the same object - - //private: + std::map _listInstances_map; - int _argc ; + int _argc ; char** _argv ; - long _pid; - bool _isServantAloneInProcess; + long _pid; + bool _isServantAloneInProcess; }; #endif diff --git a/src/DataTypeCatalog/Makefile.in b/src/DataTypeCatalog/Makefile.in index 7ba1a085f..d0ed574a6 100644 --- a/src/DataTypeCatalog/Makefile.in +++ b/src/DataTypeCatalog/Makefile.in @@ -50,11 +50,10 @@ LIB_SRC = \ # in fact client is a test ! So it may go away BIN ! BIN = SALOME_DataTypeCatalog_Server SALOME_DataTypeCatalog_Client BIN_SRC = -BIN_SERVER_IDL = SALOME_DataTypeCatalog.idl +BIN_SERVER_IDL = SALOME_DataTypeCatalog.idl SALOME_Exception.idl CPPFLAGS+= $(QT_MT_INCLUDES) CXXFLAGS+= LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace -LDFLAGSFORBIN= $(LDFLAGS) -lSALOMETraceCollector - +LDFLAGSFORBIN+= -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMEBasics @CONCLUDE@ diff --git a/src/DataTypeCatalog/SALOME_DataTypeCatalog_Client.cxx b/src/DataTypeCatalog/SALOME_DataTypeCatalog_Client.cxx index 580d16b5c..81008bcc6 100644 --- a/src/DataTypeCatalog/SALOME_DataTypeCatalog_Client.cxx +++ b/src/DataTypeCatalog/SALOME_DataTypeCatalog_Client.cxx @@ -26,7 +26,7 @@ /* $Header$ */ -#include +#include #include "SALOME_NamingService.hxx" #include "SALOME_DataTypeCatalog.hh" #include diff --git a/src/DataTypeCatalog/SALOME_DataTypeCatalog_Handler.hxx b/src/DataTypeCatalog/SALOME_DataTypeCatalog_Handler.hxx index 78d08de30..77b06a5b8 100644 --- a/src/DataTypeCatalog/SALOME_DataTypeCatalog_Handler.hxx +++ b/src/DataTypeCatalog/SALOME_DataTypeCatalog_Handler.hxx @@ -34,7 +34,21 @@ #include #include -class SALOME_DataTypeCatalog_Handler : public QXmlDefaultHandler +#if defined DATATYPECATALOG_EXPORTS +#if defined WIN32 +#define DATATYPECATALOG_EXPORT __declspec( dllexport ) +#else +#define DATATYPECATALOG_EXPORT +#endif +#else +#if defined WNT +#define DATATYPECATALOG_EXPORT __declspec( dllimport ) +#else +#define DATATYPECATALOG_EXPORT +#endif +#endif + +class DATATYPECATALOG_EXPORT SALOME_DataTypeCatalog_Handler : public QXmlDefaultHandler { public: //! standard constructor diff --git a/src/DataTypeCatalog/SALOME_DataTypeCatalog_Server.cxx b/src/DataTypeCatalog/SALOME_DataTypeCatalog_Server.cxx index d79829163..72712de82 100644 --- a/src/DataTypeCatalog/SALOME_DataTypeCatalog_Server.cxx +++ b/src/DataTypeCatalog/SALOME_DataTypeCatalog_Server.cxx @@ -26,7 +26,7 @@ // Module : SALOME // $Header$ -#include +#include #include "SALOME_NamingService.hxx" #include "SALOME_DataTypeCatalog_impl.hxx" #include "utilities.h" @@ -38,7 +38,7 @@ int main(int argc,char **argv) { // initialize the ORB CORBA::ORB_ptr orb = CORBA::ORB_init (argc, argv); - SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); try { CosNaming::NamingContext_var _rootContext, catalogContext; @@ -71,7 +71,11 @@ int main(int argc,char **argv) for (int i = 1; i<=NumberOfTries; i++) { if (i!=1) +#ifndef WNT a=nanosleep(&ts_req,&ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try { obj = orb->resolve_initial_references("RootPOA"); @@ -83,9 +87,9 @@ int main(int argc,char **argv) theObj = orb->resolve_initial_references("NameService"); if (!CORBA::is_nil(theObj)) inc = CosNaming::NamingContext::_narrow(theObj);} - catch( CORBA::COMM_FAILURE& ) + catch( CORBA::SystemException& ) { - MESSAGE( "Data Type Catalog: CORBA::COMM_FAILURE: Unable to contact the Naming Service" ); + MESSAGE( "Data Type Catalog: CORBA::SystemException: Unable to contact the Naming Service" ); } if(!CORBA::is_nil(inc)) { @@ -98,7 +102,11 @@ int main(int argc,char **argv) for(int j=1; j<=NumberOfTries; j++) { if (j!=1) +#ifndef WNT a=nanosleep(&ts_req, &ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try { object = inc->resolve(name); @@ -155,6 +163,6 @@ int main(int argc,char **argv) INFOS("Caught CORBA::Exception.") } - delete myThreadTrace; + // delete myThreadTrace; return 0; } diff --git a/src/DataTypeCatalog/SALOME_DataTypeCatalog_impl.cxx b/src/DataTypeCatalog/SALOME_DataTypeCatalog_impl.cxx index cb5337e67..13f3584f2 100644 --- a/src/DataTypeCatalog/SALOME_DataTypeCatalog_impl.cxx +++ b/src/DataTypeCatalog/SALOME_DataTypeCatalog_impl.cxx @@ -310,7 +310,11 @@ SALOME_DataTypeCatalogImpl::_verify_data_type(ListOfParserDataType datatypelist) // Parse if parents data type name of a data type are defined in the // datatype catalog +#ifndef WNT for (unsigned int ind = 0; ind < _datatype_list.size(); ind++) +#else + for (ind = 0; ind < _datatype_list.size(); ind++) +#endif { // Scrute data type parents // MESSAGE("Treatment of " << _datatype_list[ind].Parserdata_name); diff --git a/src/DataTypeCatalog/SALOME_DataTypeCatalog_impl.hxx b/src/DataTypeCatalog/SALOME_DataTypeCatalog_impl.hxx index 97c67ba40..6b662f6b2 100644 --- a/src/DataTypeCatalog/SALOME_DataTypeCatalog_impl.hxx +++ b/src/DataTypeCatalog/SALOME_DataTypeCatalog_impl.hxx @@ -34,7 +34,21 @@ #include #include CORBA_SERVER_HEADER(SALOME_DataTypeCatalog) -class SALOME_DataTypeCatalogImpl: public POA_SALOME_DataTypeCatalog::DataCatalog, +#if defined DATATYPECATALOG_EXPORTS +#if defined WIN32 +#define DATATYPECATALOG_EXPORT __declspec( dllexport ) +#else +#define DATATYPECATALOG_EXPORT +#endif +#else +#if defined WNT +#define DATATYPECATALOG_EXPORT __declspec( dllimport ) +#else +#define DATATYPECATALOG_EXPORT +#endif +#endif + +class DATATYPECATALOG_EXPORT SALOME_DataTypeCatalogImpl: public POA_SALOME_DataTypeCatalog::DataCatalog, public PortableServer::RefCountServantBase { public: diff --git a/src/GenericObj/SALOME_GenericObj_i.cc b/src/GenericObj/SALOME_GenericObj_i.cc index e5281e72b..90b7ac39f 100644 --- a/src/GenericObj/SALOME_GenericObj_i.cc +++ b/src/GenericObj/SALOME_GenericObj_i.cc @@ -41,7 +41,11 @@ GenericObj_i::GenericObj_i(PortableServer::POA_ptr thePOA): myRefCounter(1){ MESSAGE("GenericObj_i::GenericObj_i() - this = "< #include #include + +#ifdef WNT +#include +#include +#endif + using namespace std; bool CreateAttributeFromASCII(HDFinternalObject *father, FILE* fp); @@ -289,7 +295,11 @@ void SaveDatasetInASCIIfile(HDFdataset *hdf_dataset, FILE* fp, int ident) fprintf(fp, "\n"); +#ifndef WNT for(unsigned j=0; jGetAttributeName(j); HDFattribute *hdf_attribute = new HDFattribute(name, hdf_dataset); delete name; @@ -506,8 +516,10 @@ bool CreateDatasetFromASCII(HDFcontainerObject *father, FILE *fp) fscanf(fp, "%i\n", &nbDim); hdf_size* sizeArray = new hdf_size[nbDim]; + int dim = 0; for(i = 0; i - -class HDFascii +class Standard_EXPORT HDFascii { public: diff --git a/src/HDFPersist/HDFcontainerObject.hxx b/src/HDFPersist/HDFcontainerObject.hxx index b95bef33c..efc1fd9ed 100644 --- a/src/HDFPersist/HDFcontainerObject.hxx +++ b/src/HDFPersist/HDFcontainerObject.hxx @@ -33,8 +33,9 @@ extern "C" } #include "HDFobject.hxx" #include "HDFinternalObject.hxx" +#include -class HDFcontainerObject : public HDFinternalObject +class Standard_EXPORT HDFcontainerObject : public HDFinternalObject { private : HDFinternalObject *_firstson; diff --git a/src/HDFPersist/HDFconvert.cc b/src/HDFPersist/HDFconvert.cc index 0249c933a..c2e11ba1c 100644 --- a/src/HDFPersist/HDFconvert.cc +++ b/src/HDFPersist/HDFconvert.cc @@ -27,6 +27,11 @@ #include "HDFconvert.hxx" using namespace std; +#ifdef WNT +#include +#include +#endif + int HDFConvert::FromAscii(const string& file, const HDFcontainerObject & hdf_container, const string& nomdataset) { @@ -43,7 +48,7 @@ int HDFConvert::FromAscii(const string& file, const HDFcontainerObject & hdf_con return -1; }; - // Lit l'état du fichier + // Lit l'‰tat du fichier if ( fstat(fd,&status) < 0) { perror("HDFConvert::FromAscii"); return -1; @@ -54,12 +59,25 @@ int HDFConvert::FromAscii(const string& file, const HDFcontainerObject & hdf_con #ifdef _POSIX_MAPPED_FILES - // Map le fichier en mémoire + // Map le fichier en m‰moire if ( (buffer = (char *) mmap(0,length,PROT_READ,MAP_SHARED,fd,0)) == MAP_FAILED ) { perror("HDFConvert::FromAscii"); return -1; }; - +#elif defined WNT + +#define SHMEMSIZE 4096 + + HANDLE hMapObject = CreateFileMapping( + INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHMEMSIZE, ""); + if (hMapObject != NULL) { + // Get a pointer to the file-mapped shared memory. + buffer = ( char* ) MapViewOfFile( + hMapObject, FILE_MAP_WRITE, 0, 0, 0 ); + if( buffer == NULL ) + CloseHandle(hMapObject); + }; + #else // Sort de la compilation @@ -69,7 +87,7 @@ int HDFConvert::FromAscii(const string& file, const HDFcontainerObject & hdf_con // Creation du Dataset utilisateur hdf_dataset = new HDFdataset( (char *) nomdataset.c_str(), /*discard const */ - (HDFcontainerObject*) &hdf_container, /*discard const, pas de constructeur par référence */ + (HDFcontainerObject*) &hdf_container, /*discard const, pas de constructeur par r‰f‰rence */ HDF_STRING, &length_long,1); // Cree le Dataset sur le disk diff --git a/src/HDFPersist/HDFconvert.hxx b/src/HDFPersist/HDFconvert.hxx index 42628a1c8..772fbcf70 100644 --- a/src/HDFPersist/HDFconvert.hxx +++ b/src/HDFPersist/HDFconvert.hxx @@ -30,8 +30,11 @@ extern "C" { #include "HDFtypes.h" +#ifndef WNT #include #include +#else +#endif #include #include #include diff --git a/src/HDFPersist/HDFdataset.cc b/src/HDFPersist/HDFdataset.cc index ac02e32db..84a2f5ae6 100644 --- a/src/HDFPersist/HDFdataset.cc +++ b/src/HDFPersist/HDFdataset.cc @@ -33,7 +33,7 @@ extern "C" #include "HDFcontainerObject.hxx" #include "HDFexception.hxx" -#include +#include using namespace std; herr_t dataset_attr(hid_t loc_id, const char *attr_name, void *operator_data) diff --git a/src/HDFPersist/HDFdataset.hxx b/src/HDFPersist/HDFdataset.hxx index 58afc6510..b1e076903 100644 --- a/src/HDFPersist/HDFdataset.hxx +++ b/src/HDFPersist/HDFdataset.hxx @@ -33,8 +33,9 @@ extern "C" } #include "HDFinternalObject.hxx" #include "HDFcontainerObject.hxx" +#include -class HDFdataset : public HDFinternalObject +class Standard_EXPORT HDFdataset : public HDFinternalObject { private : HDFcontainerObject *_father; diff --git a/src/HDFPersist/HDFdatasetWrite.c b/src/HDFPersist/HDFdatasetWrite.c index 07dbefdd9..e3727a812 100644 --- a/src/HDFPersist/HDFdatasetWrite.c +++ b/src/HDFPersist/HDFdatasetWrite.c @@ -44,7 +44,7 @@ hdf_err HDFdatasetWrite(hdf_idt id, void *val) hdf_err ret; #ifdef PCLINUX int isI32BE = 0; - int size; + int size = 0; #endif if ((datatype = H5Dget_type(id)) < 0) @@ -53,10 +53,21 @@ hdf_err HDFdatasetWrite(hdf_idt id, void *val) #ifdef PCLINUX if((H5Tget_class(datatype) == H5T_INTEGER) && (H5Tget_size(datatype) == 4)) { isI32BE = 1; /* See HDFdatasetCreate */ - size = (int)HDFdatasetGetSize(id) / 4; + + /*SRN : bug IPAL9619: replaced the method of getting the size of INT32 dataset */ + int i, ndim = HDFdatasetGetnDim(id); + if(ndim < 0) return -1; + + hdf_size *dim = (hdf_size *) malloc(sizeof(hdf_size)*ndim); + if ((ret == HDFdatasetGetDim(id, dim)) < 0) return -1; + + for(i=0; i +#else +#include +#define F_OK 0 +#endif #include } -#include +#include #include "HDFfile.hxx" #include "HDFexception.hxx" using namespace std; diff --git a/src/HDFPersist/HDFfile.hxx b/src/HDFPersist/HDFfile.hxx index 4194fdbbe..83bec3d33 100644 --- a/src/HDFPersist/HDFfile.hxx +++ b/src/HDFPersist/HDFfile.hxx @@ -32,8 +32,9 @@ extern "C" #include "HDFtypes.h" } #include "HDFcontainerObject.hxx" +#include -class HDFfile : public HDFcontainerObject +class Standard_EXPORT HDFfile : public HDFcontainerObject { private : hdf_access_mode _access_mode; diff --git a/src/HDFPersist/HDFgroup.hxx b/src/HDFPersist/HDFgroup.hxx index cca058448..eaf93aab6 100644 --- a/src/HDFPersist/HDFgroup.hxx +++ b/src/HDFPersist/HDFgroup.hxx @@ -32,8 +32,9 @@ extern "C" #include "HDFtypes.h" } #include "HDFcontainerObject.hxx" +#include -class HDFgroup : public HDFcontainerObject +class Standard_EXPORT HDFgroup : public HDFcontainerObject { private : HDFcontainerObject *_father; diff --git a/src/HDFPersist/HDFinternalObject.cc b/src/HDFPersist/HDFinternalObject.cc index 7ef6fb8e7..a1b948643 100644 --- a/src/HDFPersist/HDFinternalObject.cc +++ b/src/HDFPersist/HDFinternalObject.cc @@ -29,7 +29,9 @@ extern "C" #include "hdfi.h" } #include "HDFinternalObject.hxx" +#ifndef WNT using namespace std; +#endif HDFinternalObject::HDFinternalObject(char *name) : HDFobject(name) diff --git a/src/HDFPersist/HDFinternalObject.hxx b/src/HDFPersist/HDFinternalObject.hxx index 5e4acb81c..7aa0eb348 100644 --- a/src/HDFPersist/HDFinternalObject.hxx +++ b/src/HDFPersist/HDFinternalObject.hxx @@ -32,8 +32,9 @@ extern "C" #include "HDFtypes.h" } #include "HDFobject.hxx" +#include -class HDFinternalObject : public HDFobject +class Standard_EXPORT HDFinternalObject : public HDFobject { private : HDFinternalObject *_previousbrother; diff --git a/src/HDFPersist/HDFobject.hxx b/src/HDFPersist/HDFobject.hxx index e92647130..9d74c271f 100644 --- a/src/HDFPersist/HDFobject.hxx +++ b/src/HDFPersist/HDFobject.hxx @@ -31,8 +31,9 @@ extern "C" { #include "HDFtypes.h" } +#include -class HDFobject { +class Standard_EXPORT HDFobject { protected : char *_name; hdf_idt _id; diff --git a/src/KERNEL_PY/Help.py b/src/KERNEL_PY/Help.py new file mode 100755 index 000000000..404ee4dfc --- /dev/null +++ b/src/KERNEL_PY/Help.py @@ -0,0 +1,141 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Help.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + +class SalomeDoc: + def __init__(self, aDoc): + self.doc = aDoc + def __repr__(self): + print self.doc + return "---" + def salome(self): + doc_salome = ''' +MODULE : salome +--------------- +module salome gives access to Salome ressources: +variables: + + salome:orb : CORBA + salome.naming_service : instance of naming Service class + methods: + Resolve(name) : find a CORBA object (ior) by its pathname + Register(name) : register a CORBA object under a pathname + salome.lcc : instance of lifeCycleCORBA class + methods: + FindOrLoadComponent(server,name) : + obtain an Engine (CORBA object) + or launch the Engine if not found, + with a Server name and an Engine name + salome.sg + methods: + updateObjBrowser(bool): + getActiveStudyId(): + getActiveStudyName(): + + SelectedCount(): returns number of selected objects + getSelected(i): returns entry of selected object number i + getAllSelected(): returns list of entry of selected objects + AddIObject(Entry): select an existing Interactive object + RemoveIObject(Entry): remove object from selection + ClearIObjects(): clear selection + + Display(*Entry): + DisplayOnly(Entry): + Erase(Entry): + DisplayAll(): + EraseAll(): + + IDToObject(Entry): returns CORBA reference from entry + + salome.myStudyName : active Study Name + salome.myStudyId : active Study Id + salome.myStudy : the active Study itself (CORBA ior) + methods : defined in SALOMEDS.idl + +methods: + salome.DumpStudy(study) : Dump a study, given the ior +--- +''' + print doc_salome + + def geompy(self): + doc_geompy = ''' +MODULE : geompy +--------------- +module geompy provides an encapsulation of GEOM Engine methods +variables: + geompy.geom : a Geometry Engine, found or loaded + at first import of module geompy. + methods : defined in GEOM_Gen.idl + geompy.myBuilder : a study builder + geompy.father : GEOM root in current study (salome.myStudy) + +methods: + addToStudy(aShape, aName) : add the shape into the current study + --- all methods of GEOM_Gen.idl that returns a shape are encapsulated, + with the same interface : shapes are named with their ior +''' + print doc_geompy + + def supervision(self): + doc_supervision = ''' +MODULES : SALOME_SuperVisionEditor and SALOME_SuperVisionExecutor +----------------------------------------------------------------- +this modules provide access to Editor and Executor Engine methods + +See SUPERV.idl + +In order to run the example (supervisionexample.py) + + Type : from supervisionexample import * + supervisionexample.py contains comments + +A new python example avoids references to LifeCycleCORBA + avoids references to NamingService + avoids references to ModuleCatalog + avoids SuperVisionComponent creation + allows G.Input(...) instead of AddInput(G,...) + replaces Editor/Executor with Graph + allows Nodes, Ports and Links CORBA objects + shortens methods names + ... + + See /SuperVisionTest/resources/GraphExample.py + and GraphExample.xml +--- +''' + print doc_supervision + + + +help = SalomeDoc(''' +Availables modules: + salome : gives access to Salome ressources + geompy : encapsulation of GEOM Engine methods + supervision : gives access to SuperVision Engine +To obtain specific help on a module "truc", type: help.truc() +To run an example, type: import example3 +''') + diff --git a/src/KERNEL_PY/Makefile.in b/src/KERNEL_PY/Makefile.in new file mode 100755 index 000000000..0f9b8963e --- /dev/null +++ b/src/KERNEL_PY/Makefile.in @@ -0,0 +1,38 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Sergey RUIN, OCC +# Module : SALOME + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +EXPORT_PYSCRIPTS = Help.py PyInterp.py salome.py salome_shared_modules.py batchmode_salome.py import_hook.py salome_test.py salome_kernel.py salome_study.py salome_iapp.py salome_ComponentGUI.py + +EXPORT_SHAREDPYSCRIPTS=kernel_shared_modules.py + +@CONCLUDE@ diff --git a/src/KERNEL_PY/PyInterp.py b/src/KERNEL_PY/PyInterp.py new file mode 100755 index 000000000..483101668 --- /dev/null +++ b/src/KERNEL_PY/PyInterp.py @@ -0,0 +1,101 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : PyInterp.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + +import sys +from omniORB import CORBA +from LifeCycleCORBA import * +from libSALOME_Swig import * +import SALOMEDS +from SALOME_NamingServicePy import * + + #-------------------------------------------------------------------------- + +def DumpComponent(Study, SO, offset): + it = Study.NewChildIterator(SO) + Builder = Study.NewBuilder() + while it.More(): + CSO = it.Value() + it.Next() + anAttr = Builder.FindOrCreateAttribute(CSO, "AttributeName") + AtName = anAttr._narrow(SALOMEDS.AttributeName) + t_name = AtName.Value() + if t_name[0] == 1: + ofs = 1 + a = "" + while ofs <= offset: + a = a + "--" + ofs = ofs +1 + print a + ">" + CSO.GetID() + " " + t_name[1] + t_RefSO = CSO.ReferencedObject() + if t_RefSO[0] == 1: + RefSO = t_RefSO[1] + ofs = 1 + a = "" + while ofs <= offset: + a = a + " " + ofs = ofs +1 + print a + ">" + RefSO.GetID() + DumpComponent(Study, CSO, offset+2) + + #-------------------------------------------------------------------------- + +def DumpStudy(Study): + itcomp = Study.NewComponentIterator() + while itcomp.More(): + SC = itcomp.Value() + itcomp.Next() + name = SC.ComponentDataType() + print "-> ComponentDataType is " + name + DumpComponent(Study, SC, 1) + + + #-------------------------------------------------------------------------- + +# initialise the ORB +orb = CORBA.ORB_init([''], CORBA.ORB_ID) + +# create an LifeCycleCORBA instance +lcc = LifeCycleCORBA(orb) + +# create an SALOMEGUI_Swig instance +sg = SALOMEGUI_Swig() + +#create an naming service instance +naming_service = SALOME_NamingServicePy_i(orb) + +# get active study name and id +myStudyName = sg.getActiveStudyName() +print myStudyName + +myStudyId = sg.getActiveStudyId() +print myStudyId + +# get Study Manager reference +obj = naming_service.Resolve('myStudyManager') +myStudyManager = obj._narrow(SALOMEDS.StudyManager) + +# get active study +myStudy = myStudyManager.GetStudyByName(myStudyName) diff --git a/src/KERNEL_PY/batchmode_salome.py b/src/KERNEL_PY/batchmode_salome.py new file mode 100755 index 000000000..abd099f1f --- /dev/null +++ b/src/KERNEL_PY/batchmode_salome.py @@ -0,0 +1,270 @@ +# Copyright (C) 2003 CEA/DEN, EDF R&D +# +# +# +# File : batchmode_salome.py +# Module : SALOME + +import salome_shared_modules + +from omniORB import CORBA +from LifeCycleCORBA import * +import SALOME +import SALOMEDS +from SALOME_NamingServicePy import * + +#-------------------------------------------------------------------------- + +def ImportComponentGUI(ComponentName): + libName = "lib" + ComponentName + "_Swig" + command = "from " + libName + " import *" + exec ( command ) + constructor = ComponentName + "GUI_Swig()" + command = "gui = " + constructor + exec ( command ) + return gui + + #-------------------------------------------------------------------------- + +def SalomeGUIgetAllSelected(self): + selNumber = self.SelectedCount() + listSelected = [] + for i in range(selNumber): + listSelected.append(self.getSelected(i)) + return listSelected + #-------------------------------------------------------------------------- + +def generateName(prefix = None): + import whrandom; + int = whrandom.randint(1,1000); + if prefix is None: + return "Study" + str(int) + else : + return prefix + str(int) + +#WITHOUTIHMfrom libSALOME_Swig import * +###from SalomePyQt import * +#WITHOUTIHMclass SalomeGUI(SALOMEGUI_Swig): + #WITHOUTIHMgetAllSelected = SalomeGUIgetAllSelected + + #WITHOUTIHMdef getDesktop(self) : +# return SalomePyQt.getDesktop() + #WITHOUTIHMreturn None + + #WITHOUTIHMdef getSelection(self) : +# return SalomePyQt.getSelection() + #WITHOUTIHMreturn None + + #-------------------------------------------------------------------------- + +def IDToObject(id): + myObj = None + mySO = myStudy.FindObjectID(id); + if mySO is not None: + ok, anAttr = mySO.FindAttribute("AttributeIOR") + if ok: + AtIOR = anAttr._narrow(SALOMEDS.AttributeIOR) + if AtIOR.Value() != "": + myObj = orb.string_to_object(AtIOR.Value()) + return myObj + +def ObjectToSObject(obj): + mySO = None + if obj is not None: + ior = orb.object_to_string(obj) + if ior != "": + mySO = myStudy.FindObjectIOR(ior) + return mySO + +def ObjectToID(obj): + mySO = ObjectToSObject(obj) + if mySO: + return mySO.GetID() + return "" + +def IDToSObject(id): + mySO = myStudy.FindObjectID(id); + return mySO + + #-------------------------------------------------------------------------- + +def PersistentPresentation(theStudy, theSO, theWithID): + # put the sobject's content (with subchildren) to the string + aResult = "" + attrs = theSO.GetAllAttributes() + aLen = len(attrs) + anUncopied = 0 + for a in range(0,aLen): + attr = attrs[a] + if isinstance(attr,SALOMEDS._objref_AttributeTreeNode): + anUncopied += 1 + elif isinstance(attr,SALOMEDS._objref_AttributeTarget): + anUncopied += 1 + elif isinstance(attr,SALOMEDS._objref_AttributeReal) or \ + isinstance(attr,SALOMEDS._objref_AttributeInteger) or \ + isinstance(attr,SALOMEDS._objref_AttributeName) or \ + isinstance(attr,SALOMEDS._objref_AttributeComment) or \ + isinstance(attr,SALOMEDS._objref_AttributePersistentRef) or \ + isinstance(attr,SALOMEDS._objref_AttributeLocalID) or \ + isinstance(attr,SALOMEDS._objref_AttributeUserID): + aResult += " attribute value: " + str(attr.Value()) + elif isinstance(attr,SALOMEDS._objref_AttributeIOR): + aResult += " attribute: IOR" + elif isinstance(attr,SALOMEDS._objref_AttributeSequenceOfReal) or \ + isinstance(attr,SALOMEDS._objref_AttributeSequenceOfInteger): + aResult += " Sequence: " + str(attr.CorbaSequence()) + elif isinstance(attr,SALOMEDS._objref_AttributeDrawable): + aResult += " Drawable: " + str(attr.IsDrawable()) + elif isinstance(attr,SALOMEDS._objref_AttributeSelectable): + aResult += " Selectable: " + str(attr.IsSelectable()) + elif isinstance(attr,SALOMEDS._objref_AttributeExpandable): + aResult += " Expandable: " + str(attr.IsExpandable()) + elif isinstance(attr,SALOMEDS._objref_AttributeOpened): + aResult += " Opened: " + str(attr.IsOpened()) + elif isinstance(attr,SALOMEDS._objref_AttributeTextColor): + aResult += " TextColor: " + str(attr.TextColor()) + elif isinstance(attr,SALOMEDS._objref_AttributeTextHighlightColor): + aResult += " TextHighlightColor: " + str(attr.TextHighlightColor()) + elif isinstance(attr,SALOMEDS._objref_AttributePixMap): + aResult += " PixMap: " + str(attr.GetPixMap()) + elif isinstance(attr,SALOMEDS._objref_AttributeTableOfInteger) or \ + isinstance(attr,SALOMEDS._objref_AttributeTableOfReal): + aResult += " Table with title: " + attr.GetTitle() + elif isinstance(attr,SALOMEDS._objref_AttributePythonObject): + aResult += " PythonObject: " + attr.GetObject() + + if theWithID: + aResult = "sobject: " + theSO.GetID() + " nbattrs: " + str(aLen - anUncopied) + aResult + '\n' + else: + aResult = " nbattrs: " + str(aLen - anUncopied) + aResult + '\n' + anIter = theStudy.NewChildIterator(theSO) + while anIter.More(): + aResult += PersistentPresentation(theStudy, anIter.Value(), theWithID) + anIter.Next() + return aResult + + #-------------------------------------------------------------------------- + +def GetTree(theSO): + # returns the document list tree (as list) + aResult = [theSO.GetID()] + anIter = myStudy.NewChildIterator(theSO) + while anIter.More(): + aResult += GetTree(anIter.Value()) + anIter.Next() + return aResult + + #-------------------------------------------------------------------------- + +def CheckCopyPaste(theSO, theInfo ,theComponentPaste): + aRoot = theSO + while aRoot.GetID() != "0:": + aRoot = aRoot.GetFather() + aTree = GetTree(aRoot) + aStudyPersist = PersistentPresentation(myStudy, aRoot, 1) + + if not myStudyManager.CanCopy(theSO): + raise RuntimeError, " for "+theInfo+" returns false" + + if not myStudyManager.Copy(theSO): + raise RuntimeError, " for "+theInfo+" returns false" + + + if not myStudyManager.CanPaste(theSO): + raise RuntimeError, " for "+theInfo+" returns false" + + # check: before paste study is not changed check + if aStudyPersist != PersistentPresentation(myStudy, aRoot, 1): + raise RuntimeError, "Study is changed before Paste calling for "+theInfo + + aSObj = theSO + if theComponentPaste: + aSObj = theSO.GetFatherComponent() + theInfo = theInfo + "(paste for component)" + if myStudyManager.Paste(aSObj) == None: + raise RuntimeError, " for "+theInfo+" returns None object" + aNewTree = GetTree(aRoot) + aLen = len(aTree) + for a in range(0,aLen): + if aTree[a] != aNewTree[a]: + return myStudy.FindObjectID(aNewTree[a]) + + if aLen < len(aNewTree): + return myStudy.FindObjectID(aNewTree[aLen]) + + raise RuntimeError, "After Copy calling the tree is not changed" + + #-------------------------------------------------------------------------- +def FindFileInDataDir(filename): + import os + datadir = os.getenv("DATA_DIR") + if datadir is not None: + import string + dirs = string.split(datadir, ":") + for dir in dirs: + file = dir + "/" + filename + if os.path.exists(file): + return file; + datadir = os.getenv("KERNEL_ROOT_DIR") + "/examples/" + file = datadir + filename + if os.path.exists(file): + return file; + + return None + +#-------------------------------------------------------------------------- +# initialise the ORB +orb = None + +step = 0 +while step < 100 and orb is None: + orb = CORBA.ORB_init([''], CORBA.ORB_ID) + step = step + 1 + time.sleep(4) + +if orb is None: + print "Warning: ORB has not been initialized !!!" + +# create an LifeCycleCORBA instance +lcc = LifeCycleCORBA(orb) + +step = 0 +while step < 100 and lcc is None: + lcc = LifeCycleCORBA(orb) + step = step + 1 + time.sleep(4) + +if lcc is None: + print "Warning: LifeCycleCORBA object has not been initialized !!!" + +#create a naming service instance +naming_service = SALOME_NamingServicePy_i(orb) + +# get Study Manager reference +obj = None + +step = 0 +while step < 100 and obj == None: + obj = naming_service.Resolve('myStudyManager') + step = step + 1 + time.sleep(4) + +myStudyManager = obj._narrow(SALOMEDS.StudyManager) + +if myStudyManager is None: + print "Warning: SALOMEDS.StudyManager has not been created !!!" + +# create new study +aListOfOpenStudies = myStudyManager.GetOpenStudies(); +myStudy = None; +if len(aListOfOpenStudies) == 0 : + myStudy = myStudyManager.NewStudy("Study1") +else: + myStudyName = aListOfOpenStudies[0] + myStudy = myStudyManager.GetStudyByName(myStudyName) + +myStudyName = myStudy._get_Name() + +myStudyId = myStudy._get_StudyId() +print myStudyId + diff --git a/src/KERNEL_PY/import_hook.py b/src/KERNEL_PY/import_hook.py new file mode 100755 index 000000000..79725c627 --- /dev/null +++ b/src/KERNEL_PY/import_hook.py @@ -0,0 +1,109 @@ +""" +This module replaces the standard import mechanism with one +that filters some imports that can't be done more than once. + +This is related to the multi study feature that is implemented +by using the Python multi interpreter feature. +Some modules register objects or classes by calling modules +implemented in C. These operations can't be done multiple times. +So it's very important to control these imports. + +Examples: + - PyQt : import qt calls a C module to register classes + - OmniORB : import *_idl calls a C module to register CORBA interfaces + +Usage: + - First import the module : import import_hook. This module will + replace the original importer mechanism + + - Next register the module names or pattern names to filter out:: + import_hook.register_name("a") + import_hook.register_pattern(pattern) + + where pattern is a function with one parameter, the module name + to be imported, that returns true or false depending if this module is + to be filtered or not. + + - Then it's done + +IMPORTANT : Every subinterpretor has its own import_hook module. import_hook is not shared among subinterpretors. +The mechanism only works if shared_imported and pattern are shared between all subinterpretors. +This is done by calling init_shared_modules(). + +""" +import sys, imp, __builtin__ + +# Keep in shared_imported a copy of dictionnary modules +# that need to be imported only once in multi-study context +shared_imported={} + +# patterns contains functions that returns 1 or 0 depending if +# the module name (argument) must be filtered out or not +# These functions are added by calling register_pattern +patterns=[] + +original_import=__builtin__.__import__ + +def register_name(name): + if shared_imported.has_key(name):return + shared_imported[name]=None + +def register_pattern(pattern): + patterns.append(pattern) + +def is_shared(name): + if shared_imported.has_key(name):return 1 + for pattern in patterns: + if pattern(name) : return 1 + return 0 + +def get_shared_imported(name): + return shared_imported.get(name) + +def set_shared_imported(name,module): + shared_imported[name]=module + #print "Module %s shared registered" % name,module + +def get_shared_imported_with_copy(name): + module_dict= shared_imported.get(name) + m=imp.new_module(name) + m.__dict__.update(module_dict) + return m +def set_shared_imported_with_copy(name,module): + shared_imported[name]=module.__dict__.copy() + #print "Module %s shared registered" % name + +def import_hook(name, globals=None, locals=None, fromlist=None): + #print "import_hook",name,fromlist + module=get_shared_imported(name) + if module: + sys.modules[name]=module + return module + + module= original_import(name, globals, locals, fromlist) + + if is_shared(name): + set_shared_imported(name,module) + return module + +original_reload=__builtin__.reload + +def reload_hook(module): + if is_shared(module.__name__): + return module + return original_reload(module) + +__builtin__.__import__=import_hook +# Reload is not replaced +#__builtin__.reload=reload_hook + +def init_shared_modules(shared_module): + global shared_imported, patterns + shared_imported=shared_module.shared_imported + patterns= shared_module.patterns + for k,v in shared_imported.items(): + if v is not None:sys.modules[k]=v + shared_imported["salome_shared_modules"]=shared_module + import salome_shared_modules + for m in salome_shared_modules.list_modules: + m.init_shared_modules() diff --git a/src/KERNEL_PY/kernel_shared_modules.py b/src/KERNEL_PY/kernel_shared_modules.py new file mode 100755 index 000000000..5be2f15f4 --- /dev/null +++ b/src/KERNEL_PY/kernel_shared_modules.py @@ -0,0 +1,112 @@ +""" + +""" +import import_hook + +import glob,os,sys,string,imp + +from import_hook import register_name +from import_hook import register_pattern + +register_name("qt") +register_name("libSALOME_LifeCycleCORBA") +register_pattern(lambda(x):x.endswith("_idl")) +register_pattern(lambda(x):x.endswith("_Swig")) + +register_name("CORBA") +import CORBA + +register_name("omniORB") +import omniORB + +register_name("CosNaming") +import CosNaming + +# Modify omniORB to use right sys.modules dictionnary +# with multi-interpreter feature +# openModule and newModule are functions of omniORB/__init__.py module +# modified to register modules to share +# Function to return a Python module for the required IDL module name +def openModule(mname, fname=None): + # Salome modification start + import sys + # Salome modification end + + if mname == "CORBA": + mod = sys.modules["omniORB.CORBA"] + elif sys.modules.has_key(mname): + mod = sys.modules[mname] + else: + mod = newModule(mname) + + # Salome modification start + import_hook.set_shared_imported(mname,mod) + # Salome modification end + + + if not hasattr(mod, "__doc__") or mod.__doc__ is None: + mod.__doc__ = "omniORB IDL module " + mname + "\n\n" + \ + "Generated from:\n\n" + + if fname is not None: + mod.__doc__ = mod.__doc__ + " " + fname + "\n" + + return mod + +# Function to create a new module, and any parent modules which do not +# already exist +def newModule(mname): + # Salome modification start + import sys + # Salome modification end + + mlist = string.split(mname, ".") + current = "" + mod = None + + for name in mlist: + current = current + name + + if sys.modules.has_key(current): + mod = sys.modules[current] + else: + newmod = imp.new_module(current) + if mod: setattr(mod, name, newmod) + sys.modules[current] = mod = newmod + + current = current + "." + + return mod +# Replace openModule and newModule by modified ones +# to take into account the sys.modules that matches +# the right one (multi-interpreter feature) +omniORB.openModule=openModule +omniORB.newModule=newModule + +# BE CAREFUL +# Engines, SALOME, SALOMEDS must be imported in that order because : +# Engines imports SALOME_Component_idl +# SALOME imports SALOME_Session_idl and SALOME_Exception_idl which imports SALOME_Component_idl +# and SALOMEDS imports SALOMEDS_idl and SALOMEDS_Attributes_idl which imports SALOME_Exception_idl +# If SALOME is imported before Engines, that module would not be completely imported +import Engines +import SALOME +import SALOMEDS +import SALOME_ModuleCatalog + +def init_shared_modules(): + """ + This function initializes shared modules that need to be + """ + # EDF-CCAR: + # Problem with omniORB : omniORB creates a C Python module named _omnipy + # this module has sub-modules : omni_func, ... + # _omnipy is quite a package but import with Python sub-interpreters does not seem to work + # To make it work we need to add those sub-modules in sys.modules + import sys + import _omnipy + sys.modules["_omnipy.omni_func"]=_omnipy.omni_func + sys.modules["_omnipy.poa_func"]=_omnipy.poa_func + sys.modules["_omnipy.poamanager_func"]=_omnipy.poamanager_func + sys.modules["_omnipy.orb_func"]=_omnipy.orb_func + diff --git a/src/KERNEL_PY/salome.py b/src/KERNEL_PY/salome.py new file mode 100755 index 000000000..e8d5d5bac --- /dev/null +++ b/src/KERNEL_PY/salome.py @@ -0,0 +1,63 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : salome.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + +from salome_kernel import * +from salome_study import * +from salome_iapp import * + +salome_initial=1 +def salome_init(theStudyId=0): + """ + Performs only once SALOME general purpose intialisation for scripts. + optional argument : theStudyId + When in embedded interpreter inside IAPP, theStudyId is not used + When used without GUI (external interpreter) + 0 : create a new study (default). + n (>0) : try connection to study with Id = n, or create a new one + if study not found. + If study creation, its Id may be different from theStudyId ! + Provides: + orb reference to CORBA + lcc a LifeCycleCorba instance + naming_service a naming service instance + cm reference to the container manager + sg access to SALOME GUI (when linked with IAPP GUI) + myStudyManager the study manager + myStudyId active study identifier + myStudy active study itself (CORBA reference) + myStudyName active study name + """ + global salome_initial + global orb, lcc, naming_service, cm + global sg + global myStudyManager, myStudyId, myStudy, myStudyName + + if salome_initial: + salome_initial=0 + sg = salome_iapp_init() + orb, lcc, naming_service, cm = salome_kernel_init() + myStudyManager, myStudyId, myStudy, myStudyName =salome_study_init(theStudyId) + diff --git a/src/KERNEL_PY/salome_ComponentGUI.py b/src/KERNEL_PY/salome_ComponentGUI.py new file mode 100644 index 000000000..617c88218 --- /dev/null +++ b/src/KERNEL_PY/salome_ComponentGUI.py @@ -0,0 +1,56 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : salome.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + + +# to replace some function from _SWIG, outside GUI + +# --- From GeometryGUI_SWIG + + #-------------------------------------------------------------------------- + +def getIndexTopology(aSubId, aMainId): + return 0 + + #-------------------------------------------------------------------------- + +def getShapeTypeString(aSubId): + return "SubShape" + + #-------------------------------------------------------------------------- + +# --- From SMESHGUI_SWIG + + #-------------------------------------------------------------------------- + +def Init(studyId): + return + + #-------------------------------------------------------------------------- + +def SetName(objId, name): + return + + #-------------------------------------------------------------------------- diff --git a/src/KERNEL_PY/salome_iapp.py b/src/KERNEL_PY/salome_iapp.py new file mode 100644 index 000000000..e6ebcaf16 --- /dev/null +++ b/src/KERNEL_PY/salome_iapp.py @@ -0,0 +1,74 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : salome_iapp.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + +import salome_ComponentGUI + + #-------------------------------------------------------------------------- + +IN_SALOME_GUI=0 + +def ImportComponentGUI(ComponentName): + if IN_SALOME_GUI: + libName = "lib" + ComponentName + "_Swig" + command = "from " + libName + " import *" + exec ( command ) + constructor = ComponentName + "_Swig()" + command = "gui = " + constructor + exec ( command ) + return gui + else: + print "Warning: ImportComponentGUI(",ComponentName,") outside GUI !" + print "calls to GUI methods may crash..." + return salome_ComponentGUI + + #-------------------------------------------------------------------------- + +def SalomeGUIgetAllSelected(self): + selNumber = self.SelectedCount() + listSelected = [] + for i in range(selNumber): + listSelected.append(self.getSelected(i)) + return listSelected + + #-------------------------------------------------------------------------- + +salome_iapp_initial = 1 + +def salome_iapp_init(): + global salome_iapp_initial + global sg,IN_SALOME_GUI + + if salome_iapp_initial: + salome_iapp_initial=0 + import libSALOME_Swig + + class SalomeGUI(libSALOME_Swig.SALOMEGUI_Swig): + getAllSelected = SalomeGUIgetAllSelected + + # create a SALOMEGUI_Swig instance + sg = SalomeGUI() + IN_SALOME_GUI = sg.hasDesktop() + return sg diff --git a/src/KERNEL_PY/salome_kernel.py b/src/KERNEL_PY/salome_kernel.py new file mode 100644 index 000000000..40fe9e124 --- /dev/null +++ b/src/KERNEL_PY/salome_kernel.py @@ -0,0 +1,55 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : salome_kernel.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + +from omniORB import CORBA +from LifeCycleCORBA import * +from SALOME_NamingServicePy import * +from SALOME_utilities import * +import Engines + +salome_kernel_initial=1 + +def salome_kernel_init(): + global salome_kernel_initial + global orb, lcc, naming_service, cm + + if salome_kernel_initial: + salome_kernel_initial = 0 + + # initialise the ORB + orb = CORBA.ORB_init([''], CORBA.ORB_ID) + + # create a LifeCycleCORBA instance + lcc = LifeCycleCORBA(orb) + + #create a naming service instance + naming_service = SALOME_NamingServicePy_i(orb) + + # get Container Manager + obj = naming_service.Resolve('/ContainerManager') + cm = obj._narrow(Engines.ContainerManager) + + return orb, lcc, naming_service, cm diff --git a/src/KERNEL_PY/salome_shared_modules.py b/src/KERNEL_PY/salome_shared_modules.py new file mode 100755 index 000000000..f74680985 --- /dev/null +++ b/src/KERNEL_PY/salome_shared_modules.py @@ -0,0 +1,92 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : salome_shared_modules.py +# Module : SALOME + +from SALOME_utilities import * + +""" +This module with help of import_hook and *_shared_modules +filters imports when using the embedded Python interpretor. + +Some imports can't be done more than once. +This is related to the multi study feature that is implemented +by using the Python multi interpreter feature. +Some modules register objects or classes by calling modules +implemented in C. These operations can't be done multiple times. +So it's very important to control these imports. + +Examples: + - PyQt : import qt calls a C module to register classes + - OmniORB : import *_idl calls a C module to register CORBA interfaces + +Usage: + - First : the module salome_shared_modules is imported by main Python interpretor. + It will keep a dictionnary and a list that are shared among all + the subinterpretors and imports import_hook module that replaces + the standard import mechanism par one that prevents more than one import + for some modules identified by name (call register_name) or by a + validator (call register_pattern). + + Calls to register_name and register_pattern are done in modules named *_shared_modules + that could be found in the path SALOMEPATH + +""" +import glob,os,sys + +import import_hook +# shared_imported, patterns, register_name, register_pattern +# will be shared by all Python sub interpretors +from import_hook import shared_imported +from import_hook import patterns +from import_hook import register_name +from import_hook import register_pattern + +register_name("salome_shared_modules") + +# Get the SALOMEPATH if set or else use KERNEL_ROOT_DIR that should be set. +salome_path=os.environ.get("SALOMEPATH",os.getenv("KERNEL_ROOT_DIR")) + +list_modules=[] + +# Import all *_shared_modules in the path and store them in list_modules +path=salome_path.split(":") +for rep in path: + # Import all *_shared_modules in rep + for f in glob.glob(os.path.join(rep,"lib","python"+sys.version[:3],"site-packages","salome","shared_modules","*_shared_modules.py")): + try: + name=os.path.splitext(os.path.basename(f))[0] + register_name(name) + m=__import__(name) + list_modules.append(m) + except: + pass + +# +# If shared modules have been imported before installing import mechanism +# we add them to shared_imported +# +for name,module in sys.modules.items(): + if import_hook.is_shared(name) and shared_imported.get(name) is None: + #print "Module shared added to shared_imported: ",name + shared_imported[name]=module + diff --git a/src/KERNEL_PY/salome_study.py b/src/KERNEL_PY/salome_study.py new file mode 100644 index 000000000..f643e844b --- /dev/null +++ b/src/KERNEL_PY/salome_study.py @@ -0,0 +1,323 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : salome_study.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + +import salome_kernel +import SALOMEDS +import salome_iapp + +#-------------------------------------------------------------------------- + +def DumpComponent(Study, SO, offset): + it = Study.NewChildIterator(SO) + Builder = Study.NewBuilder() + while it.More(): + CSO = it.Value() + it.Next() + anAttr = Builder.FindOrCreateAttribute(CSO, "AttributeName") + AtName = anAttr._narrow(SALOMEDS.AttributeName) + t_name = AtName.Value() + if t_name[0] == 1: + ofs = 1 + a = "" + while ofs <= offset: + a = a + "--" + ofs = ofs +1 + MESSAGE( a + ">" + str(CSO.GetID()) + " " + str(t_name[1]) ) + t_RefSO = CSO.ReferencedObject() + if t_RefSO[0] == 1: + RefSO = t_RefSO[1] + ofs = 1 + a = "" + while ofs <= offset: + a = a + " " + ofs = ofs +1 + MESSAGE( a + ">" + str(RefSO.GetID()) ) + DumpComponent(Study, CSO, offset+2) + + #-------------------------------------------------------------------------- + +def DumpStudy(Study): + itcomp = Study.NewComponentIterator() + while itcomp.More(): + SC = itcomp.Value() + itcomp.Next() + name = SC.ComponentDataType() + MESSAGE( "-> ComponentDataType is " + name ) + DumpComponent(Study, SC, 1) + + + #-------------------------------------------------------------------------- + +def IDToObject(id): + myObj = None + mySO = myStudy.FindObjectID(id); + if mySO is not None: + ok, anAttr = mySO.FindAttribute("AttributeIOR") + if ok: + AtIOR = anAttr._narrow(SALOMEDS.AttributeIOR) + if AtIOR.Value() != "": + myObj = orb.string_to_object(AtIOR.Value()) + return myObj + +def ObjectToSObject(obj): + mySO = None + if obj is not None: + ior = orb.object_to_string(obj) + if ior != "": + mySO = myStudy.FindObjectIOR(ior) + return mySO + +def ObjectToID(obj): + mySO = ObjectToSObject(obj) + if mySO: + return mySO.GetID() + return "" + +def IDToSObject(id): + mySO = myStudy.FindObjectID(id); + return mySO + + #-------------------------------------------------------------------------- + +def generateName(prefix = None): + import whrandom; + int = whrandom.randint(1,1000); + if prefix is None: + return "Study" + str(int) + else : + return prefix + str(int) + + #-------------------------------------------------------------------------- + +def PersistentPresentation(theStudy, theSO, theWithID): + # put the sobject's content (with subchildren) to the string + aResult = "" + attrs = theSO.GetAllAttributes() + aLen = len(attrs) + anUncopied = 0 + for a in range(0,aLen): + attr = attrs[a] + if isinstance(attr,SALOMEDS._objref_AttributeTreeNode): + anUncopied += 1 + elif isinstance(attr,SALOMEDS._objref_AttributeTarget): + anUncopied += 1 + elif isinstance(attr,SALOMEDS._objref_AttributeReal) or \ + isinstance(attr,SALOMEDS._objref_AttributeInteger) or \ + isinstance(attr,SALOMEDS._objref_AttributeName) or \ + isinstance(attr,SALOMEDS._objref_AttributeComment) or \ + isinstance(attr,SALOMEDS._objref_AttributePersistentRef) or \ + isinstance(attr,SALOMEDS._objref_AttributeLocalID) or \ + isinstance(attr,SALOMEDS._objref_AttributeUserID): + aResult += " attribute value: " + str(attr.Value()) + elif isinstance(attr,SALOMEDS._objref_AttributeIOR): + aResult += " attribute: IOR" + elif isinstance(attr,SALOMEDS._objref_AttributeSequenceOfReal) or \ + isinstance(attr,SALOMEDS._objref_AttributeSequenceOfInteger): + aResult += " Sequence: " + str(attr.CorbaSequence()) + elif isinstance(attr,SALOMEDS._objref_AttributeDrawable): + aResult += " Drawable: " + str(attr.IsDrawable()) + elif isinstance(attr,SALOMEDS._objref_AttributeSelectable): + aResult += " Selectable: " + str(attr.IsSelectable()) + elif isinstance(attr,SALOMEDS._objref_AttributeExpandable): + aResult += " Expandable: " + str(attr.IsExpandable()) + elif isinstance(attr,SALOMEDS._objref_AttributeOpened): + aResult += " Opened: " + str(attr.IsOpened()) + elif isinstance(attr,SALOMEDS._objref_AttributeTextColor): + aResult += " TextColor: " + str(attr.TextColor()) + elif isinstance(attr,SALOMEDS._objref_AttributeTextHighlightColor): + aResult += " TextHighlightColor: " + str(attr.TextHighlightColor()) + elif isinstance(attr,SALOMEDS._objref_AttributePixMap): + aResult += " PixMap: " + str(attr.GetPixMap()) + elif isinstance(attr,SALOMEDS._objref_AttributeTableOfInteger) or \ + isinstance(attr,SALOMEDS._objref_AttributeTableOfReal): + aResult += " Table with title: " + attr.GetTitle() + elif isinstance(attr,SALOMEDS._objref_AttributePythonObject): + aResult += " PythonObject: " + attr.GetObject() + + if theWithID: + aResult = "sobject: " + theSO.GetID() + " nbattrs: " + str(aLen - anUncopied) + aResult + '\n' + else: + aResult = " nbattrs: " + str(aLen - anUncopied) + aResult + '\n' + anIter = theStudy.NewChildIterator(theSO) + while anIter.More(): + aResult += PersistentPresentation(theStudy, anIter.Value(), theWithID) + anIter.Next() + return aResult + + #-------------------------------------------------------------------------- + +def GetTree(theSO): + # returns the document list tree (as list) + aResult = [theSO.GetID()] + anIter = myStudy.NewChildIterator(theSO) + while anIter.More(): + aResult += GetTree(anIter.Value()) + anIter.Next() + return aResult + + #-------------------------------------------------------------------------- + +def CheckCopyPaste(theSO, theInfo ,theComponentPaste): + aRoot = theSO + while aRoot.GetID() != "0:": + aRoot = aRoot.GetFather() + aTree = GetTree(aRoot) + aStudyPersist = PersistentPresentation(myStudy, aRoot, 1) + + if not myStudyManager.CanCopy(theSO): + raise RuntimeError, " for "+theInfo+" returns false" + + if not myStudyManager.Copy(theSO): + raise RuntimeError, " for "+theInfo+" returns false" + + + if not myStudyManager.CanPaste(theSO): + raise RuntimeError, " for "+theInfo+" returns false" + + # check: before paste study is not changed check + if aStudyPersist != PersistentPresentation(myStudy, aRoot, 1): + raise RuntimeError, "Study is changed before Paste calling for "+theInfo + + aSObj = theSO + if theComponentPaste: + aSObj = theSO.GetFatherComponent() + theInfo = theInfo + "(paste for component)" + if myStudyManager.Paste(aSObj) == None: + raise RuntimeError, " for "+theInfo+" returns None object" + aNewTree = GetTree(aRoot) + aLen = len(aTree) + for a in range(0,aLen): + if aTree[a] != aNewTree[a]: + return myStudy.FindObjectID(aNewTree[a]) + + if aLen < len(aNewTree): + return myStudy.FindObjectID(aNewTree[aLen]) + + raise RuntimeError, "After Copy calling the tree is not changed" + + #-------------------------------------------------------------------------- + +def FindFileInDataDir(filename): + import os + datadir = os.getenv("DATA_DIR") + if datadir is not None: + import string + dirs = string.split(datadir, ":") + for dir in dirs: + file = dir + "/" + filename + if os.path.exists(file): + return file; + datadir = os.getenv("KERNEL_ROOT_DIR") + "/examples/" + file = datadir + filename + if os.path.exists(file): + return file; + + return None + + #-------------------------------------------------------------------------- + +salome_study_ID = -1 + +def getActiveStudy(theStudyId=0): + global salome_study_ID + + print "getActiveStudy" + sg = salome_iapp.salome_iapp_init() + if salome_study_ID == -1: + if sg.hasDesktop(): + print "---in gui" + salome_study_ID = sg.getActiveStudyId() + else: + print "---outside gui" + if theStudyId: + aStudy=myStudyManager.GetStudyByID(theStudyId) + if aStudy: + print "connection to existing study ", theStudyId + salome_study_ID = theStudyId + if salome_study_ID == -1: + salome_study_ID = createNewStudy() + print"--- Study Id ", salome_study_ID + return salome_study_ID + + #-------------------------------------------------------------------------- + +def createNewStudy(): + print "createNewStudy" + i=1 + aStudyName = "noName" + nameAlreadyInUse = 1 + listOfOpenStudies = myStudyManager.GetOpenStudies() + print listOfOpenStudies + while nameAlreadyInUse: + aStudyName = "extStudy_%d"%i + if aStudyName not in listOfOpenStudies: + nameAlreadyInUse=0 + else: + i = i+1 + + theStudy = myStudyManager.NewStudy(aStudyName) + theStudyId = theStudy._get_StudyId() + print aStudyName, theStudyId + return theStudyId + + #-------------------------------------------------------------------------- + +salome_study_initial = 1 + +def salome_study_init(theStudyId=0): + """ + Performs only once study creation or connection. + optional argument : theStudyId + When in embedded interpreter inside IAPP, theStudyId is not used + When used without GUI (external interpreter) + 0 : create a new study (default). + n (>0) : try connection to study with Id = n, or create a new one + if study not found. + """ + + global salome_study_initial + global myStudyManager, myStudyId, myStudy, myStudyName + global orb, lcc, naming_service, cm + + if salome_study_initial: + salome_study_initial = 0 + + orb, lcc, naming_service, cm = salome_kernel.salome_kernel_init() + + # get Study Manager reference + print "looking for studyManager ..." + obj = naming_service.Resolve('myStudyManager') + myStudyManager = obj._narrow(SALOMEDS.StudyManager) + print "studyManager found" + + # get active study Id, ref and name + myStudyId = getActiveStudy(theStudyId) + print "myStudyId",myStudyId + myStudy = myStudyManager.GetStudyByID(myStudyId) + myStudyName = myStudy._get_Name() + + return myStudyManager, myStudyId, myStudy, myStudyName + diff --git a/src/KERNEL_PY/salome_test.py b/src/KERNEL_PY/salome_test.py new file mode 100755 index 000000000..a1e63a6cc --- /dev/null +++ b/src/KERNEL_PY/salome_test.py @@ -0,0 +1,486 @@ +# SALOME SALOME_SWIG : binding of C++ implementation and Python +# +# Copyright (C) 2003 CEA/DEN, EDF R&D +# +# +# +# File : salome_test.py +# Module : SALOME + +print "Test the application loading GEOM, SMESH, VISU, MED, components and doing some" +print "operation within the components." + +import salome +from salome import sg +import SALOMEDS +import os + +import SALOME_ModuleCatalog + +print "======================================================================" +print " Get Catalog " +print "======================================================================" +obj = salome.naming_service.Resolve('Kernel/ModulCatalog') +catalog = obj._narrow(SALOME_ModuleCatalog.ModuleCatalog) + +print "======================================================================" +print " Create Study " +print "======================================================================" + +comp = catalog.GetComponent("GEOM") +if comp is None: + raise RuntimeError,"Component GEOM not found in Module Catalog." + +import geompy + +print "=================================" +print " create AttributeReal " +print "=================================" +A = geompy.myBuilder.FindOrCreateAttribute(geompy.father, "AttributeReal") +if A == None : + raise RuntimeError, "Can't create AttributeReal attribute" +A = A._narrow(SALOMEDS.AttributeReal) +A.SetValue(0.0001) +if A.Value() != 0.0001: + raise RuntimeError, "Error : wrong value of AttributeReal" + +print +print " =========== Test Geometry ==========================" +print + +print "===================================" +print " define a box" +print "===================================" + +box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) +idbox = geompy.addToStudy(box,"box") + +print +print "============= Test SMESH =============================" +print + +import StdMeshers + +comp = catalog.GetComponent("SMESH") +if comp is None: + raise RuntimeError,"Component SMESH not found in Module Catalog." + +comp = catalog.GetComponent("MED") +if comp is None: + raise RuntimeError,"Component MED not found in Module Catalog." + +import SMESH + +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +myBuilder = salome.myStudy.NewBuilder() + +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") +smeshgui = salome.ImportComponentGUI("SMESH") +smeshgui.Init(salome.myStudyId); + +ShapeTypeCompSolid = 1 +ShapeTypeSolid = 2 +ShapeTypeShell = 3 +ShapeTypeFace = 4 +ShapeTypeWire = 5 +ShapeTypeEdge = 6 +ShapeTypeVertex = 7 + +# ---- define a box + +box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) +idbox = geompy.addToStudy(box,"box") + +# ---- add first face of box in study + +subShapeList=geompy.SubShapeAll(box,ShapeTypeFace) +face=subShapeList[0] +name = geompy.SubShapeName(face, box) +print name +idface=geompy.addToStudyInFather(box,face,name) + +# ---- add shell from box in study + +subShellList=geompy.SubShapeAll(box,ShapeTypeShell) +shell = subShellList[0] +name = geompy.SubShapeName(shell, box) +print name +idshell=geompy.addToStudyInFather(box,shell,name) + +# ---- add first edge of face in study + +edgeList = geompy.SubShapeAll(face,ShapeTypeEdge) +edge=edgeList[0]; +name = geompy.SubShapeName(edge, face) +print name +idedge=geompy.addToStudyInFather(face,edge,name) + + +# ---- SMESH + +# ---- create Hypothesis + +print "-------------------------- create Hypothesis" +print "-------------------------- LocalLength" +hypLen1 = smesh.CreateHypothesis( "LocalLength", "libStdMeshersEngine.so" ) +hypLen1.SetLength(100) +print hypLen1.GetName() +print hypLen1.GetId() +print hypLen1.GetLength() + +smeshgui.SetName(salome.ObjectToID(hypLen1), "Local_Length_100") + +print "-------------------------- NumberOfSegments" +hypNbSeg1= smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) +hypNbSeg1.SetNumberOfSegments(7) +print hypNbSeg1.GetName() +print hypNbSeg1.GetId() +print hypNbSeg1.GetNumberOfSegments() + +smeshgui.SetName(salome.ObjectToID(hypNbSeg1), "NumberOfSegments_7") + +print "-------------------------- MaxElementArea" +hypArea1 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) +hypArea1.SetMaxElementArea(2500) +print hypArea1.GetName() +print hypArea1.GetId() +print hypArea1.GetMaxElementArea() + +smeshgui.SetName(salome.ObjectToID(hypArea1), "MaxElementArea_2500") + +print "-------------------------- MaxElementArea" +hypArea2 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) +hypArea2.SetMaxElementArea(500) +print hypArea2.GetName() +print hypArea2.GetId() +print hypArea2.GetMaxElementArea() + +smeshgui.SetName(salome.ObjectToID(hypArea2), "MaxElementArea_500") + +print "-------------------------- Regular_1D" +algoReg = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) +listHyp=algoReg.GetCompatibleHypothesis() +for hyp in listHyp: + print hyp +print algoReg.GetName() +print algoReg.GetId() + +smeshgui.SetName(salome.ObjectToID(algoReg), "Regular_1D" ) + +print "-------------------------- MEFISTO_2D" +algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" ) +listHyp=algoMef.GetCompatibleHypothesis() +for hyp in listHyp: + print hyp +print algoMef.GetName() +print algoMef.GetId() + +smeshgui.SetName(salome.ObjectToID(algoMef), "MEFISTO_2D" ) + +# ---- add hypothesis to box + +print "-------------------------- add hypothesis to box" +box=salome.IDToObject(idbox) +mesh = smesh.CreateMesh(box) + +smeshgui.SetName( salome.ObjectToID(mesh), "MeshBox" ); + +ret=mesh.AddHypothesis(box,algoReg) +print ret +ret=mesh.AddHypothesis(box,algoMef) +print ret + + +ret=mesh.AddHypothesis(box,hypNbSeg1) +print ret +ret=mesh.AddHypothesis(box,hypArea1) +print ret + + +# ---- add hypothesis to edge + +print "-------------------------- add hypothesis to edge" +edge=salome.IDToObject(idedge) +submesh=mesh.GetSubMesh(edge, "SubMeshEdge") + +ret=mesh.AddHypothesis(edge,algoReg) +print ret +ret=mesh.AddHypothesis(edge,hypLen1) +print ret + +print "-------------------------- add hypothesis to face" +face=salome.IDToObject(idface) +submesh = mesh.GetSubMesh(face, "SubMeshFace") + +ret=mesh.AddHypothesis(face,hypArea2) +print ret + +smesh.Compute(mesh, box) +sg.updateObjBrowser(1); + +print +print "============= Test Supervisor =============================" +print + +comp = catalog.GetComponent("SUPERV") +if comp is None: + raise RuntimeError,"Component SUPERV not found in Module Catalog." + +from SuperV import * +import SALOMEDS +myStudy = salome.myStudy +myBuilder = myStudy.NewBuilder() + +SuperVision = lcc.FindOrLoadComponent("SuperVisionContainer","SUPERV") +father = myStudy.FindComponent("SUPERV") +if father is None: + father = myBuilder.NewComponent("SUPERV") + A1 = myBuilder.FindOrCreateAttribute(father, "AttributeName"); + FName = A1._narrow(SALOMEDS.AttributeName) + FName.SetValue( salome.sg.getComponentUserName("SUPERV") ) + A2 = myBuilder.FindOrCreateAttribute(father, "AttributePixMap"); + aPixmap = A2._narrow(SALOMEDS.AttributePixMap); + aPixmap.SetPixMap( "ICON_OBJBROWSER_Supervision" ); + myBuilder.DefineComponentInstance(father,SuperVision) + +def addStudy(ior): + dataflow = SuperVision.getStreamGraph(ior) + name=dataflow.Name() + itr = myStudy.NewChildIterator(father) + while itr.More(): + item=itr.Value() + res,A=item.FindAttribute("AttributeName") + if res: + aName = A._narrow(SALOMEDS.AttributeName) + if aName.Value() == name : + print myBuilder.FindOrCreateAttribute(item, "AttributeIOR") + A = myBuilder.FindOrCreateAttribute(item, "AttributeIOR") + print "A = ", A + if A is not None : + #res,A = myBuilder.FindOrCreateAttribute(item, "AttributeIOR") + anIOR = A._narrow(SALOMEDS.AttributeIOR); + print "anIOR.SetValue(dataflow.getIOR())" + anIOR.SetValue(dataflow.getIOR()) + return + itr.Next() + obj = myBuilder.NewObject(father) + A=myBuilder.FindOrCreateAttribute(obj, "AttributeName") + aName=A._narrow(SALOMEDS.AttributeName) + aName.SetValue(name) + A=myBuilder.FindOrCreateAttribute(obj, "AttributeIOR") + anIOR = A._narrow(SALOMEDS.AttributeIOR) + anIOR.SetValue(dataflow.getIOR()) + +import os +dir= os.getenv("SUPERV_ROOT_DIR") +if dir == None: + raise RuntimeError, "SUPERV_ROOT_DIR is not defined" +xmlfile = dir +"/examples/GraphGeomEssai.xml" +print "Load dataflow from the file : " +print xmlfile +print + +myGraph = StreamGraph ( xmlfile ) + +# This DataFlow is "valid" : no loop, correct links between Nodes etc... +print "myGraph.IsValid() = ", myGraph.IsValid() + +# Get Nodes +myGraph.PrintNodes() + +# This DataFlow is "executable" : all pending Ports are defined with Datas +print myGraph.IsExecutable() + +# Starts only execution of that DataFlow and gets control immediatly +print myGraph.Run() + +# That DataFlow is running ==> 0 (false) +print myGraph.IsDone() + +# Events of execution : +aStatus,aNode,anEvent,aState = myGraph.Event() +while aStatus : + print aNode.Thread(),aNode.SubGraph(),aNode.Name(),anEvent,aState + aStatus,aNode,anEvent,aState = myGraph.Event() +print "myGraph.IsDone() = ",myGraph.IsDone() + +# Wait for Completion (but it is already done after event loop ...) +print "Done : ",myGraph.DoneW() + +print " " +#print "Type : print myGraph.IsDone()" +#print " If execution is finished ==> 1 (true)" +res=myGraph.IsDone() +if res != 1: + raise RuntimeError, "myGraph.Run() is not done" + +print " " +print "Type : myGraph.PrintPorts()" +print " to see input and output values of the graph" +myGraph.PrintPorts() + +# Export will create newsupervisionexample.xml and the corresponding .py file +tmpdir=os.getenv("TmpDir") +if tmpdir is None: + tmpdir="/tmp" +file = tmpdir + "/newsupervisionexample" +print "--------------\n"+file+"\n--------------\n" +myGraph.Export(file) + +ior = salome.orb.object_to_string(myGraph.G) +addStudy(ior) + +GraphName = myGraph.Name() +print "Befor save ", +#nodes = myGraph.Nodes() +nodes = myGraph.G.Nodes().FNodes +length_bs = len(nodes) +print "ListOfNodes length = ", length_bs +names=[] +for node in nodes: + names.append(node.Name()) +print names + +# Graph creation +GraphInLines = StreamGraph( 'GraphInLines' ) +GraphInLines.SetName( 'GraphInLines' ) +GraphInLines.SetAuthor( '' ) +GraphInLines.SetComment( '' ) +GraphInLines.Coords( 0 , 0 ) + +# Creation of InLine Nodes +PyAdd = [] +PyAdd.append( 'def Add(a,b) : ' ) +PyAdd.append( ' return a+b ' ) +PyAdd.append( '' ) +Add = GraphInLines.INode( 'Add' , PyAdd ) +Add.InPort( 'a' , 'long' ) +Add.InPort( 'b' , 'long' ) +Add.OutPort( 'f' , 'long' ) +Add.SetName( 'Add' ) +Add.SetAuthor( '' ) +Add.SetComment( 'Python function' ) +Add.Coords( 351 , 77 ) +PySub = [] +PySub.append( 'def Sub(a,b) : ' ) +PySub.append( ' return a-b ' ) +PySub.append( '' ) +Sub = GraphInLines.INode( 'Sub' , PySub ) +Sub.InPort( 'a' , 'long' ) +Sub.InPort( 'b' , 'long' ) +Sub.OutPort( 'f' , 'long' ) +Sub.SetName( 'Sub' ) +Sub.SetAuthor( '' ) +Sub.SetComment( 'Python function' ) +Sub.Coords( 86 , 333 ) +PyMul = [] +PyMul.append( 'def Mul(a,b) : ' ) +PyMul.append( ' return a*b ' ) +Mul = GraphInLines.INode( 'Mul' , PyMul ) +Mul.InPort( 'a' , 'long' ) +Mul.InPort( 'b' , 'long' ) +Mul.OutPort( 'Result' , 'long' ) +Mul.SetName( 'Mul' ) +Mul.SetAuthor( '' ) +Mul.SetComment( 'Python function' ) +Mul.Coords( 616 , 247 ) + +# Creation of intermediate Output variables and of Control Links +Addf = Add.Port( 'f' ) +Mula = GraphInLines.Link( Addf , Mul.Port( 'a' ) ) +Mula.AddCoord( 1 , 570 , 356 ) +Mula.AddCoord( 2 , 570 , 186 ) +Subf = Sub.Port( 'f' ) +Mulb = GraphInLines.Link( Subf , Mul.Port( 'b' ) ) +Mulb.AddCoord( 1 , 282 , 376 ) +Mulb.AddCoord( 2 , 282 , 442 ) +Addb = GraphInLines.Link( Subf , Add.Port( 'b' ) ) +Addb.AddCoord( 1 , 283 , 209 ) +Addb.AddCoord( 2 , 283 , 374 ) +Addb.AddCoord( 3 , 283 , 442 ) + +# Creation of Input datas +Adda = Add.Input( 'a' , 1) +Suba = Sub.Input( 'a' , 3) +Subb = Sub.Input( 'b' , 4) + +# Creation of Output variables +MulResult = Mul.Port( 'Result' ) + +GraphInLines.Run() + +GraphInLines.DoneW() + +GraphInLines.PrintPorts() + +sg.updateObjBrowser(1); + +print +print "============= Test VISU and MED =============================" +print + +comp = catalog.GetComponent("VISU") +if comp is None: + raise RuntimeError,"Component VISU not found in Module Catalog." + +import sys +import SALOMEDS +import SALOME +import SALOME_MED +import VISU + +import visu_gui + +medFileName = "pointe.med" +medFile = os.getenv('KERNEL_ROOT_DIR') + '/examples/' + medFileName +print "Load ", medFile + +studyCurrent = salome.myStudyName + +med_comp = salome.lcc.FindOrLoadComponent("FactoryServer", "MED") +myVisu = salome.lcc.FindOrLoadComponent("FactoryServer", "VISU") + +try: + if os.access(medFile, os.R_OK) : + if not os.access(medFile, os.W_OK) : + import random + medFileNew = "/tmp/" + str(random.randint(0,1000000)) + "_" + medFileName + print " -- Copy " + medFile + " to " + medFileNew + os.system("cp "+ medFile + " " + medFileNew) + medFile = medFileNew + os.system("chmod 755 " + medFile) + + if os.access(medFile, os.W_OK) : + med_comp.readStructFileWithFieldType(medFile,studyCurrent) + med_obj = visu_gui.visu.getMedObjectFromStudy() + print "med_obj - ", med_obj + + myField1 = visu_gui.visu.getFieldObjectFromStudy(2,1) + aMeshName = "maa1" + anEntity = VISU.NODE + aTimeStampId = -1 + + myResult1 = myVisu.ImportMedField(myField1) + aMesh1 = myVisu.MeshOnEntity(myResult1, aMeshName, anEntity); + + aScalarMap1= myVisu.ScalarMapOnField(myResult1, aMeshName, anEntity, myField1.getName(), aTimeStampId) + + myResult2 = myVisu.ImportFile(medFile); + aMesh2 = myVisu.MeshOnEntity(myResult2, aMeshName, anEntity); + + aTimeStampId = 3 + aScalarMap2= myVisu.ScalarMapOnField(myResult2, aMeshName, anEntity, myField1.getName(), aTimeStampId) + + sg.updateObjBrowser(0) + else : print "We have no permission to rewrite medFile, so readStructFileWithFieldType can't open this file"; + else : print "We have no permission to read medFile, it will not be opened"; + +except: + if sys.exc_type == SALOME.SALOME_Exception : + print "There is no permission to read " + medFile + else : + print sys.exc_type + print sys.exc_value + print sys.exc_traceback + +sg.updateObjBrowser(1); diff --git a/src/LifeCycleCORBA/Launchers.cxx b/src/LifeCycleCORBA/Launchers.cxx index f3622465d..3957e8f77 100644 --- a/src/LifeCycleCORBA/Launchers.cxx +++ b/src/LifeCycleCORBA/Launchers.cxx @@ -1,4 +1,7 @@ #include +#include "utilities.h" + +using namespace std; static int Launchers_IsLoaded = 0; static PyObject * Launchers_module = 0; @@ -30,8 +33,14 @@ void releaseMainThread(PyThreadState *tstate){ } void Launchers_assertInitialized() { + MESSAGE("==========================================================="); + MESSAGE("Launchers_assertInitialized"); + MESSAGE("==========================================================="); PyThreadState *_save; if( !Py_IsInitialized() ) { + MESSAGE("==========================================================="); + MESSAGE("Py_Initialize()"); + MESSAGE("==========================================================="); Py_Initialize(); PyEval_InitThreads(); PyEval_SaveThread(); diff --git a/src/LifeCycleCORBA/Makefile.in b/src/LifeCycleCORBA/Makefile.in index 3b825582f..d5b514cf4 100644 --- a/src/LifeCycleCORBA/Makefile.in +++ b/src/LifeCycleCORBA/Makefile.in @@ -36,17 +36,17 @@ VPATH=.:@srcdir@:@top_srcdir@/idl EXPORT_HEADERS = SALOME_LifeCycleCORBA.hxx -EXPORT_PYSCRIPTS = LifeCycleCORBA.py Launchers.py +EXPORT_PYSCRIPTS = Launchers.py # Libraries targets LIB = libSalomeLifeCycleCORBA.la LIB_SRC = SALOME_LifeCycleCORBA.cxx Launchers.cxx LIB_CLIENT_IDL = SALOME_Component.idl SALOME_TestComponent.idl \ - SALOME_ModuleCatalog.idl SALOME_ContainerManager.idl + SALOME_ModuleCatalog.idl SALOME_ContainerManager.idl SALOME_Exception.idl # Executables targets -BIN = TestLifeCycleCORBA +BIN = Test_LifeCycleCORBA BIN_SRC = BIN_CLIENT_IDL = SALOME_Component.idl SALOME_TestComponent.idl \ SALOME_ModuleCatalog.idl SALOME_ContainerManager.idl @@ -54,7 +54,7 @@ BIN_CLIENT_IDL = SALOME_Component.idl SALOME_TestComponent.idl \ CPPFLAGS += $(PYTHON_INCLUDES) $(QT_MT_INCLUDES) LDFLAGS += -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSalomeContainer -lSalomeResourcesManager -LDFLAGSFORBIN= $(LDFLAGS) -lRegistry -lSalomeNotification -lSALOMETraceCollector +LDFLAGSFORBIN= $(LDFLAGS) -lRegistry -lSalomeNotification -lSALOMEBasics LIBS += $(PYTHON_LIBS) @CONCLUDE@ diff --git a/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx b/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx index af5848155..31dec1835 100644 --- a/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx +++ b/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx @@ -38,59 +38,232 @@ #include #include "SALOME_LifeCycleCORBA.hxx" +#include "SALOMETraceCollector.hxx" +#ifndef WNT #include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) +#else +#include "SALOME_ModuleCatalog.hh" +#endif #include "SALOME_ContainerManager.hxx" #include "SALOME_Component_i.hxx" #include "SALOME_NamingService.hxx" using namespace std; +IncompatibleComponent::IncompatibleComponent( void ): + SALOME_Exception( "IncompatibleComponent" ) +{ +} + +IncompatibleComponent::IncompatibleComponent(const IncompatibleComponent &ex): + SALOME_Exception( ex ) +{ +} + +//============================================================================= +/*! + * Constructor + */ +//============================================================================= + SALOME_LifeCycleCORBA::SALOME_LifeCycleCORBA(SALOME_NamingService *ns) { - _NS = ns; + // be sure to have an instance of traceCollector, when used via SWIG + // in a Python module + int argc = 0; + char *xargv = ""; + char **argv = &xargv; + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + if (!ns) + { + _NS = new SALOME_NamingService(orb); + } + else _NS = ns; //add try catch - _NS->Change_Directory("/"); // mpv 250105: current directory may be not root (in SALOMEDS for an example) - CORBA::Object_var obj=_NS->Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS); + _NS->Change_Directory("/"); // mpv 250105: current directory may be not root + // (in SALOMEDS for an example) + // not enough: set a current directory in naming service is not thread safe + // if naming service instance is shared among several threads... + // ==> allways use absolute path and dot rely on current directory! + + CORBA::Object_var obj = + _NS->Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS); ASSERT( !CORBA::is_nil(obj)); _ContManager=Engines::ContainerManager::_narrow(obj); } +//============================================================================= +/*! + * Destructor + */ +//============================================================================= + SALOME_LifeCycleCORBA::~SALOME_LifeCycleCORBA() { } -string SALOME_LifeCycleCORBA::ContainerName( - const char * aComputerContainer , - string * theComputer , - string * theContainer ) { - char * ContainerName = new char [ strlen( aComputerContainer ) + 1 ] ; - strcpy( ContainerName , aComputerContainer ) ; - string theComputerContainer("/Containers/"); - char * slash = strchr( ContainerName , '/' ) ; - if ( !slash ) { - *theComputer = GetHostname() ; - theComputerContainer += *theComputer ; - theComputerContainer += "/" ; - *theContainer = ContainerName ; - theComputerContainer += *theContainer ; - } - else { - slash[ 0 ] = '\0' ; - slash += 1 ; - *theContainer = slash ; - if ( !strcmp( ContainerName , "localhost" ) ) { - *theComputer = GetHostname() ; +//============================================================================= +/*! Public - + * Find and aready existing and registered component instance. + * \param params machine parameters like type or name... + * \param componentName the name of component class + * \param studyId default = 0 : multistudy instance + * \return a CORBA reference of the component instance, or _nil if not found + */ +//============================================================================= + +Engines::Component_ptr +SALOME_LifeCycleCORBA::FindComponent(const Engines::MachineParameters& params, + const char *componentName, + int studyId) +{ + if (! isKnownComponentClass(componentName)) + return Engines::Component::_nil(); + + Engines::MachineList_var listOfMachines = + _ContManager->GetFittingResources(params, componentName); + + Engines::Component_var compo = _FindComponent(params, + componentName, + studyId, + listOfMachines); + + return compo._retn(); +} + +//============================================================================= +/*! Public - + * Load a component instance on a container defined by machine parameters + * \param params machine parameters like type or name... + * \param componentName the name of component class + * \param studyId default = 0 : multistudy instance + * \return a CORBA reference of the component instance, or _nil if problem + */ +//============================================================================= + +Engines::Component_ptr +SALOME_LifeCycleCORBA::LoadComponent(const Engines::MachineParameters& params, + const char *componentName, + int studyId) +{ + // --- Check if Component Name is known in ModuleCatalog + + if (! isKnownComponentClass(componentName)) + return Engines::Component::_nil(); + + Engines::MachineList_var listOfMachines = + _ContManager->GetFittingResources(params, componentName); + + Engines::Component_var compo = _LoadComponent(params, + componentName, + studyId, + listOfMachines); + + return compo._retn(); +} + +//============================================================================= +/*! Public - + * Find and aready existing and registered component instance or load a new + * component instance on a container defined by machine parameters. + * \param params machine parameters like type or name... + * \param componentName the name of component class + * \param studyId default = 0 : multistudy instance + * \return a CORBA reference of the component instance, or _nil if problem + */ +//============================================================================= + +Engines::Component_ptr +SALOME_LifeCycleCORBA:: +FindOrLoad_Component(const Engines::MachineParameters& params, + const char *componentName, + int studyId) +{ + // --- Check if Component Name is known in ModuleCatalog + + if (! isKnownComponentClass(componentName)) + return Engines::Component::_nil(); + + Engines::MachineList_var listOfMachines = + _ContManager->GetFittingResources(params,componentName); + + Engines::Component_var compo = _FindComponent(params, + componentName, + studyId, + listOfMachines); + + if(CORBA::is_nil(compo)) + compo = _LoadComponent(params, + componentName, + studyId, + listOfMachines); + + return compo._retn(); +} + +//============================================================================= +/*! Public - + * Find and aready existing and registered component instance or load a new + * component instance on a container defined by name + * \param containerName the name of container, under one of the forms + * - 1 aContainer (local container) + * - 2 machine/aContainer (container on hostname = machine) + * \param componentName the name of component class + * \return a CORBA reference of the component instance, or _nil if problem + */ +//============================================================================= + +Engines::Component_ptr +SALOME_LifeCycleCORBA::FindOrLoad_Component(const char *containerName, + const char *componentName) +{ + // --- Check if Component Name is known in ModuleCatalog + + if (! isKnownComponentClass(componentName)) + return Engines::Component::_nil(); + + // --- Check if containerName contains machine name (if yes: rg>0) + + char *stContainer=strdup(containerName); + string st2Container(stContainer); + int rg=st2Container.find("/"); + + Engines::MachineParameters_var params=new Engines::MachineParameters; + preSet(params); + if (rg<0) + { + // containerName doesn't contain "/" => Local container + params->container_name=CORBA::string_dup(stContainer); + params->hostname=CORBA::string_dup(GetHostname().c_str()); } - else { - *theComputer = ContainerName ; + else + { + stContainer[rg]='\0'; + params->container_name=CORBA::string_dup(stContainer+rg+1); + params->hostname=CORBA::string_dup(stContainer); } - theComputerContainer += *theComputer ; - theComputerContainer += "/" ; - theComputerContainer += *theContainer ; - } - delete [] ContainerName; - return theComputerContainer ; + params->isMPI = false; + SCRUTE(params->container_name); + SCRUTE(params->hostname); + SCRUTE(params->OS); + SCRUTE(params->mem_mb); + SCRUTE(params->cpu_clock); + SCRUTE(params->nb_proc_per_node); + SCRUTE(params->nb_node); + SCRUTE(params->isMPI); + free(stContainer); + return FindOrLoad_Component(params,componentName); + } +//============================================================================= +/*! Public - + * Check if the component class is known in module catalog + * \param componentName the name of component class + * \return true if found, false otherwise + */ +//============================================================================= + bool SALOME_LifeCycleCORBA::isKnownComponentClass(const char *componentName) { @@ -99,6 +272,7 @@ bool SALOME_LifeCycleCORBA::isKnownComponentClass(const char *componentName) CORBA::Object_var obj = _NS->Resolve("/Kernel/ModulCatalog"); SALOME_ModuleCatalog::ModuleCatalog_var Catalog = SALOME_ModuleCatalog::ModuleCatalog::_narrow(obj) ; + ASSERT(! CORBA::is_nil(Catalog)); SALOME_ModuleCatalog::Acomponent_ptr compoInfo = Catalog->GetComponent(componentName); if (CORBA::is_nil (compoInfo)) @@ -119,206 +293,180 @@ bool SALOME_LifeCycleCORBA::isKnownComponentClass(const char *componentName) return false; } -string SALOME_LifeCycleCORBA::ComputerPath( - const char * theComputer ) { - CORBA::String_var path; - CORBA::Object_var obj = _NS->Resolve("/Kernel/ModulCatalog"); - SALOME_ModuleCatalog::ModuleCatalog_var Catalog = - SALOME_ModuleCatalog::ModuleCatalog::_narrow(obj) ; - try { - path = Catalog->GetPathPrefix( theComputer ); - } - catch (SALOME_ModuleCatalog::NotFound&) { - INFOS("GetPathPrefix(" << theComputer << ") not found!"); - path = "" ; - } - SCRUTE( path ) ; - return CORBA::string_dup( path ) ; -} +//============================================================================= +/*! Public - + * Not so complex... useful ? + */ +//============================================================================= -Engines::Container_ptr SALOME_LifeCycleCORBA::FindContainer(const char *containerName) +bool +SALOME_LifeCycleCORBA::isMpiContainer(const Engines::MachineParameters& params) + throw(IncompatibleComponent) { - ASSERT(_NS != NULL); - string cont ; - if ( strncmp( containerName , "/Containers/" , 12 ) ) { // Compatibility ... - string theComputer ; - string theContainer ; - cont = ContainerName( containerName , &theComputer , &theContainer ) ; - } - else { - cont = containerName ; - } - try { - - SCRUTE( cont ); - - CORBA::Object_var obj = _NS->Resolve( cont.c_str() ); - if( !CORBA::is_nil( obj ) ) { - return Engines::Container::_narrow( obj ) ; - } - } - catch (ServiceUnreachable&) { - INFOS("Caught exception: Naming Service Unreachable"); - } - catch (...) { - INFOS("Caught unknown exception."); - } - return Engines::Container::_nil(); + if( params.isMPI ) + return true; + else + return false; } -Engines::Component_ptr SALOME_LifeCycleCORBA::FindOrLoad_Component - (const char *containerName, - const char *componentName) + +//============================================================================= +/*! Public - + * Pre initialisation of a given Engines::MachineParameters with default + * values. + * - container_name = "" : not relevant + * - hostname = "" : not relevant + * - OS = "" : not relevant + * - mem_mb = 0 : not relevant + * - cpu_clock = 0 : not relevant + * - nb_proc_per_node = 0 : not relevant + * - nb_node = 0 : not relevant + * - isMPI = false : standard components + */ +//============================================================================= + +void SALOME_LifeCycleCORBA::preSet( Engines::MachineParameters& params) { - if (! isKnownComponentClass(componentName)) return Engines::Component::_nil(); - char *stContainer=strdup(containerName); - string st2Container(stContainer); - int rg=st2Container.find("/"); - if(rg>=0) - { - stContainer[rg]='\0'; - if(strcmp(stContainer,"localhost")==0) - { - Engines::Component_ptr ret=FindOrLoad_Component(stContainer+rg+1,componentName); - free(stContainer); - return ret; - } - } - if(rg<0) { - //containerName doesn't contain "/" => Local container - free(stContainer); - Engines::MachineList_var listOfMachine=new Engines::MachineList; - listOfMachine->length(1); - listOfMachine[0]=CORBA::string_dup(GetHostname().c_str()); - Engines::Component_ptr ret=FindComponent(containerName,componentName,listOfMachine.in()); - if(CORBA::is_nil(ret)) - return LoadComponent(containerName,componentName,listOfMachine); - else - return ret; - } - else { - //containerName contains "/" => Remote container - stContainer[rg]='\0'; - Engines::MachineParameters_var params=new Engines::MachineParameters; - params->container_name=CORBA::string_dup(stContainer+rg+1); - params->hostname=CORBA::string_dup(stContainer); - params->OS=CORBA::string_dup("LINUX"); - free(stContainer); - return FindOrLoad_Component(params,componentName); - } + params.container_name = ""; + params.hostname = ""; + params.OS = ""; + params.mem_mb = 0; + params.cpu_clock = 0; + params.nb_proc_per_node = 0; + params.nb_node = 0; + params.isMPI = false; } -Engines::Component_ptr SALOME_LifeCycleCORBA::FindOrLoad_Component(const Engines::MachineParameters& params, - const char *componentName) +//============================================================================= +/*! Public - + * \return a number of processors not 0, only for MPI containers + */ +//============================================================================= + +int SALOME_LifeCycleCORBA::NbProc(const Engines::MachineParameters& params) { - if (! isKnownComponentClass(componentName)) return Engines::Component::_nil(); - Engines::MachineList_var listOfMachine=_ContManager->GetFittingResources(params,componentName); - Engines::Component_ptr ret=FindComponent(params.container_name,componentName,listOfMachine); - if(CORBA::is_nil(ret)) - return LoadComponent(params.container_name,componentName,listOfMachine); + if( !isMpiContainer(params) ) + return 0; + else if( (params.nb_node <= 0) && (params.nb_proc_per_node <= 0) ) + return 1; + else if( params.nb_node == 0 ) + return params.nb_proc_per_node; + else if( params.nb_proc_per_node == 0 ) + return params.nb_node; else - return ret; + return params.nb_node * params.nb_proc_per_node; } -Engines::Component_ptr SALOME_LifeCycleCORBA::FindComponent(const char *containerName, - const char *componentName, - const Engines::MachineList& listOfMachines) +//============================================================================= +/*! Protected - + * Find and aready existing and registered component instance. + * \param params machine parameters like type or name... + * \param componentName the name of component class + * \param studyId default = 0 : multistudy instance + * \param listOfMachines list of machine address + * \return a CORBA reference of the component instance, or _nil if not found + * - build a list of machines on which an instance of the component is running, + * - find the best machine among the list + */ +//============================================================================= + +Engines::Component_ptr +SALOME_LifeCycleCORBA:: +_FindComponent(const Engines::MachineParameters& params, + const char *componentName, + int studyId, + const Engines::MachineList& listOfMachines) { - if (! isKnownComponentClass(componentName)) return Engines::Component::_nil(); - if(containerName[0]!='\0') + // --- build the list of machines on which the component is already running + + const char *containerName = params.container_name; + int nbproc = NbProc(params); + MESSAGE("_FindComponent, required " << containerName << + " " << componentName << " " << nbproc); + + Engines::MachineList_var machinesOK = new Engines::MachineList; + + unsigned int lghtOfmachinesOK = 0; + machinesOK->length(listOfMachines.length()); + + for(unsigned int i=0; ilength(listOfMachines.length()); - for(unsigned int i=0;iResolve(componentNameForNS.c_str()); - if(!CORBA::is_nil(obj)) - { - machinesOK[lghtOfmachinesOK++]=CORBA::string_dup(currentMachine); - } - } - if(lghtOfmachinesOK!=0) - { - machinesOK->length(lghtOfmachinesOK); - CORBA::String_var bestMachine=_ContManager->FindBest(machinesOK); - string componentNameForNS=Engines_Component_i::BuildComponentNameForNS(componentName,containerName,bestMachine); - CORBA::Object_var obj=_NS->Resolve(componentNameForNS.c_str()); - return Engines::Component::_narrow(obj); - } - else - return Engines::Component::_nil(); + const char *currentMachine=listOfMachines[i]; + MESSAGE("_FindComponent, look at " << currentMachine); + CORBA::Object_var obj = _NS->ResolveComponent(currentMachine, + containerName, + componentName, + nbproc); + if (!CORBA::is_nil(obj)) + machinesOK[lghtOfmachinesOK++] = CORBA::string_dup(currentMachine); } - else + + // --- find the best machine among the list + + if(lghtOfmachinesOK != 0) { - //user specified no container name so trying to find a component in the best machine among listOfMachines - CORBA::String_var bestMachine=_ContManager->FindBest(listOfMachines); - //Normally look at all containers launched on bestMachine to see if componentName is already launched on one of them. To do.. - string componentNameForNS=Engines_Component_i::BuildComponentNameForNS(componentName,containerName,bestMachine); - CORBA::Object_var obj = _NS->Resolve(componentNameForNS.c_str()); + machinesOK->length(lghtOfmachinesOK); + CORBA::String_var bestMachine = _ContManager->FindBest(machinesOK); + CORBA::Object_var obj = _NS->ResolveComponent(bestMachine, + containerName, + componentName, + nbproc); return Engines::Component::_narrow(obj); } + else + return Engines::Component::_nil(); } -Engines::Component_ptr SALOME_LifeCycleCORBA::LoadComponent(const char *containerName, const char *componentName, const Engines::MachineList& listOfMachines) +//============================================================================= +/*! Protected - + * Load a component instance. + * \param params machine parameters like type or name... + * \param componentName the name of component class + * \param studyId default = 0 : multistudy instance + * \param listOfMachines list of machine address + * \return a CORBA reference of the component instance, or _nil if problem + * - Finds a container in the list of machine or start one. + * - Try to load the component library in the container, + * - then create an instance of the component. + */ +//============================================================================= + +Engines::Component_ptr +SALOME_LifeCycleCORBA:: +_LoadComponent(const Engines::MachineParameters& params, + const char *componentName, + int studyId, + const Engines::MachineList& listOfMachines) { - Engines::Container_var cont=_ContManager->FindOrStartContainer(containerName,listOfMachines); - string implementation=Engines_Component_i::GetDynLibraryName(componentName); - return cont->load_impl(componentName, implementation.c_str()); -} + const char *containerName = params.container_name; + int nbproc = NbProc(params); + + MESSAGE("_LoadComponent, required " << containerName << + " " << componentName << " " << nbproc); + + Engines::Container_var cont = + _ContManager->FindOrStartContainer(params, + listOfMachines); + if (CORBA::is_nil(cont)) return Engines::Component::_nil(); + bool isLoadable = cont->load_component_Library(componentName); + if (!isLoadable) return Engines::Component::_nil(); -Engines::Container_ptr SALOME_LifeCycleCORBA::FindOrStartContainer( - const string aComputerContainer , - const string theComputer , - const string theContainer ) { - SCRUTE( aComputerContainer ) ; - SCRUTE( theComputer ) ; - SCRUTE( theContainer ) ; - - Engines::Container_var aContainer = FindContainer( aComputerContainer.c_str() ) ; - - if ( !CORBA::is_nil( aContainer ) ) { - return aContainer ; - } - - Engines::Container_var aFactoryServer ; - - bool pyCont = false ; - int len = theContainer.length() ; - if ( !strcmp( &theContainer.c_str()[len-2] , "Py" ) ) { - pyCont = true ; - } - - string addr=_NS->getIORaddr(); - string CMD="SALOME_Container"; - if ( pyCont ) { - CMD="SALOME_ContainerPy.py"; - } - CMD=CMD + " " + theContainer; - CMD=CMD + " -ORBInitRef NameService="+addr; - - /* - * Get the appropriate launcher and ask to launch - */ - PyObject * launcher=getLauncher((char *)theComputer.c_str()); - Launcher_Slaunch(launcher,(char *)theComputer.c_str(),(char *)CMD.c_str()); - /* - * Wait until the container is registered in Naming Service - */ - int count = 5 ; - while ( CORBA::is_nil( aFactoryServer ) && count ) { - sleep( 1 ) ; - count-- ; - if ( count != 10 ) - MESSAGE( count << ". Waiting for FactoryServer on " << theComputer) - aFactoryServer = FindContainer( aComputerContainer.c_str() ) ; - } - if ( !CORBA::is_nil( aFactoryServer ) ) { - return aFactoryServer; - } - MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed") ; - return Engines::Container::_nil(); + Engines::Component_var myInstance = + cont->create_component_instance(componentName, studyId); + return myInstance._retn(); } + + + + + + + + + + + + + + diff --git a/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.hxx b/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.hxx index ca91a238f..dea15255f 100644 --- a/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.hxx +++ b/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.hxx @@ -30,46 +30,96 @@ #define _SALOME_LIFECYCLECORBA_HXX_ #include +#ifndef WNT #include +#endif #include #include +#include #include CORBA_CLIENT_HEADER(SALOME_ContainerManager) #include CORBA_CLIENT_HEADER(SALOME_Component) +#if defined LIFECYCLECORBA_EXPORTS +#if defined WIN32 +#define LIFECYCLECORBA_EXPORT __declspec( dllexport ) +#else +#define LIFECYCLECORBA_EXPORT +#endif +#else +#if defined WNT +#define LIFECYCLECORBA_EXPORT __declspec( dllimport ) +#else +#define LIFECYCLECORBA_EXPORT +#endif +#endif + + class SALOME_NamingService; -class SALOME_LifeCycleCORBA +class LIFECYCLECORBA_EXPORT IncompatibleComponent : public SALOME_Exception +{ +public : + IncompatibleComponent(void); + IncompatibleComponent(const IncompatibleComponent &ex); +}; + +class LIFECYCLECORBA_EXPORT SALOME_LifeCycleCORBA { public: - SALOME_LifeCycleCORBA(SALOME_NamingService *ns); + SALOME_LifeCycleCORBA(SALOME_NamingService *ns = 0); virtual ~SALOME_LifeCycleCORBA(); - Engines::Container_ptr FindContainer(const char *containerName); // for supervision - Engines::Component_ptr FindOrLoad_Component(const Engines::MachineParameters& params, - const char *componentName); - Engines::Component_ptr FindOrLoad_Component(const char *containerName, - const char *componentName); + + Engines::Component_ptr + FindComponent(const Engines::MachineParameters& params, + const char *componentName, + int studyId=0); + + Engines::Component_ptr + LoadComponent(const Engines::MachineParameters& params, + const char *componentName, + int studyId=0); + + Engines::Component_ptr + FindOrLoad_Component(const Engines::MachineParameters& params, + const char *componentName, + int studyId =0); + + Engines::Component_ptr + FindOrLoad_Component(const char *containerName, + const char *componentName); // for compatibility + bool isKnownComponentClass(const char *componentName); + + bool isMpiContainer(const Engines::MachineParameters& params) + throw(IncompatibleComponent); + + int NbProc(const Engines::MachineParameters& params); + + void preSet(Engines::MachineParameters& params); + protected: - //! Establish if a component called "componentName" in a container called "containerName" exists among the list of resources - //! in "listOfMachines". This method uses Naming Service to find the component. - Engines::Component_ptr FindComponent(const char *containerName, - const char *componentName, - const Engines::MachineList& listOfMachines); - Engines::Component_ptr LoadComponent(const char *containerName, const char *componentName, const Engines::MachineList& listOfMachines); + /*! Establish if a component called "componentName" in a container called + * "containerName" + * exists among the list of resources in "listOfMachines". + * This method uses Naming Service to find the component. + */ + Engines::Component_ptr + _FindComponent(const Engines::MachineParameters& params, + const char *componentName, + int studyId, + const Engines::MachineList& listOfMachines); + Engines::Component_ptr + _LoadComponent(const Engines::MachineParameters& params, + const char *componentName, + int studyId, + const Engines::MachineList& listOfMachines); + SALOME_NamingService *_NS; Engines::ContainerManager_var _ContManager; - //private: - std::string ContainerName( const char * aComputerContainer , - std::string * theComputer , - std::string * theContainer ) ; - std::string ComputerPath( const char * theComputer ) ; - Engines::Container_ptr FindOrStartContainer(const std::string aComputerContainer , - const std::string theComputer , - const std::string theContainer ) ; } ; #endif diff --git a/src/LifeCycleCORBA/Test/LifeCycleCORBATest.cxx b/src/LifeCycleCORBA/Test/LifeCycleCORBATest.cxx new file mode 100644 index 000000000..94a42a8cf --- /dev/null +++ b/src/LifeCycleCORBA/Test/LifeCycleCORBATest.cxx @@ -0,0 +1,650 @@ + +#include "LifeCycleCORBATest.hxx" +#include "SALOME_LifeCycleCORBA.hxx" +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" +#include "OpUtil.hxx" + +#include +#include +#include +#include + +using namespace std; + +// --- uncomment to have some traces on standard error +// (useful only when adding new tests...) +//#define _DEVDEBUG_ + +#ifdef _DEVDEBUG_ +#define MYDEVTRACE {std::cerr << __FILE__ << " [" << __LINE__ << "] : ";} +#define DEVTRACE(msg) {MYDEVTRACE; std::cerr<deleteInstance(bp1); + + // --- trace on file + char *theFileName = TRACEFILE; + + string s = "file:"; + s += theFileName; + //s="local"; + //s="with_logger"; + CPPUNIT_ASSERT(! setenv("SALOME_trace",s.c_str(),1)); // 1: overwrite + + ofstream traceFile; + // traceFile.open(theFileName, ios::out | ios::trunc); + traceFile.open(theFileName, ios::out | ios::app); + CPPUNIT_ASSERT(traceFile); // file created empty, then closed + traceFile.close(); + + bp1 = LocalTraceBufferPool::instance(); + CPPUNIT_ASSERT(bp1); + + // --- Get or initialize the orb + + int _argc = 1; + char* _argv[] = {""}; + ORB_INIT &init = *SINGLETON_::Instance() ; + ASSERT(SINGLETON_::IsAlreadyExisting()); + _orb = init(_argc , _argv ) ; + + // --- Create a SALOME_NamingService instance + + _NS.init_orb(_orb) ; +} + +// ============================================================================ +/*! + * - delete trace classes + */ +// ============================================================================ + +void +LifeCycleCORBATest::tearDown() +{ + + LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance(); + CPPUNIT_ASSERT(bp1); + bp1->deleteInstance(bp1); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component. + * - get a local container (no hostname given), + * load an engine, check that the CORBA object is not null. + * - check narrow + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_LaunchContainer() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + // --- get a local container, + // load an engine, check that the CORBA object is not null + + string containerName = "myContainer"; + Engines::Component_var mycompo = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo); + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component. + * - Call 2 times FindOrLoad_Component with the same parameters + * - check if we get the same engine + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_SameInstance() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + // --- get a local container, + // load an engine, check that the CORBA object is not null + + string containerName = "myContainer"; + + Engines::Component_var mycompo1 = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo1)); + + Engines::Component_var mycompo2 = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo2)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo1); + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); + + Engines::TestComponent_var m2; + m2 = Engines::TestComponent::_narrow(mycompo2); + CPPUNIT_ASSERT(!CORBA::is_nil(m2)); + + // --- check equality of instance names + + string name1 = m1->instanceName(); + string name2 = m2->instanceName(); + CPPUNIT_ASSERT_EQUAL(name1, name2); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component with Python Component on C++ Container + * load an engine, check that the CORBA object is not null. + * - check narrow + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_PythonInCppContainer() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + // --- get a local container, + // load an engine, check that the CORBA object is not null + + string containerName = "myContainer"; + + Engines::Component_var mycompo1 = + _LCC.FindOrLoad_Component(containerName.c_str(),"SALOME_TestComponentPy"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo1)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo1); + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component with Python Component on C++ Container + * - Call 2 times FindOrLoad_Component with the same parameters + * - check if we get the same engine + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_PythonSameInstance() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + // --- get a local container (with a name based on local hostname), + // load an engine, check that the CORBA object is not null + + string containerName = "myContainer"; + + Engines::Component_var mycompo1 = + _LCC.FindOrLoad_Component(containerName.c_str(),"SALOME_TestComponentPy"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo1)); + + Engines::Component_var mycompo2 = + _LCC.FindOrLoad_Component(containerName.c_str(),"SALOME_TestComponentPy"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo2)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo1); + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); + + Engines::TestComponent_var m2; + m2 = Engines::TestComponent::_narrow(mycompo2); + CPPUNIT_ASSERT(!CORBA::is_nil(m2)); + + // --- check equality of instance names + + string name1 = m1->instanceName(); + string name2 = m2->instanceName(); + CPPUNIT_ASSERT_EQUAL(name1, name2); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component with a component name not in catalog. + * See list of catalog given to module catalog server. + * Here, we work with KERNEL_SRC/resources/KERNELCatalog.xml that contains + * only KERNEL, SalomeTestComponent and SALOME_TestComponentPy + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_UnknownInCatalog() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + // --- get a local container (with a name based on local hostname), + // load an engine, check that the CORBA object is not null + + string containerName = "myContainer"; + + Engines::Component_var mycompo1 = + _LCC.FindOrLoad_Component(containerName.c_str(),"MyNewComponent"); + CPPUNIT_ASSERT(CORBA::is_nil(mycompo1)); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component with hostname given + * - get a local container : getHostName()/componentName, + * load an engine, check that the CORBA object is not null. + * - check narrow + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_LaunchContainerHostname() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + // --- get a local container (with a name based on local hostname), + // load an engine, check that the CORBA object is not null + + string containerName = GetHostname(); + containerName += "/theContainer"; + DEVTRACE("containerName = " << containerName); + Engines::Component_var mycompo = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo); + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component with and without local hostname given. + * We must get the same container, the same instance of component + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_SameContainer() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + // --- get a local container (with a name based on local hostname), + // load an engine, check that the CORBA object is not null + + string containerName = "aContainer"; + + Engines::Component_var mycompo1 = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo1)); + + containerName = GetHostname(); + containerName += "/aContainer"; + DEVTRACE("containerName = " << containerName); + Engines::Component_var mycompo2 = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo2)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo1); + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); + + Engines::TestComponent_var m2; + m2 = Engines::TestComponent::_narrow(mycompo2); + CPPUNIT_ASSERT(!CORBA::is_nil(m2)); + + // --- check equality of instance names + + string name1 = m1->instanceName(); + string name2 = m2->instanceName(); + CPPUNIT_ASSERT_EQUAL(name1, name2); + + // --- check containers are the same servant (same container name+hostname) + + Engines::Container_var c1 = m1->GetContainerRef(); + CPPUNIT_ASSERT(!CORBA::is_nil(c1)); + Engines::Container_var c2 = m2->GetContainerRef(); + CPPUNIT_ASSERT(!CORBA::is_nil(c1)); + string cname1 = c1->name(); + string cname2 = c2->name(); + CPPUNIT_ASSERT_EQUAL(cname1, cname2); + string hostname1 = c1->getHostName(); + string hostname2 = c2->getHostName(); + CPPUNIT_ASSERT_EQUAL(hostname1, hostname2); + CORBA::Long pidc1 = c1->getPID(); + CORBA::Long pidc2 = c2->getPID(); + CPPUNIT_ASSERT_EQUAL(pidc1, pidc2); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component: check behaviour when ask for an unknown computer + * We must catch a Salome Exception with "unknown host" message + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_UnknownMachine() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + // --- try to get a distant container on an unknown machine (not existing) + // check that the CORBA object is null + + string containerName = "aFarAwayComputer"; + containerName += "/theContainer"; +// CPPUNIT_ASSERT_THROW(Engines::Component_var mycompo = +// _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent");,SALOME::SALOME_Exception); + try + { + Engines::Component_var mycompo = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + } + catch(const SALOME::SALOME_Exception &ex) + { + CPPUNIT_ASSERT(true); +// string expectedMessage = "BAD PARAM"; +// std::ostream os; +// os << ex; +// string actualMessage = os.str(); +// DEVTRACE("actual Exception Message = " << actualMessage); +// CPPUNIT_ASSERT(actualMessage.find(expectedMessage) != string::npos); + } +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component, empty params must give an instance + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_ParamsEmpty() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + Engines::MachineParameters params; + _LCC.preSet(params); + Engines::Component_var mycompo = + _LCC.FindOrLoad_Component(params,"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component params = local container + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_ParamsLocalContainer() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + Engines::MachineParameters params; + _LCC.preSet(params); + string hostname=GetHostname(); + params.hostname=hostname.c_str(); + Engines::Component_var mycompo = + _LCC.FindOrLoad_Component(params,"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo); + + // --- check that container is on local computer + + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); + Engines::Container_var c1 = m1->GetContainerRef(); + CPPUNIT_ASSERT(!CORBA::is_nil(c1)); + string hostname1 = c1->getHostName(); + CPPUNIT_ASSERT_EQUAL(hostname1, GetHostname()); +} + + +// ============================================================================ +/*! + * Check FindOrLoad_Component params = containerName + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_ParamsContainerName() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + Engines::MachineParameters params; + _LCC.preSet(params); + string containerName = "myContainer"; + params.container_name = containerName.c_str(); + Engines::Component_var mycompo = + _LCC.FindOrLoad_Component(params,"SalomeTestComponent"); + CPPUNIT_ASSERT(!CORBA::is_nil(mycompo)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo); + + // --- check that container has good name + + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); + Engines::Container_var c1 = m1->GetContainerRef(); + CPPUNIT_ASSERT(!CORBA::is_nil(c1)); + string hostname1 = c1->getHostName(); + CPPUNIT_ASSERT_EQUAL(hostname1, GetHostname()); + string cname1 = c1->name(); + CPPUNIT_ASSERT(cname1.find(containerName) != string::npos); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component on remote computer + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_RemoteComputer() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + string remoteHost = GetRemoteHost(); + + string containerName = remoteHost; + containerName += "/aContainer"; + DEVTRACE("containerName = " << containerName); + Engines::Component_var mycompo1 = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + CPPUNIT_ASSERT_MESSAGE("Test validity requires connection to remote "\ + "computers from ResourcesCatalog", + !CORBA::is_nil(mycompo1)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo1); + + // --- check that container is on good computer + + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); + Engines::Container_var c1 = m1->GetContainerRef(); + CPPUNIT_ASSERT(!CORBA::is_nil(c1)); + string hostname1 = c1->getHostName(); + CPPUNIT_ASSERT_EQUAL(hostname1, remoteHost); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component with params on remote computer + * params empty except hostname + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_ParamsRemoteComputer() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + string remoteHost = GetRemoteHost(); + + Engines::MachineParameters params; + _LCC.preSet(params); + params.hostname = remoteHost.c_str(); + + Engines::Component_var mycompo1 = + _LCC.FindOrLoad_Component(params,"SalomeTestComponent"); + CPPUNIT_ASSERT_MESSAGE("Test validity requires connection to remote "\ + "computers from ResourcesCatalog", + !CORBA::is_nil(mycompo1)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo1); + + // --- check that container is on good computer + + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); + Engines::Container_var c1 = m1->GetContainerRef(); + CPPUNIT_ASSERT(!CORBA::is_nil(c1)); + string hostname1 = c1->getHostName(); + CPPUNIT_ASSERT_EQUAL(hostname1, remoteHost); +} + +// ============================================================================ +/*! + * Check FindOrLoad_Component with params on remote computer + * params empty except hostname and container_name + */ +// ============================================================================ + +void +LifeCycleCORBATest::testFindOrLoad_Component_ParamsRemoteComputer2() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + string remoteHost = GetRemoteHost(); + + Engines::MachineParameters params; + _LCC.preSet(params); + params.hostname = remoteHost.c_str(); + params.container_name = "anotherContainer"; + + Engines::Component_var mycompo1 = + _LCC.FindOrLoad_Component(params,"SalomeTestComponent"); + CPPUNIT_ASSERT_MESSAGE("Test validity requires connection to remote "\ + "computers from ResourcesCatalog", + !CORBA::is_nil(mycompo1)); + + // --- check narrow + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo1); + + // --- check that container is on good computer + + CPPUNIT_ASSERT(!CORBA::is_nil(m1)); + Engines::Container_var c1 = m1->GetContainerRef(); + CPPUNIT_ASSERT(!CORBA::is_nil(c1)); + string hostname1 = c1->getHostName(); + CPPUNIT_ASSERT_EQUAL(hostname1, remoteHost); +} + + + +// ============================================================================ +/*! + * Check FindOrLoad_Component params = containerName + */ +// ============================================================================ + +// void +// LifeCycleCORBATest::testFindOrLoad_Component_() +// { +// } + + + + + + + + +// ============================================================================ +/*! + * Get a remote HostName in the Resource Catalog + */ +// ============================================================================ + +string LifeCycleCORBATest::GetRemoteHost() +{ + SALOME_LifeCycleCORBA _LCC(&_NS); + + CORBA::Object_var obj = _NS.Resolve("/ContainerManager"); + CPPUNIT_ASSERT(!CORBA::is_nil(obj)); + Engines::ContainerManager_var containerManager = + Engines::ContainerManager::_narrow(obj); + CPPUNIT_ASSERT(!CORBA::is_nil(containerManager)); + + Engines::MachineParameters params; + _LCC.preSet(params); // empty params to get all the machines + + Engines::MachineList_var hostList = + containerManager->GetFittingResources(params,"SalomeTestComponent"); + CPPUNIT_ASSERT(hostList->length() > 1); + + string localHost = GetHostname(); + string remoteHost; + for (unsigned int i=0; i < hostList->length(); i++) + { + const char* aMachine = hostList[i]; + string machine(aMachine); + if (machine != localHost) + { + remoteHost = machine; + break; + } + } + CPPUNIT_ASSERT(remoteHost != ""); + return remoteHost; +} diff --git a/src/LifeCycleCORBA/Test/LifeCycleCORBATest.hxx b/src/LifeCycleCORBA/Test/LifeCycleCORBATest.hxx new file mode 100644 index 000000000..2f457f09d --- /dev/null +++ b/src/LifeCycleCORBA/Test/LifeCycleCORBATest.hxx @@ -0,0 +1,63 @@ + +#ifndef _LIFECYCLECORBATEST_HXX_ +#define _LIFECYCLECORBATEST_HXX_ + +#include + +#include +#include CORBA_CLIENT_HEADER(SALOME_Component) +#include CORBA_CLIENT_HEADER(SALOME_TestComponent) +#include "SALOME_NamingService.hxx" + +class LifeCycleCORBATest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( LifeCycleCORBATest ); + CPPUNIT_TEST( testFindOrLoad_Component_LaunchContainer ); + CPPUNIT_TEST( testFindOrLoad_Component_SameInstance ); + CPPUNIT_TEST( testFindOrLoad_Component_PythonInCppContainer ); + CPPUNIT_TEST( testFindOrLoad_Component_PythonSameInstance ); + CPPUNIT_TEST( testFindOrLoad_Component_UnknownInCatalog ); + CPPUNIT_TEST( testFindOrLoad_Component_LaunchContainerHostname ); + CPPUNIT_TEST( testFindOrLoad_Component_SameContainer ); + CPPUNIT_TEST( testFindOrLoad_Component_UnknownMachine ); + CPPUNIT_TEST( testFindOrLoad_Component_ParamsEmpty ); + CPPUNIT_TEST( testFindOrLoad_Component_ParamsLocalContainer ); + CPPUNIT_TEST( testFindOrLoad_Component_ParamsContainerName ); + CPPUNIT_TEST( testFindOrLoad_Component_RemoteComputer ); + CPPUNIT_TEST( testFindOrLoad_Component_ParamsRemoteComputer ); + CPPUNIT_TEST( testFindOrLoad_Component_ParamsRemoteComputer2 ); +// CPPUNIT_TEST( testFindOrLoad_Component_ ); +// CPPUNIT_TEST( testFindOrLoad_Component_ ); +// CPPUNIT_TEST( ); +// CPPUNIT_TEST( ); + CPPUNIT_TEST_SUITE_END(); + +public: + + void setUp(); + void tearDown(); + + void testFindOrLoad_Component_LaunchContainer(); + void testFindOrLoad_Component_SameInstance(); + void testFindOrLoad_Component_PythonInCppContainer(); + void testFindOrLoad_Component_PythonSameInstance(); + void testFindOrLoad_Component_UnknownInCatalog(); + void testFindOrLoad_Component_LaunchContainerHostname(); + void testFindOrLoad_Component_SameContainer(); + void testFindOrLoad_Component_UnknownMachine(); + void testFindOrLoad_Component_ParamsEmpty(); + void testFindOrLoad_Component_ParamsLocalContainer(); + void testFindOrLoad_Component_ParamsContainerName(); + void testFindOrLoad_Component_RemoteComputer(); + void testFindOrLoad_Component_ParamsRemoteComputer(); + void testFindOrLoad_Component_ParamsRemoteComputer2(); +// void testFindOrLoad_Component_(); +// void testFindOrLoad_Component_(); + +protected: + std::string GetRemoteHost(); + CORBA::ORB_var _orb; + SALOME_NamingService _NS; +}; + +#endif diff --git a/src/LifeCycleCORBA/Test/Makefile.in b/src/LifeCycleCORBA/Test/Makefile.in new file mode 100644 index 000000000..dff2dac82 --- /dev/null +++ b/src/LifeCycleCORBA/Test/Makefile.in @@ -0,0 +1,70 @@ +# SALOMELocalTrace : log on local machine +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE (EDF) +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS= LifeCycleCORBATest.hxx + +EXPORT_PYSCRIPTS = TestLifeCycleCORBA.py + +# Libraries targets + +LIB = libLifeCycleCORBATest.la +LIB_SRC = LifeCycleCORBATest.cxx +LIB_CLIENT_IDL = SALOME_Component.idl SALOME_TestComponent.idl \ + SALOME_Exception.idl + +# Executables targets + +BIN = TestLifeCycleCORBA +BIN_SRC = + +CXXFLAGS += @CPPUNIT_INCLUDES@ +CPPFLAGS += @CPPUNIT_INCLUDES@ + +LIBS= @LIBS@ @CPPUNIT_LIBS@ + +LDFLAGS+= + +LDFLAGSFORBIN+= \ + -lSALOMELocalTraceTest -lSALOMELocalTrace -lSALOMEBasics \ + -lSALOMETraceCollectorTest \ + -lUtilsTest -lOpUtil \ + -lSalomeNS -lSalomeContainer -lSalomeResourcesManager \ + -lRegistry -lSalomeNotification \ + -lLifeCycleCORBATest -lSalomeLifeCycleCORBA + + +@CONCLUDE@ diff --git a/src/LifeCycleCORBA/Test/TestLifeCycleCORBA.cxx b/src/LifeCycleCORBA/Test/TestLifeCycleCORBA.cxx new file mode 100644 index 000000000..987e3049c --- /dev/null +++ b/src/LifeCycleCORBA/Test/TestLifeCycleCORBA.cxx @@ -0,0 +1,18 @@ + +// --- include all Unit Test from basics until the present directory + +#include "SALOMELocalTraceTest.hxx" +#include "SALOMETraceCollectorTest.hxx" +#include "UtilsTest.hxx" +#include "LifeCycleCORBATest.hxx" + +// --- Registers the fixture into the 'registry' + +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMELocalTraceTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMETraceCollectorTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( UtilsTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( LifeCycleCORBATest ); + +// --- generic Main program from Basic/Test + +#include "BasicMainTest.hxx" diff --git a/src/LifeCycleCORBA/Test/TestLifeCycleCORBA.py b/src/LifeCycleCORBA/Test/TestLifeCycleCORBA.py new file mode 100644 index 000000000..a1c7135fe --- /dev/null +++ b/src/LifeCycleCORBA/Test/TestLifeCycleCORBA.py @@ -0,0 +1,67 @@ + +import sys, os,signal,string,commands +import runSalome +import orbmodule +import TestKiller + +# get SALOME environment : + +args, modules_list, modules_root_dir = runSalome.get_config() +runSalome.set_env(args, modules_list, modules_root_dir) + +# set environment for trace in logger +# (with file, servers may be killed before the write to the file...) + +#os.environ["SALOME_trace"] = "file:/tmp/traceUnitTest.log" +#os.environ["SALOME_trace"] = "local" +os.environ["SALOME_trace"] = "with_logger" + +# launch CORBA naming server + +clt=orbmodule.client() + +# launch CORBA logger server + +myServer=runSalome.LoggerServer(args) +myServer.run() +clt.waitLogger("Logger") + +# launch notify server + +myServer=runSalome.NotifyServer(args,modules_root_dir) +myServer.run() + +# launch registry server + +myServer=runSalome.RegistryServer(args) +myServer.run() +clt.waitNS("/Registry") + +# launch module catalog server + +cataServer=runSalome.CatalogServer(args) +cataServer.setpath(modules_list,modules_root_dir) +cataServer.run() +clt.waitNS("/Kernel/ModulCatalog") + +# launch container manager server + +myCmServer = runSalome.ContainerManagerServer(args) +myCmServer.setpath(modules_list,modules_root_dir) +myCmServer.run() +clt.waitNS("/ContainerManager") + +# execute Unit Test + +command = ['TestLifeCycleCORBA'] +ret = os.spawnvp(os.P_WAIT, command[0], command) + +# kill containers created by the Container Manager + +import Engines +containerManager = clt.waitNS("/ContainerManager",Engines.ContainerManager) +containerManager.Shutdown() + +# kill Test process + +TestKiller.killProcess(runSalome.process_id) diff --git a/src/LifeCycleCORBA/Test_LifeCycleCORBA.cxx b/src/LifeCycleCORBA/Test_LifeCycleCORBA.cxx new file mode 100644 index 000000000..050cd194d --- /dev/null +++ b/src/LifeCycleCORBA/Test_LifeCycleCORBA.cxx @@ -0,0 +1,142 @@ +// SALOME LifeCycleCORBA : implementation of containers and engines life cycle both in Python and C++ +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : TestLifeCycleCORBA.cxx +// Author : Paul RASCLE, EDF - MARC TAJCHMAN, CEA +// Module : SALOME +// $Header$ + +#include +#ifndef WNT +#include +#endif +#include +#ifndef WNT +#include CORBA_CLIENT_HEADER(SALOME_Component) +#include CORBA_CLIENT_HEADER(SALOME_TestComponent) +#else +#include +#include +#endif +#include "SALOME_NamingService.hxx" +#include "SALOME_LifeCycleCORBA.hxx" +#include "utilities.h" +#include "SALOMETraceCollector.hxx" +#include + +using namespace std; + +int main (int argc, char * argv[]) +{ + + try + { + // Initializing omniORB + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + + // Obtain a reference to the root POA + CORBA::Object_var obj = orb->resolve_initial_references("RootPOA") ; + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj) ; + + SALOME_NamingService _NS(orb) ; + + SALOME_LifeCycleCORBA _LCC(&_NS) ; + + // get a local container (with a name based on local hostname), + // load an engine, and invoque methods on that engine + + string containerName = GetHostname(); + + cout << containerName << endl; + cout << "FindOrLoadComponent " + containerName + "/" + "SalomeTestComponent" << endl; + MESSAGE("FindOrLoadComponent " + containerName + "/" + "SalomeTestComponent" ); + + Engines::Component_var mycompo = + _LCC.FindOrLoad_Component(containerName.c_str(),"SalomeTestComponent"); + + ASSERT(!CORBA::is_nil(mycompo)); + + Engines::TestComponent_var m1; + m1 = Engines::TestComponent::_narrow(mycompo); + + ASSERT(!CORBA::is_nil(m1)); + + SCRUTE(m1->instanceName()); + MESSAGE("Coucou " << m1->Coucou(1L)); + + // get another container (with a fixed name), + // load an engine, and invoque methods on that engine + + string containerName2 = "FactoryServerPy"; + + Engines::Component_var mycompo2 = + _LCC.FindOrLoad_Component(containerName2.c_str(),"SALOME_TestComponentPy"); + + ASSERT(!CORBA::is_nil(mycompo2)); + + Engines::TestComponent_var m2; + m2 = Engines::TestComponent::_narrow(mycompo2); + + ASSERT(!CORBA::is_nil(m2)); + + SCRUTE(m2->instanceName()); + cout << m2->instanceName() << endl; + MESSAGE("Coucou " << m2->Coucou(1L)); + + Engines::Component_var mycompo3 = _LCC.FindOrLoad_Component("totoPy","SALOME_TestComponentPy"); + ASSERT(!CORBA::is_nil(mycompo3)); + Engines::TestComponent_var m3 = Engines::TestComponent::_narrow(mycompo3); + ASSERT(!CORBA::is_nil(m3)); + cout << m3->instanceName() << endl; + + string containerName4 = containerName + "/titiPy"; + Engines::Component_var mycompo4 = _LCC.FindOrLoad_Component(containerName4.c_str(),"SALOME_TestComponentPy"); + ASSERT(!CORBA::is_nil(mycompo4)); + Engines::TestComponent_var m4 = Engines::TestComponent::_narrow(mycompo4); + ASSERT(!CORBA::is_nil(m4)); + cout << m4->instanceName() << endl; + + } + catch(CORBA::SystemException& ex) + { + INFOS("Caught system exception COMM_FAILURE -- unable to contact the object."); + } +#ifndef WNT + catch(CORBA::SystemException&) + { + INFOS("Caught a CORBA::SystemException."); + } +#endif + catch(CORBA::Exception&) + { + INFOS("Caught CORBA::Exception."); + } + catch(...) + { + INFOS("Caught unknown exception."); + } + + return 0; +} + diff --git a/src/LifeCycleCORBA_SWIG/LifeCycleCORBA.py b/src/LifeCycleCORBA_SWIG/LifeCycleCORBA.py new file mode 100644 index 000000000..f88ef8722 --- /dev/null +++ b/src/LifeCycleCORBA_SWIG/LifeCycleCORBA.py @@ -0,0 +1,41 @@ +# SALOME LifeCycleCORBA : implementation of containers and engines life cycle both in Python and C++ +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : LifeCycleCORBA.py +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + + +import Engines +from libSALOME_LifeCycleCORBA import * + +class LifeCycleCORBA (SALOME_LifeCycleCORBA): + + def __init__(self, orb = None): + SALOME_LifeCycleCORBA.__init__(self) + + def FindOrLoadComponent(self, containerName, componentName): + return SALOME_LifeCycleCORBA.FindOrLoad_Component(self, + containerName, + componentName) diff --git a/src/LifeCycleCORBA_SWIG/Makefile.in b/src/LifeCycleCORBA_SWIG/Makefile.in new file mode 100644 index 000000000..20b6d6459 --- /dev/null +++ b/src/LifeCycleCORBA_SWIG/Makefile.in @@ -0,0 +1,52 @@ +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE, EDF +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# Libraries targets + +LIB = libSALOME_LifeCycleCORBAcmodule.la +LIB_SRC = + +LIB_CLIENT_IDL = SALOME_Component.idl SALOME_ContainerManager.idl SALOME_Exception.idl + +SWIG_DEF = libSALOME_LifeCycleCORBA.i + +EXPORT_PYSCRIPTS = libSALOME_LifeCycleCORBA.py LifeCycleCORBA.py TestLifeCycleCORBA.py + +CPPFLAGS+= $(PYTHON_INCLUDES) + +LIBS+= $(PYTHON_LIBS) -lSalomeLifeCycleCORBA + +LDFLAGS+= -lSalomeLifeCycleCORBA + +@CONCLUDE@ diff --git a/src/LifeCycleCORBA_SWIG/TestLifeCycleCORBA.py b/src/LifeCycleCORBA_SWIG/TestLifeCycleCORBA.py new file mode 100644 index 000000000..147e072d4 --- /dev/null +++ b/src/LifeCycleCORBA_SWIG/TestLifeCycleCORBA.py @@ -0,0 +1,18 @@ + +import Engines +import LifeCycleCORBA + +lcc = LifeCycleCORBA.LifeCycleCORBA() + +#obj=lcc.FindOrLoad_Component("FactoryServer","SalomeTestComponent") +#comp=obj._narrow(Engines.TestComponent) +#comp.Coucou(1) + +param={} +param['hostname']='cli76cc' +param['container_name']='myContainer' +smesh=lcc.FindOrLoad_Component(param,'PYHELLO') + +container=lcc.FindContainer('myContainer') +engine=lcc.FindComponent(param,'HELLO') +geom=lcc.LoadComponent(param,'GEOM') diff --git a/src/LifeCycleCORBA_SWIG/libSALOME_LifeCycleCORBA.i b/src/LifeCycleCORBA_SWIG/libSALOME_LifeCycleCORBA.i new file mode 100644 index 000000000..af9877e01 --- /dev/null +++ b/src/LifeCycleCORBA_SWIG/libSALOME_LifeCycleCORBA.i @@ -0,0 +1,116 @@ + + +%module libSALOME_LifeCycleCORBA + +%{ +#include "utilities.h" +#include "SALOME_LifeCycleCORBA.hxx" + + using namespace std; +%} + +%typemap(python,out) Engines::Container_ptr, Engines::Component_ptr +{ + MESSAGE("typemap out on CORBA object ptr"); + SCRUTE($1); + + // --- Get the Python orb + + PyObject* pdict = PyDict_New(); + PyDict_SetItemString(pdict, "__builtins__", PyEval_GetBuiltins()); + PyRun_String("import CORBA", Py_single_input, pdict, pdict); + PyRun_String("o = CORBA.ORB_init([''], CORBA.ORB_ID);", Py_single_input, + pdict, pdict); + PyObject* orb = PyDict_GetItemString(pdict, "o"); + + // --- Get the C++ orb + + int argc = 0; + char *xargv = ""; + char **argv = &xargv; + CORBA::ORB_var ORB = CORBA::ORB_init(argc, argv); + string s = ORB->object_to_string($1); + SCRUTE(s); + PyObject * tmp = PyString_FromString(s.c_str()); + SCRUTE(tmp); + $result = PyObject_CallMethod(orb, "string_to_object", "O", tmp); + SCRUTE($result); +} + + +%typemap(typecheck) const Engines::MachineParameters & +{ + $1 = ($input != 0); +} + +%typemap(python,in) const Engines::MachineParameters & +{ + printf("typemap in on Engines::MachineParameters\n"); + //MESSAGE("typemap in on Engines::MachineParameters"); + //ASSERT (PyDict_Check($input)) + if (PyDict_Check($input) == 1) + { + Engines::MachineParameters *param = new Engines::MachineParameters ; + param->container_name = CORBA::string_dup(""); + param->hostname = CORBA::string_dup(""); + param->OS = CORBA::string_dup(""); + param->mem_mb = 0; + param->cpu_clock = 0; + param->nb_proc_per_node = 0; + param->nb_node = 0; + param->isMPI = false; + PyObject *key, *value; + int pos = 0; + while (PyDict_Next($input, &pos, &key, &value)) + { + char* keystr = PyString_AsString(key); + printf("key: %s\n", keystr); + if (strcmp(keystr,"container_name")==0) + { + param->container_name = CORBA::string_dup(PyString_AsString(value)); + } + else if (strcmp(keystr,"hostname")==0) + { + param->hostname = CORBA::string_dup(PyString_AsString(value)); + } + else if (strcmp(keystr,"OS")==0) + { + param->OS = CORBA::string_dup(PyString_AsString(value)); + } + else if (strcmp(keystr,"mem_mb")==0) + { + param->mem_mb = PyLong_AsLong(value); + } + else if (strcmp(keystr,"cpu_clock")==0) + { + param->cpu_clock = PyLong_AsLong(value); + } + else if (strcmp(keystr,"nb_proc_per_node")==0) + { + param->nb_proc_per_node = PyLong_AsLong(value); + } + else if (strcmp(keystr,"nb_node")==0) + { + param->nb_node = PyLong_AsLong(value); + } + else if (strcmp(keystr,"isMPI")==0) + { + param->isMPI = PyLong_AsLong(value); + } + } + $1 = param; + } + else + { + printf("pas un dico\n"); + return NULL; + } +} + +%typemap(python,freearg) const Engines::MachineParameters & +{ + MESSAGE("delete $1"); + delete $1; +} + +%include "SALOME_LifeCycleCORBA.hxx" diff --git a/src/Logger/SALOME_Logger_Server.cxx b/src/Logger/SALOME_Logger_Server.cxx index f4b6fd53b..4464c835b 100644 --- a/src/Logger/SALOME_Logger_Server.cxx +++ b/src/Logger/SALOME_Logger_Server.cxx @@ -12,8 +12,13 @@ #include "SALOME_Logger_Server.hxx" #include #include -#include -using namespace std; +#ifndef __WIN32__ +# include +#endif + +#ifdef WNT +#include +#endif omni_mutex Logger::myLock; @@ -29,7 +34,7 @@ Logger::Logger() Logger::Logger(const char *filename) { // m_outputFile.open( filename, ios::out | ios::trunc , filebuf::openprot); - m_outputFile.open( filename, ios::out | ios::trunc); + m_outputFile.open( filename, std::ios::out | std::ios::trunc); if (m_outputFile.is_open()) m_putIntoFile = true; else @@ -46,9 +51,10 @@ void Logger::putMessage(const char* message) { myLock.lock(); if (m_putIntoFile) - m_outputFile << message << flush; + + m_outputFile << message << std::flush; else - cout << message; + std::cout << message; myLock.unlock(); } @@ -61,13 +67,13 @@ int main(int argc, char **argv) { if (argc > 2) { - cout << "usage: SALOME_Logger_Server [output_file]" << endl; + std::cout << "usage: SALOME_Logger_Server [output_file]" << std::endl; exit(1); } try { //Initialize the ORB - const long TIMESleep = 500000000; + const long TIMESleep = 250000000; const int NumberOfTries = 40; int i; timespec ts_req = {0, TIMESleep}; @@ -82,42 +88,47 @@ int main(int argc, char **argv) CORBA::ORB_var orb = CORBA::ORB_init(argc, argv) ; - for (int i = 1; i <= NumberOfTries; i++){ - if (i != 1) nanosleep(&ts_req, &ts_rem); - try { - obj = orb->resolve_initial_references("RootPOA") ; - if(!CORBA::is_nil(obj)) - poa = PortableServer::POA::_narrow(obj) ; - pman = poa->the_POAManager(); - // NB. You can activate the POA before or after - // activating objects in that POA. - - // This activates the object in the root POA (by default), and - // returns a reference to it. - //NB. You can't use SALOME_NamingService class because it uses MESSAGE macro - //Otherwise, you will get segmentation fault. - //Get initial naming context - if(!CORBA::is_nil(orb)) - theObj = orb->resolve_initial_references("NameService"); - //Narrow to NamingContext - if (!CORBA::is_nil(theObj)) - inc = CosNaming::NamingContext::_narrow(theObj); - } catch(CORBA::COMM_FAILURE&) { - //cout<<"Logger Server: CORBA::COMM_FAILURE: Unable to contact the Naming Service"<resolve_initial_references("RootPOA") ; + if(!CORBA::is_nil(obj)) + poa = PortableServer::POA::_narrow(obj) ; + pman = poa->the_POAManager(); + // NB. You can activate the POA before or after + // activating objects in that POA. + + // This activates the object in the root POA (by default), and + // returns a reference to it. + //NB. You can't use SALOME_NamingService class because it uses MESSAGE macro + //Otherwise, you will get segmentation fault. + //Get initial naming context + if(!CORBA::is_nil(orb)) + theObj = orb->resolve_initial_references("NameService"); + //Narrow to NamingContext + if (!CORBA::is_nil(theObj)) + inc = CosNaming::NamingContext::_narrow(theObj); + } catch(CORBA::COMM_FAILURE&) { + //cout<<"Logger Server: CORBA::COMM_FAILURE: Unable to contact the Naming Service"<_this(); CosNaming::Name name; @@ -128,29 +139,30 @@ int main(int argc, char **argv) pman->activate(); orb->run() ; orb->destroy() ; - } - catch(CORBA::COMM_FAILURE& ex) - { - cerr << "Caught system exception COMM_FAILURE -- unable to contact the " - << "object." << endl; + } + catch(CORBA::COMM_FAILURE& ex) + { + std::cerr << "Caught system exception COMM_FAILURE -- unable to contact the " + << "object." << std::endl; } catch(CORBA::SystemException&) { - cerr << "Caught CORBA::SystemException." << endl; + std::cerr << "Caught CORBA::SystemException." << std::endl; } catch(CORBA::Exception&) { - cerr << "Caught CORBA::Exception." << endl; + std::cerr << "Caught CORBA::Exception." << std::endl; } catch(omniORB::fatalException& fe) { - cerr << "Caught omniORB::fatalException:" << endl; - cerr << " file: " << fe.file() << endl; - cerr << " line: " << fe.line() << endl; - cerr << " mesg: " << fe.errmsg() << endl; + std::cerr << "Caught omniORB::fatalException:" << std::endl; + std::cerr << " file: " << fe.file() << std::endl; + std::cerr << " line: " << fe.line() << std::endl; + std::cerr << " mesg: " << fe.errmsg() << std::endl; } catch(...) { - cerr << "Caught unknown exception." << endl; + std::cerr << "Caught unknown exception." << std::endl; } + return 0; } diff --git a/src/Logger/SALOME_Logger_Server.hxx b/src/Logger/SALOME_Logger_Server.hxx index 4b1441bd1..086a0f7f9 100644 --- a/src/Logger/SALOME_Logger_Server.hxx +++ b/src/Logger/SALOME_Logger_Server.hxx @@ -11,7 +11,12 @@ #if !defined SALOME_Logger_Server_include #define SALOME_Logger_Server_include +#ifndef WNT #include +#else +#include +#include +#endif #include #include "Logger.hh" @@ -35,7 +40,11 @@ private: //otherwise all messages will be put into terminal via cout bool m_putIntoFile; //ofstream class specialized for disk file output +#ifndef WNT ofstream m_outputFile; +#else + std::ofstream m_outputFile; +#endif //synchronisation object static omni_mutex myLock; }; diff --git a/src/Logger/SALOME_Trace.cxx b/src/Logger/SALOME_Trace.cxx index 1a33333eb..1bdf1d737 100644 --- a/src/Logger/SALOME_Trace.cxx +++ b/src/Logger/SALOME_Trace.cxx @@ -16,6 +16,10 @@ #include using namespace std; +#ifdef WNT +#include +#endif + ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// @@ -53,7 +57,11 @@ int SALOME_Trace::Initialize(CORBA::ORB_ptr theOrb) { // searchin for naming service for 0.25*40=10 seconds for (i = 1; i <= NumberOfTries; i++) { +#ifndef WNT if (i != 1) nanosleep(&ts_req,&ts_rem); +#else + if (i != 1) Sleep(TIMESleep / 1000000); +#endif try{ if(CORBA::is_nil(obj)) obj = theOrb->resolve_initial_references("RootPOA"); @@ -62,7 +70,7 @@ int SALOME_Trace::Initialize(CORBA::ORB_ptr theOrb) { if (!CORBA::is_nil(theObj)) inc = CosNaming::NamingContext::_narrow(theObj); if (!CORBA::is_nil(inc)) break; - } catch( CORBA::COMM_FAILURE& ) { + } catch( CORBA::SystemException& ) { } catch (...) { } } @@ -84,7 +92,11 @@ int SALOME_Trace::Initialize(CORBA::ORB_ptr theOrb) { name[0].id=CORBA::string_dup("Logger"); for(i = 1; i <= NumberOfTries; i++){ +#ifndef WNT if (i != 1) nanosleep(&ts_req, &ts_rem); +#else + if (i != 1) Sleep(TIMESleep / 1000000); +#endif try { obj = inc->resolve(name); if (!CORBA::is_nil(obj)) m_pInterfaceLogger = SALOME_Logger::Logger::_narrow(obj); diff --git a/src/Logger/SALOME_Trace.py b/src/Logger/SALOME_Trace.py index fd507c7c7..2b88171d6 100644 --- a/src/Logger/SALOME_Trace.py +++ b/src/Logger/SALOME_Trace.py @@ -41,7 +41,7 @@ class SALOME_Trace : except CosNaming.NamingContext.NotFound, e : if steps == 1: print "Caught exception: Naming Service can't found Logger" - except CORBA.COMM_FAILURE, e: + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): if steps == 1: print "Caught CORBA::SystemException CommFailure" except CORBA.SystemException, e: if steps == 1: print "Caught CORBA::SystemException." diff --git a/src/Logger/Test/Makefile.in b/src/Logger/Test/Makefile.in new file mode 100644 index 000000000..2ff5e398b --- /dev/null +++ b/src/Logger/Test/Makefile.in @@ -0,0 +1,61 @@ +# Logger: CORBA Logger Server +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE (EDF) +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS= + +EXPORT_PYSCRIPTS = TestKiller.py + +# Libraries targets + +LIB = +LIB_SRC = + +# Executables targets + +BIN = +BIN_SRC = + +CXXFLAGS += @CPPUNIT_INCLUDES@ +CPPFLAGS += @CPPUNIT_INCLUDES@ + +LIBS= @LIBS@ @CPPUNIT_LIBS@ + +LDFLAGS+= + +LDFLAGSFORBIN+= + +@CONCLUDE@ diff --git a/src/Logger/Test/TestKiller.py b/src/Logger/Test/TestKiller.py new file mode 100644 index 000000000..cda030b60 --- /dev/null +++ b/src/Logger/Test/TestKiller.py @@ -0,0 +1,36 @@ + +import sys, os,signal,string,commands + +def killNamingService(): + """ + kills omniORB4 Naming Service on local machine. + Selects process corresponding to the port used in $OMNIORB_CONFIG file. + Works only with a single line $OMNIORB_CONFIG like + InitRef = NameService=corbaname::: + """ + fic=os.environ['OMNIORB_CONFIG'] + f=open(fic,'r') + line=f.readline() + f.close() + port=string.split(line,':')[-1][0:4] + command='ps -eo pid,command | grep "omniNames -start '+str(port)+'"' + pid=string.split(commands.getoutput(command))[0] + os.kill(int(pid),signal.SIGKILL) + + +def killProcess(process_id): + """ + kills process on local machine, given a dictionary of running process + generated by runSalome.Server() class and derived, (method run). + kills also local Naming server. + """ + for pid, cmd in process_id.items(): + print "stop process %s : %s"% (pid, cmd[0]) + try: + os.kill(int(pid),signal.SIGKILL) + except: + print " ---- process %s : %s inexistant"% (pid, cmd[0]) + pass + del process_id[pid] + pass + killNamingService() diff --git a/src/MPIContainer/MPIContainer_i.cxx b/src/MPIContainer/MPIContainer_i.cxx index c190fa2bb..3b97ad793 100644 --- a/src/MPIContainer/MPIContainer_i.cxx +++ b/src/MPIContainer/MPIContainer_i.cxx @@ -27,11 +27,14 @@ #include #include #include +#include "SALOME_Component_i.hxx" #include "MPIContainer_i.hxx" #include "SALOME_NamingService.hxx" #include "Utils_SINGLETON.hxx" #include "OpUtil.hxx" #include "utilities.h" +#include +#include "Container_init_python.hxx" using namespace std; // L'appel au registry SALOME ne se fait que pour le process 0 @@ -44,18 +47,21 @@ Engines_MPIContainer_i::Engines_MPIContainer_i(int nbproc, int numproc, { MESSAGE("[" << numproc << "] activate object"); _id = _poa->activate_object(this); - this->_add_ref(); +// this->_add_ref(); if(numproc==0){ - // _NS = new SALOME_NamingService(_orb); - _NS = SINGLETON_::Instance() ; - ASSERT(SINGLETON_::IsAlreadyExisting()) ; - _NS->init_orb( orb ) ; + _NS = new SALOME_NamingService(); +// _NS = SINGLETON_::Instance() ; +// ASSERT(SINGLETON_::IsAlreadyExisting()) ; + _NS->init_orb( CORBA::ORB::_duplicate(_orb) ) ; // Engines::Container_ptr pCont // = Engines::Container::_narrow(POA_Engines::MPIContainer::_this()); - Engines::Container_ptr pCont = Engines::Container::_narrow(_poa->id_to_reference(*_id)); + CORBA::Object_var obj=_poa->id_to_reference(*_id); + Engines::Container_var pCont = Engines::Container::_narrow(obj); + string hostname = GetHostname(); + _containerName = _NS->BuildContainerNameForNS(containerName,hostname.c_str()); SCRUTE(_containerName); _NS->Register(pCont, _containerName.c_str()); } @@ -73,122 +79,299 @@ Engines_MPIContainer_i::Engines_MPIContainer_i(int nbproc, int numproc) Engines_MPIContainer_i::~Engines_MPIContainer_i(void) { MESSAGE("[" << _numproc << "] Engines_MPIContainer_i::~Engines_MPIContainer_i()"); - if( !handle_map.empty() ){ - MESSAGE("[" << _numproc << "] Engines_MPIContainer_i::~Engines_MPIContainer_i: warning destroy a not empty container"); +} + +// Load component +void Engines_MPIContainer_i::Shutdown() +{ + int ip; + MESSAGE("[" << _numproc << "] shutdown of MPI Corba Server"); + if( _numproc == 0 ){ + _NS->Destroy_FullDirectory(_containerName.c_str()); + for(ip= 1;ip<_nbproc;ip++) + (Engines::MPIContainer::_narrow((*_tior)[ip]))->Shutdown(); } + _orb->shutdown(0); + } -// Start MPI Container -Engines::MPIContainer_ptr Engines_MPIContainer_i::start_MPIimpl( - const char* ContainerName, - CORBA::Short nbproc ) +// Load a component library +bool Engines_MPIContainer_i::load_component_Library(const char* componentName) { + if( _numproc == 0 ){ + // Invocation du chargement du composant dans les autres process + for(int ip= 1;ip<_nbproc;ip++) + (Engines::MPIContainer::_narrow((*_tior)[ip]))->Asload_component_Library(componentName); + } - char nbp[1024]; + return Lload_component_Library(componentName); +} - MESSAGE("[" << _numproc << "] start_impl argc " << _argc << " ContainerName " << ContainerName - << hex << this << dec) ; - _numInstanceMutex.lock() ; // lock on the instance number +void Engines_MPIContainer_i::Asload_component_Library(const char* componentName) +{ + Lload_component_Library(componentName); +} + +bool Engines_MPIContainer_i::Lload_component_Library(const char* componentName) +{ + string aCompName = componentName; - CORBA::Object_var obj = Engines::MPIContainer::_nil() ; - bool nilvar = true ; - try { - string cont("/Containers/"); - cont += machineName() ; - cont += "/" ; - cont += ContainerName; - INFOS("[" << _numproc << "] " << machineName() << " start_impl unknown container " << cont.c_str() - << " try to Resolve" ); - obj = _NS->Resolve( cont.c_str() ); - nilvar = CORBA::is_nil( obj ) ; - if ( nilvar ) { - INFOS("[" << _numproc << "] " << machineName() << " start_impl unknown container " - << ContainerName); + // --- try dlopen C++ component + + string impl_name = string ("lib") + aCompName + string("Engine.so"); + SCRUTE(impl_name); + + _numInstanceMutex.lock(); // lock to be alone + // (see decInstanceCnt, finalize_removal)) + if (_toRemove_map[impl_name]) _toRemove_map.erase(impl_name); + if (_library_map[impl_name]) + { + MESSAGE("[" << _numproc << "] Library " << impl_name << " already loaded"); + _numInstanceMutex.unlock(); + return true; } + + void* handle; + handle = dlopen( impl_name.c_str() , RTLD_LAZY ) ; + if ( handle ) + { + _library_map[impl_name] = handle; + _numInstanceMutex.unlock(); + return true; + } + else + { + INFOS("[" << _numproc << "] Can't load shared library : " << impl_name); + INFOS("[" << _numproc << "] error dlopen: " << dlerror()); + } + _numInstanceMutex.unlock(); + + // --- try import Python component + + INFOS("[" << _numproc << "] try import Python component "<Ascreate_component_instance(componentName,studyId); } - catch (ServiceUnreachable&) { - INFOS("[" << _numproc << "] " << machineName() << "Caught exception: Naming Service Unreachable"); - } - catch (...) { - INFOS("[" << _numproc << "] " << machineName() << "Caught unknown exception."); + + return Lcreate_component_instance(componentName,studyId); +} + +void Engines_MPIContainer_i::Ascreate_component_instance( const char* componentName, + CORBA::Long studyId) +{ + Lcreate_component_instance(componentName,studyId); +} + +Engines::Component_ptr +Engines_MPIContainer_i::Lcreate_component_instance( const char* genericRegisterName, CORBA::Long studyId) +{ + if (studyId < 0) { + INFOS("studyId must be > 0 for mono study instance, =0 for multiStudy"); + return Engines::Component::_nil() ; } - if ( !nilvar ) { + + Engines::Component_var iobject = Engines::Component::_nil() ; + Engines::MPIObject_var pobj; + + string aCompName = genericRegisterName; + if (_library_map[aCompName]) { // Python component + if (_isSupervContainer) { + INFOS("Supervision Container does not support Python Component Engines"); + return Engines::Component::_nil(); + } + _numInstanceMutex.lock() ; // lock on the instance number + _numInstance++ ; + int numInstance = _numInstance ; _numInstanceMutex.unlock() ; - MESSAGE("[" << _numproc << "] start_impl container found without new launch") ; - return Engines::MPIContainer::_narrow(obj); - } - int i = 0 ; - while ( _argv[ i ] ) { - MESSAGE("[" << _numproc << "] argv" << i << " " << _argv[ i ]) ; - i++ ; + + char aNumI[12]; + sprintf( aNumI , "%d" , numInstance ) ; + string instanceName = aCompName + "_inst_" + aNumI ; + string component_registerName = + _containerName + "/" + instanceName; + + Py_ACQUIRE_NEW_THREAD; + PyObject *mainmod = PyImport_AddModule("__main__"); + PyObject *globals = PyModule_GetDict(mainmod); + PyObject *pyCont = PyDict_GetItemString(globals, "pyCont"); + PyObject *result = PyObject_CallMethod(pyCont, + "create_component_instance", + "ssl", + aCompName.c_str(), + instanceName.c_str(), + studyId); + string iors = PyString_AsString(result); + SCRUTE(iors); + Py_RELEASE_NEW_THREAD; + + CORBA::Object_var obj = _orb->string_to_object(iors.c_str()); + iobject = Engines::Component::_narrow( obj ) ; + pobj = Engines::MPIObject::_narrow(obj) ; + if( _numproc == 0 ) + _NS->Register(iobject, component_registerName.c_str()) ; + // Root recupere les ior des composants des autre process + BCastIOR(_orb,pobj,false); + + return iobject._retn(); } - sprintf(nbp,"mpirun -np %d SALOME_MPIContainer ",nbproc); - string shstr(nbp); - shstr += ContainerName ; - if ( _argc == 4 ) { - shstr += " " ; - shstr += _argv[ 2 ] ; - shstr += " " ; - shstr += _argv[ 3 ] ; + + //--- try C++ + + string impl_name = string ("lib") + genericRegisterName +string("Engine.so"); + void* handle = _library_map[impl_name]; + if ( !handle ) { + INFOS("shared library " << impl_name <<"must be loaded before instance"); + return Engines::Component::_nil() ; } - shstr += " > /tmp/" ; - shstr += ContainerName ; - shstr += ".log 2>&1 &" ; - MESSAGE("system(" << shstr << ")") ; - int status = system( shstr.c_str() ) ; - if (status == -1) { - INFOS("[" << _numproc << "] Engines_MPIContainer_i::start_impl SALOME_MPIContainer failed (system command status -1)") ; + else { + iobject = createMPIInstance(genericRegisterName, + handle, + studyId); + return iobject._retn(); } - else if (status == 217) { - INFOS("[" << _numproc << "] Engines_MPIContainer_i::start_impl SALOME_MPIContainer failed (system command status 217)") ; +} + +Engines::Component_ptr +Engines_MPIContainer_i::createMPIInstance(string genericRegisterName, + void *handle, + int studyId) +{ + Engines::Component_var iobject; + Engines::MPIObject_var pobj; + // --- find the factory + + string aGenRegisterName = genericRegisterName; + string factory_name = aGenRegisterName + string("Engine_factory"); + SCRUTE(factory_name) ; + + typedef PortableServer::ObjectId * (*MPIFACTORY_FUNCTION) + (int,int, + CORBA::ORB_ptr, + PortableServer::POA_ptr, + PortableServer::ObjectId *, + const char *, + const char *) ; + + MPIFACTORY_FUNCTION MPIComponent_factory + = (MPIFACTORY_FUNCTION) dlsym(handle, factory_name.c_str()); + + char *error ; + if ( (error = dlerror() ) != NULL) { + // Try to load a sequential component + MESSAGE("[" << _numproc << "] Try to load a sequential component"); + _numInstanceMutex.unlock() ; + iobject = Engines_Container_i::createInstance(genericRegisterName,handle,studyId); + if( CORBA::is_nil(iobject) ) return Engines::Component::_duplicate(iobject); } - INFOS("[" << _numproc << "] " << machineName() << " Engines_MPIContainer_i::start_impl SALOME_MPIContainer launch done"); - - obj = Engines::MPIContainer::_nil() ; - try { - string cont("/Containers/"); - cont += machineName() ; - cont += "/" ; - cont += ContainerName; - nilvar = true ; - int count = 20 ; - while ( nilvar && count >= 0) { - sleep( 1 ) ; - obj = _NS->Resolve(cont.c_str()); - nilvar = CORBA::is_nil( obj ) ; - if ( nilvar ) { - INFOS("[" << _numproc << "] " << count << ". " << machineName() - << " start_impl unknown container " << cont.c_str()); - count -= 1 ; + + // --- create instance + + iobject = Engines::Component::_nil() ; + + try + { + _numInstanceMutex.lock() ; // lock on the instance number + _numInstance++ ; + int numInstance = _numInstance ; + _numInstanceMutex.unlock() ; + + char aNumI[12]; + sprintf( aNumI , "%d" , numInstance ) ; + string instanceName = aGenRegisterName + "_inst_" + aNumI ; + string component_registerName = + _containerName + "/" + instanceName; + + // --- Instanciate required CORBA object + + PortableServer::ObjectId *id ; //not owner, do not delete (nore use var) + id = (MPIComponent_factory) ( _nbproc,_numproc,_orb, _poa, _id, instanceName.c_str(), + aGenRegisterName.c_str() ) ; + + // --- get reference & servant from id + + CORBA::Object_var obj = _poa->id_to_reference(*id); + iobject = Engines::Component::_narrow( obj ) ; + pobj = Engines::MPIObject::_narrow(obj) ; + + Engines_Component_i *servant = + dynamic_cast(_poa->reference_to_servant(iobject)); + ASSERT(servant); + //SCRUTE(servant->pd_refCount); + servant->_remove_ref(); // compensate previous id_to_reference + //SCRUTE(servant->pd_refCount); + _listInstances_map[instanceName] = iobject; + _cntInstances_map[aGenRegisterName] += 1; + SCRUTE(aGenRegisterName); + SCRUTE(_cntInstances_map[aGenRegisterName]); + //SCRUTE(servant->pd_refCount); + bool ret_studyId = servant->setStudyId(studyId); + ASSERT(ret_studyId); + + // --- register the engine under the name + // containerName(.dir)/instanceName(.object) + + if( _numproc == 0 ){ + _NS->Register( iobject , component_registerName.c_str() ) ; + MESSAGE( component_registerName.c_str() << " bound" ) ; } + // Root recupere les ior des composants des autre process + BCastIOR(_orb,pobj,false); + } - _numInstanceMutex.unlock() ; - if ( !nilvar ) { - MESSAGE("[" << _numproc << "] start_impl container found after new launch of SALOME_MPIContainer") ; + catch (...) + { + INFOS( "Container_i::createInstance exception catched" ) ; } - return Engines::MPIContainer::_narrow(obj); - } - catch (ServiceUnreachable&) { - INFOS("[" << _numproc << "] " << machineName() << "Caught exception: Naming Service Unreachable"); - } - catch (...) { - INFOS("[" << _numproc << "] " << machineName() << "Caught unknown exception."); - } - _numInstanceMutex.unlock() ; - MESSAGE("[" << _numproc << "] start_impl MPI container not found after new launch of SALOME_MPIContainer") ; - return Engines::MPIContainer::_nil() ; + return iobject._retn(); } // Load component Engines::Component_ptr Engines_MPIContainer_i::load_impl(const char* nameToRegister, const char* componentName) { - int ip; - if( _numproc == 0 ){ // Invocation du chargement du composant dans les autres process - for(ip= 1;ip<_nbproc;ip++) - (Engines::MPIContainer::_narrow((*_tior)[ip]))->SPload_impl(nameToRegister, + for(int ip= 1;ip<_nbproc;ip++) + (Engines::MPIContainer::_narrow((*_tior)[ip]))->Asload_impl(nameToRegister, componentName); } @@ -197,7 +380,7 @@ Engines::Component_ptr Engines_MPIContainer_i::load_impl(const char* nameToRegis } // Load component -void Engines_MPIContainer_i::SPload_impl(const char* nameToRegister, +void Engines_MPIContainer_i::Asload_impl(const char* nameToRegister, const char* componentName) { Lload_impl(nameToRegister,componentName); @@ -277,7 +460,6 @@ Engines::Component_ptr Engines_MPIContainer_i::Lload_impl( _NS->Register(iobject, component_registerName.c_str()) ; } - handle_map[instanceName] = handle; _numInstanceMutex.unlock() ; // Root recupere les ior des composants des autre process @@ -303,25 +485,20 @@ void Engines_MPIContainer_i::remove_impl(Engines::Component_ptr component_i) for(ip= 1;ip<_nbproc;ip++){ spcptr = Engines::MPIObject::_narrow((*(pcptr->tior()))[ip]); cptr = (Engines::Component_ptr)spcptr; - (Engines::MPIContainer::_narrow((*_tior)[ip]))->SPremove_impl(cptr); + (Engines::MPIContainer::_narrow((*_tior)[ip]))->Asremove_impl(cptr); } } Lremove_impl(component_i); } -void Engines_MPIContainer_i::SPremove_impl(Engines::Component_ptr component_i) +void Engines_MPIContainer_i::Asremove_impl(Engines::Component_ptr component_i) { Lremove_impl(component_i); } void Engines_MPIContainer_i::Lremove_impl(Engines::Component_ptr component_i) { - int ip; - Engines::Component_ptr cptr; - Engines::MPIObject_ptr pcptr; - Engines::MPIObject_ptr spcptr; - BEGIN_OF("[" << _numproc << "] MPIContainer_i::Lremove_impl"); ASSERT(! CORBA::is_nil(component_i)); @@ -331,19 +508,8 @@ void Engines_MPIContainer_i::Lremove_impl(Engines::Component_ptr component_i) component_i->destroy() ; MESSAGE("[" << _numproc << "] test key handle_map"); _numInstanceMutex.lock() ; // lock on the remove on handle_map - if (handle_map[instanceName]) // if key does not exist, created & initialized null - { - remove_map[instanceName] = handle_map[instanceName] ; - } - else MESSAGE("[" << _numproc << "] no key handle_map"); - handle_map.erase(instanceName) ; _numInstanceMutex.unlock() ; MESSAGE("[" << _numproc << "] list handle_map"); - map::iterator im ; - for (im = handle_map.begin() ; im != handle_map.end() ; im ++) - { - MESSAGE("[" << _numproc << "] stay " << (*im).first); - } END_OF("[" << _numproc << "] MPIContainer_i::Lremove_impl"); @@ -356,13 +522,13 @@ void Engines_MPIContainer_i::finalize_removal() if( _numproc == 0 ){ // Invocation de la destruction du composant dans les autres process for(ip= 1;ip<_nbproc;ip++) - (Engines::MPIContainer::_narrow((*_tior)[ip]))->SPfinalize_removal(); + (Engines::MPIContainer::_narrow((*_tior)[ip]))->Asfinalize_removal(); } Lfinalize_removal(); } -void Engines_MPIContainer_i::SPfinalize_removal() +void Engines_MPIContainer_i::Asfinalize_removal() { Lfinalize_removal(); } @@ -371,33 +537,18 @@ void Engines_MPIContainer_i::Lfinalize_removal() { BEGIN_OF("[" << _numproc << "] MPIContainer_i::Lfinalize_removal"); - map::iterator im ; - // lock on the explore remove_map & dlclose - _numInstanceMutex.lock() ; - for (im = remove_map.begin() ; im != remove_map.end() ; im ++) - { - void * handle = (*im).second ; - MESSAGE("[" << _numproc << "] dlclose " << (*im).first); - dlclose(handle) ; - } - MESSAGE("[" << _numproc << "] remove_map.clear()"); - remove_map.clear() ; - _numInstanceMutex.unlock() ; +// map::iterator im ; +// // lock on the explore remove_map & dlclose +// _numInstanceMutex.lock() ; +// for (im = remove_map.begin() ; im != remove_map.end() ; im ++) +// { +// void * handle = (*im).second ; +// MESSAGE("[" << _numproc << "] dlclose " << (*im).first); +// dlclose(handle) ; +// } +// MESSAGE("[" << _numproc << "] remove_map.clear()"); +// remove_map.clear() ; +// _numInstanceMutex.unlock() ; END_OF("[" << _numproc << "] MPIContainer_i::Lfinalize_removal"); } - -// Load component -void Engines_MPIContainer_i::MPIShutdown() -{ - int ip; - MESSAGE("[" << _numproc << "] shutdown of Corba Server"); - if( _numproc == 0 ){ - for(ip= 1;ip<_nbproc;ip++) - (Engines::MPIContainer::_narrow((*_tior)[ip]))->Shutdown(); - } - - Shutdown(); - -} - diff --git a/src/MPIContainer/MPIContainer_i.hxx b/src/MPIContainer/MPIContainer_i.hxx index a971b7f20..a73af8b38 100644 --- a/src/MPIContainer/MPIContainer_i.hxx +++ b/src/MPIContainer/MPIContainer_i.hxx @@ -48,38 +48,58 @@ class Engines_MPIContainer_i : public POA_Engines::MPIContainer, // Destructor ~Engines_MPIContainer_i(); - // Launch a new MPI container from the current container - Engines::MPIContainer_ptr start_MPIimpl(const char* ContainerName, - CORBA::Short nbproc); + // shutdown corba server + void Shutdown(); + + // Load a component library + // synchronous version for process 0 + bool load_component_Library(const char* componentName); + // asynchronous version for other process + void Asload_component_Library(const char* componentName); + + // Create an instance of component + // synchronous version for process 0 + Engines::Component_ptr + create_component_instance( const char* componentName, + CORBA::Long studyId); // 0 for multiStudy + // asynchronous version for other process + void Ascreate_component_instance( const char* componentName, + CORBA::Long studyId); // 0 for multiStudy // Load a component in current MPI container // synchronous version for process 0 Engines::Component_ptr load_impl(const char* nameToRegister, const char* componentName); - // shutdown corba server - void MPIShutdown(); - // asynchronous version for other process - void SPload_impl(const char* nameToRegister, const char* componentName); + void Asload_impl(const char* nameToRegister, const char* componentName); // Unload a component from current MPI container // synchronous version for process 0 void remove_impl(Engines::Component_ptr component_i); // asynchronous version for other process - void SPremove_impl(Engines::Component_ptr component_i); + void Asremove_impl(Engines::Component_ptr component_i); // synchronous version for process 0 void finalize_removal(); // asynchronous version for other process - void SPfinalize_removal(); + void Asfinalize_removal(); private: // local version to not duplicate code // called by synchronous and asynchronous version + bool Lload_component_Library(const char* componentName); + Engines::Component_ptr + Lcreate_component_instance( const char* componentName, + CORBA::Long studyId); // 0 for multiStudy Engines::Component_ptr Lload_impl(const char* nameToRegister, const char* componentName); void Lremove_impl(Engines::Component_ptr component_i); void Lfinalize_removal(); + Engines::Component_ptr + createMPIInstance(std::string genericRegisterName, + void *handle, + int studyId); + }; #endif diff --git a/src/MPIContainer/Makefile.in b/src/MPIContainer/Makefile.in index d01e24df8..6aa39f7ce 100644 --- a/src/MPIContainer/Makefile.in +++ b/src/MPIContainer/Makefile.in @@ -52,12 +52,15 @@ BIN = SALOME_MPIContainer BIN_SRC = BIN_SERVER_IDL = SALOME_MPIObject.idl SALOME_MPIContainer.idl -LDFLAGS+= -lSalomeContainer -lSalomeNS -lRegistry -lOpUtil -lSalomeNotification -lSALOMELocalTrace +CPPFLAGS+= $(PYTHON_INCLUDES) +LDFLAGS+= -lSalomeContainer -lSalomeNS -lRegistry -lOpUtil -lSalomeNotification -lSALOMELocalTrace -lSalomeResourcesManager ifeq (@WITHMPI@,yes) + LIBS += $(PYTHON_LIBS) $(MPI_LIBS) CXXFLAGS+=${MPI_INCLUDES} CXX_DEPEND_FLAG+=${MPI_INCLUDES} - LDFLAGS+= ${MPI_LIBS} + LDFLAGSFORBIN= $(LDFLAGS) + LIBSFORBIN= $(LIBS) endif @CONCLUDE@ diff --git a/src/MPIContainer/SALOME_MPIContainer.cxx b/src/MPIContainer/SALOME_MPIContainer.cxx index 52152364e..bf2322190 100644 --- a/src/MPIContainer/SALOME_MPIContainer.cxx +++ b/src/MPIContainer/SALOME_MPIContainer.cxx @@ -4,13 +4,12 @@ #include "Utils_SINGLETON.hxx" #include "utilities.h" #include -#include "LocalTraceCollector.hxx" +#include "SALOMETraceCollector.hxx" using namespace std; int main(int argc, char* argv[]) { int nbproc, numproc; - int flag; Engines_MPIContainer_i * myContainer=NULL; MPI_Init(&argc,&argv); @@ -20,7 +19,7 @@ int main(int argc, char* argv[]) // Initialise the ORB. ORB_INIT &init = *SINGLETON_::Instance() ; CORBA::ORB_var &orb = init( argc , argv ) ; - LocalTraceCollector *myThreadTrace = LocalTraceCollector::instance(orb); + // SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); BEGIN_OF("[" << numproc << "] " << argv[0]) try { @@ -69,7 +68,6 @@ int main(int argc, char* argv[]) pman->activate(); orb->run(); - orb->destroy(); } catch(CORBA::SystemException&){ @@ -90,12 +88,11 @@ int main(int argc, char* argv[]) if(myContainer) delete myContainer; - MPI_Initialized(&flag); - if(flag) - MPI_Finalize(); END_OF("[" << numproc << "] " << argv[0]); - delete myThreadTrace; - return 0 ; + // delete myThreadTrace; + + MPI_Finalize(); + } diff --git a/src/Makefile.in b/src/Makefile.in index c64ecb109..2b5bb4c7d 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -32,36 +32,53 @@ VPATH=.:@srcdir@ @COMMENCE@ -ifeq (@WITHIHM@,yes) -SUBDIRS = MSG2QM SALOMELocalTrace SALOMETraceCollector Logger Utils CASCatch PatchQt \ - GenericObj MEDWrapper NamingService Registry \ - ModuleCatalog DataTypeCatalog RessourcesCatalog \ - ResourcesManager Notification NOTIFICATION_SWIG \ - Container TestContainer LifeCycleCORBA HDFPersist Prs \ - VTKFilter OBJECT \ - TOOLSDS SALOMEDS Event \ - SALOMEGUI TOOLSGUI Plot2d VTKViewer OCCViewer \ - SUPERVGraph \ - Session SALOME_SWIG SALOME_SWIG_WITHOUTIHM SALOME_PY \ - RegistryDisplay ModuleGenerator SALOME_PYQT Loader Communication -endif - -ifeq (@WITHIHM@,no) -SUBDIRS = MSG2QM SALOMELocalTrace SALOMETraceCollector Logger Utils CASCatch \ - GenericObj NamingService Registry \ - ModuleCatalog DataTypeCatalog RessourcesCatalog \ - ResourcesManager Notification NOTIFICATION_SWIG \ - Container TestContainer LifeCycleCORBA HDFPersist Prs \ - TOOLSDS SALOMEDS Event \ - SALOME_SWIG_WITHOUTIHM ModuleGenerator Loader Communication -endif +SUBDIRS = \ + Basics \ + SALOMELocalTrace \ + CASCatch \ + HDFPersist \ + Logger \ + SALOMETraceCollector \ + Utils \ + NamingService \ + GenericObj \ + Registry \ + ModuleCatalog \ + DataTypeCatalog \ + RessourcesCatalog \ + ResourcesManager \ + Notification \ + NOTIFICATION_SWIG \ + Container \ + TestContainer \ + LifeCycleCORBA \ + LifeCycleCORBA_SWIG \ + SALOMEDSClient \ + TOOLSDS \ + SALOMEDSImpl \ + SALOMEDS \ + KERNEL_PY \ + ModuleGenerator \ + Communication ifeq (@mpi_ok@,yes) - SUBDIRS+= MPIContainer MPILifeCycleCORBA TestMPIContainer + SUBDIRS+= MPIContainer TestMPIContainer endif ifeq (@WITH_BATCH@,yes) SUBDIRS += Batch Batch_SWIG endif +ifeq (@cppunit_ok@,yes) + SUBDIRS+= \ + Basics/Test \ + SALOMELocalTrace/Test \ + Logger/Test \ + SALOMETraceCollector/Test \ + Utils/Test \ + LifeCycleCORBA/Test \ + UnitTests +endif + @MODULE@ + diff --git a/src/ModuleCatalog/Makefile.in b/src/ModuleCatalog/Makefile.in index bc4a90bab..65f688f97 100644 --- a/src/ModuleCatalog/Makefile.in +++ b/src/ModuleCatalog/Makefile.in @@ -51,18 +51,22 @@ LIB_SRC = \ SALOME_ModuleCatalog_impl.cxx \ SALOME_ModuleCatalog_Acomponent_impl.cxx -CXXFLAGS+=@CXXTMPDPTHFLAGS@ +LIB_SERVER_IDL = SALOME_ModuleCatalog.idl SALOME_Exception.idl + +CXXFLAGS+=-ftemplate-depth-32 # Executables targets # trouble we have client and serveur and build don't known about this with rule # in fact client is a test ! So it may go away BIN ! + BIN = SALOME_ModuleCatalog_Server SALOME_ModuleCatalog_Client BIN_SRC = -LIB_CLIENT_IDL = SALOME_ModuleCatalog.idl -BIN_SERVER_IDL = SALOME_ModuleCatalog.idl +BIN_SERVER_IDL = SALOME_ModuleCatalog.idl SALOME_Exception.idl CPPFLAGS+= $(QT_MT_INCLUDES) -LDFLAGS+= $(QT_MT_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace +LDFLAGS+= $(QT_MT_LIBS) -lSalomeNS -lSALOMELocalTrace -lOpUtil -lSALOMEBasics + +LDFLAGSFORBIN+= -lSalomeNS -lSALOMELocalTrace -lOpUtil -lSALOMEBasics + -LDFLAGSFORBIN= $(LDFLAGS) -lSALOMETraceCollector @CONCLUDE@ diff --git a/src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.cxx b/src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.cxx index ad1c34169..228c49538 100644 --- a/src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.cxx +++ b/src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.cxx @@ -493,16 +493,24 @@ void SALOME_ModuleCatalog_AcomponentImpl::duplicate // duplicate out Parameters _length = S_in.ServiceoutParameter.length(); S_out.ServiceoutParameter.length(_length); - + +#ifndef WNT for (unsigned int ind2 = 0; ind2 < _length ; ind2 ++) +#else + for (ind2 = 0; ind2 < _length ; ind2 ++) +#endif duplicate(S_out.ServiceoutParameter[ind2], S_in.ServiceoutParameter[ind2]); // duplicate in DataStreamParameters _length = S_in.ServiceinDataStreamParameter.length(); S_out.ServiceinDataStreamParameter.length(_length); - + +#ifndef WNT for (unsigned int ind2 = 0; ind2 < _length ; ind2 ++) +#else + for (ind2 = 0; ind2 < _length ; ind2 ++) +#endif duplicate(S_out.ServiceinDataStreamParameter[ind2], S_in.ServiceinDataStreamParameter[ind2]); @@ -511,7 +519,11 @@ void SALOME_ModuleCatalog_AcomponentImpl::duplicate if(MYDEBUG) SCRUTE(_length); S_out.ServiceoutDataStreamParameter.length(_length); +#ifndef WNT for (unsigned int ind2 = 0; ind2 < _length ; ind2 ++) +#else + for (ind2 = 0; ind2 < _length ; ind2 ++) +#endif duplicate(S_out.ServiceoutDataStreamParameter[ind2], S_in.ServiceoutDataStreamParameter[ind2]); } diff --git a/src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.hxx b/src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.hxx index 4580350ae..e56d8a3fb 100644 --- a/src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.hxx +++ b/src/ModuleCatalog/SALOME_ModuleCatalog_Acomponent_impl.hxx @@ -34,7 +34,21 @@ #include CORBA_SERVER_HEADER(SALOME_ModuleCatalog) -class SALOME_ModuleCatalog_AcomponentImpl: public POA_SALOME_ModuleCatalog::Acomponent, +#if defined MODULECATALOG_EXPORTS +#if defined WIN32 +#define MODULECATALOG_EXPORT __declspec( dllexport ) +#else +#define MODULECATALOG_EXPORT +#endif +#else +#if defined WNT +#define MODULECATALOG_EXPORT __declspec( dllimport ) +#else +#define MODULECATALOG_EXPORT +#endif +#endif + +class MODULECATALOG_EXPORT SALOME_ModuleCatalog_AcomponentImpl: public POA_SALOME_ModuleCatalog::Acomponent, public PortableServer::RefCountServantBase { public: diff --git a/src/ModuleCatalog/SALOME_ModuleCatalog_Client.cxx b/src/ModuleCatalog/SALOME_ModuleCatalog_Client.cxx index ee3da570e..70b1c695e 100644 --- a/src/ModuleCatalog/SALOME_ModuleCatalog_Client.cxx +++ b/src/ModuleCatalog/SALOME_ModuleCatalog_Client.cxx @@ -26,7 +26,7 @@ /* $Header$ */ -#include +#include #include "SALOME_NamingService.hxx" #include "SALOME_ModuleCatalog.hh" #include @@ -78,13 +78,21 @@ int main(int argc,char **argv) MESSAGE("Get Typed Component list (SUPERV Type)"); list_typed_composants = Catalogue->GetTypedComponentList(SALOME_ModuleCatalog::SUPERV); +#ifndef WNT for (unsigned int ind = 0; ind < list_typed_composants->length();ind++) +#else + for (ind = 0; ind < list_typed_composants->length();ind++) +#endif MESSAGE("Component SUPERV list : " << list_typed_composants[ind]); // Get list of couple (component name, component icone) SALOME_ModuleCatalog::ListOfIAPP_Affich_var list_composants_icone = Catalogue->GetComponentIconeList(); +#ifndef WNT for (unsigned int ind = 0; ind < list_composants_icone->length();ind++) +#else + for (ind = 0; ind < list_composants_icone->length();ind++) +#endif { MESSAGE("Component name: " << list_composants_icone[ind].modulename); MESSAGE("Component icone: " << list_composants_icone[ind].moduleicone); diff --git a/src/ModuleCatalog/SALOME_ModuleCatalog_Handler.hxx b/src/ModuleCatalog/SALOME_ModuleCatalog_Handler.hxx index 43701c983..add44e498 100644 --- a/src/ModuleCatalog/SALOME_ModuleCatalog_Handler.hxx +++ b/src/ModuleCatalog/SALOME_ModuleCatalog_Handler.hxx @@ -35,7 +35,21 @@ #include #include -class SALOME_ModuleCatalog_Handler : public QXmlDefaultHandler +#if defined MODULECATALOG_EXPORTS +#if defined WIN32 +#define MODULECATALOG_EXPORT __declspec( dllexport ) +#else +#define MODULECATALOG_EXPORT +#endif +#else +#if defined WNT +#define MODULECATALOG_EXPORT __declspec( dllimport ) +#else +#define MODULECATALOG_EXPORT +#endif +#endif + +class MODULECATALOG_EXPORT SALOME_ModuleCatalog_Handler : public QXmlDefaultHandler { public: //! standard constructor diff --git a/src/ModuleCatalog/SALOME_ModuleCatalog_Server.cxx b/src/ModuleCatalog/SALOME_ModuleCatalog_Server.cxx index ad8cdd43d..274de28a1 100644 --- a/src/ModuleCatalog/SALOME_ModuleCatalog_Server.cxx +++ b/src/ModuleCatalog/SALOME_ModuleCatalog_Server.cxx @@ -41,7 +41,7 @@ int main(int argc,char **argv) { // initialize the ORB CORBA::ORB_ptr orb = CORBA::ORB_init (argc, argv); - SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); try { CosNaming::NamingContext_var _rootContext, catalogContext; @@ -74,7 +74,11 @@ int main(int argc,char **argv) for (int i = 1; i<=NumberOfTries; i++) { if (i!=1) +#ifndef WNT a=nanosleep(&ts_req,&ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try { obj = orb->resolve_initial_references("RootPOA"); @@ -85,9 +89,9 @@ int main(int argc,char **argv) if(!CORBA::is_nil(orb)) theObj = orb->resolve_initial_references("NameService"); } - catch( CORBA::COMM_FAILURE& ) + catch( CORBA::SystemException& ) { - INFOS( "Module Catalog Server: CORBA::COMM_FAILURE: Unable to contact the Naming Service" ); + INFOS( "Module Catalog Server: CORBA::SystemException: Unable to contact the Naming Service" ); } if (!CORBA::is_nil(theObj)) { @@ -103,7 +107,11 @@ int main(int argc,char **argv) for(int j=1; j<=NumberOfTries; j++) { if (j!=1) +#ifndef WNT a=nanosleep(&ts_req, &ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try{ object = inc->resolve(name);} catch(CosNaming::NamingContext::NotFound) @@ -166,6 +174,6 @@ int main(int argc,char **argv) INFOS("Caught CORBA::Exception.") } - delete myThreadTrace; + // delete myThreadTrace; return 0; } diff --git a/src/ModuleCatalog/SALOME_ModuleCatalog_impl.cxx b/src/ModuleCatalog/SALOME_ModuleCatalog_impl.cxx index 845e341dc..87e57d287 100644 --- a/src/ModuleCatalog/SALOME_ModuleCatalog_impl.cxx +++ b/src/ModuleCatalog/SALOME_ModuleCatalog_impl.cxx @@ -35,10 +35,12 @@ #include using namespace std; +#include "utilities.h" + #ifdef _DEBUG_ -static int MYDEBUG = 0; +static int MYDEBUG = 1; #else -static int MYDEBUG = 0; +static int MYDEBUG = 1; #endif static const char* SEPARATOR = ":"; @@ -251,7 +253,11 @@ SALOME_ModuleCatalogImpl::GetComponentList() // The components in the general catalog are taken only if they're // not defined in the personal catalog +#ifndef WNT for(unsigned int ind=0; ind < _general_module_list.size();ind++){ +#else + for(ind=0; ind < _general_module_list.size();ind++){ +#endif _find = false; for(unsigned int ind1=0; ind1 < _personal_module_list.size();ind1++){ // searching if the component is already defined in @@ -312,7 +318,11 @@ SALOME_ModuleCatalogImpl::GetComponentIconeList() // The components in the general catalog are taken only if they're // not defined in the personal catalog +#ifndef WNT for(unsigned int ind=0; ind < _general_module_list.size();ind++){ +#else + for(ind=0; ind < _general_module_list.size();ind++){ +#endif _find = false; for(unsigned int ind1=0; ind1 < _personal_module_list.size();ind1++){ // searching if the component is aleready defined in @@ -403,7 +413,11 @@ SALOME_ModuleCatalogImpl::GetTypedComponentList(SALOME_ModuleCatalog::ComponentT // The components in the general catalog are taken only if they're // not defined in the personal catalog +#ifndef WNT for (unsigned int ind=0; ind < _general_module_list.size();ind++) +#else + for (ind=0; ind < _general_module_list.size();ind++) +#endif { _find = false; @@ -456,12 +470,12 @@ SALOME_ModuleCatalogImpl::GetComponent(const char* name) ParserComponent *C_parser = NULL; ParserPathPrefixes *pp = NULL; - SALOME_ModuleCatalog::Acomponent_ptr compo = NULL; - + SALOME_ModuleCatalog::Acomponent_ptr compo + = SALOME_ModuleCatalog::Acomponent::_nil(); C_parser = findComponent(s); if (C_parser) { -// DebugParserComponent(*C_parser); + // DebugParserComponent(*C_parser); SALOME_ModuleCatalog::Component C_corba; duplicate(C_corba, *C_parser); @@ -477,7 +491,6 @@ SALOME_ModuleCatalogImpl::GetComponent(const char* name) // return NULL object if(MYDEBUG) MESSAGE("Component with name " << name << " not found in catalog"); - compo = NULL; } return compo; @@ -508,13 +521,15 @@ SALOME_ModuleCatalogImpl::findComponent(const string & name) if (!C_parser) for (unsigned int ind=0; ind < _personal_module_list.size();ind++) - if (name.compare(_personal_module_list[ind].name) == 0) - { - if(MYDEBUG) MESSAGE("Component named " << name - << " found in the personal catalog"); - C_parser = &(_personal_module_list[ind]); - break; - } + { + if (name.compare(_personal_module_list[ind].name) == 0) + { + if(MYDEBUG) MESSAGE("Component named " << name + << " found in the personal catalog"); + C_parser = &(_personal_module_list[ind]); + break; + } + } if (!C_parser) for (unsigned int ind=0; ind < _general_module_list.size();ind++) @@ -662,16 +677,24 @@ void SALOME_ModuleCatalogImpl::duplicate // duplicate out Parameters _length = S_parser.outParameters.size(); S_corba.ServiceoutParameter.length(_length); - + +#ifndef WNT for (unsigned int ind2 = 0; ind2 < _length ; ind2 ++) +#else + for (ind2 = 0; ind2 < _length ; ind2 ++) +#endif duplicate(S_corba.ServiceoutParameter[ind2], S_parser.outParameters[ind2]); // duplicate in DataStreamParameters _length = S_parser.inDataStreamParameters.size(); S_corba.ServiceinDataStreamParameter.length(_length); - + +#ifndef WNT for (unsigned int ind2 = 0; ind2 < _length ; ind2 ++) +#else + for (ind2 = 0; ind2 < _length ; ind2 ++) +#endif duplicate(S_corba.ServiceinDataStreamParameter[ind2], S_parser.inDataStreamParameters[ind2]); @@ -679,8 +702,12 @@ void SALOME_ModuleCatalogImpl::duplicate _length = S_parser.outDataStreamParameters.size(); if(MYDEBUG) SCRUTE(_length); S_corba.ServiceoutDataStreamParameter.length(_length); - + +#ifndef WNT for (unsigned int ind2 = 0; ind2 < _length ; ind2 ++) +#else + for (ind2 = 0; ind2 < _length ; ind2 ++) +#endif duplicate(S_corba.ServiceoutDataStreamParameter[ind2], S_parser.outDataStreamParameters[ind2]); } @@ -790,7 +817,11 @@ SALOME_ModuleCatalogImpl::_verify_path_prefix(ParserPathPrefixes & pathList) } // Parse if a computer name is twice in the list of computers +#ifndef WNT for (unsigned int ind = 0; ind < _machine_list.size(); ind++) +#else + for (ind = 0; ind < _machine_list.size(); ind++) +#endif { for (unsigned int ind1 = ind+1 ; ind1 < _machine_list.size(); ind1++) { diff --git a/src/ModuleCatalog/SALOME_ModuleCatalog_impl.hxx b/src/ModuleCatalog/SALOME_ModuleCatalog_impl.hxx index 712091151..aef5c2daf 100644 --- a/src/ModuleCatalog/SALOME_ModuleCatalog_impl.hxx +++ b/src/ModuleCatalog/SALOME_ModuleCatalog_impl.hxx @@ -30,7 +30,6 @@ #ifndef MODULECATALOG_IMPL_H #define MODULECATALOG_IMPL_H -#include "utilities.h" #include #include @@ -39,7 +38,22 @@ #include #include CORBA_SERVER_HEADER(SALOME_ModuleCatalog) -class SALOME_ModuleCatalogImpl: public POA_SALOME_ModuleCatalog::ModuleCatalog, + +#if defined MODULECATALOG_EXPORTS +#if defined WIN32 +#define MODULECATALOG_EXPORT __declspec( dllexport ) +#else +#define MODULECATALOG_EXPORT +#endif +#else +#if defined WNT +#define MODULECATALOG_EXPORT __declspec( dllimport ) +#else +#define MODULECATALOG_EXPORT +#endif +#endif + +class MODULECATALOG_EXPORT SALOME_ModuleCatalogImpl: public POA_SALOME_ModuleCatalog::ModuleCatalog, public PortableServer::RefCountServantBase { public: diff --git a/src/ModuleGenerator/IDLparser.py b/src/ModuleGenerator/IDLparser.py index a653da09e..3cf31f9b7 100644 --- a/src/ModuleGenerator/IDLparser.py +++ b/src/ModuleGenerator/IDLparser.py @@ -49,7 +49,7 @@ nb_components = 0 # catalog=/tmp/myxml.xml #-------------------------------------------------- def getParamValue( param_name, default_value, args ): - pattern=param_name+"=" + pattern="^"+param_name+"=" res = default_value #initial value for opt in args: @@ -410,12 +410,20 @@ class Component(Tree): Tree.__init__(self, 'component', key=name) if name is None: return - self.addNamedChild('component-name', name) +# ASV : fix for bug PAL8922 (Component name indicated by user in GUI is not taken into account + if common_data["COMP_NAME"] != '': + self.addNamedChild('component-name', common_data["COMP_NAME"]) + else: + self.addNamedChild('component-name', name) +# ASV : if user name is NOT set, then use component-name instead. Else - default. if common_data["COMP_UNAME"] != '': self.addNamedChild('component-username', common_data["COMP_UNAME"]) else: - self.addNamedChild('component-username', name) + if common_data["COMP_NAME"] != '': + self.addNamedChild('component-username', common_data["COMP_NAME"] ) + else: + self.addNamedChild('component-username', name) self.addNamedChild('component-type', common_data["COMP_TYPE"]) self.addNamedChild('component-author', common_data["AUTHOR"]) @@ -629,15 +637,15 @@ class ModuleCatalogVisitor (idlvisitor.AstVisitor): self.currentService = self.currentInterface.createService \ (node.identifier()) - - for c in node.parameters(): - c.accept(self) node.returnType().accept(self) if (self.currentType != "void"): self.currentService.createOutParameter \ ("return", self.currentType) + for c in node.parameters(): + c.accept(self) + for i in node.comments(): self.currentInterface.comments.append(str(i)) @@ -673,7 +681,7 @@ def run(tree, args): common_data["ICON"] = getParamValue("icon", "", args) common_data["AUTHOR"] = getParamValue("author", os.getenv("USER"), args) common_data["VERSION"] = getParamValue("version", "1", args) - common_data["COMP_NAME"] = getParamValue("name", "", args) + common_data["COMP_NAME"] = getParamValue("name", "", args) common_data["COMP_UNAME"] = getParamValue("username", "", args) common_data["COMP_TYPE"] = getParamValue("type", "OTHER", args) common_data["COMP_MULT"] = getParamValue("multistudy", "1", args) diff --git a/src/NamingService/Makefile.in b/src/NamingService/Makefile.in index 2951501b1..13281780c 100644 --- a/src/NamingService/Makefile.in +++ b/src/NamingService/Makefile.in @@ -48,6 +48,7 @@ LIB_SRC = \ SALOME_NamingService.cxx \ ServiceUnreachable.cxx \ NamingService_WaitForServerReadiness.cxx +LIB_SERVER_IDL = SALOME_Exception.idl LDFLAGS+= -lOpUtil diff --git a/src/NamingService/NamingService_WaitForServerReadiness.cxx b/src/NamingService/NamingService_WaitForServerReadiness.cxx index 7cb1a6bce..6b1503670 100644 --- a/src/NamingService/NamingService_WaitForServerReadiness.cxx +++ b/src/NamingService/NamingService_WaitForServerReadiness.cxx @@ -66,7 +66,7 @@ void NamingService_WaitForServerReadiness(SALOME_NamingService* NS, { if (serverName.length() == 0) { - string curdir = NS->Current_Directory(); // to wait for naming service + string dummyadr = NS->getIORaddr(); // to wait for naming service found = 1; break; // naming service found } @@ -79,13 +79,21 @@ void NamingService_WaitForServerReadiness(SALOME_NamingService* NS, break; // server found, no more try to do } MESSAGE("Server "<< serverName <<" not yet ready, waiting..."); +#ifndef WNT int a = nanosleep(&ts_req,&ts_rem); // wait before retry +#else + Sleep(TIMESleep/1000000); +#endif } } catch( ServiceUnreachable& ) { MESSAGE("CORBA::COMM_FAILURE: Naming Service not yet ready, waiting..."); +#ifndef WNT int a = nanosleep(&ts_req,&ts_rem); // wait before retry +#else + Sleep(TIMESleep/1000000); +#endif } } if (!found) diff --git a/src/NamingService/NamingService_WaitForServerReadiness.hxx b/src/NamingService/NamingService_WaitForServerReadiness.hxx index e65693117..f5fdd578f 100644 --- a/src/NamingService/NamingService_WaitForServerReadiness.hxx +++ b/src/NamingService/NamingService_WaitForServerReadiness.hxx @@ -29,8 +29,13 @@ #include #include "SALOME_NamingService.hxx" +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif -void NamingService_WaitForServerReadiness(SALOME_NamingService* NS, +void SALOME_WNT_EXPORT NamingService_WaitForServerReadiness(SALOME_NamingService* NS, std::string serverName); #endif diff --git a/src/NamingService/SALOME_NamingService.cxx b/src/NamingService/SALOME_NamingService.cxx index e939d5341..0692af495 100644 --- a/src/NamingService/SALOME_NamingService.cxx +++ b/src/NamingService/SALOME_NamingService.cxx @@ -33,6 +33,7 @@ #include #include +#include using namespace std; @@ -69,7 +70,8 @@ SALOME_NamingService::SALOME_NamingService(CORBA::ORB_ptr orb) SALOME_NamingService::~SALOME_NamingService() { - MESSAGE("SALOME_NamingService destruction"); + // Problem MESSAGE with singleton: late destruction, after trace system destruction ? + //MESSAGE("SALOME_NamingService destruction"); } //---------------------------------------------------------------------- @@ -80,7 +82,8 @@ SALOME_NamingService::~SALOME_NamingService() void SALOME_NamingService::init_orb(CORBA::ORB_ptr orb) { - // MESSAGE("SALOME_NamingService initialisation"); + MESSAGE("SALOME_NamingService initialisation"); + Utils_Locker lock(&_myMutex); _orb = orb ; _initialize_root_context(); } @@ -100,7 +103,8 @@ void SALOME_NamingService::Register(CORBA::Object_ptr ObjRef, const char* Path) throw(ServiceUnreachable) { - // MESSAGE("BEGIN OF Register: "<< Path); + MESSAGE("BEGIN OF Register: "<< Path); + Utils_Locker lock(&_myMutex); int dimension_Path = strlen(Path) + 1; char** resultat_resolve_Path = new char* [dimension_Path]; @@ -151,9 +155,9 @@ void SALOME_NamingService::Register(CORBA::Object_ptr ObjRef, { INFOS("!!!Register() : CosNaming::NamingContext::CannotProceed"); } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS("!!!Register() : CORBA::COMM_FAILURE : unable to contact" + INFOS("!!!Register() : CORBA::SystemException : unable to contact" << " the naming service"); throw ServiceUnreachable(); } @@ -218,9 +222,9 @@ void SALOME_NamingService::Register(CORBA::Object_ptr ObjRef, { INFOS("!!!Register() : CosNaming::NamingContext::InvalidName"); } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS("!!!Register() :CORBA::COMM_FAILURE : unable to contact" + INFOS("!!!Register() :CORBA::SystemException : unable to contact" << " the naming service"); throw ServiceUnreachable(); } @@ -270,9 +274,9 @@ void SALOME_NamingService::Register(CORBA::Object_ptr ObjRef, INFOS("!!!Register() : CosNaming::NamingContext::AlreadyBound, object will be rebind"); _current_context->rebind(_context_name, ObjRef); } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS("!!!Register() :CORBA::COMM_FAILURE : unable to contact" + INFOS("!!!Register() :CORBA::SystemException : unable to contact" << " the naming service"); throw ServiceUnreachable(); } @@ -298,7 +302,8 @@ void SALOME_NamingService::Register(CORBA::Object_ptr ObjRef, CORBA::Object_ptr SALOME_NamingService::Resolve(const char* Path) throw(ServiceUnreachable) { - //MESSAGE("BEGIN OF Resolve: " << Path); + MESSAGE("BEGIN OF Resolve: " << Path); + Utils_Locker lock(&_myMutex); int dimension_Path = strlen(Path) + 1; char** resultat_resolve_Path = new char* [dimension_Path]; @@ -352,9 +357,9 @@ CORBA::Object_ptr SALOME_NamingService::Resolve(const char* Path) { INFOS("!!!Resolve() : CosNaming::NamingContext::InvalidName"); } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS("!!!Resolve() :CORBA::COMM_FAILURE : unable to contact" + INFOS("!!!Resolve() :CORBA::SystemException : unable to contact" << "the naming service"); throw ServiceUnreachable(); } @@ -368,6 +373,162 @@ CORBA::Object_ptr SALOME_NamingService::Resolve(const char* Path) return _obj; } +//---------------------------------------------------------------------- +/*! Function : ResolveFirst + * Purpose : method to get an ObjRef with a symbolic name + * \param Path const char* argument like "/path/name" + * search the fist reference like "/path(.dir)/name*(.kind)" + * If the NamingService is out, the exception ServiceUnreachable is thrown + + + + + * \return the object reference + */ +//---------------------------------------------------------------------- + +CORBA::Object_ptr SALOME_NamingService::ResolveFirst(const char* Path) + throw(ServiceUnreachable) +{ + MESSAGE("ResolveFirst"); + Utils_Locker lock(&_myMutex); + SCRUTE(Path); + string thePath =Path; + string basePath ="/"; + string name = thePath; + string::size_type idx = thePath.rfind('/'); + if (idx != string::npos) // at least one '/' found + { + basePath = thePath.substr(0,idx); + name = thePath.substr(idx+1); + SCRUTE(basePath); + } + SCRUTE(name); + CORBA::Object_ptr obj = CORBA::Object::_nil(); + bool isOk = Change_Directory(basePath.c_str()); + if (isOk) + { + vector listElem = list_directory(); + vector::iterator its = listElem.begin(); + while (its != listElem.end()) + { + MESSAGE(*its); + if ((*its).find(name) == 0) + { + //string instance = basePath + "/" + *its; + return Resolve((*its).c_str()); + } + its++; + } + } + return obj; +} + +//---------------------------------------------------------------------- +/*! Function : Resolve Component from hostname, containername, componentName and number of prcoessors + * Purpose : method to get the ObjRef of a component + * If the NamingService is out, the exception ServiceUnreachable is thrown + * \param hostname const char* argument + * \param containername const char* argument + * \param componentname const char* argument + * \param nbproc const int argument + * \return the object reference + */ +//---------------------------------------------------------------------- + +CORBA::Object_ptr SALOME_NamingService::ResolveComponent(const char* hostname, const char* containerName, const char* componentName, const int nbproc) +{ + MESSAGE("ResolveComponent"); + Utils_Locker lock(&_myMutex); + + string name="/Containers/"; + name += hostname; + if( strlen(containerName) != 0 ){ + name += "/"; + if( nbproc >=1 ){ + char *newContainerName = new char[strlen(containerName)+8]; + sprintf(newContainerName,"%s_%d",containerName,nbproc); + name += newContainerName; + } + else + name += containerName; + name += "/"; + name += componentName; + return ResolveFirst(name.c_str()); + } + else { + Change_Directory(name.c_str()); + vector contList = list_directory(); + for(unsigned int ind = 0; ind < contList.size(); ind++){ + name = contList[ind].c_str(); + name += "/"; + name += componentName; + CORBA::Object_ptr obj = ResolveFirst(name.c_str()); + if( !CORBA::is_nil(obj) ) + return obj; + } + return CORBA::Object::_nil(); + } + +} + +string SALOME_NamingService::ContainerName(const char *containerName) +{ + string ret; + + if (strlen(containerName)== 0) + ret = "FactoryServer"; + else + ret = containerName; + + return ret; +} + +string SALOME_NamingService::ContainerName(const Engines::MachineParameters& params) +{ + int nbproc; + if( !params.isMPI ) + nbproc = 0; + else if( (params.nb_node <= 0) && (params.nb_proc_per_node <= 0) ) + nbproc = 1; + else if( params.nb_node == 0 ) + nbproc = params.nb_proc_per_node; + else if( params.nb_proc_per_node == 0 ) + nbproc = params.nb_node; + else + nbproc = params.nb_node * params.nb_proc_per_node; + + string ret=ContainerName(params.container_name); + + if( nbproc >=1 ){ + char *suffix = new char[8]; + sprintf(suffix,"_%d",nbproc); + ret += suffix; + } + + return ret; +} + +string SALOME_NamingService::BuildContainerNameForNS(const char *containerName, const char *hostname) +{ + string ret="/Containers/"; + ret += hostname; + ret+="/"; + ret+=ContainerName(containerName); + + return ret; +} + +string SALOME_NamingService::BuildContainerNameForNS(const Engines::MachineParameters& params, const char *hostname) +{ + string ret="/Containers/"; + ret += hostname; + ret+="/"; + ret+=ContainerName(params); + + return ret; +} + //---------------------------------------------------------------------- /*! Function : Find * Purpose : method to research a name from the current directory @@ -384,15 +545,16 @@ CORBA::Object_ptr SALOME_NamingService::Resolve(const char* Path) int SALOME_NamingService::Find(const char* name) throw(ServiceUnreachable) { - // MESSAGE("BEGIN OF Find " << name); + MESSAGE("BEGIN OF Find " << name); + Utils_Locker lock(&_myMutex); CORBA::Long occurence_number = 0 ; try { _Find(name,occurence_number); } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS("!!!Find() : CORBA::COMM_FAILURE : unable to contact" + INFOS("!!!Find() : CORBA::SystemException : unable to contact" << " the naming service"); throw ServiceUnreachable(); } @@ -411,7 +573,8 @@ int SALOME_NamingService::Find(const char* name) bool SALOME_NamingService::Create_Directory(const char* Path) throw(ServiceUnreachable) { - //MESSAGE("BEGIN OF Create_Directory"); + MESSAGE("BEGIN OF Create_Directory"); + Utils_Locker lock(&_myMutex); int dimension_Path = strlen(Path) + 1; char** resultat_resolve_Path= new char* [dimension_Path];; CORBA::Boolean _return_code = true ; @@ -495,10 +658,10 @@ bool SALOME_NamingService::Create_Directory(const char* Path) _return_code = false; INFOS("!!!Create_Directory():CosNaming::NamingContext::InvalidName"); } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { _return_code = false; - INFOS("!!!Register() :CORBA::COMM_FAILURE : unable to contact" + INFOS("!!!Register() :CORBA::SystemException : unable to contact" << " the naming service"); throw ServiceUnreachable(); } @@ -525,7 +688,8 @@ bool SALOME_NamingService::Create_Directory(const char* Path) bool SALOME_NamingService::Change_Directory(const char* Path) throw(ServiceUnreachable) { - //MESSAGE("BEGIN OF Change_Directory " << Path); + MESSAGE("BEGIN OF Change_Directory " << Path); + Utils_Locker lock(&_myMutex); int dimension_Path = strlen(Path) + 1; char** resultat_resolve_Path = new char* [dimension_Path]; CORBA::Boolean _return_code = true ; @@ -588,10 +752,10 @@ bool SALOME_NamingService::Change_Directory(const char* Path) _return_code = false; INFOS( "!!!Change_Directory() : CosNaming::NamingContext::InvalidName" ) } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { _return_code = false; - INFOS( "!!!Change_Directory() :CORBA::COMM_FAILURE : unable to contact" + INFOS( "!!!Change_Directory() :CORBA::SystemException : unable to contact" << "the naming service") throw ServiceUnreachable(); } @@ -617,7 +781,8 @@ bool SALOME_NamingService::Change_Directory(const char* Path) char* SALOME_NamingService::Current_Directory() throw(ServiceUnreachable) { - //MESSAGE("BEGIN OF Current_Directory"); + MESSAGE("BEGIN OF Current_Directory"); + Utils_Locker lock(&_myMutex); CosNaming::NamingContext_var _ref_context = _current_context; @@ -633,9 +798,9 @@ char* SALOME_NamingService::Current_Directory() { _current_directory(result_path,i,_ref_context,_continue ); } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS("!!!Current_Directory(): CORBA::COMM_FAILURE : unable to contact" + INFOS("!!!Current_Directory(): CORBA::SystemException : unable to contact" << " the naming service" ) throw ServiceUnreachable(); } @@ -648,7 +813,11 @@ char* SALOME_NamingService::Current_Directory() char* return_Path = new char[length_path +2]; return_Path[0] = '/' ; return_Path[1] = '\0' ; +#ifndef WNT for (int k = 0 ; k SALOME_NamingService::list_directory() vector SALOME_NamingService::list_directory_recurs() throw(ServiceUnreachable) { + MESSAGE("list_directory_recurs"); + Utils_Locker lock(&_myMutex); vector _list ; char *currentDir=Current_Directory(); _list_directory_recurs(_list,0,currentDir); @@ -768,6 +940,7 @@ void SALOME_NamingService::Destroy_Name(const char* Path) throw(ServiceUnreachable) { MESSAGE("BEGIN OF Destroy_Name"); + Utils_Locker lock(&_myMutex); int dimension_Path = strlen(Path) + 1; char** resultat_resolve_Path = new char* [dimension_Path]; @@ -817,9 +990,9 @@ void SALOME_NamingService::Destroy_Name(const char* Path) { INFOS( "!!!Destroy_Name(): CosNaming::NamingContext::CannotProceed" ) } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS( "!!!Destroy_Name() : CORBA::COMM_FAILURE : unable to contact" + INFOS( "!!!Destroy_Name() : CORBA::SystemException : unable to contact" << " the naming service") throw ServiceUnreachable(); } @@ -861,9 +1034,9 @@ void SALOME_NamingService::Destroy_Name(const char* Path) { INFOS( "!!!Destroy_Name() : CosNaming::NamingContext::InvalidName") } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS( "!!!Destroy_Name() :CORBA::COMM_FAILURE : unable to contact" + INFOS( "!!!Destroy_Name() :CORBA::SystemException : unable to contact" << " the naming service") throw ServiceUnreachable(); } @@ -889,6 +1062,7 @@ void SALOME_NamingService::Destroy_Directory(const char* Path) throw(ServiceUnreachable) { MESSAGE("BEGIN OF Destroy_Directory"); + Utils_Locker lock(&_myMutex); int dimension_Path = strlen(Path) + 1; char** resultat_resolve_Path = new char* [dimension_Path]; @@ -940,9 +1114,9 @@ void SALOME_NamingService::Destroy_Directory(const char* Path) { INFOS("!!!Destroy_Directory(): CosNaming::NamingContext::CannotProceed" ) } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS( "!!!Destroy_Directory() : CORBA::COMM_FAILURE : unable to contact" + INFOS( "!!!Destroy_Directory() : CORBA::SystemException : unable to contact" << " the naming service" ) throw ServiceUnreachable(); } @@ -984,9 +1158,9 @@ void SALOME_NamingService::Destroy_Directory(const char* Path) { INFOS( "!!!Destroy_Directory(): CosNaming::NamingContext::CannotProceed" ) } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS( "!!!Destroy_Directory() : CORBA::COMM_FAILURE : unable to contact" + INFOS( "!!!Destroy_Directory() : CORBA::SystemException : unable to contact" << " the naming service" ) throw ServiceUnreachable(); } @@ -1003,9 +1177,9 @@ void SALOME_NamingService::Destroy_Directory(const char* Path) INFOS( "!!!Destroy_Directory() : CosNaming::NamingContext::NoEmpty " << Path << " is not empty" ) } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS( "!!!Destroy_Directory() :CORBA::COMM_FAILURE : " + INFOS( "!!!Destroy_Directory() :CORBA::SystemException : " << "unable to contact the naming service") throw ServiceUnreachable(); } @@ -1039,9 +1213,9 @@ void SALOME_NamingService::Destroy_Directory(const char* Path) { INFOS( "!!!Destroy_Directory() : CosNaming::NamingContext::InvalidName") } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS( "!!!Destroy_Directory() :CORBA::COMM_FAILURE : unable to contact" + INFOS( "!!!Destroy_Directory() :CORBA::SystemException : unable to contact" << " the naming service") throw ServiceUnreachable(); } @@ -1053,6 +1227,27 @@ void SALOME_NamingService::Destroy_Directory(const char* Path) delete[] resultat_resolve_Path ; } +//---------------------------------------------------------------------- +/*! Function : Destroy_Directory. + * Purpose : method to destroy a directory if it is empty. + * WARNING : The complete Path to the directory (from the root_context) + * to destroy should be given. + * If the NamingService is out, the exception ServiceUnreachable is thrown. + * \param Path const char* arguments + */ +//---------------------------------------------------------------------- + +void SALOME_NamingService::Destroy_FullDirectory(const char* Path) + throw(ServiceUnreachable) +{ + Change_Directory(Path); + vector contList = list_directory(); + for(unsigned int ind = 0; ind < contList.size(); ind++) + Destroy_Name(contList[ind].c_str()); + Destroy_Directory(Path); + Destroy_Name(Path); +} + //---------------------------------------------------------------------- /*! Function : _initialize_root_context * Purpose : method called by constructor to initialize _root_context @@ -1070,9 +1265,9 @@ void SALOME_NamingService::_initialize_root_context() ASSERT(!CORBA::is_nil(_root_context)); } - catch(CORBA::COMM_FAILURE&) + catch(CORBA::SystemException&) { - INFOS("CORBA::COMM_FAILURE: unable to contact the naming service"); + INFOS("CORBA::SystemException: unable to contact the naming service"); throw ServiceUnreachable(); } catch(...) @@ -1284,7 +1479,7 @@ SALOME_NamingService::_current_directory(char** result_path, CosNaming::NamingContext_var _temp_context = _current_context; _current_context->list(nb, _binding_list, _binding_iterator) ; - + if ( !_binding_iterator->_is_nil() ) { while ((_binding_iterator->next_one(_binding)) && _continue) { CosNaming::Name _bindingName = _binding->binding_name; if (_binding->binding_type == CosNaming::ncontext) @@ -1324,6 +1519,7 @@ SALOME_NamingService::_current_directory(char** result_path, } } _binding_iterator->destroy(); + } // We go to the last directory where an occurence was found _current_context = _ref_context ; } @@ -1383,6 +1579,8 @@ void SALOME_NamingService::_list_directory_recurs(vector& myList, const //---------------------------------------------------------------------- -char * SALOME_NamingService::getIORaddr(){ +char * SALOME_NamingService::getIORaddr() +{ return _orb->object_to_string(_root_context); } + diff --git a/src/NamingService/SALOME_NamingService.hxx b/src/NamingService/SALOME_NamingService.hxx index db9c39e17..d418b47b7 100644 --- a/src/NamingService/SALOME_NamingService.hxx +++ b/src/NamingService/SALOME_NamingService.hxx @@ -33,11 +33,29 @@ #include #include #include +#include "Utils_Mutex.hxx" +#include +#include CORBA_CLIENT_HEADER(SALOME_ContainerManager) +#include CORBA_CLIENT_HEADER(SALOME_Component) //class ServiceUnreachable; #include "ServiceUnreachable.hxx" -class SALOME_NamingService +#if defined NAMINGSERVICE_EXPORTS +#if defined WIN32 +#define NAMINGSERVICE_EXPORT __declspec( dllexport ) +#else +#define NAMINGSERVICE_EXPORT +#endif +#else +#if defined WNT +#define NAMINGSERVICE_EXPORT __declspec( dllimport ) +#else +#define NAMINGSERVICE_EXPORT +#endif +#endif + +class NAMINGSERVICE_EXPORT SALOME_NamingService { public: //! default constructor @@ -60,6 +78,19 @@ public: CORBA::Object_ptr Resolve(const char* Path) throw( ServiceUnreachable); + //! method to get the ObjRef of a component + CORBA::Object_ptr ResolveComponent(const char* hostname, const char* containerName, const char* componentName, const int nbproc=0); + + //! method to get an ObjRef, given a symbolic name without instance suffix "/Path/Name*.kind" + CORBA::Object_ptr ResolveFirst(const char* Path) + throw( ServiceUnreachable); + + std::string ContainerName(const char *ContainerName); + std::string ContainerName(const Engines::MachineParameters& params); + + std::string BuildContainerNameForNS(const char *ContainerName, const char *hostname); + std::string BuildContainerNameForNS(const Engines::MachineParameters& params, const char *hostname); + //! method to research a name from the naming service's current directory int Find(const char* name) throw(ServiceUnreachable); @@ -97,10 +128,15 @@ public: virtual void Destroy_Directory(const char* Path) throw(ServiceUnreachable); + //! method to destroy a directory even if it is not empty + virtual void Destroy_FullDirectory(const char* Path) + throw(ServiceUnreachable); + //! get IORstring naming service address char * getIORaddr(); protected: + Utils_Mutex _myMutex; CORBA::ORB_ptr _orb; CosNaming::NamingContext_var _root_context, _current_context; @@ -134,3 +170,4 @@ protected: }; #endif // SALOME_NAMINGSERVICE_H + diff --git a/src/NamingService/SALOME_NamingServicePy.py b/src/NamingService/SALOME_NamingServicePy.py index 2bc3c553c..ab7f2050d 100644 --- a/src/NamingService/SALOME_NamingServicePy.py +++ b/src/NamingService/SALOME_NamingServicePy.py @@ -64,7 +64,7 @@ class SALOME_NamingServicePy_i: MESSAGE(" Name service not found") else: ok = 1 - except CORBA.COMM_FAILURE, ex: + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): MESSAGE(" Name service not found") time.sleep(0.25) steps = steps - 1 @@ -100,8 +100,8 @@ class SALOME_NamingServicePy_i: MESSAGE ( "Register : CosNaming.NamingContext.InvalidName" ) except CosNaming.NamingContext.CannotProceed, ex: MESSAGE ( "Register : CosNaming.NamingContext.CannotProceed" ) - except CORBA.COMM_FAILURE, ex: - MESSAGE ( "Register : CORBA.COMM_FAILURE" ) + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): + MESSAGE ( "Register : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" ) if _not_exist: # at least one context of the complete path is not created, we had @@ -132,8 +132,8 @@ class SALOME_NamingServicePy_i: except CosNaming.NamingContext.AlreadyBound, ex: MESSAGE ( "Register : CosNaming.NamingContext.AlreadyBound, object will be rebind" ) self._current_context.rebind(_context_name,ObjRef) - except CORBA.COMM_FAILURE, ex: - MESSAGE ( "Register : CORBA.COMM_FAILURE" ) + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): + MESSAGE ( "Register : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" ) #------------------------------------------------------------------------- @@ -161,8 +161,8 @@ class SALOME_NamingServicePy_i: except CosNaming.NamingContext.CannotProceed, ex: MESSAGE ( "Resolve : CosNaming.NamingContext.CannotProceed" ) self._obj = None - except CORBA.COMM_FAILURE, ex: - MESSAGE ( "Resolve : CORBA.COMM_FAILURE" ) + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): + MESSAGE ( "Resolve : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" ) self._obj = None return self._obj @@ -191,8 +191,8 @@ class SALOME_NamingServicePy_i: MESSAGE ( "Create_Directory : CosNaming.NamingContext.InvalidName" ) except CosNaming.NamingContext.CannotProceed, ex: MESSAGE ( "Create_Directory : CosNaming.NamingContext.CannotProceed" ) - except CORBA.COMM_FAILURE, ex: - MESSAGE ( "Create_Directory : CORBA.COMM_FAILURE" ) + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): + MESSAGE ( "Create_Directory : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" ) diff --git a/src/NamingService/ServiceUnreachable.hxx b/src/NamingService/ServiceUnreachable.hxx index 2124c76fe..9134e3244 100644 --- a/src/NamingService/ServiceUnreachable.hxx +++ b/src/NamingService/ServiceUnreachable.hxx @@ -31,9 +31,23 @@ #include "Utils_SALOME_Exception.hxx" +#if defined NAMINGSERVICE_EXPORTS +#if defined WIN32 +#define NAMINGSERVICE_EXPORT __declspec( dllexport ) +#else +#define NAMINGSERVICE_EXPORT +#endif +#else +#if defined WNT +#define NAMINGSERVICE_EXPORT __declspec( dllimport ) +#else +#define NAMINGSERVICE_EXPORT +#endif +#endif + //! exception class for NamingService : ServiceUnreachable -class ServiceUnreachable : public SALOME_Exception +class NAMINGSERVICE_EXPORT ServiceUnreachable : public SALOME_Exception { public : ServiceUnreachable( void ); diff --git a/src/Notification/NOTIFICATION.cxx b/src/Notification/NOTIFICATION.cxx index bbbb92294..e55d0abc7 100644 --- a/src/Notification/NOTIFICATION.cxx +++ b/src/Notification/NOTIFICATION.cxx @@ -50,7 +50,7 @@ CosNA_EventChannel_ptr NOTIFICATION_channel() { } catch(CORBA::ORB::InvalidName& ex) { MESSAGE("NOTIFICATION Error : service required is invalid [does not exist]"); return(channel); - } catch (CORBA::COMM_FAILURE& ex) { + } catch (CORBA::SystemException& ex) { MESSAGE("NOTIFICATION Error : caught system exception COMM_FAILURE"); return(channel); } catch (...) { @@ -70,7 +70,7 @@ CosNA_EventChannel_ptr NOTIFICATION_channel() { }; } catch(CORBA::ORB::InvalidName& ex) { MESSAGE("NOTIFICATION Error : invalid name"); - } catch (CORBA::COMM_FAILURE& ex) { + } catch (CORBA::SystemException& ex) { MESSAGE("NOTIFICATION Error : caught system exception COMM_FAILURE while resolving event channel name"); } catch (...) { MESSAGE("NOTIFICATION Error : caught exception while resolving event channel name"); diff --git a/src/Notification/NOTIFICATION.hxx b/src/Notification/NOTIFICATION.hxx index 4e8a08e06..3bc49294b 100644 --- a/src/Notification/NOTIFICATION.hxx +++ b/src/Notification/NOTIFICATION.hxx @@ -43,7 +43,22 @@ #include "NOTIFICATION_Supplier.hxx" #include "NOTIFICATION_Consumer.hxx" -char* NOTIFICATION_date(); -CosNA_EventChannel_ptr NOTIFICATION_channel(); + +#if defined NOTIFICATION_EXPORTS +#if defined WIN32 +#define NOTIFICATION_EXPORT __declspec( dllexport ) +#else +#define NOTIFICATION_EXPORT +#endif +#else +#if defined WNT +#define NOTIFICATION_EXPORT __declspec( dllimport ) +#else +#define NOTIFICATION_EXPORT +#endif +#endif + +NOTIFICATION_EXPORT char* NOTIFICATION_date(); +NOTIFICATION_EXPORT CosNA_EventChannel_ptr NOTIFICATION_channel(); #endif diff --git a/src/Notification/NOTIFICATION_Consumer.hxx b/src/Notification/NOTIFICATION_Consumer.hxx index 26470597c..653fca33f 100644 --- a/src/Notification/NOTIFICATION_Consumer.hxx +++ b/src/Notification/NOTIFICATION_Consumer.hxx @@ -28,7 +28,21 @@ #ifndef NOTIFICATION_Consumer_HXX #define NOTIFICATION_Consumer_HXX -class NOTIFICATION_Consumer: public POA_CosNotifyComm::StructuredPullConsumer { +#if defined NOTIFICATION_EXPORTS +#if defined WIN32 +#define NOTIFICATION_EXPORT __declspec( dllexport ) +#else +#define NOTIFICATION_EXPORT +#endif +#else +#if defined WNT +#define NOTIFICATION_EXPORT __declspec( dllimport ) +#else +#define NOTIFICATION_EXPORT +#endif +#endif + +class NOTIFICATION_EXPORT NOTIFICATION_Consumer: public POA_CosNotifyComm::StructuredPullConsumer { public: NOTIFICATION_Consumer(); virtual ~NOTIFICATION_Consumer(); diff --git a/src/Notification/NOTIFICATION_Supplier.hxx b/src/Notification/NOTIFICATION_Supplier.hxx index 77f44d07b..0f7070226 100644 --- a/src/Notification/NOTIFICATION_Supplier.hxx +++ b/src/Notification/NOTIFICATION_Supplier.hxx @@ -28,7 +28,21 @@ #ifndef NOTIFICATION_Supplier_HXX #define NOTIFICATION_Supplier_HXX -class NOTIFICATION_Supplier: public POA_CosNotifyComm::StructuredPushSupplier { +#if defined NOTIFICATION_EXPORTS +#if defined WIN32 +#define NOTIFICATION_EXPORT __declspec( dllexport ) +#else +#define NOTIFICATION_EXPORT +#endif +#else +#if defined WNT +#define NOTIFICATION_EXPORT __declspec( dllimport ) +#else +#define NOTIFICATION_EXPORT +#endif +#endif + +class NOTIFICATION_EXPORT NOTIFICATION_Supplier: public POA_CosNotifyComm::StructuredPushSupplier { public: NOTIFICATION_Supplier(const char* instanceName, bool notif); virtual ~NOTIFICATION_Supplier(); diff --git a/src/Registry/Makefile.in b/src/Registry/Makefile.in index 8b5eb524c..73b61f60d 100644 --- a/src/Registry/Makefile.in +++ b/src/Registry/Makefile.in @@ -46,7 +46,7 @@ LIB = libRegistry.la LIB_SRC = \ RegistryConnexion.cxx \ RegistryService.cxx -LIB_CLIENT_IDL = SALOME_Registry.idl +LIB_CLIENT_IDL = SALOME_Registry.idl SALOME_Exception.idl # Executables targets BIN = SALOME_Registry_Server @@ -55,6 +55,6 @@ BIN_SERVER_IDL = SALOME_Registry.idl LDFLAGS+= -lSalomeNS -lOpUtil -lSALOMELocalTrace -LDFLAGSFORBIN= $(LDFLAGS) -lSALOMETraceCollector +LDFLAGSFORBIN= $(LDFLAGS) -lSALOMEBasics @CONCLUDE@ diff --git a/src/Registry/RegistryConnexion.cxx b/src/Registry/RegistryConnexion.cxx index bf33e0882..de079550f 100644 --- a/src/Registry/RegistryConnexion.cxx +++ b/src/Registry/RegistryConnexion.cxx @@ -98,7 +98,11 @@ RegistryConnexion::~RegistryConnexion() _VarComponents->remove( _Id ) ; } _Id = 0 ; +#ifndef WNT delete [] _Ior; +#else + delete [] (char*) _Ior; +#endif _Ior = 0; _SessionName = ""; _Name = "" ; @@ -121,7 +125,7 @@ void RegistryConnexion::add( const char *aName ) infos.pid = lesInfos.pid() ; infos.machine = CORBA::string_dup( lesInfos.host_char() ) ; infos.adip = CORBA::string_dup( lesInfos.adip() ) ; - infos.uid = lesInfos.uid() ; + infos.uid = (long)lesInfos.uid() ; infos.pwname = CORBA::string_dup( lesInfos.pwname() ) ; infos.tc_start = lesInfos.start() ; infos.tc_hello = 0 ; diff --git a/src/Registry/RegistryConnexion.hxx b/src/Registry/RegistryConnexion.hxx index 5b945cd41..c241618ef 100644 --- a/src/Registry/RegistryConnexion.hxx +++ b/src/Registry/RegistryConnexion.hxx @@ -37,7 +37,21 @@ #include CORBA_CLIENT_HEADER(SALOME_Registry) #include -class RegistryConnexion +#if defined REGISTRY_EXPORTS +#if defined WIN32 +#define REGISTRY_EXPORT __declspec( dllexport ) +#else +#define REGISTRY_EXPORT +#endif +#else +#if defined WNT +#define REGISTRY_EXPORT __declspec( dllimport ) +#else +#define REGISTRY_EXPORT +#endif +#endif + +class REGISTRY_EXPORT RegistryConnexion { protected : const char* _Ior ; // engine ior diff --git a/src/Registry/RegistryService.cxx b/src/Registry/RegistryService.cxx index 8aed1d77f..77c55a7a1 100644 --- a/src/Registry/RegistryService.cxx +++ b/src/Registry/RegistryService.cxx @@ -35,7 +35,9 @@ extern "C" # include } +#ifndef WNT #include +#endif using namespace std; /* ------------------------------*/ @@ -70,7 +72,11 @@ RegistryService::~RegistryService() _Compteur = -1 ; if ( _SessionName ) { +#ifndef WNT delete [] _SessionName ; +#else + delete [] (char*)_SessionName ; +#endif _SessionName = 0 ; } END_OF("RegistryService::~RegistryService()") ; @@ -104,8 +110,11 @@ CORBA::ULong RegistryService::add( const Registry::Infos & infos ) return (CORBA::ULong)_Compteur ; } - +#ifndef WNT void RegistryService::remove( const CORBA::ULong id) +#else +void RegistryService::remove( CORBA::ULong id) +#endif { BEGIN_OF("RegistryService::remove") ; SCRUTE(id) ; @@ -129,8 +138,11 @@ void RegistryService::remove( const CORBA::ULong id) } - +#ifndef WNT void RegistryService::hello( const CORBA::ULong id ) +#else +void RegistryService::hello( CORBA::ULong id ) +#endif { BEGIN_OF("RegistryService::hello") ; SCRUTE(id) ; diff --git a/src/Registry/RegistryService.hxx b/src/Registry/RegistryService.hxx index 63f7d57e4..c07043e50 100644 --- a/src/Registry/RegistryService.hxx +++ b/src/Registry/RegistryService.hxx @@ -34,8 +34,21 @@ # include - -class RegistryService : public POA_Registry::Components //, public PortableServer::RefCountServantBase +#if defined REGISTRY_EXPORTS +#if defined WIN32 +#define REGISTRY_EXPORT __declspec( dllexport ) +#else +#define REGISTRY_EXPORT +#endif +#else +#if defined WNT +#define REGISTRY_EXPORT __declspec( dllimport ) +#else +#define REGISTRY_EXPORT +#endif +#endif + +class REGISTRY_EXPORT RegistryService : public POA_Registry::Components //, public PortableServer::RefCountServantBase { public : @@ -73,8 +86,13 @@ public : void ping(); virtual CORBA::ULong add (const Registry::Infos & infos); virtual CORBA::ULong size ( void ); +#ifndef WNT virtual void remove( const CORBA::ULong id ); virtual void hello( const CORBA::ULong id ); +#else + virtual void remove( CORBA::ULong id ); + virtual void hello( CORBA::ULong id ); +#endif virtual void end(void); virtual Registry::AllInfos *getall(void); diff --git a/src/Registry/SALOME_Registry_Server.cxx b/src/Registry/SALOME_Registry_Server.cxx index d47523a93..0131bb901 100644 --- a/src/Registry/SALOME_Registry_Server.cxx +++ b/src/Registry/SALOME_Registry_Server.cxx @@ -27,8 +27,8 @@ // $Header$ #include -#include -#include +#include +#include extern "C" { @@ -54,7 +54,7 @@ int main( int argc , char **argv ) { ORB_INIT &init = *SINGLETON_::Instance() ; CORBA::ORB_var &orb = init( argc , argv ) ; - SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); BEGIN_OF( argv[0] ) INFOS_COMPILATION SCRUTE(argc) @@ -105,7 +105,11 @@ int main( int argc , char **argv ) for (int i = 1; i<=NumberOfTries; i++) { if (i!=1) +#ifndef WNT a=nanosleep(&ts_req,&ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try { obj = orb->resolve_initial_references("RootPOA"); @@ -118,9 +122,9 @@ int main( int argc , char **argv ) if (!CORBA::is_nil(theObj)) inc = CosNaming::NamingContext::_narrow(theObj); } - catch( CORBA::COMM_FAILURE& ) + catch( CORBA::SystemException& ) { - MESSAGE( "Registry Server: CORBA::COMM_FAILURE: Unable to contact the Naming Service" ); + MESSAGE( "Registry Server: CORBA::SystemException: Unable to contact the Naming Service" ); } if(!CORBA::is_nil(inc)) { @@ -130,7 +134,11 @@ int main( int argc , char **argv ) for(int j=1; j<=NumberOfTries; j++) { if (j!=1) +#ifndef WNT a=nanosleep(&ts_req, &ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try { object = inc->resolve(name); @@ -211,6 +219,6 @@ int main( int argc , char **argv ) } END_OF( argv[0] ) ; - delete myThreadTrace; + // delete myThreadTrace; return 0 ; } diff --git a/src/ResourcesManager/Makefile.in b/src/ResourcesManager/Makefile.in index ac30999d7..e3aca30fa 100755 --- a/src/ResourcesManager/Makefile.in +++ b/src/ResourcesManager/Makefile.in @@ -53,13 +53,13 @@ LIB_SRC = \ # in fact client is a test ! So it may go away BIN ! #BIN = test_rc2 #SALOME_RessourcesCatalog_Server SALOME_RessourcesCatalog_Client test -LIB_CLIENT_IDL = SALOME_ContainerManager.idl SALOME_Component.idl +LIB_CLIENT_IDL = SALOME_ContainerManager.idl SALOME_Component.idl SALOME_Exception.idl BIN_SRC = BIN_SERVER_IDL = SALOME_ContainerManager.idl CPPFLAGS+= $(QT_MT_INCLUDES) -I$(srcdir)/../Container CXXFLAGS+= -LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMETraceCollector +LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace @CONCLUDE@ diff --git a/src/ResourcesManager/SALOME_LoadRateManager.cxx b/src/ResourcesManager/SALOME_LoadRateManager.cxx index ab5aa4d88..00166fec4 100644 --- a/src/ResourcesManager/SALOME_LoadRateManager.cxx +++ b/src/ResourcesManager/SALOME_LoadRateManager.cxx @@ -1,9 +1,16 @@ #include "SALOME_LoadRateManager.hxx" +#include "utilities.h" +#include using namespace std; string SALOME_LoadRateManager::FindBest(const Engines::MachineList& hosts) { // for the moment then "maui" will be used for dynamic selection ... + MESSAGE("SALOME_LoadRateManager::FindBest " << hosts.length()); + + if (hosts.length() == 0) + return string(""); + return string(hosts[0]); } diff --git a/src/ResourcesManager/SALOME_LoadRateManager.hxx b/src/ResourcesManager/SALOME_LoadRateManager.hxx index 9a5d98441..1f2677748 100644 --- a/src/ResourcesManager/SALOME_LoadRateManager.hxx +++ b/src/ResourcesManager/SALOME_LoadRateManager.hxx @@ -5,10 +5,26 @@ #include CORBA_CLIENT_HEADER(SALOME_ContainerManager) #include -class SALOME_LoadRateManager -{ -public: - std::string FindBest(const Engines::MachineList& hosts); -}; + +#if defined RESOURCESMANAGER_EXPORTS +#if defined WIN32 +#define RESOURCESMANAGER_EXPORT __declspec( dllexport ) +#else +#define RESOURCESMANAGER_EXPORT +#endif +#else +#if defined WNT +#define RESOURCESMANAGER_EXPORT __declspec( dllimport ) +#else +#define RESOURCESMANAGER_EXPORT +#endif +#endif + +class RESOURCESMANAGER_EXPORT SALOME_LoadRateManager + { + + public: + std::string FindBest(const Engines::MachineList& hosts); + }; #endif diff --git a/src/ResourcesManager/SALOME_ResourcesCatalog_Handler.cxx b/src/ResourcesManager/SALOME_ResourcesCatalog_Handler.cxx index f8c5a6ef1..f635431c7 100755 --- a/src/ResourcesManager/SALOME_ResourcesCatalog_Handler.cxx +++ b/src/ResourcesManager/SALOME_ResourcesCatalog_Handler.cxx @@ -1,23 +1,23 @@ // SALOME ResourcesCatalog : implementation of catalog resources parsing (SALOME_ModuleCatalog.idl) // // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // @@ -34,256 +34,364 @@ using namespace std; -//---------------------------------------------------------------------- -//Function : SALOME_ResourcesCatalog_Handler -//Purpose: Constructor -//---------------------------------------------------------------------- -SALOME_ResourcesCatalog_Handler::SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& listOfResources):_resources_list(listOfResources) +//============================================================================= +/*! + * Constructor + * \param listOfResources: map of ParserResourcesType to fill when parsing + */ +//============================================================================= + +SALOME_ResourcesCatalog_Handler:: +SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& listOfResources): + _resources_list(listOfResources) { MESSAGE("SALOME_ResourcesCatalog_Handler creation"); //XML tags initialisation - test_machine="machine"; - test_resources="resources"; - - test_hostname="hostname"; - test_alias="alias"; - test_protocol="protocol"; - test_mode="mode"; - test_user_name="userName"; - test_modules="modules"; - test_module_name="moduleName"; - test_module_path="modulePath"; - test_pre_req_file_path="preReqFilePath"; - test_os="OS"; - test_mem_in_mb="memInMB"; - test_cpu_freq_mhz="CPUFreqMHz"; - test_nb_of_nodes="nbOfNodes"; - test_nb_of_proc_per_node="nbOfProcPerNode"; + test_machine = "machine"; + test_resources = "resources"; + + test_hostname = "hostname"; + test_alias = "alias"; + test_protocol = "protocol"; + test_mode = "mode"; + test_user_name = "userName"; + test_appli_path = "appliPath"; + test_modules = "modules"; + test_module_name = "moduleName"; + test_module_path = "modulePath"; + test_pre_req_file_path = "preReqFilePath"; + test_os = "OS"; + test_mem_in_mb = "memInMB"; + test_cpu_freq_mhz = "CPUFreqMHz"; + test_nb_of_nodes = "nbOfNodes"; + test_nb_of_proc_per_node = "nbOfProcPerNode"; } -//---------------------------------------------------------------------- -//Function : ~SALOME_ResourcesCatalog_Handler -//Purpose: Destructor -//---------------------------------------------------------------------- +//============================================================================= +/*! + * Destructor + */ +//============================================================================= + SALOME_ResourcesCatalog_Handler::~SALOME_ResourcesCatalog_Handler() { MESSAGE("SALOME_ResourcesCatalog_Handler destruction"); } -//---------------------------------------------------------------------- -//Function : GetResourcesAfterParsing -//Purpose: Retrieves DS after the file parse. -//---------------------------------------------------------------------- -const MapOfParserResourcesType& SALOME_ResourcesCatalog_Handler::GetResourcesAfterParsing() const -{ - return _resources_list; -} +//============================================================================= +/*! + * Retrieves DS after the file parse. + */ +//============================================================================= + +const MapOfParserResourcesType& +SALOME_ResourcesCatalog_Handler::GetResourcesAfterParsing() const + { + return _resources_list; + } + +//============================================================================= +/*! + * Overload handler function startDocument. + * Called before an xml file is parsed. + * Clears the list of resources. + * \return true (if no error detected...) + */ +//============================================================================= -//---------------------------------------------------------------------- -//Function : startDocument -//Purpose: overload handler function -//---------------------------------------------------------------------- bool SALOME_ResourcesCatalog_Handler::startDocument() { MESSAGE("Begin parse document"); - // Empty private elements + + // --- Empty private elements + _resources_list.clear(); return true; } -//---------------------------------------------------------------------- -//Function : startElement -//Purpose: overload handler function -//---------------------------------------------------------------------- -bool SALOME_ResourcesCatalog_Handler::startElement(const QString&, - const QString&, - const QString& name, - const QXmlAttributes& attrs) +//============================================================================= +/*! + * Overload handler function startElement. + * \param QString argument by reference (not used here ?) + * \param QString argument by reference (not used here ?) + * \param name (not used here ?) + * \param atts + * \return true if no error was detected + */ +//============================================================================= + +bool +SALOME_ResourcesCatalog_Handler:: +startElement( const QString&, + const QString&, + const QString& name, + const QXmlAttributes& attrs ) { - for(int i=0;i::const_iterator iter = + _resources_list.begin(); + iter != _resources_list.end(); + iter++) + { + SCRUTE((*iter).second.Alias); + SCRUTE((*iter).second.UserName); + SCRUTE((*iter).second.AppliPath); + SCRUTE((*iter).second.PreReqFilePath); + SCRUTE((*iter).second.OS); + SCRUTE((*iter).second.Protocol); + SCRUTE((*iter).second.Mode); + } + + MESSAGE("This is the end of document"); return true; } -//---------------------------------------------------------------------- -//Function : errorProtocol -//Purpose: overload handler function -//---------------------------------------------------------------------- +//============================================================================= +/*! + * Overload handler function errorProtocol. + * \return the error message. + */ +//============================================================================= + QString SALOME_ResourcesCatalog_Handler::errorProtocol() { - cout << "error prot !!!!!!!!!!!!!!!!!" << endl; + INFOS(" ------------- error protocol !"); return errorProt; } -//---------------------------------------------------------------------- -//Function : fatalError -//Purpose: overload handler function -//---------------------------------------------------------------------- -bool -SALOME_ResourcesCatalog_Handler::fatalError(const QXmlParseException& exception) +//============================================================================= +/*! + * Overload handler function fatalError. + * Fills the private string errorProt with details on error. + * \param exception from parser + * \return boolean (meaning ?) + */ +//============================================================================= + +bool +SALOME_ResourcesCatalog_Handler::fatalError +(const QXmlParseException& exception) { - cout << "fatal error !!!!!!!!!!!!!!!!!" << endl; - errorProt += QString( "fatal parsing error: %1 in line %2, column %3\n" ) - .arg( exception.message() ) - .arg( exception.lineNumber() ) - .arg( exception.columnNumber() ); + INFOS(" ------------- fatal error !"); + errorProt += QString( "fatal parsing error: %1 in line %2, column %3\n" ) + .arg( exception.message() ) + .arg( exception.lineNumber() ) + .arg( exception.columnNumber() ); return QXmlDefaultHandler::fatalError( exception ); } -//---------------------------------------------------------------------- -//Function : FillDocument -//Purpose: Fill the document tree in xml file, used to write in xml file. -//---------------------------------------------------------------------- +//============================================================================= +/*! + * Fill the document tree in xml file, used to write in an xml file. + * \param doc document to fill. + */ +//============================================================================= + void SALOME_ResourcesCatalog_Handler::PrepareDocToXmlFile(QDomDocument& doc) { QDomElement root = doc.createElement("resources"); doc.appendChild(root); - for(map::iterator iter=_resources_list.begin();iter!=_resources_list.end();iter++) + + for (map::iterator iter = + _resources_list.begin(); + iter != _resources_list.end(); + iter++) { QDomElement eltRoot = doc.createElement(test_machine); root.appendChild( eltRoot ); - eltRoot.setAttribute((char *)test_hostname,(*iter).first.c_str()); - eltRoot.setAttribute((char *)test_alias,(*iter).second.Alias.c_str()); - switch((*iter).second.Protocol) - { - case rsh: - eltRoot.setAttribute((char *)test_protocol,"rsh"); - break; - case ssh: - eltRoot.setAttribute((char *)test_protocol,"ssh"); - break; - default: - eltRoot.setAttribute((char *)test_protocol,"rsh"); - } - switch((*iter).second.Mode) - { - case interactive: - eltRoot.setAttribute((char *)test_mode,"interactive"); - break; - case batch: - eltRoot.setAttribute((char *)test_mode,"batch"); - break; - default: - eltRoot.setAttribute((char *)test_mode,"interactive"); - } - eltRoot.setAttribute((char *)test_user_name,(*iter).second.UserName.c_str()); - for(map::const_iterator iter2=(*iter).second.ModulesPath.begin();iter2!=(*iter).second.ModulesPath.end();iter2++) - { - QDomElement rootForModulesPaths=doc.createElement(test_modules); - rootForModulesPaths.setAttribute(test_module_name,(*iter2).first.c_str()); - rootForModulesPaths.setAttribute(test_module_path,(*iter2).second.c_str()); - eltRoot.appendChild(rootForModulesPaths); - } - eltRoot.setAttribute(test_pre_req_file_path,(*iter).second.PreReqFilePath.c_str()); - eltRoot.setAttribute(test_os,(*iter).second.OS.c_str()); - eltRoot.setAttribute(test_mem_in_mb,(*iter).second.DataForSort._memInMB); - eltRoot.setAttribute(test_cpu_freq_mhz,(*iter).second.DataForSort._CPUFreqMHz); - eltRoot.setAttribute(test_nb_of_nodes,(*iter).second.DataForSort._nbOfNodes); - eltRoot.setAttribute(test_nb_of_proc_per_node,(*iter).second.DataForSort._nbOfProcPerNode); + eltRoot.setAttribute((char *)test_hostname, (*iter).first.c_str()); + eltRoot.setAttribute((char *)test_alias, (*iter).second.Alias.c_str()); + + switch ((*iter).second.Protocol) + { + + case rsh: + eltRoot.setAttribute((char *)test_protocol, "rsh"); + break; + + case ssh: + eltRoot.setAttribute((char *)test_protocol, "ssh"); + break; + + default: + eltRoot.setAttribute((char *)test_protocol, "rsh"); + } + + switch ((*iter).second.Mode) + { + + case interactive: + eltRoot.setAttribute((char *)test_mode, "interactive"); + break; + + case batch: + eltRoot.setAttribute((char *)test_mode, "batch"); + break; + + default: + eltRoot.setAttribute((char *)test_mode, "interactive"); + } + + eltRoot.setAttribute((char *)test_user_name, + (*iter).second.UserName.c_str()); + + for (map::const_iterator iter2 = + (*iter).second.ModulesPath.begin(); + iter2 != (*iter).second.ModulesPath.end(); + iter2++) + { + QDomElement rootForModulesPaths = doc.createElement(test_modules); + rootForModulesPaths.setAttribute(test_module_name, + (*iter2).first.c_str()); + rootForModulesPaths.setAttribute(test_module_path, + (*iter2).second.c_str()); + eltRoot.appendChild(rootForModulesPaths); + } + + eltRoot.setAttribute(test_pre_req_file_path, + (*iter).second.PreReqFilePath.c_str()); + eltRoot.setAttribute(test_os, (*iter).second.OS.c_str()); + eltRoot.setAttribute(test_mem_in_mb, + (*iter).second.DataForSort._memInMB); + eltRoot.setAttribute(test_cpu_freq_mhz, + (*iter).second.DataForSort._CPUFreqMHz); + eltRoot.setAttribute(test_nb_of_nodes, + (*iter).second.DataForSort._nbOfNodes); + eltRoot.setAttribute(test_nb_of_proc_per_node, + (*iter).second.DataForSort._nbOfProcPerNode); } } diff --git a/src/ResourcesManager/SALOME_ResourcesCatalog_Handler.hxx b/src/ResourcesManager/SALOME_ResourcesCatalog_Handler.hxx index 6e9916aab..c450cfce8 100755 --- a/src/ResourcesManager/SALOME_ResourcesCatalog_Handler.hxx +++ b/src/ResourcesManager/SALOME_ResourcesCatalog_Handler.hxx @@ -1,23 +1,23 @@ // SALOME ResourcesCatalog : implementation of catalog resources parsing (SALOME_ModuleCatalog.idl) // // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // @@ -36,102 +36,65 @@ #include class QDomElement; + class QDomDocument; class SALOME_ResourcesCatalog_Handler : public QXmlDefaultHandler -{ -public : - //! standard constructor - SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& listOfResources); - - const MapOfParserResourcesType& GetResourcesAfterParsing() const; - - //! standard destructor - virtual ~SALOME_ResourcesCatalog_Handler(); - - //! method to overload handler function startDocument - /*! is called before a xml file is parsed - \return true if no error was detected - */ - virtual bool startDocument(); - - //! method to overload handler function startElement - /*! - \param QString argument by value - \param QString argument by value - \param QString qName argument by value - \param QXmlAttributes atts argument by value - \return true if no error was detected - */ - virtual bool startElement(const QString& , const QString& , - const QString& name, const QXmlAttributes& attrs); - - //! method to overload handler function endElement - /*! - \param QString argument by value - \param QString argument by value - \param QString qName argument by value - \return true if no error was detected - */ - virtual bool endElement(const QString&, const QString&, - const QString& qName); - - //! method to overload handler function characters - /*! - \param QString chars argument by value - \return true if no error was detected - */ - virtual bool characters(const QString& chars); - - //! method to overload handler function endDocument - /*! is called at the end of the parsing - \return true if no error was detected - */ - virtual bool endDocument(); - - //! method to overload handler function errorProtocol - /*! - \return the error message - */ - virtual QString errorProtocol(); - -//! method to overload handler function fatalError - /*! - \param QXmlParseException exception argument by value - \return true if no error was detected - */ - virtual bool fatalError(const QXmlParseException& exception); - -//! method to fill the document to be writen in a file - void PrepareDocToXmlFile(QDomDocument& doc); - -private : - QString errorProt; - std::string content; - std::string previous_module_name; - std::string previous_module_path; - - ParserResourcesType _resource; - MapOfParserResourcesType& _resources_list; - - const char *test_machine; - const char *test_resources; - - const char *test_hostname; - const char *test_alias; - const char *test_protocol; - const char *test_mode; - const char *test_user_name; - const char *test_modules; - const char *test_module_name; - const char *test_module_path; - const char *test_pre_req_file_path; - const char *test_os; - const char *test_mem_in_mb; - const char *test_cpu_freq_mhz; - const char *test_nb_of_nodes; - const char *test_nb_of_proc_per_node; - -}; + { + + public : + SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& listOfResources); + + const MapOfParserResourcesType& GetResourcesAfterParsing() const; + + virtual ~SALOME_ResourcesCatalog_Handler(); + + virtual bool startDocument(); + + virtual bool startElement(const QString& , const QString& , + const QString& name, + const QXmlAttributes& attrs); + + virtual bool endElement(const QString&, const QString&, + const QString& qName); + + virtual bool characters(const QString& chars); + + virtual bool endDocument(); + + virtual QString errorProtocol(); + virtual bool fatalError(const QXmlParseException& exception); + + void PrepareDocToXmlFile(QDomDocument& doc); + + private : + QString errorProt; + std::string content; + std::string previous_module_name; + std::string previous_module_path; + + ParserResourcesType _resource; + MapOfParserResourcesType& _resources_list; + + const char *test_machine; + const char *test_resources; + + const char *test_hostname; + const char *test_alias; + const char *test_protocol; + const char *test_mode; + const char *test_user_name; + const char *test_appli_path; + const char *test_modules; + const char *test_module_name; + const char *test_module_path; + const char *test_pre_req_file_path; + const char *test_os; + const char *test_mem_in_mb; + const char *test_cpu_freq_mhz; + const char *test_nb_of_nodes; + const char *test_nb_of_proc_per_node; + + }; #endif // SALOME_RESOURCES_CATALOG_HANDLER diff --git a/src/ResourcesManager/SALOME_ResourcesCatalog_Parser.cxx b/src/ResourcesManager/SALOME_ResourcesCatalog_Parser.cxx index d6562befc..8747cb030 100644 --- a/src/ResourcesManager/SALOME_ResourcesCatalog_Parser.cxx +++ b/src/ResourcesManager/SALOME_ResourcesCatalog_Parser.cxx @@ -1,82 +1,118 @@ #include "SALOME_ResourcesCatalog_Parser.hxx" +#include "utilities.h" #include #define NULL_VALUE 0 using namespace std; -unsigned int ResourceDataToSort::_nbOfNodesWanted=NULL_VALUE; -unsigned int ResourceDataToSort::_nbOfProcPerNodeWanted=NULL_VALUE; -unsigned int ResourceDataToSort::_CPUFreqMHzWanted=NULL_VALUE; -unsigned int ResourceDataToSort::_memInMBWanted=NULL_VALUE; +unsigned int ResourceDataToSort::_nbOfNodesWanted = NULL_VALUE; +unsigned int ResourceDataToSort::_nbOfProcPerNodeWanted = NULL_VALUE; +unsigned int ResourceDataToSort::_CPUFreqMHzWanted = NULL_VALUE; +unsigned int ResourceDataToSort::_memInMBWanted = NULL_VALUE; ResourceDataToSort::ResourceDataToSort() -{ -} +{} -ResourceDataToSort::ResourceDataToSort(const string& hostname,unsigned int nbOfNodes,unsigned int nbOfProcPerNode,unsigned int CPUFreqMHz,unsigned int memInMB):_hostName(hostname),_nbOfNodes(nbOfNodes),_nbOfProcPerNode(nbOfProcPerNode),_CPUFreqMHz(CPUFreqMHz),_memInMB(memInMB) -{ -} +ResourceDataToSort::ResourceDataToSort(const string& hostname, + unsigned int nbOfNodes, + unsigned int nbOfProcPerNode, + unsigned int CPUFreqMHz, + unsigned int memInMB): + _hostName(hostname), + _nbOfNodes(nbOfNodes), + _nbOfProcPerNode(nbOfProcPerNode), + _CPUFreqMHz(CPUFreqMHz), + _memInMB(memInMB) +{} //! Method used by list::sort to sort the resources used in SALOME_ResourcesManager::GetResourcesFitting bool ResourceDataToSort::operator< (const ResourceDataToSort& other) const -{ - unsigned int nbPts=GetNumberOfPoints(); - return nbPts_nbOfNodesWanted) - ret+=2000; - else - ret+=1000; - } - //priority 2 : Nb of proc by node - if(_nbOfProcPerNodeWanted!=NULL_VALUE) - { - if(_nbOfProcPerNode==_nbOfProcPerNodeWanted) - ret+=300; - else if(_nbOfProcPerNode > _nbOfProcPerNodeWanted) - ret+=200; - else - ret+=100; - } - //priority 3 : Cpu freq - if(_CPUFreqMHzWanted!=NULL_VALUE) - { - if(_CPUFreqMHz==_CPUFreqMHzWanted) - ret+=30; - else if(_CPUFreqMHz > _CPUFreqMHzWanted) - ret+=20; - else - ret+=10; - } - //priority 4 : memory - if(_memInMBWanted!=NULL_VALUE) - { - if(_memInMB==_memInMBWanted) - ret+=3; - else if(_memInMB > _memInMBWanted) - ret+=2; - else - ret+=1; - } - return ret; -} + { + unsigned int ret = 0; + //priority 1 : Nb of nodes + + if (_nbOfNodesWanted != NULL_VALUE) + { + if (_nbOfNodes == _nbOfNodesWanted) + ret += 3000; + else if (_nbOfNodes > _nbOfNodesWanted) + ret += 2000; + else + ret += 1000; + } + + //priority 2 : Nb of proc by node + if (_nbOfProcPerNodeWanted != NULL_VALUE) + { + if (_nbOfProcPerNode == _nbOfProcPerNodeWanted) + ret += 300; + else if (_nbOfProcPerNode > _nbOfProcPerNodeWanted) + ret += 200; + else + ret += 100; + } + + //priority 3 : Cpu freq + if (_CPUFreqMHzWanted != NULL_VALUE) + { + if (_CPUFreqMHz == _CPUFreqMHzWanted) + ret += 30; + else if (_CPUFreqMHz > _CPUFreqMHzWanted) + ret += 20; + else + ret += 10; + } + + //priority 4 : memory + if (_memInMBWanted != NULL_VALUE) + { + if (_memInMB == _memInMBWanted) + ret += 3; + else if (_memInMB > _memInMBWanted) + ret += 2; + else + ret += 1; + } + + return ret; + } //! Method used for debug void ResourceDataToSort::Print() const + { + SCRUTE(_nbOfNodes); + SCRUTE(_nbOfProcPerNode); + SCRUTE(_CPUFreqMHz); + SCRUTE(_memInMB); + } + +void ParserResourcesType::Print() { - cout << "Nb of nodes : " << _nbOfNodes << endl; - cout << "Nb of proc per node : " << _nbOfProcPerNode << endl; - cout << "CPU : " << _CPUFreqMHz << endl; - cout << "Mem : " << _memInMB << endl; -} + MESSAGE("##############*****"); + MESSAGE("HostName : " << DataForSort._hostName); + MESSAGE("Alias : " << Alias); + MESSAGE("Protocol : " << Protocol); + MESSAGE("Mode : " << Mode); + MESSAGE("UserName : " << UserName); + MESSAGE("Modules : "); + int i = 1; + + for (std::map::iterator iter = ModulesPath.begin(); + iter != ModulesPath.end(); + iter++) + { + MESSAGE("Module " << i++ << " called : " << (*iter).first + << " with path : " << (*iter).second); + } + MESSAGE("PreReqFilePath : " << PreReqFilePath); + MESSAGE("OS : " << OS); + DataForSort.Print(); +} diff --git a/src/ResourcesManager/SALOME_ResourcesCatalog_Parser.hxx b/src/ResourcesManager/SALOME_ResourcesCatalog_Parser.hxx index 989db2f44..d81c1d4f1 100755 --- a/src/ResourcesManager/SALOME_ResourcesCatalog_Parser.hxx +++ b/src/ResourcesManager/SALOME_ResourcesCatalog_Parser.hxx @@ -1,23 +1,23 @@ // SALOME ResourcesCatalog : implementation of catalog resources parsing (SALOME_ModuleCatalog.idl) // // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // @@ -40,57 +40,48 @@ enum AccessProtocolType {rsh, ssh}; enum AccessModeType {interactive, batch}; -class ResourceDataToSort { -public: - std::string _hostName; - unsigned int _nbOfNodes; - unsigned int _nbOfProcPerNode; - unsigned int _CPUFreqMHz; - unsigned int _memInMB; - static unsigned int _nbOfNodesWanted; - static unsigned int _nbOfProcPerNodeWanted; - static unsigned int _CPUFreqMHzWanted; - static unsigned int _memInMBWanted; -public: - ResourceDataToSort(); - ResourceDataToSort(const std::string& hostname,unsigned int nbOfNodes,unsigned int nbOfProcPerNode,unsigned int CPUFreqMHz,unsigned int memInMB); - bool operator< (const ResourceDataToSort& other) const; - void Print() const; -private: - unsigned int GetNumberOfPoints() const; -// friend class SALOME_ResourcesCatalog_Handler; -// friend class SALOME_ResourcesManager; -// friend struct ParserResourcesType; -}; +class ResourceDataToSort + { + + public: + std::string _hostName; + unsigned int _nbOfNodes; + unsigned int _nbOfProcPerNode; + unsigned int _CPUFreqMHz; + unsigned int _memInMB; + static unsigned int _nbOfNodesWanted; + static unsigned int _nbOfProcPerNodeWanted; + static unsigned int _CPUFreqMHzWanted; + static unsigned int _memInMBWanted; + + public: + ResourceDataToSort(); + ResourceDataToSort(const std::string& hostname, + unsigned int nbOfNodes, + unsigned int nbOfProcPerNode, + unsigned int CPUFreqMHz, + unsigned int memInMB); + bool operator< (const ResourceDataToSort& other) const; + void Print() const; + + private: + unsigned int GetNumberOfPoints() const; + }; -struct ParserResourcesType { - ResourceDataToSort DataForSort; - std::string Alias; - AccessProtocolType Protocol; - AccessModeType Mode; - std::string UserName; - MapOfModulesPath ModulesPath; - std::string PreReqFilePath; - std::string OS; +struct ParserResourcesType + { + ResourceDataToSort DataForSort; + std::string Alias; + AccessProtocolType Protocol; + AccessModeType Mode; + std::string UserName; + std::string AppliPath; + MapOfModulesPath ModulesPath; + std::string PreReqFilePath; + std::string OS; - void Print(){ - std::cout << "##############*****" << std::endl; - std::cout << "HostName : " << DataForSort._hostName << std::endl; - std::cout << "Alias : " << Alias << std::endl; - std::cout << "Protocol : " << Protocol << std::endl; - std::cout << "Mode : " << Mode << std::endl; - std::cout << "UserName : " << UserName << std::endl; - std::cout << "Modules : " << std::endl; - int i=1; - for(std::map::iterator iter=ModulesPath.begin();iter!=ModulesPath.end();iter++) - { - std::cout << " Module " << i++ << " called : " << (*iter).first << " with path : " << (*iter).second << std::endl; - } - std::cout << "PreReqFilePath : " << PreReqFilePath << std::endl; - std::cout << "OS : " << OS << std::endl; - DataForSort.Print(); - } -}; + void Print(); + }; typedef std::map MapOfParserResourcesType; diff --git a/src/ResourcesManager/SALOME_ResourcesManager.cxx b/src/ResourcesManager/SALOME_ResourcesManager.cxx index f84a35867..88ff54e84 100644 --- a/src/ResourcesManager/SALOME_ResourcesManager.cxx +++ b/src/ResourcesManager/SALOME_ResourcesManager.cxx @@ -1,129 +1,281 @@ -#include "SALOME_ResourcesManager.hxx" -#include "SALOME_Container_i.hxx" +#include "SALOME_ResourcesManager.hxx" +//#include "SALOME_Container_i.hxx" #include "Utils_ExceptHandlers.hxx" #include "OpUtil.hxx" #include #include +#ifndef WNT #include +#else +#include +#include +#endif #include #include +#include #include #include +#include #include #include +#include "utilities.h" #define MAX_SIZE_FOR_HOSTNAME 256; using namespace std; -//just for test -SALOME_ResourcesManager::SALOME_ResourcesManager(const char *xmlFilePath):_path_resources(xmlFilePath) +//============================================================================= +/*! + * just for test + */ +//============================================================================= + +SALOME_ResourcesManager:: +SALOME_ResourcesManager(CORBA::ORB_ptr orb, + const char *xmlFilePath) : + _path_resources(xmlFilePath) { + _NS = new SALOME_NamingService(orb); } -SALOME_ResourcesManager::SALOME_ResourcesManager() +//============================================================================= +/*! + * Standard constructor, parse resource file. + * - if ${APPLI} exists in environment, + * look for ${HOME}/*{APPLI}/CatalogResources.xml + * - else look for default: + * ${KERNEL_ROOT_DIR}/share/salome/resources/CatalogResources.xml + * - parse XML resource file. + */ +//============================================================================= + +SALOME_ResourcesManager::SALOME_ResourcesManager(CORBA::ORB_ptr orb) { - _path_resources=getenv("KERNEL_ROOT_DIR"); - _path_resources+="/share/salome/resources/CatalogResources.xml"; + _NS = new SALOME_NamingService(orb); + _isAppliSalomeDefined = (getenv("APPLI") != 0); + + if (_isAppliSalomeDefined) + { + _path_resources = getenv("HOME"); + _path_resources += "/"; + _path_resources += getenv("APPLI"); + _path_resources += "/CatalogResources.xml"; + } + + else + { + _path_resources = getenv("KERNEL_ROOT_DIR"); + _path_resources += "/share/salome/resources/CatalogResources.xml"; + } + ParseXmlFile(); } +//============================================================================= +/*! + * Standard Destructor + */ +//============================================================================= + SALOME_ResourcesManager::~SALOME_ResourcesManager() { + delete _NS; } -vector SALOME_ResourcesManager::GetFittingResources(const Engines::MachineParameters& params,const char *moduleName) throw(SALOME_Exception) +//============================================================================= +/*! + * get the list of name of ressources fitting for the specified module. + * If hostname specified, check it is local or known in resources catalog. + * + * Else + * - select first machines with corresponding OS (all machines if + * parameter OS empty), + * - then select the sublist of machines on witch the module is known + * (if the result is empty, that probably means that the inventory of + * modules is probably not done, so give complete list from previous step) + */ +//============================================================================= + +vector +SALOME_ResourcesManager:: +GetFittingResources(const Engines::MachineParameters& params, + const char *moduleName) +throw(SALOME_Exception) { + MESSAGE("ResourcesManager::GetFittingResources"); vector ret; - //To be sure that we search in a correct list. + + // --- To be sure that we search in a correct list. ParseXmlFile(); - const char *hostname=(const char *)params.hostname; - if(hostname[0]!='\0') + + const char *hostname = (const char *)params.hostname; + MESSAGE("GetFittingResources " << hostname << " " << GetHostname().c_str()); + + if (hostname[0] != '\0') { - if(_resourcesList.find(hostname)!=_resourcesList.end()) - // params.hostame is in the list of resources so return it. - ret.push_back(hostname); + MESSAGE("ResourcesManager::GetFittingResources : hostname specified" ); + + if ( strcmp(hostname, "localhost") == 0 || + strcmp(hostname, GetHostname().c_str()) == 0 ) + { + MESSAGE("ResourcesManager::GetFittingResources : localhost" ); + ret.push_back(GetHostname().c_str()); + MESSAGE("ResourcesManager::GetFittingResources : " << ret.size()); + } + + else if (_resourcesList.find(hostname) != _resourcesList.end()) + { + // --- params.hostname is in the list of resources so return it. + ret.push_back(hostname); + } + else - //user specified an unknown hostame so notify to him. - throw SALOME_Exception("unknown host"); + { + // --- user specified an unknown hostame so notify him. + MESSAGE("ResourcesManager::GetFittingResources : SALOME_Exception"); + throw SALOME_Exception("unknown host"); + } } + else - // Search for available resources sorted by priority + // --- Search for available resources sorted by priority { - SelectOnlyResourcesWithOS(ret,params.OS); - KeepOnlyResourcesWithModule(ret,moduleName); - //set wanted parameters - ResourceDataToSort::_nbOfNodesWanted=params.nb_node; - ResourceDataToSort::_nbOfProcPerNodeWanted=params.nb_proc_per_node; - ResourceDataToSort::_CPUFreqMHzWanted=params.cpu_clock; - ResourceDataToSort::_memInMBWanted=params.mem_mb; - //end of set + SelectOnlyResourcesWithOS(ret, params.OS); + + KeepOnlyResourcesWithModule(ret, moduleName); + + if (ret.size() == 0) + SelectOnlyResourcesWithOS(ret, params.OS); + + // --- set wanted parameters + ResourceDataToSort::_nbOfNodesWanted = params.nb_node; + + ResourceDataToSort::_nbOfProcPerNodeWanted = params.nb_proc_per_node; + + ResourceDataToSort::_CPUFreqMHzWanted = params.cpu_clock; + + ResourceDataToSort::_memInMBWanted = params.mem_mb; + + // --- end of set + list li; - for(vector::iterator iter=ret.begin();iter!=ret.end();iter++) - li.push_back(_resourcesList[(*iter)].DataForSort); + + for (vector::iterator iter = ret.begin(); + iter != ret.end(); + iter++) + li.push_back(_resourcesList[(*iter)].DataForSort); + li.sort(); - unsigned int i=0; - for(list::iterator iter2=li.begin();iter2!=li.end();iter2++) - ret[i++]=(*iter2)._hostName; + + unsigned int i = 0; + + for (list::iterator iter2 = li.begin(); + iter2 != li.end(); + iter2++) + ret[i++] = (*iter2)._hostName; } + + MESSAGE("ResourcesManager::GetFittingResources : return" << ret.size()); return ret; } -int SALOME_ResourcesManager::AddResourceInCatalog(const Engines::MachineParameters& paramsOfNewResources, const map& modulesOnNewResources, - const char *environPathOfPrerequired, - const char *alias, const char *userName, AccessModeType mode, AccessProtocolType prot) throw(SALOME_Exception) +//============================================================================= +/*! + * add an entry in the ressources catalog xml file. + * Return 0 if OK (KERNEL found in new resources modules) else throw exception + */ +//============================================================================= + +int +SALOME_ResourcesManager:: +AddResourceInCatalog(const Engines::MachineParameters& paramsOfNewResources, + const map& modulesOnNewResources, + const char *environPathOfPrerequired, + const char *alias, + const char *userName, + AccessModeType mode, + AccessProtocolType prot) +throw(SALOME_Exception) { - map::const_iterator iter=modulesOnNewResources.find("KERNEL"); - if(iter!=modulesOnNewResources.end()) + map::const_iterator iter = + modulesOnNewResources.find("KERNEL"); + + if (iter != modulesOnNewResources.end()) { ParserResourcesType newElt; - newElt.DataForSort._hostName=paramsOfNewResources.hostname; - newElt.Alias=alias; - newElt.Protocol=prot; - newElt.Mode=mode; - newElt.UserName=userName; - newElt.ModulesPath=modulesOnNewResources; - newElt.PreReqFilePath=environPathOfPrerequired; - newElt.OS=paramsOfNewResources.OS; - newElt.DataForSort._memInMB=paramsOfNewResources.mem_mb; - newElt.DataForSort._CPUFreqMHz=paramsOfNewResources.cpu_clock; - newElt.DataForSort._nbOfNodes=paramsOfNewResources.nb_node; - newElt.DataForSort._nbOfProcPerNode=paramsOfNewResources.nb_proc_per_node; - _resourcesList[newElt.DataForSort._hostName]=newElt; + newElt.DataForSort._hostName = paramsOfNewResources.hostname; + newElt.Alias = alias; + newElt.Protocol = prot; + newElt.Mode = mode; + newElt.UserName = userName; + newElt.ModulesPath = modulesOnNewResources; + newElt.PreReqFilePath = environPathOfPrerequired; + newElt.OS = paramsOfNewResources.OS; + newElt.DataForSort._memInMB = paramsOfNewResources.mem_mb; + newElt.DataForSort._CPUFreqMHz = paramsOfNewResources.cpu_clock; + newElt.DataForSort._nbOfNodes = paramsOfNewResources.nb_node; + newElt.DataForSort._nbOfProcPerNode = + paramsOfNewResources.nb_proc_per_node; + _resourcesList[newElt.DataForSort._hostName] = newElt; return 0; } + else throw SALOME_Exception("KERNEL is not present in this resource"); } +//============================================================================= +/*! + * Deletes a resource from the catalog + */ +//============================================================================= + void SALOME_ResourcesManager::DeleteResourceInCatalog(const char *hostname) { _resourcesList.erase(hostname); } +//============================================================================= +/*! + * write the current data in memory in file. + */ +//============================================================================= + void SALOME_ResourcesManager::WriteInXmlFile() { QDomDocument doc("ResourcesCatalog"); - SALOME_ResourcesCatalog_Handler* handler = new SALOME_ResourcesCatalog_Handler(_resourcesList); + SALOME_ResourcesCatalog_Handler* handler = + new SALOME_ResourcesCatalog_Handler(_resourcesList); handler->PrepareDocToXmlFile(doc); delete handler; + QFile file( _path_resources ); - if( !file.open( IO_WriteOnly ) ) - cout << "WRITING ERROR !!!" << endl; + + if ( !file.open( IO_WriteOnly ) ) + INFOS("WRITING ERROR !"); QTextStream ts( &file ); + ts << doc.toString(); file.close(); - cout << "WRITING DONE!!!" << endl; + + MESSAGE("WRITING DONE!"); } -const MapOfParserResourcesType& SALOME_ResourcesManager::ParseXmlFile() +//============================================================================= +/*! + * parse the data type catalog + */ +//============================================================================= + +const MapOfParserResourcesType& SALOME_ResourcesManager::ParseXmlFile() { - SALOME_ResourcesCatalog_Handler* handler = new SALOME_ResourcesCatalog_Handler(_resourcesList); + SALOME_ResourcesCatalog_Handler* handler = + new SALOME_ResourcesCatalog_Handler(_resourcesList); QFile xmlFile(_path_resources); QXmlInputSource source(xmlFile); @@ -137,163 +289,265 @@ const MapOfParserResourcesType& SALOME_ResourcesManager::ParseXmlFile() return _resourcesList; } -bool SALOME_ResourcesManager::_verify_resources(MapOfParserResourcesType resourceslist) -{ -// bool _return_value = true; -// bool _bool = false ; -// vector _machine_list; -// _machine_list.resize(0); - -// // Fill a list of all computers indicated in the resources list -// for (unsigned int ind = 0; ind < resourceslist.size(); ind++) -// _machine_list.push_back(resourceslist[ind].HostName); - -// // Parse if a computer name is twice in the list of computers -// for (unsigned int ind = 0; ind < _machine_list.size(); ind++) -// { -// for (unsigned int ind1 = ind+1 ; ind1 < _machine_list.size(); ind1++) -// { -// if(_machine_list[ind].compare(_machine_list[ind1]) == 0) -// { -// MESSAGE("The computer " << _machine_list[ind] << " is indicated more than once in the resources list") -// _return_value = false; -// } -// } -// } - -// return _return_value; - return true; -} +//============================================================================= +/*! + * consult the content of the list + */ +//============================================================================= const MapOfParserResourcesType& SALOME_ResourcesManager::GetList() const + { + return _resourcesList; + } + + +//============================================================================= +/*! + * dynamically obtains the best machines + */ +//============================================================================= + +string +SALOME_ResourcesManager::FindBest(const Engines::MachineList& listOfMachines) { - return _resourcesList; + return _dynamicResourcesSelecter.FindBest(listOfMachines); } -string SALOME_ResourcesManager::FindBest(const Engines::MachineList& listOfMachines) + +//============================================================================= +/*! + * This is no longer valid (C++ container are also python containers) + */ +//============================================================================= + +bool isPythonContainer(const char* ContainerName) { - return _dynamicResourcesSelecter.FindBest(listOfMachines); + bool ret = false; + int len = strlen(ContainerName); + + if (len >= 2) + if (strcmp(ContainerName + len - 2, "Py") == 0) + ret = true; + + return ret; } -string SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer(const string& machine,const char *containerName) + +//============================================================================= +/*! + * Builds the script to be launched + * + * If SALOME Application not defined ($APPLI), + * see BuildTempFileToLaunchRemoteContainer() + * + * Else rely on distant configuration. Command is under the form (example): + * ssh user@machine distantPath/runRemote.sh hostNS portNS \ + * SALOME_Container containerName &" + + * - where user is ommited if not specified in CatalogResources, + * - where distant path is always relative to user@machine $HOME, and + * equal to $APPLI if not specified in CatalogResources, + * - where hostNS is the hostname of CORBA naming server (set by scripts to + * use to launch SALOME and servers in $APPLI: runAppli.sh, runRemote.sh) + * - where portNS is the port used by CORBA naming server (set by scripts to + * use to launch SALOME and servers in $APPLI: runAppli.sh, runRemote.sh) + */ +//============================================================================= + +string +SALOME_ResourcesManager::BuildCommandToLaunchRemoteContainer +(const string& machine, + const Engines::MachineParameters& params) { - _TmpFileName=BuildTemporaryFileName(); - ofstream tempOutputFile; - tempOutputFile.open(_TmpFileName.c_str(),ofstream::out ); - const ParserResourcesType& resInfo=_resourcesList[machine]; - tempOutputFile << "#! /bin/sh" << endl; - //set env vars - for(map::const_iterator iter=resInfo.ModulesPath.begin();iter!=resInfo.ModulesPath.end();iter++) - { - string curModulePath((*iter).second); - tempOutputFile << (*iter).first << "_ROOT_DIR="<< curModulePath << endl; - tempOutputFile << "export " << (*iter).first << "_ROOT_DIR" << endl; - tempOutputFile << "LD_LIBRARY_PATH=" << curModulePath << "/lib/salome" << ":${LD_LIBRARY_PATH}" << endl; - tempOutputFile << "PYTHONPATH=" << curModulePath << "/bin/salome:" << curModulePath << "/lib/salome:" << curModulePath << "/lib/python2.2/site-packages/salome:"; - tempOutputFile << curModulePath << "/lib/python2.2/site-packages/salome/shared_modules:${PYTHONPATH}" << endl; - } - tempOutputFile << "export LD_LIBRARY_PATH" << endl; - tempOutputFile << "export PYTHONPATH" << endl; - tempOutputFile << "source " << resInfo.PreReqFilePath << endl; - // ! env vars - tempOutputFile << (*(resInfo.ModulesPath.find("KERNEL"))).second << "/bin/salome/"; - if(Engines_Container_i::isPythonContainer(containerName)) - tempOutputFile << "SALOME_ContainerPy.py "; - else - tempOutputFile << "SALOME_Container "; - tempOutputFile << containerName << " -"; - AddOmninamesParams(tempOutputFile); - tempOutputFile << " &" << endl; - tempOutputFile.flush(); - tempOutputFile.close(); - chmod(_TmpFileName.c_str(),0x1ED); - //Build command string command; - if(resInfo.Protocol==rsh) + + if ( ! _isAppliSalomeDefined ) + command = BuildTempFileToLaunchRemoteContainer(machine, params); + + else { - command = "rsh "; - string commandRcp="rcp "; - commandRcp+=_TmpFileName; - commandRcp+=" "; - commandRcp+=machine; - commandRcp+=":"; - commandRcp+=_TmpFileName; - system(commandRcp.c_str()); + const ParserResourcesType& resInfo = _resourcesList[machine]; + + if (params.isMPI) + { + int nbproc; + + if ( (params.nb_node <= 0) && (params.nb_proc_per_node <= 0) ) + nbproc = 1; + else if ( params.nb_node == 0 ) + nbproc = params.nb_proc_per_node; + else if ( params.nb_proc_per_node == 0 ) + nbproc = params.nb_node; + else + nbproc = params.nb_node * params.nb_proc_per_node; + } + + // "ssh user@machine distantPath/runRemote.sh hostNS portNS \ + // SALOME_Container containerName &" + + if (resInfo.Protocol == rsh) + command = "rsh "; + else if (resInfo.Protocol == ssh) + command = "ssh "; + else + throw SALOME_Exception("Unknown protocol"); + + if (resInfo.UserName != "") + { + command += resInfo.UserName; + command += "@"; + } + + command += machine; + command += " "; + + if (resInfo.AppliPath != "") + command += resInfo.AppliPath; // path relative to user@machine $HOME + else + { + ASSERT(getenv("APPLI")); + command += getenv("APPLI"); // path relative to user@machine $HOME + } + + command += "/runRemote.sh "; + + ASSERT(getenv("NSHOST")); + command += getenv("NSHOST"); // hostname of CORBA name server + + command += " "; + ASSERT(getenv("NSPORT")); + command += getenv("NSPORT"); // port of CORBA name server + + command += " SALOME_Container "; + command += _NS->ContainerName(params); + command += "&"; + + MESSAGE("command =" << command); } - else if(resInfo.Protocol==ssh) - command = "ssh "; - else - throw SALOME_Exception("Unknown protocol"); - command+=machine; - _CommandForRemAccess=command; - command+=" "; - command+=_TmpFileName; - command += " > "; - command += "/tmp/"; - command += containerName; - command += "_"; - command += machine; - command += ".log &"; - cout << "Command is ... " << command << endl; + return command; } -string SALOME_ResourcesManager::BuildCommandToLaunchLocalContainer(const char *containerName) + +//============================================================================= +/*! + * builds the command to be launched. + */ +//============================================================================= + +string +SALOME_ResourcesManager::BuildCommandToLaunchLocalContainer +(const Engines::MachineParameters& params) { - _TmpFileName=""; + _TmpFileName = ""; string command; - if(Engines_Container_i::isPythonContainer(containerName)) - command="SALOME_ContainerPy.py "; + int nbproc = 0; + + if (params.isMPI) + { + command = "mpirun -np "; + + if ( (params.nb_node <= 0) && (params.nb_proc_per_node <= 0) ) + nbproc = 1; + else if ( params.nb_node == 0 ) + nbproc = params.nb_proc_per_node; + else if ( params.nb_proc_per_node == 0 ) + nbproc = params.nb_node; + else + nbproc = params.nb_node * params.nb_proc_per_node; + + std::ostringstream o; + + o << nbproc << " "; + + command += o.str(); + + if (isPythonContainer(params.container_name)) + command += "pyMPI SALOME_ContainerPy.py "; + else + command += "SALOME_MPIContainer "; + } + else - command="SALOME_Container "; - command+=containerName; - command+=" -"; + { + if (isPythonContainer(params.container_name)) + command = "SALOME_ContainerPy.py "; + else + command = "SALOME_Container "; + } + + command += _NS->ContainerName(params); + command += " -"; AddOmninamesParams(command); - command+=" > /tmp/"; - command+=containerName; + command += " > /tmp/"; + command += _NS->ContainerName(params); command += "_"; command += GetHostname(); + command += "_"; + command += getenv( "USER" ) ; command += ".log 2>&1 &" ; - cout << "Command is ... " << command << endl << flush; + MESSAGE("Command is ... " << command); return command; } + +//============================================================================= +/*! + * removes the generated temporary file in case of a remote launch. + */ +//============================================================================= + void SALOME_ResourcesManager::RmTmpFile() { - if(_TmpFileName!="") + if (_TmpFileName != "") { - string command="rm "; - command+=_TmpFileName; - char *temp=strdup(command.c_str()); - int lgthTemp=strlen(temp); - temp[lgthTemp-3]='*'; - temp[lgthTemp-2]='\0'; + string command = "rm "; + command += _TmpFileName; + char *temp = strdup(command.c_str()); + int lgthTemp = strlen(temp); + temp[lgthTemp - 3] = '*'; + temp[lgthTemp - 2] = '\0'; system(temp); free(temp); } } -string SALOME_ResourcesManager::BuildCommand(const string& machine,const char *containerName) + +//============================================================================= +/*! + * builds the script to be launched + */ +//============================================================================= + +string +SALOME_ResourcesManager::BuildCommand +(const string& machine, + const char *containerName) { -// rsh -n ikkyo /export/home/rahuel/SALOME_ROOT/bin/runSession SALOME_Container -ORBInitRef NameService=corbaname::dm2s0017:1515 & - const ParserResourcesType& resInfo=_resourcesList[machine]; - bool pyCont=Engines_Container_i::isPythonContainer(containerName); + // rsh -n ikkyo /export/home/rahuel/SALOME_ROOT/bin/runSession SALOME_Container -ORBInitRef NameService=corbaname::dm2s0017:1515 & + const ParserResourcesType& resInfo = _resourcesList[machine]; + bool pyCont = isPythonContainer(containerName); + string command; - if(resInfo.Protocol==rsh) + + if (resInfo.Protocol == rsh) command = "rsh -n " ; - else if(resInfo.Protocol==ssh) + else if (resInfo.Protocol == ssh) command = "ssh -f -n "; else throw SALOME_Exception("Not implemented yet..."); - command += machine; + + command += machine; command += " "; string path = (*(resInfo.ModulesPath.find("KERNEL"))).second; - command +=path; + command += path; command += "/bin/salome/"; + if ( pyCont ) command += "SALOME_ContainerPy.py "; else command += "SALOME_Container "; + command += containerName; command += " -"; AddOmninamesParams(command); @@ -302,80 +556,285 @@ string SALOME_ResourcesManager::BuildCommand(const string& machine,const char *c command += "_"; command += machine; command += ".log 2>&1 &" ; + SCRUTE( command ); return command; } +//============================================================================= +/*! + * Gives a sublist of machines with matching OS. + * If parameter OS is empty, gives the complete list of machines + */ +//============================================================================= + // Warning need an updated parsed list : _resourcesList -void SALOME_ResourcesManager::SelectOnlyResourcesWithOS(vector& hosts,const char *OS) const throw(SALOME_Exception) +void +SALOME_ResourcesManager::SelectOnlyResourcesWithOS +( vector& hosts, + const char *OS) const +throw(SALOME_Exception) { string base(OS); - for(map::const_iterator iter=_resourcesList.begin();iter!=_resourcesList.end();iter++) - if((*iter).second.OS==base) - hosts.push_back((*iter).first); + + for (map::const_iterator iter = + _resourcesList.begin(); + iter != _resourcesList.end(); + iter++) + { + if ( (*iter).second.OS == base || base.size() == 0) + hosts.push_back((*iter).first); + } } + +//============================================================================= +/*! + * Gives a sublist of machines on which the module is known. + */ +//============================================================================= + //Warning need an updated parsed list : _resourcesList -void SALOME_ResourcesManager::KeepOnlyResourcesWithModule(vector& hosts,const char *moduleName) const throw(SALOME_Exception) +void +SALOME_ResourcesManager::KeepOnlyResourcesWithModule +( vector& hosts, + const char *moduleName) const +throw(SALOME_Exception) { - for(vector::iterator iter=hosts.begin();iter!=hosts.end();iter++) - { - MapOfParserResourcesType::const_iterator it=_resourcesList.find(*iter); - const map& mapOfModulesOfCurrentHost=(((*it).second).ModulesPath); - if(mapOfModulesOfCurrentHost.find(moduleName)==mapOfModulesOfCurrentHost.end()) - { - hosts.erase(iter); - } - } + for (vector::iterator iter = hosts.begin(); iter != hosts.end();) + { + MapOfParserResourcesType::const_iterator it = _resourcesList.find(*iter); + const map& mapOfModulesOfCurrentHost = + (((*it).second).ModulesPath); + + if (mapOfModulesOfCurrentHost.find(moduleName) == + mapOfModulesOfCurrentHost.end()) + hosts.erase(iter); + else + iter++; + } } + +//============================================================================= +/*! + * add to command all options relative to naming service. + */ +//============================================================================= + void SALOME_ResourcesManager::AddOmninamesParams(string& command) const -{ - string omniORBcfg( getenv( "OMNIORB_CONFIG" ) ) ; - ifstream omniORBfile( omniORBcfg.c_str() ) ; - char ORBInitRef[12] ; - char nameservice[132] ; - omniORBfile >> ORBInitRef ; - command += ORBInitRef ; - command += " " ; - omniORBfile >> nameservice ; - omniORBfile.close() ; - char * bsn = strchr( nameservice , '\n' ) ; - if ( bsn ) { - bsn[ 0 ] = '\0' ; + { + // If env variable OMNIORB_CONFIG is not defined or the file is more complex than one line + // does not work + // Even if we use it we have to check if env variable exists + //string omniORBcfg( getenv( "OMNIORB_CONFIG" ) ) ; + //ifstream omniORBfile( omniORBcfg.c_str() ) ; + //char ORBInitRef[11] ; + //char egal[3] ; + //char nameservice[132] ; + //omniORBfile >> ORBInitRef ; + //command += "ORBInitRef " ; + //omniORBfile >> egal ; + //omniORBfile >> nameservice ; + //omniORBfile.close() ; + //char * bsn = strchr( nameservice , '\n' ) ; + //if ( bsn ) { + //bsn[ 0 ] = '\0' ; + //} + //command += nameservice ; + + char *iorstr = _NS->getIORaddr(); + command += "ORBInitRef NameService="; + command += iorstr; } - command += nameservice ; -} + + +//============================================================================= +/*! + * add to command all options relative to naming service. + */ +//============================================================================= void SALOME_ResourcesManager::AddOmninamesParams(ofstream& fileStream) const -{ - string omniORBcfg( getenv( "OMNIORB_CONFIG" ) ) ; - ifstream omniORBfile( omniORBcfg.c_str() ) ; - char ORBInitRef[12] ; - char nameservice[132] ; - omniORBfile >> ORBInitRef ; - fileStream << ORBInitRef; - fileStream << " "; - omniORBfile >> nameservice ; - omniORBfile.close() ; - char * bsn = strchr( nameservice , '\n' ) ; - if ( bsn ) { - bsn[ 0 ] = '\0' ; + { + string omniORBcfg( getenv( "OMNIORB_CONFIG" ) ) ; + ifstream omniORBfile( omniORBcfg.c_str() ) ; + char ORBInitRef[11] ; + char egal[3] ; + char nameservice[132] ; + omniORBfile >> ORBInitRef ; + fileStream << "ORBInitRef "; + omniORBfile >> egal ; + omniORBfile >> nameservice ; + omniORBfile.close() ; + char * bsn = strchr( nameservice , '\n' ) ; + + if ( bsn ) + { + bsn[ 0 ] = '\0' ; + } + + fileStream << nameservice; } - fileStream << nameservice; -} + + +//============================================================================= +/*! + * generate a file name in /tmp directory + */ +//============================================================================= string SALOME_ResourcesManager::BuildTemporaryFileName() const + { + //build more complex file name to support multiple salome session + char *temp = new char[19]; + strcpy(temp, "/tmp/command"); + strcat(temp, "XXXXXX"); +#ifndef WNT + + mkstemp(temp); +#else + + char aPID[80]; + itoa(getpid(), aPID, 10); + strcat(temp, aPID); +#endif + + string command(temp); + delete [] temp; + command += ".sh"; + return command; + } + + +//============================================================================= +/*! + * Builds in a temporary file the script to be launched. + * + * Used if SALOME Application ($APPLI) is not defined. + * The command is build with data from CatalogResources, in which every path + * used on remote computer must be defined. + */ +//============================================================================= + +string +SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer +(const string& machine, + const Engines::MachineParameters& params) { - //build more complex file name to support multiple salome session - char *temp=new char[19]; - strcpy(temp,"/tmp/command"); - strcat(temp,"XXXXXX"); - mkstemp(temp); - string command(temp); - delete [] temp; - command += ".sh"; + _TmpFileName = BuildTemporaryFileName(); + ofstream tempOutputFile; + tempOutputFile.open(_TmpFileName.c_str(), ofstream::out ); + const ParserResourcesType& resInfo = _resourcesList[machine]; + tempOutputFile << "#! /bin/sh" << endl; + + // --- set env vars + + for (map::const_iterator iter = resInfo.ModulesPath.begin(); + iter != resInfo.ModulesPath.end(); + iter++) + { + string curModulePath((*iter).second); + tempOutputFile << (*iter).first << "_ROOT_DIR=" << curModulePath << endl; + tempOutputFile << "export " << (*iter).first << "_ROOT_DIR" << endl; + tempOutputFile << "LD_LIBRARY_PATH=" << curModulePath + << "/lib/salome" << ":${LD_LIBRARY_PATH}" << endl; + tempOutputFile << "PYTHONPATH=" << curModulePath << "/bin/salome:" + << curModulePath << "/lib/salome:" << curModulePath + << "/lib/python2.2/site-packages/salome:"; + tempOutputFile << curModulePath + << "/lib/python2.2/site-packages/salome/shared_modules:${PYTHONPATH}" + << endl; + } + + tempOutputFile << "export LD_LIBRARY_PATH" << endl; + tempOutputFile << "export PYTHONPATH" << endl; + tempOutputFile << "source " << resInfo.PreReqFilePath << endl; + + // ! env vars + + if (params.isMPI) + { + tempOutputFile << "mpirun -np "; + int nbproc; + + if ( (params.nb_node <= 0) && (params.nb_proc_per_node <= 0) ) + nbproc = 1; + else if ( params.nb_node == 0 ) + nbproc = params.nb_proc_per_node; + else if ( params.nb_proc_per_node == 0 ) + nbproc = params.nb_node; + else + nbproc = params.nb_node * params.nb_proc_per_node; + + std::ostringstream o; + + tempOutputFile << nbproc << " "; + } + + tempOutputFile << (*(resInfo.ModulesPath.find("KERNEL"))).second + << "/bin/salome/"; + + if (params.isMPI) + { + if (isPythonContainer(params.container_name)) + tempOutputFile << "pyMPI SALOME_ContainerPy.py "; + else + tempOutputFile << "SALOME_MPIContainer "; + } + + else + { + if (isPythonContainer(params.container_name)) + tempOutputFile << "SALOME_ContainerPy.py "; + else + tempOutputFile << "SALOME_Container "; + } + + tempOutputFile << _NS->ContainerName(params) << " -"; + AddOmninamesParams(tempOutputFile); + tempOutputFile << " &" << endl; + tempOutputFile.flush(); + tempOutputFile.close(); + chmod(_TmpFileName.c_str(), 0x1ED); + + // --- Build command + + string command; + + if (resInfo.Protocol == rsh) + { + command = "rsh "; + string commandRcp = "rcp "; + commandRcp += _TmpFileName; + commandRcp += " "; + commandRcp += machine; + commandRcp += ":"; + commandRcp += _TmpFileName; + system(commandRcp.c_str()); + } + + else if (resInfo.Protocol == ssh) + command = "ssh "; + else + throw SALOME_Exception("Unknown protocol"); + + command += machine; + _CommandForRemAccess = command; + command += " "; + command += _TmpFileName; + command += " > "; + command += "/tmp/"; + command += _NS->ContainerName(params); + command += "_"; + command += machine; + command += ".log 2>&1 &"; + SCRUTE(command); + return command; + } + + diff --git a/src/ResourcesManager/SALOME_ResourcesManager.hxx b/src/ResourcesManager/SALOME_ResourcesManager.hxx index c0b6ef385..029c9fa9e 100644 --- a/src/ResourcesManager/SALOME_ResourcesManager.hxx +++ b/src/ResourcesManager/SALOME_ResourcesManager.hxx @@ -6,94 +6,120 @@ #include #include "SALOME_ResourcesCatalog_Handler.hxx" #include "SALOME_LoadRateManager.hxx" +#include "SALOME_NamingService.hxx" #include CORBA_CLIENT_HEADER(SALOME_ContainerManager) #include #include #include -//WARNING the call of BuildTempFileToLaunchRemoteContainer and RmTmpFile must be done in a critical section to be sure to be clean. -//Only one thread should use the SALOME_ResourcesManager class in a SALOME session. -class SALOME_ResourcesManager -{ -public: - //! standard constructor - SALOME_ResourcesManager(); - //!just for test - SALOME_ResourcesManager(const char *xmlFilePath); - - //! standard destructor - ~SALOME_ResourcesManager(); +#if defined RESOURCESMANAGER_EXPORTS +#if defined WIN32 +#define RESOURCESMANAGER_EXPORT __declspec( dllexport ) +#else +#define RESOURCESMANAGER_EXPORT +#endif +#else +#if defined WNT +#define RESOURCESMANAGER_EXPORT __declspec( dllimport ) +#else +#define RESOURCESMANAGER_EXPORT +#endif +#endif - //! method to get the list of name of ressources fitting for the specified module. - std::vector GetFittingResources(const Engines::MachineParameters& params,const char *moduleName) throw(SALOME_Exception); +// --- WARNING --- +// The call of BuildTempFileToLaunchRemoteContainer and RmTmpFile must be done +// in a critical section to be sure to be clean. +// Only one thread should use the SALOME_ResourcesManager class in a SALOME +// session. - //! method to dynamically obtain the best machines - std::string FindBest(const Engines::MachineList& listOfMachines); +class RESOURCESMANAGER_EXPORT SALOME_ResourcesManager + { - //! method that builds in a temporary file the script to be launched - std::string BuildTempFileToLaunchRemoteContainer(const std::string& machine,const char *containerName); + public: - //! method that builds the command to be launched. - std::string BuildCommandToLaunchLocalContainer(const char *containerName); + SALOME_ResourcesManager(CORBA::ORB_ptr orb, const char *xmlFilePath); + SALOME_ResourcesManager(CORBA::ORB_ptr orb); - //! method that remove the generated temporary file in case of a remote launch. - void RmTmpFile(); + ~SALOME_ResourcesManager(); - //! method that builds the script to be launched - std::string BuildCommand(const std::string& machine,const char *containerName); + std::vector + GetFittingResources(const Engines::MachineParameters& params, + const char *moduleName) + throw(SALOME_Exception); - //! add an entry in the ressources catalog xml file. Return 1 if OK. Return 0 if the ressource with the same hostname already exists. - int AddResourceInCatalog(const Engines::MachineParameters& paramsOfNewResources, const std::map& modulesOnNewResources, - const char *environPathOfPrerequired, - const char *alias, const char *userName, AccessModeType mode, AccessProtocolType prot) throw(SALOME_Exception); - - //! delete a ressource from the Catalog. - void DeleteResourceInCatalog(const char *hostname); + std::string FindBest(const Engines::MachineList& listOfMachines); - //! write the current data in memory in file. - void WriteInXmlFile(); + std::string BuildCommandToLaunchRemoteContainer + (const std::string& machine, + const Engines::MachineParameters& params); - //! method to parse the data type catalog - const MapOfParserResourcesType& ParseXmlFile(); + std::string BuildCommandToLaunchLocalContainer + (const Engines::MachineParameters& params); - //! to consult the content of the list - const MapOfParserResourcesType& GetList() const; + void RmTmpFile(); -private: + std::string BuildCommand(const std::string& machine, + const char *containerName); - //! method to verify ressources catalog content - return true if verfication is OK - bool _verify_resources(MapOfParserResourcesType resourceslist); + int AddResourceInCatalog + (const Engines::MachineParameters& paramsOfNewResources, + const std::map& modulesOnNewResources, + const char *environPathOfPrerequired, + const char *alias, + const char *userName, + AccessModeType mode, + AccessProtocolType prot) + throw(SALOME_Exception); - //! method that fill hosts with only resources in xml files that are on the specified OS - void SelectOnlyResourcesWithOS(std::vector& hosts,const char *OS) const throw(SALOME_Exception); + void DeleteResourceInCatalog(const char *hostname); - //! method that keep from hosts only those having component of name moduleName. - void KeepOnlyResourcesWithModule(std::vector& hosts,const char *moduleName) const throw(SALOME_Exception); + void WriteInXmlFile(); - //! methode that add to command all options relative to naming service. - void AddOmninamesParams(std::string& command) const; + const MapOfParserResourcesType& ParseXmlFile(); - //! method that add to command all options relative to naming service. - void AddOmninamesParams(std::ofstream& fileStream) const; + const MapOfParserResourcesType& GetList() const; - //! method that generate a file name in /tmp directory - std::string BuildTemporaryFileName() const; + private: + SALOME_NamingService *_NS; - // will contain the path to the ressources catalog - QString _path_resources; + std::string BuildTempFileToLaunchRemoteContainer + (const std::string& machine, + const Engines::MachineParameters& params); - //! attribute that contains current tmp files generated - std::string _TmpFileName; + void SelectOnlyResourcesWithOS(std::vector& hosts, + const char *OS) const + throw(SALOME_Exception); - //! attribute that contains the rsh or ssh command to access directly to machine. Only used by this->RmTmpFile in case of a remote launch. - std::string _CommandForRemAccess; - - //will contain the informations on the data type catalog(after parsing) - MapOfParserResourcesType _resourcesList; + void KeepOnlyResourcesWithModule(std::vector& hosts, + const char *moduleName) const + throw(SALOME_Exception); - SALOME_LoadRateManager _dynamicResourcesSelecter; -}; + void AddOmninamesParams(std::string& command) const; + + void AddOmninamesParams(std::ofstream& fileStream) const; + + std::string BuildTemporaryFileName() const; + + + //! will contain the path to the ressources catalog + QString _path_resources; + + //! attribute that contains current tmp files generated + std::string _TmpFileName; + + //! contains the rsh or ssh command to access directly to machine. + // Only used by this->RmTmpFile in case of a remote launch. + std::string _CommandForRemAccess; + + //! will contain the informations on the data type catalog(after parsing) + MapOfParserResourcesType _resourcesList; + + SALOME_LoadRateManager _dynamicResourcesSelecter; + + //! different behaviour if $APPLI exists (SALOME Application) + bool _isAppliSalomeDefined; + }; #endif // RESSOURCESCATALOG_IMPL_H diff --git a/src/RessourcesCatalog/Makefile.in b/src/RessourcesCatalog/Makefile.in index 17f8c42af..8d416a855 100644 --- a/src/RessourcesCatalog/Makefile.in +++ b/src/RessourcesCatalog/Makefile.in @@ -50,12 +50,12 @@ LIB_SRC = \ # in fact client is a test ! So it may go away BIN ! BIN = SALOME_RessourcesCatalog_Server SALOME_RessourcesCatalog_Client BIN_SRC = -BIN_SERVER_IDL = SALOME_RessourcesCatalog.idl +BIN_SERVER_IDL = SALOME_RessourcesCatalog.idl SALOME_Exception.idl CPPFLAGS+= $(QT_MT_INCLUDES) CXXFLAGS+= LDFLAGS+= $(QT_MT_LIBS) $(OGL_LIBS) -lSalomeNS -lOpUtil -lSALOMELocalTrace -LDFLAGSFORBIN= $(LDFLAGS) -lSALOMETraceCollector +LDFLAGSFORBIN+= -lSalomeNS -lOpUtil -lSALOMELocalTrace -lSALOMEBasics @CONCLUDE@ diff --git a/src/RessourcesCatalog/SALOME_RessourcesCatalog_Client.cxx b/src/RessourcesCatalog/SALOME_RessourcesCatalog_Client.cxx index d368d878f..9fef8478b 100644 --- a/src/RessourcesCatalog/SALOME_RessourcesCatalog_Client.cxx +++ b/src/RessourcesCatalog/SALOME_RessourcesCatalog_Client.cxx @@ -26,10 +26,14 @@ /* $Header$ */ -#include +#include #include "SALOME_NamingService.hxx" #include +#ifndef WNT #include CORBA_SERVER_HEADER(SALOME_RessourcesCatalog) +#else +#include +#endif #include #include "utilities.h" using namespace std; @@ -62,7 +66,11 @@ int main(int argc,char **argv) //Get container type list of computer eri SALOME_RessourcesCatalog::ListOfContainerType_var list = Catalogue->GetContainerTypeList("eri"); +#ifndef WNT for (unsigned int ind = 0; ind < list->length();ind++) +#else + for (ind = 0; ind < list->length();ind++) +#endif { MESSAGE("Container type list of eri : " << list[ind]); } @@ -72,7 +80,11 @@ int main(int argc,char **argv) MESSAGE("Ressource name : " << computer->name); MESSAGE("Ressource OS : " << computer->OS); MESSAGE("Ressource OS version : " << computer->OS_version); +#ifndef WNT for (unsigned int ind = 0; ind < computer->procs.length();ind++) +#else + for (ind = 0; ind < computer->procs.length();ind++) +#endif { MESSAGE("Processor number : " << computer->procs[ind].number); MESSAGE("Processor model name : " << computer->procs[ind].model_name); diff --git a/src/RessourcesCatalog/SALOME_RessourcesCatalog_Handler.hxx b/src/RessourcesCatalog/SALOME_RessourcesCatalog_Handler.hxx index 9e1b8e2f8..79e785560 100755 --- a/src/RessourcesCatalog/SALOME_RessourcesCatalog_Handler.hxx +++ b/src/RessourcesCatalog/SALOME_RessourcesCatalog_Handler.hxx @@ -35,7 +35,21 @@ #include #include -class SALOME_RessourcesCatalog_Handler : public QXmlDefaultHandler +#if defined RESSOURCESCatalog_EXPORTS +#if defined WIN32 +#define RESSOURCESCatalog_EXPORT __declspec( dllexport ) +#else +#define RESSOURCESCatalog_EXPORT +#endif +#else +#if defined WNT +#define RESSOURCESCatalog_EXPORT __declspec( dllimport ) +#else +#define RESSOURCESCatalog_EXPORT +#endif +#endif + +class RESSOURCESCatalog_EXPORT SALOME_RessourcesCatalog_Handler : public QXmlDefaultHandler { public : //! standard constructor diff --git a/src/RessourcesCatalog/SALOME_RessourcesCatalog_Server.cxx b/src/RessourcesCatalog/SALOME_RessourcesCatalog_Server.cxx index b52c63b67..ea3be6a32 100644 --- a/src/RessourcesCatalog/SALOME_RessourcesCatalog_Server.cxx +++ b/src/RessourcesCatalog/SALOME_RessourcesCatalog_Server.cxx @@ -26,7 +26,7 @@ // Module : SALOME // $Header$ -#include +#include #include "SALOME_NamingService.hxx" #include "SALOME_RessourcesCatalog_impl.hxx" #include "utilities.h" @@ -38,7 +38,7 @@ int main(int argc,char **argv) { // initialize the ORB CORBA::ORB_ptr orb = CORBA::ORB_init (argc, argv); - SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); try { CosNaming::NamingContext_var _rootContext, catalogContext; @@ -72,7 +72,11 @@ int main(int argc,char **argv) for (int i = 1; i<=NumberOfTries; i++) { if (i!=1) +#ifndef WNT a=nanosleep(&ts_req,&ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try { obj = orb->resolve_initial_references("RootPOA"); @@ -85,9 +89,9 @@ int main(int argc,char **argv) if (!CORBA::is_nil(theObj)) inc = CosNaming::NamingContext::_narrow(theObj); } - catch( CORBA::COMM_FAILURE& ) + catch( CORBA::SystemException& ) { - INFOS( "Ressources Catalog: CORBA::COMM_FAILURE: Unable to contact the Naming Service" ); + INFOS( "Ressources Catalog: CORBA::SystemException: Unable to contact the Naming Service" ); } if(!CORBA::is_nil(inc)) { @@ -97,7 +101,11 @@ int main(int argc,char **argv) for(int j=1; j<=NumberOfTries; j++) { if (j!=1) +#ifndef WNT a=nanosleep(&ts_req, &ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try{ object = inc->resolve(name); } @@ -149,6 +157,6 @@ int main(int argc,char **argv) INFOS("Caught CORBA::Exception.") } - delete myThreadTrace; + // delete myThreadTrace; return 0; } diff --git a/src/RessourcesCatalog/SALOME_RessourcesCatalog_impl.cxx b/src/RessourcesCatalog/SALOME_RessourcesCatalog_impl.cxx index 5a1d7bed4..28be74c37 100644 --- a/src/RessourcesCatalog/SALOME_RessourcesCatalog_impl.cxx +++ b/src/RessourcesCatalog/SALOME_RessourcesCatalog_impl.cxx @@ -227,7 +227,11 @@ SALOME_RessourcesCatalogImpl::_verify_ressources(ListOfParserressources ressourc _machine_list.push_back(ressourceslist[ind].Parsername); // Parse if a computer name is twice in the list of computers +#ifndef WNT for (unsigned int ind = 0; ind < _machine_list.size(); ind++) +#else + for (ind = 0; ind < _machine_list.size(); ind++) +#endif { for (unsigned int ind1 = ind+1 ; ind1 < _machine_list.size(); ind1++) { diff --git a/src/RessourcesCatalog/SALOME_RessourcesCatalog_impl.hxx b/src/RessourcesCatalog/SALOME_RessourcesCatalog_impl.hxx index 4b8c5228a..42237b98b 100644 --- a/src/RessourcesCatalog/SALOME_RessourcesCatalog_impl.hxx +++ b/src/RessourcesCatalog/SALOME_RessourcesCatalog_impl.hxx @@ -34,7 +34,21 @@ #include #include CORBA_SERVER_HEADER(SALOME_RessourcesCatalog) -class SALOME_RessourcesCatalogImpl: public POA_SALOME_RessourcesCatalog::RessourcesCatalog, +#if defined RESSOURCESCatalog_EXPORTS +#if defined WIN32 +#define RESSOURCESCatalog_EXPORT __declspec( dllexport ) +#else +#define RESSOURCESCatalog_EXPORT +#endif +#else +#if defined WNT +#define RESSOURCESCatalog_EXPORT __declspec( dllimport ) +#else +#define RESSOURCESCatalog_EXPORT +#endif +#endif + +class RESSOURCESCatalog_EXPORT SALOME_RessourcesCatalogImpl: public POA_SALOME_RessourcesCatalog::RessourcesCatalog, public PortableServer::RefCountServantBase { public: diff --git a/src/SALOMEDS/Makefile.in b/src/SALOMEDS/Makefile.in index 5a4adbf4e..eb9a92a37 100644 --- a/src/SALOMEDS/Makefile.in +++ b/src/SALOMEDS/Makefile.in @@ -1,28 +1,6 @@ -# SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library 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 -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# # # File : Makefile.in -# Author : Marc Tajchman +# Author : Sergey RUIN # Module : SALOME top_srcdir=@top_srcdir@ @@ -33,15 +11,27 @@ VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_srcdir)/idl @COMMENCE@ +EXPORT_PYSCRIPTS = SALOME_DriverPy.py + EXPORT_HEADERS= \ SALOMEDS_StudyManager_i.hxx \ - SALOMEDS_OCAFApplication.hxx \ - Handle_SALOMEDS_OCAFApplication.hxx + SALOMEDS_Driver_i.hxx \ + SALOMEDS_StudyManager.hxx \ + SALOMEDS_Study_i.hxx \ + SALOMEDS_Study.hxx \ + SALOMEDS_SObject_i.hxx \ + SALOMEDS_SObject.hxx \ + SALOMEDS_SComponent_i.hxx \ + SALOMEDS_SComponent.hxx \ + SALOMEDS_GenericAttribute_i.hxx \ + SALOMEDS_GenericAttribute.hxx # Libraries targets LIB = libSalomeDS.la LIB_SRC = \ + SALOMEDS.cxx \ + SALOMEDS_Driver_i.cxx \ SALOMEDS_StudyManager_i.cxx \ SALOMEDS_UseCaseBuilder_i.cxx \ SALOMEDS_UseCaseIterator_i.cxx \ @@ -51,12 +41,7 @@ LIB_SRC = \ SALOMEDS_StudyBuilder_i.cxx \ SALOMEDS_SObject_i.cxx \ SALOMEDS_SComponent_i.cxx \ - SALOMEDS_OCAFApplication.cxx \ SALOMEDS_GenericAttribute_i.cxx \ - SALOMEDS_IORAttribute.cxx \ - SALOMEDS_ExternalFileDef.cxx \ - SALOMEDS_FileType.cxx \ - SALOMEDS_PersRefAttribute.cxx \ SALOMEDS_AttributeComment_i.cxx \ SALOMEDS_AttributeExternalFileDef_i.cxx \ SALOMEDS_AttributeFileType_i.cxx \ @@ -85,51 +70,71 @@ LIB_SRC = \ SALOMEDS_AttributeTableOfString_i.cxx \ SALOMEDS_AttributeStudyProperties_i.cxx \ SALOMEDS_AttributePythonObject_i.cxx \ - SALOMEDS_SequenceOfRealAttribute.cxx \ - SALOMEDS_SequenceOfIntegerAttribute.cxx \ - SALOMEDS_DrawableAttribute.cxx \ - SALOMEDS_SelectableAttribute.cxx \ - SALOMEDS_ExpandableAttribute.cxx \ - SALOMEDS_OpenedAttribute.cxx \ - SALOMEDS_FlagsAttribute.cxx \ - SALOMEDS_GraphicAttribute.cxx \ - SALOMEDS_TextColorAttribute.cxx \ - SALOMEDS_TextHighlightColorAttribute.cxx \ - SALOMEDS_PixMapAttribute.cxx \ - SALOMEDS_LocalIDAttribute.cxx \ - SALOMEDS_TargetAttribute.cxx \ - SALOMEDS_TableOfIntegerAttribute.cxx \ - SALOMEDS_TableOfRealAttribute.cxx \ - SALOMEDS_TableOfStringAttribute.cxx \ - SALOMEDS_StudyPropertiesAttribute.cxx \ - SALOMEDS_PythonObjectAttribute.cxx \ - SALOMEDS_DataMapOfIntegerString_0.cxx \ - SALOMEDS_DataMapIteratorOfDataMapOfIntegerString_0.cxx \ - SALOMEDS_DataMapNodeOfDataMapOfIntegerString_0.cxx \ - SALOMEDS_DataMapIteratorOfDataMapStringLabel_0.cxx \ - SALOMEDS_DataMapNodeOfDataMapStringLabel_0.cxx \ - SALOMEDS_DataMapStringLabel_0.cxx + SALOMEDS_SObject.cxx \ + SALOMEDS_SComponent.cxx \ + SALOMEDS_GenericAttribute.cxx \ + SALOMEDS_ChildIterator.cxx \ + SALOMEDS_SComponentIterator.cxx \ + SALOMEDS_UseCaseIterator.cxx \ + SALOMEDS_UseCaseBuilder.cxx \ + SALOMEDS_StudyBuilder.cxx \ + SALOMEDS_Study.cxx \ + SALOMEDS_StudyManager.cxx \ + SALOMEDS_AttributeStudyProperties.cxx \ + SALOMEDS_AttributeComment.cxx \ + SALOMEDS_AttributeDrawable.cxx \ + SALOMEDS_AttributeExpandable.cxx \ + SALOMEDS_AttributeExternalFileDef.cxx \ + SALOMEDS_AttributeFileType.cxx \ + SALOMEDS_AttributeFlags.cxx \ + SALOMEDS_AttributeGraphic.cxx \ + SALOMEDS_AttributeIOR.cxx \ + SALOMEDS_AttributeInteger.cxx \ + SALOMEDS_AttributeLocalID.cxx \ + SALOMEDS_AttributeName.cxx \ + SALOMEDS_AttributeOpened.cxx \ + SALOMEDS_AttributePythonObject.cxx \ + SALOMEDS_AttributeReal.cxx \ + SALOMEDS_AttributeSelectable.cxx \ + SALOMEDS_AttributeSequenceOfInteger.cxx \ + SALOMEDS_AttributePersistentRef.cxx \ + SALOMEDS_AttributePixMap.cxx \ + SALOMEDS_AttributeSequenceOfReal.cxx \ + SALOMEDS_AttributeTableOfInteger.cxx \ + SALOMEDS_AttributeTableOfReal.cxx \ + SALOMEDS_AttributeTableOfString.cxx \ + SALOMEDS_AttributeTarget.cxx \ + SALOMEDS_AttributeTextColor.cxx \ + SALOMEDS_AttributeTextHighlightColor.cxx \ + SALOMEDS_AttributeTreeNode.cxx \ + SALOMEDS_AttributeUserID.cxx + # Executables targets BIN = SALOMEDS_Server SALOMEDS_Client BIN_SRC = -LIB_SERVER_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_ContainerManager.idl +LIB_SERVER_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_GenericObj.idl BIN_SERVER_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl BIN_CLIENT_IDL = -LIB_CLIENT_IDL = SALOME_Component.idl SALOME_GenericObj.idl -CPPFLAGS+=$(OCC_INCLUDES) $(HDF5_INCLUDES) -CXXFLAGS+=$(OCC_CXXFLAGS) -LDFLAGS+= $(HDF5_LIBS) -lTOOLSDS -lSalomeNS -lSalomeHDFPersist -lOpUtil -lSALOMELocalTrace $(CAS_LDPATH) -lTKCAF -lTKBO -lTKStdSchema -lSalomeGenericObj -lSalomeLifeCycleCORBA -lSalomeContainer -lSalomeResourcesManager +CPPFLAGS+=$(OCC_INCLUDES) $(HDF5_INCLUDES) $(BOOST_CPPFLAGS) +CXXFLAGS+=$(OCC_CXXFLAGS) $(BOOST_CPPFLAGS) +LDFLAGS+= $(HDF5_LIBS) -lTOOLSDS -lSalomeNS -lSalomeHDFPersist -lOpUtil -lSALOMELocalTrace -lSalomeDSImpl -lSalomeGenericObj $(CAS_LDPATH) -lTKCAF -lTKBO -lTKStdSchema -lSalomeGenericObj -lSalomeLifeCycleCORBA # _CS_gbo_090604 Ajout Spécifique Calibre 3, pour l'utilisation de la version 5.12 de la bibliothèque OCC. # La bibliothèque OCC5.12 a été compilée sur Calibre 3 avec l'extention Xmu (impossible de compiler sans). # On est donc obligé ici, pour permettre l'édition de lien avec les bibliothèques OCC, de spécifier le # chemin d'accès aux bibliothèques Xmu # + +# _CS_gbo_090604 Ajout Sp.cifique Calibre 3, pour l'utilisation de la version 5.12 de la biblioth.que OCC. +# La biblioth.que OCC5.12 a .t. compil.e sur Calibre 3 avec l'extention Xmu (impossible de compiler sans). +# On est donc oblig. ici, pour permettre l'.dition de lien avec les biblioth.ques OCC, de sp.cifier le +# chemin d'acc.s aux biblioth.ques Xmu +# LDXMUFLAGS= -L/usr/X11R6/lib -lXmu LDFLAGS+=$(LDXMUFLAGS) -LDFLAGSFORBIN= $(LDFLAGS) -lRegistry -lSalomeNotification -lSALOMETraceCollector +LDFLAGSFORBIN= $(LDFLAGS) -lTKLCAF -lTKMath -lRegistry -lSalomeNotification -lSalomeContainer -lSalomeResourcesManager -lSALOMEBasics @CONCLUDE@ diff --git a/src/SALOMEDS/SALOMEDS.cxx b/src/SALOMEDS/SALOMEDS.cxx new file mode 100644 index 000000000..ae488ad0a --- /dev/null +++ b/src/SALOMEDS/SALOMEDS.cxx @@ -0,0 +1,57 @@ +// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : SALOMEDS.cxx +// Author : Sergey ANIKIN +// Module : SALOME +// $Header$ + + +#ifndef WNT +#include +#else +#include "SALOMEDS.hxx" +#endif + +using namespace SALOMEDS; + +// PAL8065: san -- Global recursive mutex for SALOMEDS methods +Utils_Mutex Locker::MutexDS; + +// PAL8065: san -- Global SALOMEDS locker +Locker::Locker() +: Utils_Locker( &MutexDS ) +{} + +Locker::~Locker() +{} + +void SALOMEDS::lock() +{ + Locker::MutexDS.lock(); +} + +void SALOMEDS::unlock() +{ + Locker::MutexDS.unlock(); +} diff --git a/src/SALOMEDS/SALOMEDS.hxx b/src/SALOMEDS/SALOMEDS.hxx new file mode 100644 index 000000000..06ee1825e --- /dev/null +++ b/src/SALOMEDS/SALOMEDS.hxx @@ -0,0 +1,67 @@ +// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : SALOMEDS.hxx +// Author : Sergey ANIKIN +// Module : SALOME +// $Header$ + + +#ifndef SALOMEDS_HeaderFile +#define SALOMEDS_HeaderFile + +#include + +namespace SALOMEDS +{ + // PAL8065: san -- Implementation of convenient locker based on simple recursive + // mutex for POSIX platforms. + // This class is to protect SALOMEDS CORBA methods which deal with OCC calls from + // parallel access by several threads + // To protect some method, an instance of Locker class should be created + // on the stack at the beginning of guarded code: + // + // Locker lock; + // + class Locker : public Utils_Locker + { + public: + Locker(); + virtual ~Locker(); + + private: + static Utils_Mutex MutexDS; + + friend void lock(); + friend void unlock(); + }; + + // Convenient functions to lock/unlock the global SALOMEDS mutex temporarily. + // In particular, "unlock-dosomething-lock" scheme should be used, when some non-SALOMEDS + // CORBA interface is called (component's engine), to avoid deadlocks in case of + // indirect recursion. + void lock(); + void unlock(); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeComment.cxx b/src/SALOMEDS/SALOMEDS_AttributeComment.cxx new file mode 100644 index 000000000..d8555c1e5 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeComment.cxx @@ -0,0 +1,36 @@ +// File : SALOMEDS_AttributeComment.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeComment.hxx" + +#include +#include +#include + +SALOMEDS_AttributeComment::SALOMEDS_AttributeComment(const Handle(SALOMEDSImpl_AttributeComment)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeComment::SALOMEDS_AttributeComment(SALOMEDS::AttributeComment_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeComment::~SALOMEDS_AttributeComment() +{} + +std::string SALOMEDS_AttributeComment::Value() +{ + std::string aValue; + if(_isLocal) + aValue = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeComment)::DownCast(_local_impl)->Value()).ToCString(); + else aValue = SALOMEDS::AttributeComment::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeComment::SetValue(const std::string& value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeComment)::DownCast(_local_impl)->SetValue((char*)value.c_str()); + else SALOMEDS::AttributeComment::_narrow(_corba_impl)->SetValue(value.c_str()); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeComment.hxx b/src/SALOMEDS/SALOMEDS_AttributeComment.hxx new file mode 100644 index 000000000..b3638975c --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeComment.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeComment.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeComment_HeaderFile +#define SALOMEDS_AttributeComment_HeaderFile + +#include "SALOMEDSClient_AttributeComment.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeComment.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeComment: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeComment +{ +public: + SALOMEDS_AttributeComment(const Handle(SALOMEDSImpl_AttributeComment)& theAttr); + SALOMEDS_AttributeComment(SALOMEDS::AttributeComment_ptr theAttr); + ~SALOMEDS_AttributeComment(); + + virtual std::string Value(); + virtual void SetValue(const std::string& value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeComment_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeComment_i.cxx index d84186658..ee2d75a09 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeComment_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeComment_i.cxx @@ -1,56 +1,30 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeComment_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#include -#include #include "SALOMEDS_AttributeComment_i.hxx" +#include +#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDS.hxx" + using namespace std; char* SALOMEDS_AttributeComment_i::Value() { - TCollection_ExtendedString S = Handle(TDataStd_Comment)::DownCast(_myAttr)->Get(); - CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(S).ToCString()); + SALOMEDS::Locker lock; + + CORBA::String_var c_s = + CORBA::string_dup(TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeComment)::DownCast(_impl)->Value()).ToCString()); return c_s._retn(); } void SALOMEDS_AttributeComment_i::SetValue(const char* value) { - CheckLocked(); - CORBA::String_var Str = CORBA::string_dup(value); - Handle(TDataStd_Comment)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str)); -} - -char* SALOMEDS_AttributeComment_i::Store() { - return Value(); -} + SALOMEDS::Locker lock; -void SALOMEDS_AttributeComment_i::Restore(const char* value) { - SetValue(value); + CheckLocked(); + TCollection_AsciiString aStr((char*)value); + Handle(SALOMEDSImpl_AttributeComment)::DownCast(_impl)->SetValue(TCollection_ExtendedString(aStr)); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeComment_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeComment_i.hxx index 762a96fe9..dcc5a4892 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeComment_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeComment_i.hxx @@ -1,56 +1,28 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeComment_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeComment_i_HeaderFile #define SALOMEDS_AttributeComment_i_HeaderFile -#include - -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeComment,TDataStd_Comment,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeComment.hxx" -class SALOMEDS_AttributeComment_i: - public virtual POA_SALOMEDS::AttributeComment, - public virtual SALOMEDS_TAttributeComment_i +class SALOMEDS_AttributeComment_i: public virtual POA_SALOMEDS::AttributeComment, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeComment,TDataStd_Comment); -public: +public: + SALOMEDS_AttributeComment_i(const Handle(SALOMEDSImpl_AttributeComment)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + virtual ~SALOMEDS_AttributeComment_i() {}; + char* Value(); - void SetValue(const char* theValue); - - char* Store(); - void Restore(const char*); + void SetValue(const char* value); }; - #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeDrawable.cxx b/src/SALOMEDS/SALOMEDS_AttributeDrawable.cxx new file mode 100644 index 000000000..0c4972ec2 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeDrawable.cxx @@ -0,0 +1,34 @@ +// File : SALOMEDS_AttributeDrawable.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeDrawable.hxx" + +#include +#include + +SALOMEDS_AttributeDrawable::SALOMEDS_AttributeDrawable(const Handle(SALOMEDSImpl_AttributeDrawable)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeDrawable::SALOMEDS_AttributeDrawable(SALOMEDS::AttributeDrawable_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeDrawable::~SALOMEDS_AttributeDrawable() +{} + +bool SALOMEDS_AttributeDrawable::IsDrawable() +{ + bool aValue; + if(_isLocal) aValue = (bool)Handle(SALOMEDSImpl_AttributeDrawable)::DownCast(_local_impl)->IsDrawable(); + else aValue = SALOMEDS::AttributeDrawable::_narrow(_corba_impl)->IsDrawable(); + return aValue; +} + +void SALOMEDS_AttributeDrawable::SetDrawable(bool value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeDrawable)::DownCast(_local_impl)->SetDrawable((int)value); + else SALOMEDS::AttributeDrawable::_narrow(_corba_impl)->SetDrawable(value); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeDrawable.hxx b/src/SALOMEDS/SALOMEDS_AttributeDrawable.hxx new file mode 100644 index 000000000..fdc0b369a --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeDrawable.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeDrawable.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeDrawable_HeaderFile +#define SALOMEDS_AttributeDrawable_HeaderFile + +#include "SALOMEDSClient_AttributeDrawable.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeDrawable.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeDrawable: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeDrawable +{ +public: + SALOMEDS_AttributeDrawable(const Handle(SALOMEDSImpl_AttributeDrawable)& theAttr); + SALOMEDS_AttributeDrawable(SALOMEDS::AttributeDrawable_ptr theAttr); + ~SALOMEDS_AttributeDrawable(); + + virtual bool IsDrawable(); + virtual void SetDrawable(bool value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeDrawable_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeDrawable_i.cxx index 26f657821..4f68a4b83 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeDrawable_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeDrawable_i.cxx @@ -1,50 +1,24 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeDrawable_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + + #include "SALOMEDS_AttributeDrawable_i.hxx" +#include "SALOMEDS.hxx" using namespace std; -CORBA::Boolean SALOMEDS_AttributeDrawable_i::IsDrawable() { - return (Handle(SALOMEDS_DrawableAttribute)::DownCast(_myAttr)->Get() == 1); +CORBA::Boolean SALOMEDS_AttributeDrawable_i::IsDrawable() +{ + SALOMEDS::Locker lock; + return (Handle(SALOMEDSImpl_AttributeDrawable)::DownCast(_impl)->IsDrawable() == 1); } -void SALOMEDS_AttributeDrawable_i::SetDrawable(CORBA::Boolean value) { +void SALOMEDS_AttributeDrawable_i::SetDrawable(CORBA::Boolean value) +{ + SALOMEDS::Locker lock; CheckLocked(); - Standard_Integer val = 0; - if (value != 0) val = 1; - Handle(TDataStd_Integer)::DownCast(_myAttr)->Set(val); + Handle(SALOMEDSImpl_AttributeDrawable)::DownCast(_impl)->SetDrawable(value); } -char* SALOMEDS_AttributeDrawable_i::Store() { - return CORBA::string_dup(IsDrawable()?"1":"0"); -} - -void SALOMEDS_AttributeDrawable_i::Restore(const char* value) { - SetDrawable(value[0] == '1'); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeDrawable_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeDrawable_i.hxx index 7fb12ac34..97fbda50e 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeDrawable_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeDrawable_i.hxx @@ -1,56 +1,31 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeDrawable_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header: #ifndef SALOMEDS_AttributeDrawable_i_HeaderFile #define SALOMEDS_AttributeDrawable_i_HeaderFile -#include "SALOMEDS_DrawableAttribute.hxx" -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers + #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeDrawable,SALOMEDS_DrawableAttribute,false); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeDrawable.hxx" -class SALOMEDS_AttributeDrawable_i: - public virtual POA_SALOMEDS::AttributeDrawable, - public virtual SALOMEDS_TAttributeDrawable_i +class SALOMEDS_AttributeDrawable_i: public virtual POA_SALOMEDS::AttributeDrawable, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeDrawable,SALOMEDS_DrawableAttribute); public: + + SALOMEDS_AttributeDrawable_i(const Handle(SALOMEDSImpl_AttributeDrawable)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + virtual ~SALOMEDS_AttributeDrawable_i() {}; CORBA::Boolean IsDrawable(); void SetDrawable(CORBA::Boolean value); - - char* Store(); - void Restore(const char*); - }; + #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeExpandable.cxx b/src/SALOMEDS/SALOMEDS_AttributeExpandable.cxx new file mode 100644 index 000000000..f14eca0de --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeExpandable.cxx @@ -0,0 +1,34 @@ +// File : SALOMEDS_AttributeExpandable.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeExpandable.hxx" + +#include +#include + +SALOMEDS_AttributeExpandable::SALOMEDS_AttributeExpandable(const Handle(SALOMEDSImpl_AttributeExpandable)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeExpandable::SALOMEDS_AttributeExpandable(SALOMEDS::AttributeExpandable_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeExpandable::~SALOMEDS_AttributeExpandable() +{} + +bool SALOMEDS_AttributeExpandable::IsExpandable() +{ + bool aValue; + if(_isLocal) aValue = (bool)Handle(SALOMEDSImpl_AttributeExpandable)::DownCast(_local_impl)->IsExpandable(); + else aValue = SALOMEDS::AttributeExpandable::_narrow(_corba_impl)->IsExpandable(); + return aValue; +} + +void SALOMEDS_AttributeExpandable::SetExpandable(bool value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeExpandable)::DownCast(_local_impl)->SetExpandable((int)value); + else SALOMEDS::AttributeExpandable::_narrow(_corba_impl)->SetExpandable(value); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeExpandable.hxx b/src/SALOMEDS/SALOMEDS_AttributeExpandable.hxx new file mode 100644 index 000000000..550e2890e --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeExpandable.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeExpandable.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeExpandable_HeaderFile +#define SALOMEDS_AttributeExpandable_HeaderFile + +#include "SALOMEDSClient_AttributeExpandable.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeExpandable.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeExpandable: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeExpandable +{ +public: + SALOMEDS_AttributeExpandable(const Handle(SALOMEDSImpl_AttributeExpandable)& theAttr); + SALOMEDS_AttributeExpandable(SALOMEDS::AttributeExpandable_ptr theAttr); + ~SALOMEDS_AttributeExpandable(); + + virtual bool IsExpandable(); + virtual void SetExpandable(bool value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeExpandable_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeExpandable_i.cxx index 70601d33f..5cff0d380 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeExpandable_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeExpandable_i.cxx @@ -1,49 +1,23 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeExpandable_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeExpandable_i.hxx" +#include "SALOMEDS.hxx" using namespace std; -CORBA::Boolean SALOMEDS_AttributeExpandable_i::IsExpandable() { - return (Handle(SALOMEDS_ExpandableAttribute)::DownCast(_myAttr)->Get() == 1); +CORBA::Boolean SALOMEDS_AttributeExpandable_i::IsExpandable() +{ + SALOMEDS::Locker lock; + return (Handle(SALOMEDSImpl_AttributeExpandable)::DownCast(_impl)->IsExpandable() == 1); } -void SALOMEDS_AttributeExpandable_i::SetExpandable(CORBA::Boolean value) { - Standard_Integer val = 0; - if (value != 0) val = 1; - Handle(TDataStd_Integer)::DownCast(_myAttr)->Set(val); -} - -char* SALOMEDS_AttributeExpandable_i::Store() { - return CORBA::string_dup(IsExpandable()?"1":"0"); +void SALOMEDS_AttributeExpandable_i::SetExpandable(CORBA::Boolean value) +{ + SALOMEDS::Locker lock; + CheckLocked(); + Handle(SALOMEDSImpl_AttributeExpandable)::DownCast(_impl)->SetExpandable(value); } -void SALOMEDS_AttributeExpandable_i::Restore(const char* value) { - SetExpandable(value[0] == '1'); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeExpandable_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeExpandable_i.hxx index a8c57c00e..7463c8f51 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeExpandable_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeExpandable_i.hxx @@ -1,28 +1,5 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeExpandable_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME // $Header: @@ -30,26 +7,24 @@ #define SALOMEDS_AttributeExpandable_i_HeaderFile // IDL headers + #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_ExpandableAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeExpandable.hxx" -DEFINE_DERIVED_ATTR(AttributeExpandable,SALOMEDS_ExpandableAttribute,false); - -class SALOMEDS_AttributeExpandable_i: - public virtual POA_SALOMEDS::AttributeExpandable, - public virtual SALOMEDS_TAttributeExpandable_i +class SALOMEDS_AttributeExpandable_i: public virtual POA_SALOMEDS::AttributeExpandable, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeExpandable,SALOMEDS_ExpandableAttribute); public: + + SALOMEDS_AttributeExpandable_i(const Handle(SALOMEDSImpl_AttributeExpandable)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeExpandable_i() {}; CORBA::Boolean IsExpandable(); void SetExpandable(CORBA::Boolean value); - - char* Store(); - void Restore(const char*); - }; diff --git a/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef.cxx b/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef.cxx new file mode 100644 index 000000000..01e5c5193 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef.cxx @@ -0,0 +1,36 @@ +// File : SALOMEDS_AttributeExternalFileDef.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeExternalFileDef.hxx" + +#include +#include +#include + +SALOMEDS_AttributeExternalFileDef::SALOMEDS_AttributeExternalFileDef(const Handle(SALOMEDSImpl_AttributeExternalFileDef)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeExternalFileDef::SALOMEDS_AttributeExternalFileDef(SALOMEDS::AttributeExternalFileDef_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeExternalFileDef::~SALOMEDS_AttributeExternalFileDef() +{} + +std::string SALOMEDS_AttributeExternalFileDef::Value() +{ + std::string aValue; + if(_isLocal) + aValue = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeExternalFileDef)::DownCast(_local_impl)->Value()).ToCString(); + else aValue = SALOMEDS::AttributeExternalFileDef::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeExternalFileDef::SetValue(const std::string& value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeExternalFileDef)::DownCast(_local_impl)->SetValue((char*)value.c_str()); + else SALOMEDS::AttributeExternalFileDef::_narrow(_corba_impl)->SetValue(value.c_str()); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef.hxx b/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef.hxx new file mode 100644 index 000000000..71b9a5f84 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeExternalFileDef.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeExternalFileDef_HeaderFile +#define SALOMEDS_AttributeExternalFileDef_HeaderFile + +#include "SALOMEDSClient_AttributeExternalFileDef.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeExternalFileDef.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeExternalFileDef: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeExternalFileDef +{ +public: + SALOMEDS_AttributeExternalFileDef(const Handle(SALOMEDSImpl_AttributeExternalFileDef)& theAttr); + SALOMEDS_AttributeExternalFileDef(SALOMEDS::AttributeExternalFileDef_ptr theAttr); + ~SALOMEDS_AttributeExternalFileDef(); + + virtual std::string Value(); + virtual void SetValue(const std::string& value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef_i.cxx index 9c60c8886..d25c454f6 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef_i.cxx @@ -1,49 +1,26 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeExternalFileDef_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#include "SALOMEDS_AttributeExternalFileDef_i.hxx" +#include "SALOMEDS_AttributeExternalFileDef_i.hxx" +#include "SALOMEDS.hxx" #include -#include using namespace std; char* SALOMEDS_AttributeExternalFileDef_i::Value() -{ - TCollection_ExtendedString S = Handle(SALOMEDS_ExternalFileDef)::DownCast(_myAttr)->Get(); - CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(S).ToCString()); +{ + SALOMEDS::Locker lock; + CORBA::String_var c_s = + CORBA::string_dup(TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeExternalFileDef)::DownCast(_impl)->Value()).ToCString()); return c_s._retn(); } void SALOMEDS_AttributeExternalFileDef_i::SetValue(const char* value) { + SALOMEDS::Locker lock; CheckLocked(); CORBA::String_var Str = CORBA::string_dup(value); - // Handle(SALOMEDS_ExternalFileDef)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str)); - Handle(TDataStd_Comment)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str)); + Handle(SALOMEDSImpl_AttributeExternalFileDef)::DownCast(_impl)->SetValue(TCollection_ExtendedString(Str)); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef_i.hxx index 12b203356..a6032c359 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeExternalFileDef_i.hxx @@ -1,30 +1,6 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeExternalFileDef_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeExternalFileDef_i_HeaderFile #define SALOMEDS_AttributeExternalFileDef_i_HeaderFile @@ -34,16 +10,17 @@ #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) #include "SALOMEDS_GenericAttribute_i.hxx" -#include "SALOMEDS_ExternalFileDef.hxx" +#include "SALOMEDSImpl_AttributeExternalFileDef.hxx" -DEFINE_DERIVED_ATTR(AttributeExternalFileDef,SALOMEDS_ExternalFileDef,false); - -class SALOMEDS_AttributeExternalFileDef_i: - public virtual POA_SALOMEDS::AttributeExternalFileDef, - public virtual SALOMEDS_TAttributeExternalFileDef_i +class SALOMEDS_AttributeExternalFileDef_i: public virtual POA_SALOMEDS::AttributeExternalFileDef, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeExternalFileDef,SALOMEDS_ExternalFileDef); public: + + SALOMEDS_AttributeExternalFileDef_i(const Handle(SALOMEDSImpl_AttributeExternalFileDef)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {} + ~SALOMEDS_AttributeExternalFileDef_i() {}; + char* Value(); void SetValue(const char* value); diff --git a/src/SALOMEDS/SALOMEDS_AttributeFileType.cxx b/src/SALOMEDS/SALOMEDS_AttributeFileType.cxx new file mode 100644 index 000000000..d2cc2c103 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeFileType.cxx @@ -0,0 +1,36 @@ +// File : SALOMEDS_AttributeFileType.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeFileType.hxx" + +#include +#include +#include + +SALOMEDS_AttributeFileType::SALOMEDS_AttributeFileType(const Handle(SALOMEDSImpl_AttributeFileType)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeFileType::SALOMEDS_AttributeFileType(SALOMEDS::AttributeFileType_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeFileType::~SALOMEDS_AttributeFileType() +{} + +std::string SALOMEDS_AttributeFileType::Value() +{ + std::string aValue; + if(_isLocal) + aValue = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeFileType)::DownCast(_local_impl)->Value()).ToCString(); + else aValue = SALOMEDS::AttributeFileType::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeFileType::SetValue(const std::string& value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeFileType)::DownCast(_local_impl)->SetValue((char*)value.c_str()); + else SALOMEDS::AttributeFileType::_narrow(_corba_impl)->SetValue(value.c_str()); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeFileType.hxx b/src/SALOMEDS/SALOMEDS_AttributeFileType.hxx new file mode 100644 index 000000000..b889d534c --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeFileType.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeFileType.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeFileType_HeaderFile +#define SALOMEDS_AttributeFileType_HeaderFile + +#include "SALOMEDSClient_AttributeFileType.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeFileType.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeFileType: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeFileType +{ +public: + SALOMEDS_AttributeFileType(const Handle(SALOMEDSImpl_AttributeFileType)& theAttr); + SALOMEDS_AttributeFileType(SALOMEDS::AttributeFileType_ptr theAttr); + ~SALOMEDS_AttributeFileType(); + + virtual std::string Value(); + virtual void SetValue(const std::string& value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeFileType_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeFileType_i.cxx index b6237f309..c94f3b70d 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeFileType_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeFileType_i.cxx @@ -1,48 +1,26 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeFileType_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeFileType_i.hxx" +#include "SALOMEDS.hxx" #include -#include using namespace std; char* SALOMEDS_AttributeFileType_i::Value() { - TCollection_ExtendedString S = Handle(SALOMEDS_FileType)::DownCast(_myAttr)->Get(); - CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(S).ToCString()); + SALOMEDS::Locker lock; + CORBA::String_var c_s = + CORBA::string_dup(TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeFileType)::DownCast(_impl)->Value()).ToCString()); return c_s._retn(); } void SALOMEDS_AttributeFileType_i::SetValue(const char* value) { + SALOMEDS::Locker lock; CheckLocked(); CORBA::String_var Str = CORBA::string_dup(value); - // Handle(SALOMEDS_FileType)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str)); - Handle(TDataStd_Comment)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str)); + Handle(SALOMEDSImpl_AttributeFileType)::DownCast(_impl)->SetValue(TCollection_ExtendedString(Str)); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeFileType_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeFileType_i.hxx index e31e23b2e..321d1a024 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeFileType_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeFileType_i.hxx @@ -1,49 +1,25 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeFileType_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeFileType_i_HeaderFile #define SALOMEDS_AttributeFileType_i_HeaderFile -#include "SALOMEDS_GenericAttribute_i.hxx" -#include "SALOMEDS_FileType.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeFileType,SALOMEDS_FileType,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeFileType.hxx" -class SALOMEDS_AttributeFileType_i: - public virtual POA_SALOMEDS::AttributeFileType, - public virtual SALOMEDS_TAttributeFileType_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeFileType,SALOMEDS_FileType); +class SALOMEDS_AttributeFileType_i: public virtual POA_SALOMEDS::AttributeFileType, + public virtual SALOMEDS_GenericAttribute_i { public: + + SALOMEDS_AttributeFileType_i(const Handle(SALOMEDSImpl_AttributeFileType)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + ~SALOMEDS_AttributeFileType_i() {}; + char* Value(); void SetValue(const char* value); diff --git a/src/SALOMEDS/SALOMEDS_AttributeFlags.cxx b/src/SALOMEDS/SALOMEDS_AttributeFlags.cxx new file mode 100644 index 000000000..ff7044943 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeFlags.cxx @@ -0,0 +1,50 @@ +// File : SALOMEDS_AttributeFlags.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeFlags.hxx" + +#include +#include + +SALOMEDS_AttributeFlags::SALOMEDS_AttributeFlags(const Handle(SALOMEDSImpl_AttributeFlags)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeFlags::SALOMEDS_AttributeFlags(SALOMEDS::AttributeFlags_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeFlags::~SALOMEDS_AttributeFlags() +{} + +int SALOMEDS_AttributeFlags::GetFlags() +{ + int aValue; + if(_isLocal) aValue = Handle(SALOMEDSImpl_AttributeFlags)::DownCast(_local_impl)->Get(); + else aValue = SALOMEDS::AttributeFlags::_narrow(_corba_impl)->GetFlags(); + return aValue; +} + +void SALOMEDS_AttributeFlags::SetFlags(int theFlags) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeFlags)::DownCast(_local_impl)->Set(theFlags); + else SALOMEDS::AttributeFlags::_narrow(_corba_impl)->SetFlags(theFlags); +} + +bool SALOMEDS_AttributeFlags::Get(int theFlag) +{ + return (GetFlags() & theFlag) ? true : false; +} + +void SALOMEDS_AttributeFlags::Set(int theFlag, bool theValue) +{ + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeFlags) anAttr = Handle(SALOMEDSImpl_AttributeFlags)::DownCast(_local_impl); + if ( theValue ) + anAttr->Set( anAttr->Get() | theFlag ); + else + anAttr->Set( anAttr->Get() & ~theFlag ); + } + else SALOMEDS::AttributeFlags::_narrow(_corba_impl)->Set(theFlag, theValue); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeFlags.hxx b/src/SALOMEDS/SALOMEDS_AttributeFlags.hxx new file mode 100644 index 000000000..8bd9f5797 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeFlags.hxx @@ -0,0 +1,31 @@ +// File : SALOMEDS_AttributeFlags.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeFlags_HeaderFile +#define SALOMEDS_AttributeFlags_HeaderFile + +#include "SALOMEDSClient_AttributeFlags.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeFlags.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeFlags: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeFlags +{ +public: + SALOMEDS_AttributeFlags(const Handle(SALOMEDSImpl_AttributeFlags)& theAttr); + SALOMEDS_AttributeFlags(SALOMEDS::AttributeFlags_ptr theAttr); + ~SALOMEDS_AttributeFlags(); + + virtual int GetFlags(); + virtual void SetFlags(int theFlags); + + virtual bool Get(int theFlag); + virtual void Set(int theFlag, bool theValue); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeFlags_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeFlags_i.cxx index 43f2fd947..9bbe0fd66 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeFlags_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeFlags_i.cxx @@ -1,42 +1,33 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeFlags_i.cxx -// Author : Sergey LITONIN +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeFlags_i.hxx" +#include "SALOMEDS.hxx" using namespace std; +/* + Class : SALOMEDS_AttributeFlags_i + Description : This class is intended for storing different object attributes that + have only two states (0 and 1). + + Avalable attributes: + + IS_VISIBLE - is equal to 1 if object is visible in 3D view (0 - overwise). + This attribute is valid for active view only. +*/ + + //======================================================================= // function : SALOMEDS_AttributeFlags_i::GetFlags // purpose : Get all flags as integer value //======================================================================= CORBA::Long SALOMEDS_AttributeFlags_i::GetFlags() { - return Handle(SALOMEDS_FlagsAttribute)::DownCast( _myAttr )->Get(); + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeFlags)::DownCast(_impl)->Get(); } //======================================================================= @@ -45,7 +36,8 @@ CORBA::Long SALOMEDS_AttributeFlags_i::GetFlags() //======================================================================= void SALOMEDS_AttributeFlags_i::SetFlags( CORBA::Long theFlags ) { - Handle(SALOMEDS_FlagsAttribute)::DownCast( _myAttr )->Set( theFlags ); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeFlags)::DownCast(_impl)->Set( theFlags ); } //======================================================================= @@ -54,7 +46,8 @@ void SALOMEDS_AttributeFlags_i::SetFlags( CORBA::Long theFlags ) //======================================================================= CORBA::Boolean SALOMEDS_AttributeFlags_i::Get( CORBA::Long theFlag ) { - return Handle(SALOMEDS_FlagsAttribute)::DownCast( _myAttr )->Get() & theFlag ? true : false; + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeFlags)::DownCast(_impl)->Get() & theFlag ? true : false; } //======================================================================= @@ -63,8 +56,8 @@ CORBA::Boolean SALOMEDS_AttributeFlags_i::Get( CORBA::Long theFlag ) //======================================================================= void SALOMEDS_AttributeFlags_i::Set( CORBA::Long theFlag, CORBA::Boolean theValue ) { - Handle(SALOMEDS_FlagsAttribute) anAttr = - Handle(SALOMEDS_FlagsAttribute)::DownCast( _myAttr ); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeFlags) anAttr = Handle(SALOMEDSImpl_AttributeFlags)::DownCast(_impl); if ( theValue ) anAttr->Set( anAttr->Get() | theFlag ); else diff --git a/src/SALOMEDS/SALOMEDS_AttributeFlags_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeFlags_i.hxx index 228654562..1481d0720 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeFlags_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeFlags_i.hxx @@ -1,28 +1,5 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeFlags_i.hxx -// Author : Sergey LITONIN +// Author : Sergey RUIN // Module : SALOME // $Header: @@ -30,11 +7,12 @@ #define SALOMEDS_AttributeFlags_i_HeaderFile // IDL headers + #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_FlagsAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeFlags.hxx" /* Class : SALOMEDS_AttributeFlags_i @@ -47,14 +25,15 @@ This attribute is valid for active view only. */ -DEFINE_DERIVED_ATTR(AttributeFlags,SALOMEDS_FlagsAttribute,true); - -class SALOMEDS_AttributeFlags_i: - public virtual POA_SALOMEDS::AttributeFlags, - public virtual SALOMEDS_TAttributeFlags_i +class SALOMEDS_AttributeFlags_i: public virtual POA_SALOMEDS::AttributeFlags, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeFlags,SALOMEDS_FlagsAttribute); public: + + SALOMEDS_AttributeFlags_i( const Handle(SALOMEDSImpl_AttributeFlags)& theAttr, CORBA::ORB_ptr orb ) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + virtual ~SALOMEDS_AttributeFlags_i() {}; CORBA::Long GetFlags(); void SetFlags( CORBA::Long theFlags ); diff --git a/src/SALOMEDS/SALOMEDS_AttributeGraphic.cxx b/src/SALOMEDS/SALOMEDS_AttributeGraphic.cxx new file mode 100644 index 000000000..896502927 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeGraphic.cxx @@ -0,0 +1,34 @@ +// File : SALOMEDS_AttributeGraphic.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeGraphic.hxx" + +#include +#include + +SALOMEDS_AttributeGraphic::SALOMEDS_AttributeGraphic(const Handle(SALOMEDSImpl_AttributeGraphic)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeGraphic::SALOMEDS_AttributeGraphic(SALOMEDS::AttributeGraphic_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeGraphic::~SALOMEDS_AttributeGraphic() +{} + + +bool SALOMEDS_AttributeGraphic:: GetVisibility(int theViewId) +{ + bool aValue; + if(_isLocal) aValue = (bool)Handle(SALOMEDSImpl_AttributeGraphic)::DownCast(_local_impl)->GetVisibility(theViewId); + else aValue = SALOMEDS::AttributeGraphic::_narrow(_corba_impl)->GetVisibility(theViewId); + return aValue; +} + +void SALOMEDS_AttributeGraphic::SetVisibility(int theViewId, bool theValue) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeGraphic)::DownCast(_local_impl)->SetVisibility(theViewId, theValue); + else SALOMEDS::AttributeGraphic::_narrow(_corba_impl)->SetVisibility(theViewId, theValue); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeGraphic.hxx b/src/SALOMEDS/SALOMEDS_AttributeGraphic.hxx new file mode 100644 index 000000000..f684c45dd --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeGraphic.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeGraphic.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeGraphic_HeaderFile +#define SALOMEDS_AttributeGraphic_HeaderFile + +#include "SALOMEDSClient_AttributeGraphic.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeGraphic.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeGraphic: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeGraphic +{ +public: + SALOMEDS_AttributeGraphic(const Handle(SALOMEDSImpl_AttributeGraphic)& theAttr); + SALOMEDS_AttributeGraphic(SALOMEDS::AttributeGraphic_ptr theAttr); + ~SALOMEDS_AttributeGraphic(); + + virtual void SetVisibility(int theViewId, bool theValue); + virtual bool GetVisibility(int theViewId); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeGraphic_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeGraphic_i.cxx index 7865b2501..54eca3453 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeGraphic_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeGraphic_i.cxx @@ -1,35 +1,20 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeGraphic_i.cxx -// Author : Sergey LITONIN +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeGraphic_i.hxx" +#include "SALOMEDS.hxx" using namespace std; +/* + Class : SALOMEDS_AttributeGraphic_i + Description : This class is intended for storing information about + graphic representation of objects in dirrent views +*/ + + //======================================================================= // function : SALOMEDS_AttributeGraphic_i::~SetVisibility // purpose : Set visibility of object in given view @@ -37,10 +22,9 @@ using namespace std; void SALOMEDS_AttributeGraphic_i::SetVisibility( CORBA::Long theViewId, CORBA::Boolean theValue ) { - Handle(SALOMEDS_GraphicAttribute) anAttr = - Handle(SALOMEDS_GraphicAttribute)::DownCast( _myAttr ); - if ( !anAttr.IsNull() ) - anAttr->SetVisibility( theViewId, theValue ); + SALOMEDS::Locker lock; + if ( !_impl.IsNull() ) + Handle(SALOMEDSImpl_AttributeGraphic)::DownCast(_impl)->SetVisibility( theViewId, theValue ); } //======================================================================= @@ -49,9 +33,8 @@ void SALOMEDS_AttributeGraphic_i::SetVisibility( CORBA::Long theViewId, //======================================================================= CORBA::Boolean SALOMEDS_AttributeGraphic_i::GetVisibility( CORBA::Long theViewId ) { - Handle(SALOMEDS_GraphicAttribute) anAttr = - Handle(SALOMEDS_GraphicAttribute)::DownCast( _myAttr ); - return !anAttr.IsNull() ? anAttr->GetVisibility( theViewId ) : false; + SALOMEDS::Locker lock; + return !_impl.IsNull() ? Handle(SALOMEDSImpl_AttributeGraphic)::DownCast(_impl)->GetVisibility( theViewId ) : false; } diff --git a/src/SALOMEDS/SALOMEDS_AttributeGraphic_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeGraphic_i.hxx index 718b28619..a391fc333 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeGraphic_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeGraphic_i.hxx @@ -1,28 +1,5 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeFlags_i.hxx -// Author : Sergey LITONIN +// Author : Sergey RUIN // Module : SALOME // $Header: @@ -30,11 +7,13 @@ #define SALOMEDS_AttributeGraphic_i_HeaderFile // IDL headers + + #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_GraphicAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeGraphic.hxx" /* Class : SALOMEDS_AttributeGraphic_i @@ -42,18 +21,20 @@ graphic representation of objects in dirrent views */ -DEFINE_DERIVED_ATTR(AttributeGraphic,SALOMEDS_GraphicAttribute,true); - -class SALOMEDS_AttributeGraphic_i: - public virtual POA_SALOMEDS::AttributeGraphic, - public virtual SALOMEDS_TAttributeGraphic_i +class SALOMEDS_AttributeGraphic_i: public virtual POA_SALOMEDS::AttributeGraphic, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeGraphic,SALOMEDS_GraphicAttribute); public: + + SALOMEDS_AttributeGraphic_i( const Handle(SALOMEDSImpl_AttributeGraphic)& theAttr, CORBA::ORB_ptr orb ) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + virtual ~SALOMEDS_AttributeGraphic_i() {}; void SetVisibility( CORBA::Long theViewId, CORBA::Boolean theValue ); CORBA::Boolean GetVisibility( CORBA::Long theViewId ); + }; #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeIOR.cxx b/src/SALOMEDS/SALOMEDS_AttributeIOR.cxx new file mode 100644 index 000000000..13b54c96b --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeIOR.cxx @@ -0,0 +1,36 @@ +// File : SALOMEDS_AttributeIOR.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeIOR.hxx" + +#include +#include +#include + +SALOMEDS_AttributeIOR::SALOMEDS_AttributeIOR(const Handle(SALOMEDSImpl_AttributeIOR)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeIOR::SALOMEDS_AttributeIOR(SALOMEDS::AttributeIOR_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeIOR::~SALOMEDS_AttributeIOR() +{} + +std::string SALOMEDS_AttributeIOR::Value() +{ + std::string aValue; + if(_isLocal) + aValue = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeIOR)::DownCast(_local_impl)->Value()).ToCString(); + else aValue = SALOMEDS::AttributeIOR::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeIOR::SetValue(const std::string& value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeIOR)::DownCast(_local_impl)->SetValue((char*)value.c_str()); + else SALOMEDS::AttributeIOR::_narrow(_corba_impl)->SetValue(value.c_str()); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeIOR.hxx b/src/SALOMEDS/SALOMEDS_AttributeIOR.hxx new file mode 100644 index 000000000..98d383fff --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeIOR.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeIOR.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeIOR_HeaderFile +#define SALOMEDS_AttributeIOR_HeaderFile + +#include "SALOMEDSClient_AttributeIOR.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeIOR: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeIOR +{ +public: + SALOMEDS_AttributeIOR(const Handle(SALOMEDSImpl_AttributeIOR)& theAttr); + SALOMEDS_AttributeIOR(SALOMEDS::AttributeIOR_ptr theAttr); + ~SALOMEDS_AttributeIOR(); + + virtual std::string Value(); + virtual void SetValue(const std::string& value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeIOR_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeIOR_i.cxx index dec61d358..24309b32a 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeIOR_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeIOR_i.cxx @@ -1,55 +1,26 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeIOR_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#include "SALOMEDS_AttributeIOR_i.hxx" +#include "SALOMEDS_AttributeIOR_i.hxx" +#include "SALOMEDS.hxx" #include -#include "SALOMEDS_SObject_i.hxx" -#include "SALOMEDS_Study_i.hxx" using namespace std; char* SALOMEDS_AttributeIOR_i::Value() { - TCollection_ExtendedString S = Handle(SALOMEDS_IORAttribute)::DownCast(_myAttr)->Get(); - CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(S).ToCString()); + SALOMEDS::Locker lock; + CORBA::String_var c_s = + CORBA::string_dup(TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeIOR)::DownCast(_impl)->Value()).ToCString()); return c_s._retn(); } void SALOMEDS_AttributeIOR_i::SetValue(const char* value) { + SALOMEDS::Locker lock; CheckLocked(); - - SALOMEDS_Study_i* aStudy = _mySObject->GetStudyServant(); - aStudy->AddCreatedPostponed(value); - aStudy->AddPostponed(Value()); - CORBA::String_var Str = CORBA::string_dup(value); - Handle(TDataStd_Comment)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str)); - aStudy->IORUpdated(Handle(SALOMEDS_IORAttribute)::DownCast(_myAttr)); + Handle(SALOMEDSImpl_AttributeIOR)::DownCast(_impl)->SetValue(TCollection_ExtendedString(Str)); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeIOR_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeIOR_i.hxx index 5e60bd6cb..1aa1b7e4f 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeIOR_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeIOR_i.hxx @@ -1,48 +1,25 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeIOR_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeIOR_i_HeaderFile #define SALOMEDS_AttributeIOR_i_HeaderFile -#include "SALOMEDS_GenericAttribute_i.hxx" -#include "SALOMEDS_IORAttribute.hxx" - #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeIOR,SALOMEDS_IORAttribute,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" -class SALOMEDS_AttributeIOR_i: - public virtual POA_SALOMEDS::AttributeIOR, - public virtual SALOMEDS_TAttributeIOR_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeIOR,SALOMEDS_IORAttribute); +class SALOMEDS_AttributeIOR_i: public virtual POA_SALOMEDS::AttributeIOR, + public virtual SALOMEDS_GenericAttribute_i { public: + + SALOMEDS_AttributeIOR_i(const Handle(SALOMEDSImpl_AttributeIOR)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeIOR_i() {}; + char* Value(); void SetValue(const char* value); diff --git a/src/SALOMEDS/SALOMEDS_AttributeInteger.cxx b/src/SALOMEDS/SALOMEDS_AttributeInteger.cxx new file mode 100644 index 000000000..4fb2b3038 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeInteger.cxx @@ -0,0 +1,34 @@ +// File : SALOMEDS_AttributeInteger.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeInteger.hxx" + +#include +#include + +SALOMEDS_AttributeInteger::SALOMEDS_AttributeInteger(const Handle(SALOMEDSImpl_AttributeInteger)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeInteger::SALOMEDS_AttributeInteger(SALOMEDS::AttributeInteger_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeInteger::~SALOMEDS_AttributeInteger() +{} + +int SALOMEDS_AttributeInteger::Value() +{ + int aValue; + if(_isLocal) aValue = Handle(SALOMEDSImpl_AttributeInteger)::DownCast(_local_impl)->Value(); + else aValue = SALOMEDS::AttributeInteger::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeInteger::SetValue(int value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeInteger)::DownCast(_local_impl)->SetValue(value); + else SALOMEDS::AttributeInteger::_narrow(_corba_impl)->SetValue(value); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeInteger.hxx b/src/SALOMEDS/SALOMEDS_AttributeInteger.hxx new file mode 100644 index 000000000..1ebe36627 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeInteger.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeInteger.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeInteger_HeaderFile +#define SALOMEDS_AttributeInteger_HeaderFile + +#include "SALOMEDSClient_AttributeInteger.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeInteger.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeInteger: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeInteger +{ +public: + SALOMEDS_AttributeInteger(const Handle(SALOMEDSImpl_AttributeInteger)& theAttr); + SALOMEDS_AttributeInteger(SALOMEDS::AttributeInteger_ptr theAttr); + ~SALOMEDS_AttributeInteger(); + + virtual int Value(); + virtual void SetValue(int value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeInteger_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeInteger_i.cxx index 8e40d8590..1766ccf87 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeInteger_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeInteger_i.cxx @@ -1,52 +1,24 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeInteger_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeInteger_i.hxx" +#include "SALOMEDS.hxx" using namespace std; -CORBA::Long SALOMEDS_AttributeInteger_i::Value() { - return Handle(TDataStd_Integer)::DownCast(_myAttr)->Get(); +CORBA::Long SALOMEDS_AttributeInteger_i::Value() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeInteger)::DownCast(_impl)->Value(); } -void SALOMEDS_AttributeInteger_i::SetValue(CORBA::Long value) { +void SALOMEDS_AttributeInteger_i::SetValue(CORBA::Long value) +{ + SALOMEDS::Locker lock; CheckLocked(); - Handle(TDataStd_Integer)::DownCast(_myAttr)->Set(value); + Handle(SALOMEDSImpl_AttributeInteger)::DownCast(_impl)->SetValue(value); } -char* SALOMEDS_AttributeInteger_i::Store() { - char* IntVal = new char[25]; - sprintf(IntVal, "%d", Value()); - return IntVal; -} -void SALOMEDS_AttributeInteger_i::Restore(const char* value) { - char *err = NULL; - CORBA::Long l = atol(value); - SetValue(l); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeInteger_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeInteger_i.hxx index 0339a2cce..dc0bea26e 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeInteger_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeInteger_i.hxx @@ -1,57 +1,32 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeInteger_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header: #ifndef SALOMEDS_AttributeInteger_i_HeaderFile #define SALOMEDS_AttributeInteger_i_HeaderFile -#include +// IDL headers -#include "SALOMEDS_GenericAttribute_i.hxx" -// IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeInteger,TDataStd_Integer,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeInteger.hxx" -class SALOMEDS_AttributeInteger_i: - public virtual POA_SALOMEDS::AttributeInteger, - public virtual SALOMEDS_TAttributeInteger_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeInteger,TDataStd_Integer); +class SALOMEDS_AttributeInteger_i: public virtual POA_SALOMEDS::AttributeInteger, + public virtual SALOMEDS_GenericAttribute_i { public: - CORBA::Long Value(); - void SetValue(CORBA::Long theValue); + + SALOMEDS_AttributeInteger_i(const Handle(SALOMEDSImpl_AttributeInteger)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; - char* Store(); - void Restore(const char*); + ~SALOMEDS_AttributeInteger_i() {}; + CORBA::Long Value(); + void SetValue(CORBA::Long value); }; + #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeLocalID.cxx b/src/SALOMEDS/SALOMEDS_AttributeLocalID.cxx new file mode 100644 index 000000000..4efc2ac3f --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeLocalID.cxx @@ -0,0 +1,34 @@ +// File : SALOMEDS_AttributeLocalID.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeLocalID.hxx" + +#include +#include + +SALOMEDS_AttributeLocalID::SALOMEDS_AttributeLocalID(const Handle(SALOMEDSImpl_AttributeLocalID)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeLocalID::SALOMEDS_AttributeLocalID(SALOMEDS::AttributeLocalID_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeLocalID::~SALOMEDS_AttributeLocalID() +{} + +int SALOMEDS_AttributeLocalID::Value() +{ + int aValue; + if(_isLocal) aValue = (bool)Handle(SALOMEDSImpl_AttributeLocalID)::DownCast(_local_impl)->Value(); + else aValue = SALOMEDS::AttributeLocalID::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeLocalID::SetValue(int value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeLocalID)::DownCast(_local_impl)->SetValue(value); + else SALOMEDS::AttributeLocalID::_narrow(_corba_impl)->SetValue(value); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeLocalID.hxx b/src/SALOMEDS/SALOMEDS_AttributeLocalID.hxx new file mode 100644 index 000000000..d62a94178 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeLocalID.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeLocalID.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeLocalID_HeaderFile +#define SALOMEDS_AttributeLocalID_HeaderFile + +#include "SALOMEDSClient_AttributeLocalID.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeLocalID.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeLocalID: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeLocalID +{ +public: + SALOMEDS_AttributeLocalID(const Handle(SALOMEDSImpl_AttributeLocalID)& theAttr); + SALOMEDS_AttributeLocalID(SALOMEDS::AttributeLocalID_ptr theAttr); + ~SALOMEDS_AttributeLocalID(); + + virtual int Value(); + virtual void SetValue(int value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeLocalID_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeLocalID_i.cxx index 77cef4678..79231218e 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeLocalID_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeLocalID_i.cxx @@ -1,52 +1,23 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeLocalID_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeLocalID_i.hxx" +#include "SALOMEDS.hxx" using namespace std; -CORBA::Long SALOMEDS_AttributeLocalID_i::Value() { - return Handle(SALOMEDS_LocalIDAttribute)::DownCast(_myAttr)->Get(); +CORBA::Long SALOMEDS_AttributeLocalID_i::Value() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeLocalID)::DownCast(_impl)->Value(); } -void SALOMEDS_AttributeLocalID_i::SetValue(CORBA::Long value) { +void SALOMEDS_AttributeLocalID_i::SetValue(CORBA::Long value) +{ + SALOMEDS::Locker lock; CheckLocked(); - Handle(TDataStd_Integer)::DownCast(_myAttr)->Set(value); -} - -char* SALOMEDS_AttributeLocalID_i::Store() { - char* IntVal = new char[25]; - sprintf(IntVal, "%d", Value()); - return IntVal; + Handle(SALOMEDSImpl_AttributeLocalID)::DownCast(_impl)->SetValue(value); } -void SALOMEDS_AttributeLocalID_i::Restore(const char* value) { - char *err = NULL; - CORBA::Long l = atol(value); - SetValue(l); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeLocalID_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeLocalID_i.hxx index a2d41abf9..add11aab7 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeLocalID_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeLocalID_i.hxx @@ -1,28 +1,5 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeLocalID_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME // $Header: @@ -33,25 +10,24 @@ #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_LocalIDAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeLocalID.hxx" -DEFINE_DERIVED_ATTR(AttributeLocalID,SALOMEDS_LocalIDAttribute,true); - -class SALOMEDS_AttributeLocalID_i: - public virtual POA_SALOMEDS::AttributeLocalID, - public virtual SALOMEDS_TAttributeLocalID_i +class SALOMEDS_AttributeLocalID_i: public virtual POA_SALOMEDS::AttributeLocalID, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeLocalID,SALOMEDS_LocalIDAttribute); public: + + SALOMEDS_AttributeLocalID_i(const Handle(SALOMEDSImpl_AttributeLocalID)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeLocalID_i() {}; CORBA::Long Value(); void SetValue(CORBA::Long value); - char* Store(); - void Restore(const char*); - }; + #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeName.cxx b/src/SALOMEDS/SALOMEDS_AttributeName.cxx new file mode 100644 index 000000000..082703ebb --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeName.cxx @@ -0,0 +1,36 @@ +// File : SALOMEDS_AttributeName.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeName.hxx" + +#include +#include +#include + +SALOMEDS_AttributeName::SALOMEDS_AttributeName(const Handle(SALOMEDSImpl_AttributeName)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeName::SALOMEDS_AttributeName(SALOMEDS::AttributeName_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeName::~SALOMEDS_AttributeName() +{} + +std::string SALOMEDS_AttributeName::Value() +{ + std::string aValue; + if(_isLocal) + aValue = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeName)::DownCast(_local_impl)->Value()).ToCString(); + else aValue = SALOMEDS::AttributeName::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeName::SetValue(const std::string& value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeName)::DownCast(_local_impl)->SetValue((char*)value.c_str()); + else SALOMEDS::AttributeName::_narrow(_corba_impl)->SetValue(value.c_str()); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeName.hxx b/src/SALOMEDS/SALOMEDS_AttributeName.hxx new file mode 100644 index 000000000..f17634901 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeName.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeName.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeName_HeaderFile +#define SALOMEDS_AttributeName_HeaderFile + +#include "SALOMEDSClient_AttributeName.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeName.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeName: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeName +{ +public: + SALOMEDS_AttributeName(const Handle(SALOMEDSImpl_AttributeName)& theAttr); + SALOMEDS_AttributeName(SALOMEDS::AttributeName_ptr theAttr); + ~SALOMEDS_AttributeName(); + + virtual std::string Value(); + virtual void SetValue(const std::string& value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeName_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeName_i.cxx index b495f26bf..65483a3a3 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeName_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeName_i.cxx @@ -1,52 +1,25 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeName_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeName_i.hxx" +#include "SALOMEDS.hxx" #include -#include using namespace std; -char* SALOMEDS_AttributeName_i::Value() { - TCollection_ExtendedString S = Handle(TDataStd_Name)::DownCast(_myAttr)->Get(); - CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(S).ToCString()); +char* SALOMEDS_AttributeName_i::Value() +{ + SALOMEDS::Locker lock; + CORBA::String_var c_s = + CORBA::string_dup(TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeName)::DownCast(_impl)->Value()).ToCString()); return c_s._retn(); } -void SALOMEDS_AttributeName_i::SetValue(const char* theValue) { +void SALOMEDS_AttributeName_i::SetValue(const char* value) +{ + SALOMEDS::Locker lock; CheckLocked(); - Handle(TDataStd_Name)::DownCast(_myAttr)->Set(TCollection_ExtendedString((char*)theValue)); -} - -char* SALOMEDS_AttributeName_i::Store() { - return Value(); -} - -void SALOMEDS_AttributeName_i::Restore(const char* value) { - SetValue(value); + Handle(SALOMEDSImpl_AttributeName)::DownCast(_impl)->SetValue(TCollection_ExtendedString((char*)value)); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeName_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeName_i.hxx index ffcebc20f..cdb147181 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeName_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeName_i.hxx @@ -1,55 +1,31 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeName_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME // $Header: #ifndef SALOMEDS_AttributeName_i_HeaderFile #define SALOMEDS_AttributeName_i_HeaderFile -#include - -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeName,TDataStd_Name,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeName.hxx" -class SALOMEDS_AttributeName_i: - public virtual POA_SALOMEDS::AttributeName, - public virtual SALOMEDS_TAttributeName_i +class SALOMEDS_AttributeName_i: public virtual POA_SALOMEDS::AttributeName, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeName,TDataStd_Name); public: + + SALOMEDS_AttributeName_i(const Handle(SALOMEDSImpl_AttributeName)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeName_i() {}; + char* Value(); void SetValue(const char* value); - char* Store(); - void Restore(const char*); }; diff --git a/src/SALOMEDS/SALOMEDS_AttributeOpened.cxx b/src/SALOMEDS/SALOMEDS_AttributeOpened.cxx new file mode 100644 index 000000000..0f4f29df2 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeOpened.cxx @@ -0,0 +1,33 @@ +// File : SALOMEDS_AttributeOpened.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeOpened.hxx" + +#include +#include + +SALOMEDS_AttributeOpened::SALOMEDS_AttributeOpened(const Handle(SALOMEDSImpl_AttributeOpened)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeOpened::SALOMEDS_AttributeOpened(SALOMEDS::AttributeOpened_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeOpened::~SALOMEDS_AttributeOpened() +{} + +bool SALOMEDS_AttributeOpened::IsOpened() +{ + bool aValue; + if(_isLocal) aValue = (bool)Handle(SALOMEDSImpl_AttributeOpened)::DownCast(_local_impl)->IsOpened(); + else aValue = SALOMEDS::AttributeOpened::_narrow(_corba_impl)->IsOpened(); + return aValue; +} + +void SALOMEDS_AttributeOpened::SetOpened(bool value) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeOpened)::DownCast(_local_impl)->SetOpened((int)value); + else SALOMEDS::AttributeOpened::_narrow(_corba_impl)->SetOpened(value); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeOpened.hxx b/src/SALOMEDS/SALOMEDS_AttributeOpened.hxx new file mode 100644 index 000000000..653bfad45 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeOpened.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeOpened.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeOpened_HeaderFile +#define SALOMEDS_AttributeOpened_HeaderFile + +#include "SALOMEDSClient_AttributeOpened.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeOpened.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeOpened: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeOpened +{ +public: + SALOMEDS_AttributeOpened(const Handle(SALOMEDSImpl_AttributeOpened)& theAttr); + SALOMEDS_AttributeOpened(SALOMEDS::AttributeOpened_ptr theAttr); + ~SALOMEDS_AttributeOpened(); + + virtual bool IsOpened(); + virtual void SetOpened(bool value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeOpened_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeOpened_i.cxx index 5471006e5..0a7445dd6 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeOpened_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeOpened_i.cxx @@ -1,49 +1,24 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeOpened_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeOpened_i.hxx" +#include "SALOMEDS.hxx" using namespace std; -CORBA::Boolean SALOMEDS_AttributeOpened_i::IsOpened() { - return (Handle(SALOMEDS_OpenedAttribute)::DownCast(_myAttr)->Get() == 1); +CORBA::Boolean SALOMEDS_AttributeOpened_i::IsOpened() +{ + SALOMEDS::Locker lock; + return (Handle(SALOMEDSImpl_AttributeOpened)::DownCast(_impl)->IsOpened() == 1); } -void SALOMEDS_AttributeOpened_i::SetOpened(CORBA::Boolean value) { +void SALOMEDS_AttributeOpened_i::SetOpened(CORBA::Boolean value) +{ + SALOMEDS::Locker lock; + Standard_Integer val = 0; if (value != 0) val = 1; - Handle(TDataStd_Integer)::DownCast(_myAttr)->Set(val); -} - -char* SALOMEDS_AttributeOpened_i::Store() { - return CORBA::string_dup(IsOpened()?"1":"0"); -} - -void SALOMEDS_AttributeOpened_i::Restore(const char* value) { - SetOpened(value[0] == '1'); + Handle(SALOMEDSImpl_AttributeOpened)::DownCast(_impl)->SetOpened(val); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeOpened_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeOpened_i.hxx index 0ad905ca6..3d5ea9ca6 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeOpened_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeOpened_i.hxx @@ -1,28 +1,5 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeOpened_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME // $Header: @@ -33,23 +10,20 @@ #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_OpenedAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeOpened.hxx" -DEFINE_DERIVED_ATTR(AttributeOpened,SALOMEDS_OpenedAttribute,false); - -class SALOMEDS_AttributeOpened_i: - public virtual POA_SALOMEDS::AttributeOpened, - public virtual SALOMEDS_TAttributeOpened_i +class SALOMEDS_AttributeOpened_i: public virtual POA_SALOMEDS::AttributeOpened, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeOpened,SALOMEDS_OpenedAttribute); public: + + SALOMEDS_AttributeOpened_i(const Handle(SALOMEDSImpl_AttributeOpened)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + ~SALOMEDS_AttributeOpened_i() {}; + CORBA::Boolean IsOpened(); void SetOpened(CORBA::Boolean value); - - char* Store(); - void Restore(const char*); - }; diff --git a/src/SALOMEDS/SALOMEDS_AttributePersistentRef.cxx b/src/SALOMEDS/SALOMEDS_AttributePersistentRef.cxx new file mode 100644 index 000000000..4b2f2c96b --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributePersistentRef.cxx @@ -0,0 +1,36 @@ +// File : SALOMEDS_AttributePersistentRef.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributePersistentRef.hxx" + +#include +#include +#include + +SALOMEDS_AttributePersistentRef::SALOMEDS_AttributePersistentRef(const Handle(SALOMEDSImpl_AttributePersistentRef)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributePersistentRef::SALOMEDS_AttributePersistentRef(SALOMEDS::AttributePersistentRef_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributePersistentRef::~SALOMEDS_AttributePersistentRef() +{} + +std::string SALOMEDS_AttributePersistentRef::Value() +{ + std::string aValue; + if(_isLocal) + aValue = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributePersistentRef)::DownCast(_local_impl)->Value()).ToCString(); + else aValue = SALOMEDS::AttributePersistentRef::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributePersistentRef::SetValue(const std::string& value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributePersistentRef)::DownCast(_local_impl)->SetValue((char*)value.c_str()); + else SALOMEDS::AttributePersistentRef::_narrow(_corba_impl)->SetValue(value.c_str()); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributePersistentRef.hxx b/src/SALOMEDS/SALOMEDS_AttributePersistentRef.hxx new file mode 100644 index 000000000..b5b5aaee0 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributePersistentRef.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributePersistentRef.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributePersistentRef_HeaderFile +#define SALOMEDS_AttributePersistentRef_HeaderFile + +#include "SALOMEDSClient_AttributePersistentRef.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributePersistentRef.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributePersistentRef: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributePersistentRef +{ +public: + SALOMEDS_AttributePersistentRef(const Handle(SALOMEDSImpl_AttributePersistentRef)& theAttr); + SALOMEDS_AttributePersistentRef(SALOMEDS::AttributePersistentRef_ptr theAttr); + ~SALOMEDS_AttributePersistentRef(); + + virtual std::string Value(); + virtual void SetValue(const std::string& value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributePersistentRef_i.cxx b/src/SALOMEDS/SALOMEDS_AttributePersistentRef_i.cxx index 67281220b..1add1e193 100644 --- a/src/SALOMEDS/SALOMEDS_AttributePersistentRef_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributePersistentRef_i.cxx @@ -1,55 +1,26 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributePersistentRef_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributePersistentRef_i.hxx" +#include "SALOMEDS.hxx" #include -#include using namespace std; char* SALOMEDS_AttributePersistentRef_i::Value() { - TCollection_ExtendedString S = Handle(SALOMEDS_PersRefAttribute)::DownCast(_myAttr)->Get(); - CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(S).ToCString()); + SALOMEDS::Locker lock; + CORBA::String_var c_s = + CORBA::string_dup(TCollection_AsciiString(Handle(SALOMEDSImpl_AttributePersistentRef)::DownCast(_impl)->Value()).ToCString()); return c_s._retn(); } void SALOMEDS_AttributePersistentRef_i::SetValue(const char* value) { + SALOMEDS::Locker lock; CheckLocked(); CORBA::String_var Str = CORBA::string_dup(value); - Handle(TDataStd_Comment)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str)); -} - -char* SALOMEDS_AttributePersistentRef_i::Store() { - return Value(); -} - -void SALOMEDS_AttributePersistentRef_i::Restore(const char* value) { - SetValue(value); + Handle(SALOMEDSImpl_AttributePersistentRef)::DownCast(_impl)->SetValue(TCollection_ExtendedString(Str)); } diff --git a/src/SALOMEDS/SALOMEDS_AttributePersistentRef_i.hxx b/src/SALOMEDS/SALOMEDS_AttributePersistentRef_i.hxx index 40cb20149..ccf47be6c 100644 --- a/src/SALOMEDS/SALOMEDS_AttributePersistentRef_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributePersistentRef_i.hxx @@ -1,55 +1,30 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributePersistentRef_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributePersistentRef_i_HeaderFile #define SALOMEDS_AttributePersistentRef_i_HeaderFile -#include "SALOMEDS_GenericAttribute_i.hxx" -#include "SALOMEDS_PersRefAttribute.hxx" - #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributePersistentRef,SALOMEDS_PersRefAttribute,false); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributePersistentRef.hxx" -class SALOMEDS_AttributePersistentRef_i: - public virtual POA_SALOMEDS::AttributePersistentRef, - public virtual SALOMEDS_TAttributePersistentRef_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributePersistentRef,SALOMEDS_PersRefAttribute); +class SALOMEDS_AttributePersistentRef_i: public virtual POA_SALOMEDS::AttributePersistentRef, + public virtual SALOMEDS_GenericAttribute_i { public: + + SALOMEDS_AttributePersistentRef_i(const Handle(SALOMEDSImpl_AttributePersistentRef)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributePersistentRef_i() {}; + char* Value(); void SetValue(const char* value); - char* Store(); - void Restore(const char*); - }; + #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributePixMap.cxx b/src/SALOMEDS/SALOMEDS_AttributePixMap.cxx new file mode 100644 index 000000000..658d81e5d --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributePixMap.cxx @@ -0,0 +1,44 @@ +// File : SALOMEDS_AttributePixMap.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributePixMap.hxx" + +#include +#include +#include + +SALOMEDS_AttributePixMap::SALOMEDS_AttributePixMap(const Handle(SALOMEDSImpl_AttributePixMap)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributePixMap::SALOMEDS_AttributePixMap(SALOMEDS::AttributePixMap_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributePixMap::~SALOMEDS_AttributePixMap() +{} + +bool SALOMEDS_AttributePixMap::HasPixMap() +{ + bool ret; + if(_isLocal) ret = Handle(SALOMEDSImpl_AttributePixMap)::DownCast(_local_impl)->HasPixMap(); + else ret = SALOMEDS::AttributePixMap::_narrow(_corba_impl)->HasPixMap(); + return ret; +} + +std::string SALOMEDS_AttributePixMap::GetPixMap() +{ + std::string aValue; + if(_isLocal) + aValue = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributePixMap)::DownCast(_local_impl)->GetPixMap()).ToCString(); + else aValue = SALOMEDS::AttributePixMap::_narrow(_corba_impl)->GetPixMap(); + return aValue; +} + +void SALOMEDS_AttributePixMap::SetPixMap(const std::string& value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributePixMap)::DownCast(_local_impl)->SetPixMap((char*)value.c_str()); + else SALOMEDS::AttributePixMap::_narrow(_corba_impl)->SetPixMap(value.c_str()); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributePixMap.hxx b/src/SALOMEDS/SALOMEDS_AttributePixMap.hxx new file mode 100644 index 000000000..47e6f36ec --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributePixMap.hxx @@ -0,0 +1,30 @@ +// File : SALOMEDS_AttributePixMap.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributePixMap_HeaderFile +#define SALOMEDS_AttributePixMap_HeaderFile + +#include "SALOMEDSClient_AttributePixMap.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributePixMap.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributePixMap: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributePixMap +{ +public: + SALOMEDS_AttributePixMap(const Handle(SALOMEDSImpl_AttributePixMap)& theAttr); + SALOMEDS_AttributePixMap(SALOMEDS::AttributePixMap_ptr theAttr); + ~SALOMEDS_AttributePixMap(); + + virtual bool HasPixMap(); + virtual std::string GetPixMap(); + virtual void SetPixMap(const std::string& value); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributePixMap_i.cxx b/src/SALOMEDS/SALOMEDS_AttributePixMap_i.cxx index 8fc0f2be1..9774a1004 100644 --- a/src/SALOMEDS/SALOMEDS_AttributePixMap_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributePixMap_i.cxx @@ -1,57 +1,32 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributePixMap_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributePixMap_i.hxx" +#include "SALOMEDS.hxx" #include using namespace std; -CORBA::Boolean SALOMEDS_AttributePixMap_i::HasPixMap() { - TCollection_ExtendedString S = Handle(SALOMEDS_PixMapAttribute)::DownCast(_myAttr)->Get(); - if (strcmp(TCollection_AsciiString(S).ToCString(), "None") == 0) return Standard_False; - return Standard_True; +CORBA::Boolean SALOMEDS_AttributePixMap_i::HasPixMap() +{ + return Handle(SALOMEDSImpl_AttributePixMap)::DownCast(_impl)->HasPixMap(); } -char* SALOMEDS_AttributePixMap_i::GetPixMap() { - CORBA::String_var S = CORBA::string_dup(TCollection_AsciiString(Handle(SALOMEDS_PixMapAttribute)::DownCast(_myAttr)->Get()).ToCString()); - return S._retn(); +char* SALOMEDS_AttributePixMap_i::GetPixMap() +{ + SALOMEDS::Locker lock; + CORBA::String_var S = + CORBA::string_dup(TCollection_AsciiString(Handle(SALOMEDSImpl_AttributePixMap)::DownCast(_impl)->GetPixMap()).ToCString()); + return S._retn(); } -void SALOMEDS_AttributePixMap_i::SetPixMap(const char* value) { +void SALOMEDS_AttributePixMap_i::SetPixMap(const char* value) +{ + SALOMEDS::Locker lock; CheckLocked(); CORBA::String_var Str = CORBA::string_dup(value); - Handle(TDataStd_Comment)::DownCast(_myAttr)->Set(TCollection_ExtendedString(Str)); -} - -char* SALOMEDS_AttributePixMap_i::Store() { - return GetPixMap(); + Handle(SALOMEDSImpl_AttributePixMap)::DownCast(_impl)->SetPixMap(TCollection_ExtendedString(Str)); } -void SALOMEDS_AttributePixMap_i::Restore(const char* value) { - SetPixMap(value); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributePixMap_i.hxx b/src/SALOMEDS/SALOMEDS_AttributePixMap_i.hxx index c17fa5c2f..46f3797ff 100644 --- a/src/SALOMEDS/SALOMEDS_AttributePixMap_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributePixMap_i.hxx @@ -1,30 +1,6 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributePixMap_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributePixMap_i_HeaderFile #define SALOMEDS_AttributePixMap_i_HeaderFile @@ -33,24 +9,23 @@ #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_PixMapAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributePixMap.hxx" -DEFINE_DERIVED_ATTR(AttributePixMap,SALOMEDS_PixMapAttribute,false); - -class SALOMEDS_AttributePixMap_i: - public virtual POA_SALOMEDS::AttributePixMap, - public virtual SALOMEDS_TAttributePixMap_i +class SALOMEDS_AttributePixMap_i: public virtual POA_SALOMEDS::AttributePixMap, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributePixMap,SALOMEDS_PixMapAttribute); public: + + SALOMEDS_AttributePixMap_i(const Handle(SALOMEDSImpl_AttributePixMap)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributePixMap_i() {}; + CORBA::Boolean HasPixMap(); char* GetPixMap(); void SetPixMap(const char* value); - char* Store(); - void Restore(const char*); - }; diff --git a/src/SALOMEDS/SALOMEDS_AttributePythonObject.cxx b/src/SALOMEDS/SALOMEDS_AttributePythonObject.cxx new file mode 100644 index 000000000..4a3561fb3 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributePythonObject.cxx @@ -0,0 +1,44 @@ +// File : SALOMEDS_AttributePythonObject.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributePythonObject.hxx" + +#include +#include +#include + +SALOMEDS_AttributePythonObject::SALOMEDS_AttributePythonObject(const Handle(SALOMEDSImpl_AttributePythonObject)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributePythonObject::SALOMEDS_AttributePythonObject(SALOMEDS::AttributePythonObject_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributePythonObject::~SALOMEDS_AttributePythonObject() +{} + +bool SALOMEDS_AttributePythonObject::IsScript() +{ + bool ret; + if(_isLocal) ret = Handle(SALOMEDSImpl_AttributePythonObject)::DownCast(_local_impl)->IsScript(); + else ret = SALOMEDS::AttributePythonObject::_narrow(_corba_impl)->IsScript(); + return ret; +} + +std::string SALOMEDS_AttributePythonObject::GetObject() +{ + std::string aValue; + if(_isLocal) + aValue = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributePythonObject)::DownCast(_local_impl)->GetObject()).ToCString(); + else aValue = SALOMEDS::AttributePythonObject::_narrow(_corba_impl)->GetObject(); + return aValue; +} + +void SALOMEDS_AttributePythonObject::SetObject(const std::string& theSequence, bool IsScript) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributePythonObject)::DownCast(_local_impl)->SetObject((char*)theSequence.c_str(), IsScript); + else SALOMEDS::AttributePythonObject::_narrow(_corba_impl)->SetObject(theSequence.c_str(), IsScript); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributePythonObject.hxx b/src/SALOMEDS/SALOMEDS_AttributePythonObject.hxx new file mode 100644 index 000000000..e5f12b2dc --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributePythonObject.hxx @@ -0,0 +1,35 @@ +// File : SALOMEDS_AttributePythonObject.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributePythonObject_HeaderFile +#define SALOMEDS_AttributePythonObject_HeaderFile + +#include "SALOMEDSClient_AttributePythonObject.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributePythonObject.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + + +#ifdef GetObject +#undef GetObject +#endif + +class SALOMEDS_AttributePythonObject: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributePythonObject +{ +public: + SALOMEDS_AttributePythonObject(const Handle(SALOMEDSImpl_AttributePythonObject)& theAttr); + SALOMEDS_AttributePythonObject(SALOMEDS::AttributePythonObject_ptr theAttr); + ~SALOMEDS_AttributePythonObject(); + + virtual void SetObject(const std::string& theSequence, bool IsScript); + virtual std::string GetObject(); + virtual bool IsScript(); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributePythonObject_i.cxx b/src/SALOMEDS/SALOMEDS_AttributePythonObject_i.cxx index 2faab629d..59dcf552e 100644 --- a/src/SALOMEDS/SALOMEDS_AttributePythonObject_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributePythonObject_i.cxx @@ -1,43 +1,35 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributePythonObject_i.cxx -// Author : Michael Ponikarov +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributePythonObject_i.hxx" +#include "SALOMEDS.hxx" #include #include using namespace std; -void SALOMEDS_AttributePythonObject_i::SetObject(const char* theSequence, CORBA::Boolean IsScript) { +void SALOMEDS_AttributePythonObject_i::SetObject(const char* theSequence, CORBA::Boolean IsScript) +{ + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_PythonObjectAttribute)::DownCast(_myAttr)->SetObject(const_cast(theSequence), IsScript); + char *aSeq = CORBA::string_dup(theSequence); + Handle(SALOMEDSImpl_AttributePythonObject)::DownCast(_impl)->SetObject(aSeq, IsScript); } -char* SALOMEDS_AttributePythonObject_i::GetObject() { - char* aSeq = Handle(SALOMEDS_PythonObjectAttribute)::DownCast(_myAttr)->GetObject(); +char* SALOMEDS_AttributePythonObject_i::GetObject() +{ + SALOMEDS::Locker lock; + char* aSeq = Handle(SALOMEDSImpl_AttributePythonObject)::DownCast(_impl)->GetObject().ToCString(); CORBA::String_var aStr = CORBA::string_dup(aSeq); return aStr._retn(); } -CORBA::Boolean SALOMEDS_AttributePythonObject_i::IsScript() { - return Handle(SALOMEDS_PythonObjectAttribute)::DownCast(_myAttr)->IsScript(); +CORBA::Boolean SALOMEDS_AttributePythonObject_i::IsScript() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributePythonObject)::DownCast(_impl)->IsScript(); } -char* SALOMEDS_AttributePythonObject_i::Store() { - CORBA::String_var aString = GetObject(); - char* aResult = new char[strlen(aString) + 2]; - aResult[0] = IsScript()?'s':'n'; - strcpy(aResult+1, aString); - return aResult; -} -void SALOMEDS_AttributePythonObject_i::Restore(const char* theValue) { - SetObject(&theValue[1], theValue[0]=='s'); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributePythonObject_i.hxx b/src/SALOMEDS/SALOMEDS_AttributePythonObject_i.hxx index 615690b97..fb82ce740 100644 --- a/src/SALOMEDS/SALOMEDS_AttributePythonObject_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributePythonObject_i.hxx @@ -1,13 +1,6 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributePythonObject_i.hxx -// Author : Michael Ponikarov +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributePythonObject_i_HeaderFile #define SALOMEDS_AttributePythonObject_i_HeaderFile @@ -17,23 +10,24 @@ #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) #include "SALOMEDS_GenericAttribute_i.hxx" -#include "SALOMEDS_PythonObjectAttribute.hxx" +#include "SALOMEDSImpl_AttributePythonObject.hxx" -DEFINE_DERIVED_ATTR(AttributePythonObject,SALOMEDS_PythonObjectAttribute,true); - -class SALOMEDS_AttributePythonObject_i: - public virtual POA_SALOMEDS::AttributePythonObject, - public virtual SALOMEDS_TAttributePythonObject_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributePythonObject,SALOMEDS_PythonObjectAttribute); +class SALOMEDS_AttributePythonObject_i: public virtual POA_SALOMEDS::AttributePythonObject, + public virtual SALOMEDS_GenericAttribute_i { public: + + SALOMEDS_AttributePythonObject_i(const Handle(SALOMEDSImpl_AttributePythonObject)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributePythonObject_i() {}; + virtual void SetObject(const char* theSequence, CORBA::Boolean IsScript); virtual char* GetObject(); virtual CORBA::Boolean IsScript(); - virtual char* Store(); - virtual void Restore(const char*); - }; + + + #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeReal.cxx b/src/SALOMEDS/SALOMEDS_AttributeReal.cxx new file mode 100644 index 000000000..72d73d421 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeReal.cxx @@ -0,0 +1,34 @@ +// File : SALOMEDS_AttributeReal.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeReal.hxx" + +#include +#include + +SALOMEDS_AttributeReal::SALOMEDS_AttributeReal(const Handle(SALOMEDSImpl_AttributeReal)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeReal::SALOMEDS_AttributeReal(SALOMEDS::AttributeReal_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeReal::~SALOMEDS_AttributeReal() +{} + +double SALOMEDS_AttributeReal::Value() +{ + double aValue; + if(_isLocal) aValue = Handle(SALOMEDSImpl_AttributeReal)::DownCast(_local_impl)->Value(); + else aValue = SALOMEDS::AttributeReal::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeReal::SetValue(double value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeReal)::DownCast(_local_impl)->SetValue(value); + else SALOMEDS::AttributeReal::_narrow(_corba_impl)->SetValue(value); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeReal.hxx b/src/SALOMEDS/SALOMEDS_AttributeReal.hxx new file mode 100644 index 000000000..dd26b5345 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeReal.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeReal.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeReal_HeaderFile +#define SALOMEDS_AttributeReal_HeaderFile + +#include "SALOMEDSClient_AttributeReal.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeReal.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeReal: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeReal +{ +public: + SALOMEDS_AttributeReal(const Handle(SALOMEDSImpl_AttributeReal)& theAttr); + SALOMEDS_AttributeReal(SALOMEDS::AttributeReal_ptr theAttr); + ~SALOMEDS_AttributeReal(); + + virtual double Value(); + virtual void SetValue(double value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeReal_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeReal_i.cxx index ca74454ee..aaeae7ee1 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeReal_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeReal_i.cxx @@ -1,80 +1,24 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeReal_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #include "SALOMEDS_AttributeReal_i.hxx" +#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDS.hxx" #include using namespace std; -static const char* write_double(double value) +CORBA::Double SALOMEDS_AttributeReal_i::Value() { - std::ostringstream os; - unsigned char* array = (unsigned char*)&value; - for(int i = 0; i < sizeof(double); i++) { - unsigned tmp = (unsigned short)array[i]; - os << " " << tmp; - } - return os.str().c_str(); + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeReal)::DownCast(_impl)->Value(); } -static double read_double(const char* str) +void SALOMEDS_AttributeReal_i::SetValue(CORBA::Double value) { - std::istringstream is(str); - double value; - unsigned char* array = (unsigned char*)(&value); - for(int i = 0; i < sizeof(double); i++) { - unsigned tmp; - is >> tmp; - array[i] = (unsigned char)tmp; - } - return value; -} - -CORBA::Double SALOMEDS_AttributeReal_i::Value() { - return Handle(TDataStd_Real)::DownCast(_myAttr)->Get(); -} - -void SALOMEDS_AttributeReal_i::SetValue(CORBA::Double value) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(TDataStd_Real)::DownCast(_myAttr)->Set(value); -} - -char* SALOMEDS_AttributeReal_i::Store() { - // char* RealVal = new char[35]; - // sprintf(RealVal, "%.20f", Value()); - //return RealVal; - return (char*)write_double( (double)Value() ); -} - -void SALOMEDS_AttributeReal_i::Restore(const char* value) { - //char *err = NULL; - //CORBA::Double r = strtod(value, &err); - //if (err != value) SetValue(r); - SetValue( read_double(value) ); + Handle(SALOMEDSImpl_AttributeReal)::DownCast(_impl)->SetValue(value); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeReal_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeReal_i.hxx index a7fa861e6..305cfb6b1 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeReal_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeReal_i.hxx @@ -1,56 +1,28 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeReal_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeReal_i_HeaderFile #define SALOMEDS_AttributeReal_i_HeaderFile -#include - -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeReal,TDataStd_Real,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeReal.hxx" -class SALOMEDS_AttributeReal_i: - public virtual POA_SALOMEDS::AttributeReal, - public virtual SALOMEDS_TAttributeReal_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeReal,TDataStd_Real); +class SALOMEDS_AttributeReal_i: public virtual POA_SALOMEDS::AttributeReal, + public virtual SALOMEDS_GenericAttribute_i { public: - CORBA::Double Value(); - void SetValue(CORBA::Double theValue); + + SALOMEDS_AttributeReal_i(const Handle(SALOMEDSImpl_AttributeReal)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; - char* Store(); - void Restore(const char*); + ~SALOMEDS_AttributeReal_i() {}; + CORBA::Double Value(); + void SetValue(CORBA::Double value); }; diff --git a/src/SALOMEDS/SALOMEDS_AttributeSelectable.cxx b/src/SALOMEDS/SALOMEDS_AttributeSelectable.cxx new file mode 100644 index 000000000..f9581a03d --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeSelectable.cxx @@ -0,0 +1,33 @@ +// File : SALOMEDS_AttributeSelectable.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeSelectable.hxx" + +#include +#include + +SALOMEDS_AttributeSelectable::SALOMEDS_AttributeSelectable(const Handle(SALOMEDSImpl_AttributeSelectable)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeSelectable::SALOMEDS_AttributeSelectable(SALOMEDS::AttributeSelectable_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeSelectable::~SALOMEDS_AttributeSelectable() +{} + +bool SALOMEDS_AttributeSelectable::IsSelectable() +{ + bool aValue; + if(_isLocal) aValue = (bool)Handle(SALOMEDSImpl_AttributeSelectable)::DownCast(_local_impl)->IsSelectable(); + else aValue = SALOMEDS::AttributeSelectable::_narrow(_corba_impl)->IsSelectable(); + return aValue; +} + +void SALOMEDS_AttributeSelectable::SetSelectable(bool value) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeSelectable)::DownCast(_local_impl)->SetSelectable((int)value); + else SALOMEDS::AttributeSelectable::_narrow(_corba_impl)->SetSelectable(value); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeSelectable.hxx b/src/SALOMEDS/SALOMEDS_AttributeSelectable.hxx new file mode 100644 index 000000000..943eafacc --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeSelectable.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeSelectable.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeSelectable_HeaderFile +#define SALOMEDS_AttributeSelectable_HeaderFile + +#include "SALOMEDSClient_AttributeSelectable.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeSelectable.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeSelectable: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeSelectable +{ +public: + SALOMEDS_AttributeSelectable(const Handle(SALOMEDSImpl_AttributeSelectable)& theAttr); + SALOMEDS_AttributeSelectable(SALOMEDS::AttributeSelectable_ptr theAttr); + ~SALOMEDS_AttributeSelectable(); + + virtual bool IsSelectable(); + virtual void SetSelectable(bool value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeSelectable_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeSelectable_i.cxx index 1ae041186..a83c79c16 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeSelectable_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeSelectable_i.cxx @@ -1,49 +1,24 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeSelectable_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeSelectable_i.hxx" +#include "SALOMEDS.hxx" using namespace std; -CORBA::Boolean SALOMEDS_AttributeSelectable_i::IsSelectable() { - return (Handle(SALOMEDS_SelectableAttribute)::DownCast(_myAttr)->Get() == 1); +CORBA::Boolean SALOMEDS_AttributeSelectable_i::IsSelectable() +{ + SALOMEDS::Locker lock; + return (Handle(SALOMEDSImpl_AttributeSelectable)::DownCast(_impl)->IsSelectable() == 1); } -void SALOMEDS_AttributeSelectable_i::SetSelectable(CORBA::Boolean value) { +void SALOMEDS_AttributeSelectable_i::SetSelectable(CORBA::Boolean value) +{ + SALOMEDS::Locker lock; Standard_Integer val = 0; if (value != 0) val = 1; - Handle(TDataStd_Integer)::DownCast(_myAttr)->Set(val); -} - -char* SALOMEDS_AttributeSelectable_i::Store() { - return CORBA::string_dup(IsSelectable()?"1":"0"); + Handle(SALOMEDSImpl_AttributeSelectable)::DownCast(_impl)->SetSelectable(val); } -void SALOMEDS_AttributeSelectable_i::Restore(const char* value) { - SetSelectable(value[0] == '1'); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeSelectable_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeSelectable_i.hxx index f7158eeda..d91f510be 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeSelectable_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeSelectable_i.hxx @@ -1,56 +1,31 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeSelectable_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header: #ifndef SALOMEDS_AttributeSelectable_i_HeaderFile #define SALOMEDS_AttributeSelectable_i_HeaderFile -#include "SALOMEDS_SelectableAttribute.hxx" -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeSelectable,SALOMEDS_SelectableAttribute,false); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeSelectable.hxx" -class SALOMEDS_AttributeSelectable_i: - public virtual POA_SALOMEDS::AttributeSelectable, - public virtual SALOMEDS_TAttributeSelectable_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeSelectable,SALOMEDS_SelectableAttribute); +class SALOMEDS_AttributeSelectable_i: public virtual POA_SALOMEDS::AttributeSelectable, + public virtual SALOMEDS_GenericAttribute_i { public: + + SALOMEDS_AttributeSelectable_i(const Handle(SALOMEDSImpl_AttributeSelectable)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeSelectable_i() {}; + CORBA::Boolean IsSelectable(); void SetSelectable(CORBA::Boolean value); - char* Store(); - void Restore(const char*); - }; + #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger.cxx b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger.cxx new file mode 100644 index 000000000..9623d89f8 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger.cxx @@ -0,0 +1,89 @@ +// File : SALOMEDS_AttributeSequenceOfInteger.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeSequenceOfInteger.hxx" + +#include +#include +#include + +SALOMEDS_AttributeSequenceOfInteger +::SALOMEDS_AttributeSequenceOfInteger(const Handle(SALOMEDSImpl_AttributeSequenceOfInteger)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeSequenceOfInteger::SALOMEDS_AttributeSequenceOfInteger(SALOMEDS::AttributeSequenceOfInteger_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeSequenceOfInteger::~SALOMEDS_AttributeSequenceOfInteger() +{} + +void SALOMEDS_AttributeSequenceOfInteger::Assign(const std::vector& other) +{ + int i, aLength = other.size(); + if(_isLocal) { + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + for(i = 0; i < aLength; i++) aSeq->Append(other[i]); + Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_local_impl)->Assign(aSeq); + } + else { + SALOMEDS::LongSeq_var aSeq = new SALOMEDS::LongSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = other[i]; + SALOMEDS::AttributeSequenceOfInteger::_narrow(_corba_impl)->Assign(aSeq); + } +} + +std::vector SALOMEDS_AttributeSequenceOfInteger::CorbaSequence() +{ + std::vector aVector; + int i, aLength; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeSequenceOfInteger) aSeqAttr; + aSeqAttr = Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_local_impl); + aLength = aSeqAttr->Length(); + for(i = 1; i <=aLength; i++) aVector.push_back(aSeqAttr->Value(i)); + } + else { + SALOMEDS::AttributeSequenceOfInteger_var aSeqAttr = SALOMEDS::AttributeSequenceOfInteger::_narrow(_corba_impl); + aLength = aSeqAttr->Length(); + for(i = 1; i <=aLength; i++) aVector.push_back(aSeqAttr->Value(i)); + } + return aVector; +} + +void SALOMEDS_AttributeSequenceOfInteger::Add(int value) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_local_impl)->Add(value); + else SALOMEDS::AttributeSequenceOfInteger::_narrow(_corba_impl)->Add(value); +} + +void SALOMEDS_AttributeSequenceOfInteger::Remove(int index) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_local_impl)->Remove(index); + else SALOMEDS::AttributeSequenceOfInteger::_narrow(_corba_impl)->Remove(index); +} + +void SALOMEDS_AttributeSequenceOfInteger::ChangeValue(int index, int value) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_local_impl)->ChangeValue(index, value); + else SALOMEDS::AttributeSequenceOfInteger::_narrow(_corba_impl)->ChangeValue(index, value); +} + +int SALOMEDS_AttributeSequenceOfInteger::Value(int index) +{ + int aValue; + if(_isLocal) aValue = Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_local_impl)->Value(index); + else aValue = SALOMEDS::AttributeSequenceOfInteger::_narrow(_corba_impl)->Value(index); + return aValue; +} + +int SALOMEDS_AttributeSequenceOfInteger::Length() +{ + int aValue; + if(_isLocal) aValue = Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_local_impl)-> Length(); + else aValue = SALOMEDS::AttributeSequenceOfInteger::_narrow(_corba_impl)-> Length(); + return aValue; +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger.hxx b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger.hxx new file mode 100644 index 000000000..26fe88e5a --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger.hxx @@ -0,0 +1,36 @@ +// File : SALOMEDS_AttributeSequenceOfInteger.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeSequenceOfInteger_HeaderFile +#define SALOMEDS_AttributeSequenceOfInteger_HeaderFile + +#include "SALOMEDSClient_AttributeSequenceOfInteger.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfInteger.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#include + +class SALOMEDS_AttributeSequenceOfInteger: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeSequenceOfInteger +{ +public: + SALOMEDS_AttributeSequenceOfInteger(const Handle(SALOMEDSImpl_AttributeSequenceOfInteger)& theAttr); + SALOMEDS_AttributeSequenceOfInteger(SALOMEDS::AttributeSequenceOfInteger_ptr theAttr); + ~SALOMEDS_AttributeSequenceOfInteger(); + + virtual void Assign(const std::vector& other); + virtual std::vector CorbaSequence(); + virtual void Add(int value); + virtual void Remove(int index); + virtual void ChangeValue(int index, int value); + virtual int Value(int index); + virtual int Length(); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.cxx index 33b8fbd1e..0fccb55c0 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.cxx @@ -1,50 +1,32 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeSequenceOfInteger_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeSequenceOfInteger_i.hxx" +#include "SALOMEDS.hxx" #include using namespace std; + void SALOMEDS_AttributeSequenceOfInteger_i::Assign(const SALOMEDS::LongSeq& other) { + SALOMEDS::Locker lock; CheckLocked(); Handle(TColStd_HSequenceOfInteger) CasCadeSeq = new TColStd_HSequenceOfInteger; for (int i = 0; i < other.length(); i++) { CasCadeSeq->Append(other[i]); } - Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr)->Assign(CasCadeSeq); + Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_impl)->Assign(CasCadeSeq); } SALOMEDS::LongSeq* SALOMEDS_AttributeSequenceOfInteger_i::CorbaSequence() { + SALOMEDS::Locker lock; SALOMEDS::LongSeq_var CorbaSeq = new SALOMEDS::LongSeq; - Handle(SALOMEDS_SequenceOfIntegerAttribute) CasCadeSeq = Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeSequenceOfInteger) CasCadeSeq; + CasCadeSeq = Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_impl); CorbaSeq->length(CasCadeSeq->Length()); for (int i = 0; i < CasCadeSeq->Length(); i++) { CorbaSeq[i] = CasCadeSeq->Value(i+1);; @@ -54,55 +36,34 @@ SALOMEDS::LongSeq* SALOMEDS_AttributeSequenceOfInteger_i::CorbaSequence() void SALOMEDS_AttributeSequenceOfInteger_i::Add(CORBA::Long value) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr)->Add(value); + Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_impl)->Add(value); } void SALOMEDS_AttributeSequenceOfInteger_i::Remove(CORBA::Long index) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr)->Remove(index); + Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_impl)->Remove(index); } void SALOMEDS_AttributeSequenceOfInteger_i::ChangeValue(CORBA::Long index, CORBA::Long value) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr)->ChangeValue(index, value); + Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_impl)->ChangeValue(index, value); } CORBA::Long SALOMEDS_AttributeSequenceOfInteger_i::Value(CORBA::Short index) { - return Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr)->Value(index); + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_impl)->Value(index); } CORBA::Long SALOMEDS_AttributeSequenceOfInteger_i::Length() -{ - return Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr)->Length(); +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(_impl)->Length(); } -char* SALOMEDS_AttributeSequenceOfInteger_i::Store() { - Handle(SALOMEDS_SequenceOfIntegerAttribute) CasCadeSeq = Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr); - Standard_Integer aLength = CasCadeSeq->Length(); - char* aResult = new char[aLength * 25]; - aResult[0] = 0; - Standard_Integer aPosition = 0; - for (int i = 1; i <= aLength; i++) { - sprintf(aResult + aPosition , "%d ", CasCadeSeq->Value(i)); - aPosition += strlen(aResult + aPosition); - } - return aResult; -} - -void SALOMEDS_AttributeSequenceOfInteger_i::Restore(const char* value) { - Handle(TColStd_HSequenceOfInteger) CasCadeSeq = new TColStd_HSequenceOfInteger; - - char* aCopy = strdup(value); - char* adr = strtok(aCopy, " "); - while (adr) { - CORBA::Long l = atol(adr); - CasCadeSeq->Append(l); - adr = strtok(NULL, " "); - } - free(aCopy); - Handle(SALOMEDS_SequenceOfIntegerAttribute)::DownCast(_myAttr)->Assign(CasCadeSeq); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.hxx index d561d229d..320bbd21e 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfInteger_i.hxx @@ -1,49 +1,27 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeSequenceOfInteger_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeSequenceOfInteger_i_HeaderFile #define SALOMEDS_AttributeSequenceOfInteger_i_HeaderFile -#include "SALOMEDS_SequenceOfIntegerAttribute.hxx" -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeSequenceOfInteger,SALOMEDS_SequenceOfIntegerAttribute,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfInteger.hxx" -class SALOMEDS_AttributeSequenceOfInteger_i: - public virtual POA_SALOMEDS::AttributeSequenceOfInteger, - public virtual SALOMEDS_TAttributeSequenceOfInteger_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeSequenceOfInteger,SALOMEDS_SequenceOfIntegerAttribute); +class SALOMEDS_AttributeSequenceOfInteger_i: public virtual POA_SALOMEDS::AttributeSequenceOfInteger, + public virtual SALOMEDS_GenericAttribute_i +{ public: + + SALOMEDS_AttributeSequenceOfInteger_i(const Handle(SALOMEDSImpl_AttributeSequenceOfInteger)& theAttr,CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeSequenceOfInteger_i() {}; + void Assign(const SALOMEDS::LongSeq& other); SALOMEDS::LongSeq* CorbaSequence(); void Add(CORBA::Long value); @@ -52,9 +30,6 @@ public: CORBA::Long Value(CORBA::Short index); CORBA::Long Length(); - char* Store(); - void Restore(const char*); - }; #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal.cxx b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal.cxx new file mode 100644 index 000000000..f29de16e6 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal.cxx @@ -0,0 +1,89 @@ +// File : SALOMEDS_AttributeSequenceOfReal.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeSequenceOfReal.hxx" + +#include +#include +#include + +SALOMEDS_AttributeSequenceOfReal +::SALOMEDS_AttributeSequenceOfReal(const Handle(SALOMEDSImpl_AttributeSequenceOfReal)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeSequenceOfReal::SALOMEDS_AttributeSequenceOfReal(SALOMEDS::AttributeSequenceOfReal_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeSequenceOfReal::~SALOMEDS_AttributeSequenceOfReal() +{} + +void SALOMEDS_AttributeSequenceOfReal::Assign(const std::vector& other) +{ + int i, aLength = other.size(); + if(_isLocal) { + Handle(TColStd_HSequenceOfReal) aSeq = new TColStd_HSequenceOfReal; + for(i = 0; i < aLength; i++) aSeq->Append(other[i]); + Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_local_impl)->Assign(aSeq); + } + else { + SALOMEDS::DoubleSeq_var aSeq = new SALOMEDS::DoubleSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = other[i]; + SALOMEDS::AttributeSequenceOfReal::_narrow(_corba_impl)->Assign(aSeq); + } +} + +std::vector SALOMEDS_AttributeSequenceOfReal::CorbaSequence() +{ + std::vector aVector; + int i, aLength; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeSequenceOfReal) aSeqAttr; + aSeqAttr = Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_local_impl); + aLength = aSeqAttr->Length(); + for(i = 1; i <=aLength; i++) aVector.push_back(aSeqAttr->Value(i)); + } + else { + SALOMEDS::AttributeSequenceOfReal_var aSeqAttr = SALOMEDS::AttributeSequenceOfReal::_narrow(_corba_impl); + aLength = aSeqAttr->Length(); + for(i = 1; i <=aLength; i++) aVector.push_back(aSeqAttr->Value(i)); + } + return aVector; +} + +void SALOMEDS_AttributeSequenceOfReal::Add(double value) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_local_impl)->Add(value); + else SALOMEDS::AttributeSequenceOfReal::_narrow(_corba_impl)->Add(value); +} + +void SALOMEDS_AttributeSequenceOfReal::Remove(int index) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_local_impl)->Remove(index); + else SALOMEDS::AttributeSequenceOfReal::_narrow(_corba_impl)->Remove(index); +} + +void SALOMEDS_AttributeSequenceOfReal::ChangeValue(int index, double value) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_local_impl)->ChangeValue(index, value); + else SALOMEDS::AttributeSequenceOfReal::_narrow(_corba_impl)->ChangeValue(index, value); +} + +double SALOMEDS_AttributeSequenceOfReal::Value(int index) +{ + double aValue; + if(_isLocal) aValue = Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_local_impl)->Value(index); + else aValue = SALOMEDS::AttributeSequenceOfReal::_narrow(_corba_impl)->Value(index); + return aValue; +} + +int SALOMEDS_AttributeSequenceOfReal::Length() +{ + int aValue; + if(_isLocal) aValue = Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_local_impl)-> Length(); + else aValue = SALOMEDS::AttributeSequenceOfReal::_narrow(_corba_impl)-> Length(); + return aValue; +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal.hxx b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal.hxx new file mode 100644 index 000000000..31773263f --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal.hxx @@ -0,0 +1,36 @@ +// File : SALOMEDS_AttributeSequenceOfReal.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeSequenceOfReal_HeaderFile +#define SALOMEDS_AttributeSequenceOfReal_HeaderFile + +#include "SALOMEDSClient_AttributeSequenceOfReal.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfReal.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#include + +class SALOMEDS_AttributeSequenceOfReal: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeSequenceOfReal +{ +public: + SALOMEDS_AttributeSequenceOfReal(const Handle(SALOMEDSImpl_AttributeSequenceOfReal)& theAttr); + SALOMEDS_AttributeSequenceOfReal(SALOMEDS::AttributeSequenceOfReal_ptr theAttr); + ~SALOMEDS_AttributeSequenceOfReal(); + + virtual void Assign(const std::vector& other); + virtual std::vector CorbaSequence(); + virtual void Add(double value); + virtual void Remove(int index); + virtual void ChangeValue(int index, double value); + virtual double Value(int index); + virtual int Length(); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.cxx index 308ec01c0..bf97ab386 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.cxx @@ -1,50 +1,30 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeSequenceOfReal_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeSequenceOfReal_i.hxx" +#include "SALOMEDS.hxx" #include using namespace std; void SALOMEDS_AttributeSequenceOfReal_i::Assign(const SALOMEDS::DoubleSeq& other) { + SALOMEDS::Locker lock; CheckLocked(); Handle(TColStd_HSequenceOfReal) CasCadeSeq = new TColStd_HSequenceOfReal; for (int i = 0; i < other.length(); i++) { CasCadeSeq->Append(other[i]); } - Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr)->Assign(CasCadeSeq); + Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_impl)->Assign(CasCadeSeq); } SALOMEDS::DoubleSeq* SALOMEDS_AttributeSequenceOfReal_i::CorbaSequence() { + SALOMEDS::Locker lock; SALOMEDS::DoubleSeq_var CorbaSeq = new SALOMEDS::DoubleSeq; - Handle(SALOMEDS_SequenceOfRealAttribute) CasCadeSeq = Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeSequenceOfReal) CasCadeSeq = Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_impl); CorbaSeq->length(CasCadeSeq->Length()); for (int i = 0; i < CasCadeSeq->Length(); i++) { CorbaSeq[i] = CasCadeSeq->Value(i+1);; @@ -54,57 +34,34 @@ SALOMEDS::DoubleSeq* SALOMEDS_AttributeSequenceOfReal_i::CorbaSequence() void SALOMEDS_AttributeSequenceOfReal_i::Add(CORBA::Double value) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr)->Add(value); + Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_impl)->Add(value); } void SALOMEDS_AttributeSequenceOfReal_i::Remove(CORBA::Long index) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr)->Remove(index); + Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_impl)->Remove(index); } void SALOMEDS_AttributeSequenceOfReal_i::ChangeValue(CORBA::Long index, CORBA::Double value) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr)->ChangeValue(index, value); + Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_impl)->ChangeValue(index, value); } CORBA::Double SALOMEDS_AttributeSequenceOfReal_i::Value(CORBA::Short index) { - return Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr)->Value(index); + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_impl)->Value(index); } CORBA::Long SALOMEDS_AttributeSequenceOfReal_i::Length() { - return Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr)->Length(); -} - -char* SALOMEDS_AttributeSequenceOfReal_i::Store() { - Handle(SALOMEDS_SequenceOfRealAttribute) CasCadeSeq = Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr); - Standard_Integer aLength = CasCadeSeq->Length(); - char* aResult = new char[aLength * 25]; - aResult[0] = 0; - Standard_Integer aPosition = 0; - for (int i = 1; i <= aLength; i++) { - sprintf(aResult + aPosition , "%f ", CasCadeSeq->Value(i)); - aPosition += strlen(aResult + aPosition); - } - return aResult; + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(_impl)->Length(); } -void SALOMEDS_AttributeSequenceOfReal_i::Restore(const char* value) { - Handle(TColStd_HSequenceOfReal) CasCadeSeq = new TColStd_HSequenceOfReal; - - char* aCopy = strdup(value); - char* adr = strtok(aCopy, " "); - char *err = NULL; - while (adr) { - CORBA::Double r = strtod(adr, &err); - if (err == adr) break; - else CasCadeSeq->Append(r); - adr = strtok(NULL, " "); - } - free(aCopy); - Handle(SALOMEDS_SequenceOfRealAttribute)::DownCast(_myAttr)->Assign(CasCadeSeq); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.hxx index 4c7fa6a17..a4aa834cc 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeSequenceOfReal_i.hxx @@ -1,49 +1,26 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeSequenceOfSequenceOfReal_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeSequenceOfSequenceOfReal_i_HeaderFile #define SALOMEDS_AttributeSequenceOfSequenceOfReal_i_HeaderFile -#include "SALOMEDS_SequenceOfRealAttribute.hxx" -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeSequenceOfReal,SALOMEDS_SequenceOfRealAttribute,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfReal.hxx" -class SALOMEDS_AttributeSequenceOfReal_i: - public virtual POA_SALOMEDS::AttributeSequenceOfReal, - public virtual SALOMEDS_TAttributeSequenceOfReal_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeSequenceOfReal,SALOMEDS_SequenceOfRealAttribute); +class SALOMEDS_AttributeSequenceOfReal_i: public virtual POA_SALOMEDS::AttributeSequenceOfReal, + public virtual SALOMEDS_GenericAttribute_i { public: + + SALOMEDS_AttributeSequenceOfReal_i(const Handle(SALOMEDSImpl_AttributeSequenceOfReal)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeSequenceOfReal_i() {}; + void Assign(const SALOMEDS::DoubleSeq& other); SALOMEDS::DoubleSeq* CorbaSequence(); void Add(CORBA::Double value); @@ -52,9 +29,6 @@ public: CORBA::Double Value(CORBA::Short index); CORBA::Long Length(); - char* Store(); - void Restore(const char*); - }; diff --git a/src/SALOMEDS/SALOMEDS_AttributeStudyProperties.cxx b/src/SALOMEDS/SALOMEDS_AttributeStudyProperties.cxx new file mode 100644 index 000000000..8ba288b42 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeStudyProperties.cxx @@ -0,0 +1,236 @@ +// File : SALOMEDS_AttributeStudyProperties.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeStudyProperties.hxx" + +#include +#include +#include +#include +#include + +SALOMEDS_AttributeStudyProperties::SALOMEDS_AttributeStudyProperties + (const Handle(SALOMEDSImpl_AttributeStudyProperties)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeStudyProperties::SALOMEDS_AttributeStudyProperties + (SALOMEDS::AttributeStudyProperties_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeStudyProperties::~SALOMEDS_AttributeStudyProperties() +{ +} + +void SALOMEDS_AttributeStudyProperties::SetUserName(const std::string& theName) +{ + if (_isLocal) { + Handle(SALOMEDSImpl_AttributeStudyProperties) anImpl = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl); + anImpl->ChangeCreatorName((char*)theName.c_str()); + } else + SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->SetUserName(theName.c_str()); +} + +std::string SALOMEDS_AttributeStudyProperties::GetUserName() +{ + std::string aName; + if (_isLocal) { + TCollection_ExtendedString S = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->GetCreatorName(); + aName = TCollection_AsciiString(S).ToCString(); + } +#ifndef WNT + else aName = SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->GetUserName(); +#else + else aName = SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->GetUserNameA(); +#endif + return aName; +} + +void SALOMEDS_AttributeStudyProperties::SetCreationDate + (int theMinute, int theHour, int theDay, int theMonth, int theYear) +{ + if (_isLocal) { + Handle(SALOMEDSImpl_AttributeStudyProperties) anImpl = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl); + int aTmp; + if (anImpl->GetCreationDate(aTmp, aTmp, aTmp, aTmp, aTmp)) return; + TCollection_ExtendedString S; + anImpl->SetModification(S, theMinute, theHour, theDay, theMonth, theYear); + } else { + SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->SetCreationDate(theMinute, + theHour, + theDay, + theMonth, + theYear); + } +} + +bool SALOMEDS_AttributeStudyProperties::GetCreationDate(int& theMinute, + int& theHour, + int& theDay, + int& theMonth, + int& theYear) +{ + bool ret; + if (_isLocal) { + ret = Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast + (_local_impl)->GetCreationDate(theMinute, theHour, theDay, theMonth, theYear); + } else { + CORBA::Long aMinute, anHour, aDay, aMonth, anYear; + ret = SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->GetCreationDate(aMinute, + anHour, + aDay, + aMonth, + anYear); + theMinute = (int)aMinute; + theHour = (int)anHour; + theDay = (int)aDay; + theMonth = (int)aMonth; + theYear = (int)anYear; + } + return ret; +} + +void SALOMEDS_AttributeStudyProperties::SetCreationMode(const std::string& theMode) +{ + if (_isLocal) { + if (theMode == "from scratch") + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->SetCreationMode(1); + else if (theMode == "copy from") + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->SetCreationMode(2); + else //Not defined + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->SetCreationMode(0); + } + else SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->SetCreationMode(theMode.c_str()); +} + +std::string SALOMEDS_AttributeStudyProperties::GetCreationMode() +{ + std::string aMode; + if (_isLocal) { + int mode = Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->GetCreationMode(); + if (mode == 1) aMode = "from scratch"; + if (mode == 2) aMode = "copy from"; + } + else + aMode = SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->GetCreationMode(); + return aMode; +} + +void SALOMEDS_AttributeStudyProperties::SetModified(int theModified) +{ + if (_isLocal) + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->SetModified(theModified); + else + SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->SetModified(theModified); +} + +bool SALOMEDS_AttributeStudyProperties::IsModified() +{ + bool ret; + if (_isLocal) + ret = Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->IsModified(); + else + ret = SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->IsModified(); + return ret; +} + +int SALOMEDS_AttributeStudyProperties::GetModified() +{ + int isModified; + if (_isLocal) + isModified = Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->GetModified(); + else + isModified = SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->GetModified(); + return isModified; +} + +void SALOMEDS_AttributeStudyProperties::SetLocked(bool theLocked) +{ + if (_isLocal) + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->SetLocked(theLocked); + else + SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->SetLocked(theLocked); +} + +bool SALOMEDS_AttributeStudyProperties::IsLocked() +{ + bool ret; + if (_isLocal) + ret = Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl)->IsLocked(); + else + ret = SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->IsLocked(); + return ret; +} + +void SALOMEDS_AttributeStudyProperties::SetModification(const std::string& theName, + int theMinute, + int theHour, + int theDay, + int theMonth, + int theYear) +{ + if (_isLocal) { + Handle(SALOMEDSImpl_AttributeStudyProperties) anImpl = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl); + anImpl->SetModification((char*)theName.c_str(), theMinute, theHour, theDay, theMonth, theYear); + } else + SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->SetModification(theName.c_str(), + theMinute, + theHour, + theDay, + theMonth, + theYear); +} + +void SALOMEDS_AttributeStudyProperties::GetModificationsList(std::vector& theNames, + std::vector& theMinutes, + std::vector& theHours, + std::vector& theDays, + std::vector& theMonths, + std::vector& theYears, + bool theWithCreator) +{ + int i, aLength; + + if (_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aNames; + Handle(TColStd_HSequenceOfInteger) aMinutes, aHours, aDays, aMonths, aYears; + Handle(SALOMEDSImpl_AttributeStudyProperties) anImpl = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_local_impl); + anImpl->GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears); + aLength = aNames->Length(); + i = ((theWithCreator) ? 1 : 2); + for (; i <= aLength; i++) { + theNames.push_back(TCollection_AsciiString(aNames->Value(i)).ToCString()); + theMinutes.push_back(aMinutes->Value(i)); + theHours.push_back(aHours->Value(i)); + theDays.push_back(aDays->Value(i)); + theMonths.push_back(aMonths->Value(i)); + theYears.push_back(aYears->Value(i)); + } + } else { + SALOMEDS::StringSeq_var aNames; + SALOMEDS::LongSeq_var aMinutes, aHours, aDays, aMonths, aYears; + SALOMEDS::AttributeStudyProperties::_narrow(_corba_impl)->GetModificationsList(aNames.out(), + aMinutes.out(), + aHours.out(), + aDays.out(), + aMonths.out(), + aYears.out(), + theWithCreator); + aLength = aNames->length(); + for (i = 0; i +#include + +#include "SALOMEDSClient_AttributeStudyProperties.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeStudyProperties.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#ifdef GetUserName +#undef GetUserName +#endif + +class Standard_EXPORT SALOMEDS_AttributeStudyProperties: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeStudyProperties +{ +public: + + SALOMEDS_AttributeStudyProperties(const Handle(SALOMEDSImpl_AttributeStudyProperties)& theAttr); + SALOMEDS_AttributeStudyProperties(SALOMEDS::AttributeStudyProperties_ptr theAttr); + ~SALOMEDS_AttributeStudyProperties(); + + virtual void SetUserName(const std::string& theName); + virtual std::string GetUserName(); + virtual void SetCreationDate(int theMinute, int theHour, int theDay, int theMonth, int theYear); + virtual bool GetCreationDate(int& theMinute, int& theHour, int& theDay, int& theMonth, int& theYear); + virtual void SetCreationMode(const std::string& theMode); + virtual std::string GetCreationMode(); + virtual void SetModified(int theModified); + virtual bool IsModified(); + virtual int GetModified(); + virtual void SetLocked(bool theLocked); + virtual bool IsLocked(); + virtual void SetModification(const std::string& theName, + int theMinute, + int theHour, + int theDay, + int theMonth, + int theYear); + virtual void GetModificationsList(std::vector& theNames, + std::vector& theMinutes, + std::vector& theHours, + std::vector& theDays, + std::vector& theMonths, + std::vector& theYears, + bool theWithCreator); + +}; + + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.cxx index b08b9d5c4..286fdb7d2 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.cxx @@ -1,35 +1,32 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributeStudyProperties_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + +#include "SALOMEDS_AttributeStudyProperties_i.hxx" +#include "SALOMEDS.hxx" #include #include #include -#include -#include "SALOMEDS_AttributeStudyProperties_i.hxx" +using namespace std; #define CREATION_MODE_NOTDEFINED 0 #define CREATION_MODE_SCRATCH 1 #define CREATION_MODE_COPY 2 -using namespace std; - -void SALOMEDS_AttributeStudyProperties_i::SetUserName(const char* theName) { +void SALOMEDS_AttributeStudyProperties_i::SetUserName(const char* theName) +{ + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_StudyPropertiesAttribute) aProp = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr); - aProp->SetFirstName(const_cast(theName)); + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl)->ChangeCreatorName((char*)theName); } -char* SALOMEDS_AttributeStudyProperties_i::GetUserName() { - TCollection_ExtendedString S = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr)->GetCreatorName(); +char* SALOMEDS_AttributeStudyProperties_i::GetUserName() +{ + SALOMEDS::Locker lock; + TCollection_ExtendedString S = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl)->GetCreatorName(); CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(S).ToCString()); return c_s._retn(); } @@ -38,26 +35,32 @@ void SALOMEDS_AttributeStudyProperties_i::SetCreationDate(CORBA::Long theMinute, CORBA::Long theHour, CORBA::Long theDay, CORBA::Long theMonth, - CORBA::Long theYear) { + CORBA::Long theYear) +{ + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_StudyPropertiesAttribute) aProp = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl); int aTmp; if (aProp->GetCreationDate(aTmp, aTmp, aTmp, aTmp, aTmp)) return; - aProp->SetModificationDate(theMinute, theHour, theDay, theMonth, theYear); + TCollection_ExtendedString S; + aProp->SetModification(S, theMinute, theHour, theDay, theMonth, theYear); } CORBA::Boolean SALOMEDS_AttributeStudyProperties_i::GetCreationDate(CORBA::Long& theMinute, CORBA::Long& theHour, CORBA::Long& theDay, CORBA::Long& theMonth, - CORBA::Long& theYear) { + CORBA::Long& theYear) +{ + SALOMEDS::Locker lock; Standard_Integer aMinute; Standard_Integer aHour; Standard_Integer aDay; Standard_Integer aMonth; Standard_Integer aYear; - if (Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr)->GetCreationDate(aMinute, aHour, aDay, - aMonth, aYear)) { + if (Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast + (_impl)->GetCreationDate(aMinute, aHour, aDay, aMonth, aYear)) { theMinute = aMinute; theHour = aHour; theDay = aDay; @@ -68,17 +71,22 @@ CORBA::Boolean SALOMEDS_AttributeStudyProperties_i::GetCreationDate(CORBA::Long& return Standard_False; } -void SALOMEDS_AttributeStudyProperties_i::SetCreationMode(const char* theMode) { +void SALOMEDS_AttributeStudyProperties_i::SetCreationMode(const char* theMode) +{ + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_StudyPropertiesAttribute) aProp = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl); if (strcmp(theMode,"from scratch")==0) aProp->SetCreationMode(CREATION_MODE_SCRATCH); else if (strcmp(theMode,"copy from")==0) aProp->SetCreationMode(CREATION_MODE_COPY); else aProp->SetCreationMode(CREATION_MODE_NOTDEFINED); } -char* SALOMEDS_AttributeStudyProperties_i::GetCreationMode() { +char* SALOMEDS_AttributeStudyProperties_i::GetCreationMode() +{ + SALOMEDS::Locker lock; CORBA::String_var c_s; - switch (Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr)->GetCreationMode()) { + switch (Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl)->GetCreationMode()) { case CREATION_MODE_SCRATCH: c_s = "from scratch"; break; case CREATION_MODE_COPY: c_s = "copy from"; break; default: c_s = ""; @@ -86,24 +94,34 @@ char* SALOMEDS_AttributeStudyProperties_i::GetCreationMode() { return c_s._retn(); } -void SALOMEDS_AttributeStudyProperties_i::SetModified(CORBA::Long theModified) { - Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr)->SetModified(theModified); +void SALOMEDS_AttributeStudyProperties_i::SetModified(CORBA::Long theModified) +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl)->SetModified(theModified); } -CORBA::Boolean SALOMEDS_AttributeStudyProperties_i::IsModified() { - return Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr)->IsModified(); +CORBA::Boolean SALOMEDS_AttributeStudyProperties_i::IsModified() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl)->IsModified(); } -CORBA::Long SALOMEDS_AttributeStudyProperties_i::GetModified() { - return Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr)->GetModified(); +CORBA::Long SALOMEDS_AttributeStudyProperties_i::GetModified() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl)->GetModified(); } -void SALOMEDS_AttributeStudyProperties_i::SetLocked(CORBA::Boolean theLocked) { - Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr)->SetLocked(theLocked); +void SALOMEDS_AttributeStudyProperties_i::SetLocked(CORBA::Boolean theLocked) +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl)->SetLocked(theLocked); } -CORBA::Boolean SALOMEDS_AttributeStudyProperties_i::IsLocked() { - return Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr)->IsLocked(); +CORBA::Boolean SALOMEDS_AttributeStudyProperties_i::IsLocked() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl)->IsLocked(); } void SALOMEDS_AttributeStudyProperties_i::SetModification(const char* theName, @@ -111,124 +129,51 @@ void SALOMEDS_AttributeStudyProperties_i::SetModification(const char* theName, CORBA::Long theHour, CORBA::Long theDay, CORBA::Long theMonth, - CORBA::Long theYear) { + CORBA::Long theYear) +{ + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_StudyPropertiesAttribute) aProp = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr); - aProp->SetUserName(const_cast(theName)); - aProp->SetModificationDate((int)theMinute, (int)theHour, (int)theDay, (int)theMonth, (int)theYear); + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl); + aProp->SetModification((char*)theName, (int)theMinute, (int)theHour, + (int)theDay, (int)theMonth, (int)theYear); } + void SALOMEDS_AttributeStudyProperties_i::GetModificationsList(SALOMEDS::StringSeq_out theNames, SALOMEDS::LongSeq_out theMinutes, SALOMEDS::LongSeq_out theHours, SALOMEDS::LongSeq_out theDays, SALOMEDS::LongSeq_out theMonths, SALOMEDS::LongSeq_out theYears, - CORBA::Boolean theWithCreator) { + CORBA::Boolean theWithCreator) +{ + SALOMEDS::Locker lock; Handle(TColStd_HSequenceOfExtendedString) aNames; Handle(TColStd_HSequenceOfInteger) aMinutes, aHours, aDays, aMonths, aYears; - Handle(SALOMEDS_StudyPropertiesAttribute) aProp = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr); - aNames = aProp->GetUserNames(); - aProp->GetModificationDates(aMinutes, aHours, aDays, aMonths, aYears); - int aLength = aNames->Length()-((theWithCreator)?0:1); + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(_impl); + aProp->GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears); + int aLength = aNames->Length(); + int aRetLength = aLength - ((theWithCreator) ? 0 : 1); theNames = new SALOMEDS::StringSeq; -// SALOMEDS::LongSeq *maminute = new SALOMEDS::LongSeq; -// maminute->length(5); theMinutes = new SALOMEDS::LongSeq; theHours = new SALOMEDS::LongSeq; theDays = new SALOMEDS::LongSeq; theMonths = new SALOMEDS::LongSeq; theYears = new SALOMEDS::LongSeq; - theNames->length(aLength); - theMinutes->length(aLength); - theHours->length(aLength); - theDays->length(aLength); - theMonths->length(aLength); - theYears->length(aLength); - int a; - for(a = 0; a < aLength; a++) - { - (*theNames)[a] = CORBA::string_dup(TCollection_AsciiString(aNames->Value(a + 1 + ((theWithCreator)?0:1))).ToCString()); - (*theMinutes)[a] = aMinutes->Value(a + 1 + ((theWithCreator)?0:1)); - (*theHours)[a] = aHours->Value(a + 1 + ((theWithCreator)?0:1)); - (*theDays)[a] = aDays->Value(a + 1 + ((theWithCreator)?0:1)); - (*theMonths)[a] = aMonths->Value(a + 1 + ((theWithCreator)?0:1)); - (*theYears)[a] = aYears->Value(a + 1 + ((theWithCreator)?0:1)); - } -} - -char* SALOMEDS_AttributeStudyProperties_i::Store() { - Handle(TColStd_HSequenceOfExtendedString) aNames; - Handle(TColStd_HSequenceOfInteger) aMinutes, aHours, aDays, aMonths, aYears; - Handle(SALOMEDS_StudyPropertiesAttribute) aProp = Handle(SALOMEDS_StudyPropertiesAttribute)::DownCast(_myAttr); - aNames = aProp->GetUserNames(); - aProp->GetModificationDates(aMinutes, aHours, aDays, aMonths, aYears); - - int aLength, anIndex; - for(aLength = 0, anIndex = aNames->Length(); anIndex > 0; anIndex--) aLength += aNames->Value(anIndex).Length() + 1; - - char* aProperty = new char[3 + aLength + 12 * aNames->Length()]; - - sprintf(aProperty,"%c%c", strlen(GetCreationMode())?GetCreationMode()[0]:'0', IsLocked()?'l':'u'); - - aLength = aNames->Length(); - int a = 2; - for(anIndex = 1; anIndex <= aLength; anIndex++) { - sprintf(&(aProperty[a]),"%2d%2d%2d%2d%4d%s", - (int)(aMinutes->Value(anIndex)), - (int)(aHours->Value(anIndex)), - (int)(aDays->Value(anIndex)), - (int)(aMonths->Value(anIndex)), - (int)(aYears->Value(anIndex)), - (char*)(TCollection_AsciiString(aNames->Value(anIndex)).ToCString())); - a = strlen(aProperty); - aProperty[a++] = 1; - } - aProperty[a] = 0; - return aProperty; -} - -void SALOMEDS_AttributeStudyProperties_i::Restore(const char* value) { - char* aCopy = strdup(value); - if (aCopy[0] == 'f') SetCreationMode("from scratch"); - else if (aCopy[0] == 'c') SetCreationMode("copy from"); - else SetCreationMode("none"); - - int anIndex; - for(anIndex = 2; anIndex + 2 < strlen(value) ;) { - char str[10]; - Standard_Integer aMinute, aHour, aDay, aMonth, aYear; - str[0] = aCopy[anIndex++]; - str[1] = aCopy[anIndex++]; - str[2] = 0; - aMinute = atoi(str); - str[0] = aCopy[anIndex++]; - str[1] = aCopy[anIndex++]; - aHour = atoi(str); - str[0] = aCopy[anIndex++]; - str[1] = aCopy[anIndex++]; - aDay = atoi(str); - str[0] = aCopy[anIndex++]; - str[1] = aCopy[anIndex++]; - aMonth = atoi(str); - str[0] = aCopy[anIndex++]; - str[1] = aCopy[anIndex++]; - str[2] = aCopy[anIndex++]; - str[3] = aCopy[anIndex++]; - str[4] = 0; - aYear = atoi(str); - - int aNameSize; - for(aNameSize = 0; aCopy[anIndex+aNameSize]!=1; aNameSize++); - char *aName = new char[aNameSize+1]; - strncpy(aName, &(aCopy[anIndex]), aNameSize); - aName[aNameSize] = 0; - SetModification(aName, aMinute,aHour,aDay,aMonth,aYear); - delete(aName); - anIndex += aNameSize + 1; - } - if (aCopy[1] == 'l') { - SetLocked(Standard_True); + theNames->length(aRetLength); + theMinutes->length(aRetLength); + theHours->length(aRetLength); + theDays->length(aRetLength); + theMonths->length(aRetLength); + theYears->length(aRetLength); + int a = 0, ind = ((theWithCreator) ? 1 : 2); + for (; ind <= aLength; a++, ind++) { + (*theNames)[a] = CORBA::string_dup(TCollection_AsciiString(aNames->Value(ind)).ToCString()); + (*theMinutes)[a] = aMinutes->Value(ind); + (*theHours)[a] = aHours->Value(ind); + (*theDays)[a] = aDays->Value(ind); + (*theMonths)[a] = aMonths->Value(ind); + (*theYears)[a] = aYears->Value(ind); } - SetModified(0); - free(aCopy); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.hxx index b7e1d0020..7a93e197d 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeStudyProperties_i.hxx @@ -1,13 +1,6 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributeStudyProperties_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeStudyProperties_i_HeaderFile #define SALOMEDS_AttributeStudyProperties_i_HeaderFile @@ -16,17 +9,18 @@ #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_StudyPropertiesAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeStudyProperties.hxx" -DEFINE_DERIVED_ATTR(AttributeStudyProperties,SALOMEDS_StudyPropertiesAttribute,false); - -class SALOMEDS_AttributeStudyProperties_i: - public virtual POA_SALOMEDS::AttributeStudyProperties, - public virtual SALOMEDS_TAttributeStudyProperties_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeStudyProperties,SALOMEDS_StudyPropertiesAttribute); +class SALOMEDS_AttributeStudyProperties_i: public virtual POA_SALOMEDS::AttributeStudyProperties, + public virtual SALOMEDS_GenericAttribute_i { public: + + SALOMEDS_AttributeStudyProperties_i(const Handle(SALOMEDSImpl_AttributeStudyProperties)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeStudyProperties_i() {}; + virtual void SetUserName(const char* theName); virtual char* GetUserName() ; virtual void SetCreationDate(CORBA::Long theMinute, CORBA::Long theHour, CORBA::Long theDay, CORBA::Long theMonth, CORBA::Long theYear); @@ -52,9 +46,6 @@ public: SALOMEDS::LongSeq_out theYears, CORBA::Boolean theWithCreator); - char* Store(); - void Restore(const char*); - }; diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger.cxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger.cxx new file mode 100644 index 000000000..d72bd44ff --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger.cxx @@ -0,0 +1,383 @@ +// File : SALOMEDS_AttributeTableOfInteger.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeTableOfInteger.hxx" + +#include +#include +#include +#include + + +SALOMEDS_AttributeTableOfInteger +::SALOMEDS_AttributeTableOfInteger(const Handle(SALOMEDSImpl_AttributeTableOfInteger)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTableOfInteger::SALOMEDS_AttributeTableOfInteger(SALOMEDS::AttributeTableOfInteger_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTableOfInteger::~SALOMEDS_AttributeTableOfInteger() +{} + + +void SALOMEDS_AttributeTableOfInteger::SetTitle(const std::string& theTitle) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->SetTitle((char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetTitle(theTitle.c_str()); +} + +std::string SALOMEDS_AttributeTableOfInteger::GetTitle() +{ + std::string aStr; + if(_isLocal) + aStr = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetTitle()).ToCString(); + else aStr = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetTitle(); + return aStr; +} + +void SALOMEDS_AttributeTableOfInteger::SetRowTitle(int theIndex, const std::string& theTitle) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->SetRowTitle(theIndex, + (char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetRowTitle(theIndex, theTitle.c_str()); +} + +void SALOMEDS_AttributeTableOfInteger::SetRowTitles(const std::vector& theTitles) +{ + CheckLocked(); + int aLength = theTitles.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theTitles[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->SetRowTitles(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = theTitles[i].c_str(); + SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetRowTitles(aSeq); + } + +} + +std::vector SALOMEDS_AttributeTableOfInteger::GetRowTitles() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetRowTitles(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString((aSeq->Value(i))).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetRowTitles(); + aLength = aSeq->length(); + for(i = 0; iSetColumnTitle(theIndex, + (char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetColumnTitle(theIndex, theTitle.c_str()); +} + +void SALOMEDS_AttributeTableOfInteger::SetColumnTitles(const std::vector& theTitles) +{ + CheckLocked(); + int aLength = theTitles.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theTitles[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->SetColumnTitles(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = theTitles[i].c_str(); + SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetColumnTitles(aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfInteger::GetColumnTitles() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetColumnTitles(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aSeq->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetColumnTitles(); + aLength = aSeq->length(); + for(i = 0; iSetRowUnit(theIndex, + (char*)theUnit.c_str()); + else SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetRowUnit(theIndex, theUnit.c_str()); +} + +void SALOMEDS_AttributeTableOfInteger::SetRowUnits(const std::vector& theUnits) +{ + CheckLocked(); + int aLength = theUnits.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theUnits[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->SetRowUnits(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theUnits[i].c_str(); + SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetRowUnits(aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfInteger::GetRowUnits() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetRowUnits(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aSeq->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetRowUnits(); + aLength = aSeq->length(); + for(i = 0; iGetNbRows(); + else aNb = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetNbRows(); + return aNb; +} + +int SALOMEDS_AttributeTableOfInteger::GetNbColumns() +{ + int aNb; + if(_isLocal) aNb = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetNbColumns(); + else aNb = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetNbColumns(); + return aNb; + +} + +void SALOMEDS_AttributeTableOfInteger::AddRow(const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfInteger) aRow = new TColStd_HSequenceOfInteger; + for (int i = 0; i < aLength; i++) aRow->Append(theData[i]); + try { + aTable->SetRowData(aTable->GetNbRows() + 1, aRow); + } + catch(...) { + throw SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::LongSeq_var aSeq = new SALOMEDS::LongSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = theData[i]; + SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->AddRow(aSeq); + } +} + +void SALOMEDS_AttributeTableOfInteger::SetRow(int theRow, const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfInteger) aRow = new TColStd_HSequenceOfInteger; + for (int i = 0; i < aLength; i++) aRow->Append(theData[i]); + try { + aTable->SetRowData(theRow, aRow); + } + catch(...) { + throw SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::LongSeq_var aSeq = new SALOMEDS::LongSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = theData[i]; + SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetRow(theRow, aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfInteger::GetRow(int theRow) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfInteger) aRow; + aRow = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetRowData(theRow); + aLength = aRow->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(aRow->Value(i)); + } + else { + SALOMEDS::LongSeq_var aRow = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetRow(theRow); + for(i = 0; i < aLength; i++) aVector.push_back(aRow[i]); + } + + return aVector; +} + +void SALOMEDS_AttributeTableOfInteger::AddColumn(const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfInteger) aColumn = new TColStd_HSequenceOfInteger; + for (int i = 0; i < aLength; i++) aColumn->Append(theData[i]); + try { + aTable->SetColumnData(aTable->GetNbColumns() + 1, aColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::LongSeq_var aColumn = new SALOMEDS::LongSeq(); + aColumn->length(aLength); + for(i = 0; i < aLength; i++) aColumn[i] = theData[i]; + SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->AddColumn(aColumn); + } +} + +void SALOMEDS_AttributeTableOfInteger::SetColumn(int theColumn, const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfInteger) aColumn = new TColStd_HSequenceOfInteger; + for (int i = 0; i < aLength; i++) aColumn->Append(theData[i]); + try { + aTable->SetRowData(theColumn, aColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::LongSeq_var aColumn = new SALOMEDS::LongSeq(); + aColumn->length(aLength); + for(i = 0; i < aLength; i++) aColumn[i] = theData[i]; + SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetRow(theColumn, aColumn); + } +} + +std::vector SALOMEDS_AttributeTableOfInteger::GetColumn(int theColumn) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfInteger) aColumn; + aColumn = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetColumnData(theColumn); + aLength = aColumn->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(aColumn->Value(i)); + } + else { + SALOMEDS::LongSeq_var aColumn = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetColumn(theColumn); + for(i = 0; i < aLength; i++) aVector.push_back(aColumn[i]); + } + return aVector; +} + +void SALOMEDS_AttributeTableOfInteger::PutValue(int theValue, int theRow, int theColumn) +{ + CheckLocked(); + if(_isLocal) { + try { + Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->PutValue(theValue, theRow, theColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); + } + } + else { + SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->PutValue(theValue, theRow, theColumn); + } +} + +bool SALOMEDS_AttributeTableOfInteger::HasValue(int theRow, int theColumn) +{ + bool ret; + if(_isLocal) ret = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->HasValue(theRow, theColumn); + else ret = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->HasValue(theRow, theColumn); + return ret; +} + +int SALOMEDS_AttributeTableOfInteger::GetValue(int theRow, int theColumn) +{ + int aValue; + if(_isLocal) { + try { + aValue = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetValue(theRow, theColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); + } + } + else { + aValue = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetValue(theRow, theColumn); + } + return aValue; +} + +std::vector SALOMEDS_AttributeTableOfInteger::GetRowSetIndices(int theRow) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfInteger) aSet; + aSet = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->GetSetRowIndices(theRow); + aLength = aSet->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(aSet->Value(i)); + } + else { + SALOMEDS::LongSeq_var aSet = SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->GetRowSetIndices(theRow); + for(i = 0; i < aLength; i++) aVector.push_back(aSet[i]); + } + return aVector; +} + +void SALOMEDS_AttributeTableOfInteger::SetNbColumns(int theNbColumns) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_local_impl)->SetNbColumns(theNbColumns); + else SALOMEDS::AttributeTableOfInteger::_narrow(_corba_impl)->SetNbColumns(theNbColumns); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger.hxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger.hxx new file mode 100644 index 000000000..ad191577d --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger.hxx @@ -0,0 +1,56 @@ +// File : SALOMEDS_AttributeTableOfInteger.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeTableOfInteger_HeaderFile +#define SALOMEDS_AttributeTableOfInteger_HeaderFile + +#include "SALOMEDSClient_AttributeTableOfInteger.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeTableOfInteger.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#include + +class SALOMEDS_AttributeTableOfInteger: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeTableOfInteger +{ +public: + SALOMEDS_AttributeTableOfInteger(const Handle(SALOMEDSImpl_AttributeTableOfInteger)& theAttr); + SALOMEDS_AttributeTableOfInteger(SALOMEDS::AttributeTableOfInteger_ptr theAttr); + ~SALOMEDS_AttributeTableOfInteger(); + + virtual void SetTitle(const std::string& theTitle); + virtual std::string GetTitle(); + virtual void SetRowTitle(int theIndex, const std::string& theTitle); + virtual void SetRowTitles(const std::vector& theTitles); + virtual std::vector GetRowTitles(); + virtual void SetColumnTitle(int theIndex, const std::string& theTitle); + virtual void SetColumnTitles(const std::vector& theTitles); + virtual std::vector GetColumnTitles(); + + virtual void SetRowUnit(int theIndex, const std::string& theUnit); + virtual void SetRowUnits(const std::vector& theUnits); + virtual std::vector GetRowUnits(); + + virtual int GetNbRows(); + virtual int GetNbColumns(); + virtual void AddRow(const std::vector& theData); + virtual void SetRow(int theRow, const std::vector& theData); + virtual std::vector GetRow(int theRow); + virtual void AddColumn(const std::vector& theData); + virtual void SetColumn(int theColumn, const std::vector& theData); + virtual std::vector GetColumn(int theColumn); + virtual void PutValue(int theValue, int theRow, int theColumn); + virtual bool HasValue(int theRow, int theColumn); + virtual int GetValue(int theRow, int theColumn); + + virtual std::vector GetRowSetIndices(int theRow); + virtual void SetNbColumns(int theNbColumns); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger_i.cxx index 380741f49..0c97e6246 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger_i.cxx @@ -1,20 +1,14 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributeTableOfInteger_i.cxx -// Author : Michael Ponikarov +// Author : Sergey RUIN // Module : SALOME -// $Header$ + + +#include "SALOMEDS_AttributeTableOfInteger_i.hxx" +#include "SALOMEDS.hxx" #include -#include #include #include - -#include "SALOMEDS_AttributeTableOfInteger_i.hxx" #include "Utils_ExceptHandlers.hxx" #include @@ -23,38 +17,21 @@ using namespace std; -#define SEPARATOR '\1' - UNEXPECT_CATCH(ATI_IncorrectIndex, SALOMEDS::AttributeTableOfInteger::IncorrectIndex); UNEXPECT_CATCH(ATI_IncorrectArgumentLength, SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength); -static TCollection_ExtendedString getUnit(TCollection_ExtendedString theString) +void SALOMEDS_AttributeTableOfInteger_i::SetTitle(const char* theTitle) { - TCollection_ExtendedString aString(theString); - int aPos = aString.Search(SEPARATOR); - if(aPos <= 0 || aPos == aString.Length() ) return TCollection_ExtendedString(); - return aString.Split(aPos); -} - -static TCollection_ExtendedString getTitle(TCollection_ExtendedString theString) -{ - TCollection_ExtendedString aString(theString); - int aPos = aString.Search(SEPARATOR); - if(aPos < 1) return aString; - if(aPos == 1) return TCollection_ExtendedString(); - aString.Split(aPos-1); - return aString; -} - -void SALOMEDS_AttributeTableOfInteger_i::SetTitle(const char* theTitle) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); CORBA::String_var aStr = CORBA::string_dup(theTitle); - aTable->SetTitle(TCollection_ExtendedString(aStr)); + Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl)->SetTitle(TCollection_ExtendedString(aStr)); } -char* SALOMEDS_AttributeTableOfInteger_i::GetTitle() { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); +char* SALOMEDS_AttributeTableOfInteger_i::GetTitle() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(aTable->GetTitle()).ToCString()); return c_s._retn(); } @@ -62,48 +39,45 @@ char* SALOMEDS_AttributeTableOfInteger_i::GetTitle() { void SALOMEDS_AttributeTableOfInteger_i::SetRowTitle(CORBA::Long theIndex, const char* theTitle) throw (SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch (ATI_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); - CORBA::String_var aStr = CORBA::string_dup(theTitle); - TCollection_ExtendedString aTitle(aStr); - TCollection_ExtendedString aUnit = getUnit(aTable->GetRowTitle(theIndex)); - if(aUnit.Length() > 0) { - aTitle += SEPARATOR; - aTitle += aUnit; - } - - aTable->SetRowTitle(theIndex, aTitle); + aTable->SetRowTitle(theIndex, TCollection_ExtendedString((char*)theTitle)); } void SALOMEDS_AttributeTableOfInteger_i::SetRowTitles(const SALOMEDS::StringSeq& theTitles) throw (SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch (ATI_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theTitles.length() != aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength(); for (int i = 0; i < theTitles.length(); i++) { SetRowTitle(i + 1, theTitles[i]); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfInteger_i::GetRowTitles() { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfInteger_i::GetRowTitles() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); SALOMEDS::StringSeq_var aTitles = new SALOMEDS::StringSeq; aTitles->length(aTable->GetNbRows()); for(int i = 0; i < aTitles->length(); i++) - aTitles[i] = CORBA::string_dup(TCollection_AsciiString(getTitle(aTable->GetRowTitle(i + 1))).ToCString()); + aTitles[i] = CORBA::string_dup(TCollection_AsciiString(aTable->GetRowTitle(i + 1)).ToCString()); return aTitles._retn(); } void SALOMEDS_AttributeTableOfInteger_i::SetColumnTitle(CORBA::Long theIndex, const char* theTitle) throw (SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch (ATI_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); CORBA::String_var aStr = CORBA::string_dup(theTitle); aTable->SetColumnTitle(theIndex, TCollection_ExtendedString(aStr)); @@ -112,17 +86,20 @@ void SALOMEDS_AttributeTableOfInteger_i::SetColumnTitle(CORBA::Long theIndex, co void SALOMEDS_AttributeTableOfInteger_i::SetColumnTitles(const SALOMEDS::StringSeq& theTitles) throw (SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theTitles.length() != aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength(); for (int i = 0; i < theTitles.length(); i++) { - SetColumnTitle(i + 1, theTitles[i]); + aTable->SetColumnTitle(i + 1, (char*)theTitles[i].in()); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfInteger_i::GetColumnTitles() { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfInteger_i::GetColumnTitles() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); SALOMEDS::StringSeq_var aTitles = new SALOMEDS::StringSeq; aTitles->length(aTable->GetNbColumns()); for(int i = 0; i < aTitles->length(); i++) @@ -134,52 +111,57 @@ SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfInteger_i::GetColumnTitles() { void SALOMEDS_AttributeTableOfInteger_i::SetRowUnit(CORBA::Long theIndex, const char* theUnit) throw (SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { - Unexpect aCatch (ATI_IncorrectIndex); + SALOMEDS::Locker lock; + Unexpect aCatch (ATI_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); - CORBA::String_var aStr = CORBA::string_dup(theUnit); - TCollection_ExtendedString aTitle = getTitle(aTable->GetRowTitle(theIndex)); - TCollection_ExtendedString aUnit(aStr); - aTitle += SEPARATOR; - aTitle += aUnit; - aTable->SetRowTitle(theIndex, aTitle); + aTable->SetRowUnit(theIndex, TCollection_ExtendedString((char*)theUnit)); } void SALOMEDS_AttributeTableOfInteger_i::SetRowUnits(const SALOMEDS::StringSeq& theUnits) throw (SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch (ATI_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theUnits.length() != aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength(); for (int i = 0; i < theUnits.length(); i++) { - SetRowUnit(i + 1, theUnits[i]); + aTable->SetRowUnit(i + 1, (char*)theUnits[i].in()); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfInteger_i::GetRowUnits() { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfInteger_i::GetRowUnits() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); SALOMEDS::StringSeq_var aUnits = new SALOMEDS::StringSeq; aUnits->length(aTable->GetNbRows()); for(int i = 0; i < aUnits->length(); i++) - aUnits[i] = CORBA::string_dup(TCollection_AsciiString(getUnit(aTable->GetRowTitle(i + 1))).ToCString()); + aUnits[i] = CORBA::string_dup(TCollection_AsciiString(aTable->GetRowUnit(i + 1)).ToCString()); return aUnits._retn(); } -CORBA::Long SALOMEDS_AttributeTableOfInteger_i::GetNbRows() { - return Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr)->GetNbRows(); +CORBA::Long SALOMEDS_AttributeTableOfInteger_i::GetNbRows() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl)->GetNbRows(); } -CORBA::Long SALOMEDS_AttributeTableOfInteger_i::GetNbColumns() { - return Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr)->GetNbColumns(); + +CORBA::Long SALOMEDS_AttributeTableOfInteger_i::GetNbColumns() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl)->GetNbColumns(); } void SALOMEDS_AttributeTableOfInteger_i::AddRow(const SALOMEDS::LongSeq& theData) throw (SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); Handle(TColStd_HSequenceOfInteger) aRow = new TColStd_HSequenceOfInteger; for (int i = 0; i < theData.length(); i++) aRow->Append(theData[i]); @@ -194,9 +176,10 @@ void SALOMEDS_AttributeTableOfInteger_i::AddRow(const SALOMEDS::LongSeq& theData void SALOMEDS_AttributeTableOfInteger_i::SetRow(CORBA::Long theRow, const SALOMEDS::LongSeq& theData) throw (SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength, SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); Handle(TColStd_HSequenceOfInteger) aRow = new TColStd_HSequenceOfInteger; for (int i = 0; i < theData.length(); i++) aRow->Append(theData[i]); @@ -211,8 +194,9 @@ void SALOMEDS_AttributeTableOfInteger_i::SetRow(CORBA::Long theRow, const SALOME SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfInteger_i::GetRow(CORBA::Long theRow) throw (SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectIndex); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theRow <= 0 || theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); SALOMEDS::LongSeq_var CorbaSeq = new SALOMEDS::LongSeq; @@ -227,9 +211,10 @@ SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfInteger_i::GetRow(CORBA::Long theRow void SALOMEDS_AttributeTableOfInteger_i::AddColumn(const SALOMEDS::LongSeq& theData) throw (SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); Handle(TColStd_HSequenceOfInteger) aColumn = new TColStd_HSequenceOfInteger; for (int i = 0; i < theData.length(); i++) aColumn->Append(theData[i]); @@ -244,9 +229,10 @@ void SALOMEDS_AttributeTableOfInteger_i::AddColumn(const SALOMEDS::LongSeq& theD void SALOMEDS_AttributeTableOfInteger_i::SetColumn(CORBA::Long theColumn, const SALOMEDS::LongSeq& theData) throw (SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength, SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); Handle(TColStd_HSequenceOfInteger) aColumn = new TColStd_HSequenceOfInteger; for (int i = 0; i < theData.length(); i++) aColumn->Append(theData[i]); @@ -261,8 +247,9 @@ void SALOMEDS_AttributeTableOfInteger_i::SetColumn(CORBA::Long theColumn, const SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfInteger_i::GetColumn(CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectIndex); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theColumn <= 0 || theColumn > aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); SALOMEDS::LongSeq_var CorbaSeq = new SALOMEDS::LongSeq; @@ -277,9 +264,10 @@ SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfInteger_i::GetColumn(CORBA::Long the void SALOMEDS_AttributeTableOfInteger_i::PutValue(CORBA::Long theValue, CORBA::Long theRow, CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); try { aTable->PutValue(theValue, theRow, theColumn); @@ -289,15 +277,18 @@ void SALOMEDS_AttributeTableOfInteger_i::PutValue(CORBA::Long theValue, CORBA::L } } -CORBA::Boolean SALOMEDS_AttributeTableOfInteger_i::HasValue(CORBA::Long theRow, CORBA::Long theColumn) { - return Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr)->HasValue(theRow, theColumn); +CORBA::Boolean SALOMEDS_AttributeTableOfInteger_i::HasValue(CORBA::Long theRow, CORBA::Long theColumn) +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl)->HasValue(theRow, theColumn); } CORBA::Long SALOMEDS_AttributeTableOfInteger_i::GetValue(CORBA::Long theRow, CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfInteger::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATI_IncorrectIndex); - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if (theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); CORBA::Long aValue; @@ -312,7 +303,8 @@ CORBA::Long SALOMEDS_AttributeTableOfInteger_i::GetValue(CORBA::Long theRow, COR SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfInteger_i::GetRowSetIndices(CORBA::Long theRow) { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); if(theRow <= 0 || theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfInteger::IncorrectIndex(); @@ -328,13 +320,15 @@ SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfInteger_i::GetRowSetIndices(CORBA::L void SALOMEDS_AttributeTableOfInteger_i::SetNbColumns(CORBA::Long theNbColumns) { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); aTable->SetNbColumns(theNbColumns); } bool SALOMEDS_AttributeTableOfInteger_i::ReadFromFile(const SALOMEDS::TMPFile& theStream) { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); istrstream aStream((char*)&theStream[0], theStream.length()); return aTable->RestoreFromString(aStream); @@ -342,7 +336,8 @@ bool SALOMEDS_AttributeTableOfInteger_i::ReadFromFile(const SALOMEDS::TMPFile& t SALOMEDS::TMPFile* SALOMEDS_AttributeTableOfInteger_i::SaveToFile() { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(_impl); ostrstream ostr; string aString; @@ -360,20 +355,4 @@ SALOMEDS::TMPFile* SALOMEDS_AttributeTableOfInteger_i::SaveToFile() return aStreamFile._retn(); } -char* SALOMEDS_AttributeTableOfInteger_i::Store() { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); - ostrstream ostr; - aTable->ConvertToString(ostr); - string aString = ostr.rdbuf()->str(); - - CORBA::String_var aBuffer = CORBA::string_dup(aString.c_str()); - return aBuffer._retn(); -} - -void SALOMEDS_AttributeTableOfInteger_i::Restore(const char* value) { - Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(_myAttr); - - istrstream aStream(value, strlen(value)); - aTable->RestoreFromString(aStream); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger_i.hxx index 03f996572..a2999eb26 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfInteger_i.hxx @@ -1,32 +1,28 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributeTableOfInteger_i.hxx -// Author : Michael Ponikarov +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeTableOfInteger_i_HeaderFile #define SALOMEDS_AttributeTableOfInteger_i_HeaderFile -#include "SALOMEDS_TableOfIntegerAttribute.hxx" -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeTableOfInteger,SALOMEDS_TableOfIntegerAttribute,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeTableOfInteger.hxx" -class SALOMEDS_AttributeTableOfInteger_i: - public virtual POA_SALOMEDS::AttributeTableOfInteger, - public virtual SALOMEDS_TAttributeTableOfInteger_i +class SALOMEDS_AttributeTableOfInteger_i: public virtual POA_SALOMEDS::AttributeTableOfInteger, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeTableOfInteger,SALOMEDS_TableOfIntegerAttribute); + public: + + SALOMEDS_AttributeTableOfInteger_i(const Handle(SALOMEDSImpl_AttributeTableOfInteger)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeTableOfInteger_i() {}; + virtual void SetTitle(const char* theTitle); virtual char* GetTitle(); virtual void SetRowTitle(CORBA::Long theIndex, const char* theTitle) @@ -71,10 +67,6 @@ public: virtual bool ReadFromFile(const SALOMEDS::TMPFile& theStream); virtual SALOMEDS::TMPFile* SaveToFile(); - - virtual char* Store(); - virtual void Restore(const char*); - }; #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfReal.cxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfReal.cxx new file mode 100644 index 000000000..89c5935fa --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfReal.cxx @@ -0,0 +1,383 @@ +// File : SALOMEDS_AttributeTableOfReal.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeTableOfReal.hxx" + +#include +#include +#include +#include +#include + + +SALOMEDS_AttributeTableOfReal +::SALOMEDS_AttributeTableOfReal(const Handle(SALOMEDSImpl_AttributeTableOfReal)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTableOfReal::SALOMEDS_AttributeTableOfReal(SALOMEDS::AttributeTableOfReal_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTableOfReal::~SALOMEDS_AttributeTableOfReal() +{} + + +void SALOMEDS_AttributeTableOfReal::SetTitle(const std::string& theTitle) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->SetTitle((char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetTitle(theTitle.c_str()); +} + +std::string SALOMEDS_AttributeTableOfReal::GetTitle() +{ + std::string aStr; + if(_isLocal) + aStr = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetTitle()).ToCString(); + else aStr = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetTitle(); + return aStr; +} + +void SALOMEDS_AttributeTableOfReal::SetRowTitle(int theIndex, const std::string& theTitle) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->SetRowTitle(theIndex, + (char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetRowTitle(theIndex, theTitle.c_str()); +} + +void SALOMEDS_AttributeTableOfReal::SetRowTitles(const std::vector& theTitles) +{ + CheckLocked(); + int aLength = theTitles.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theTitles[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->SetRowTitles(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theTitles[i].c_str(); + SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetRowTitles(aSeq); + } + +} + +std::vector SALOMEDS_AttributeTableOfReal::GetRowTitles() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetRowTitles(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aSeq->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetRowTitles(); + aLength = aSeq->length(); + for(i = 0; iSetColumnTitle(theIndex, + (char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetColumnTitle(theIndex, theTitle.c_str()); +} + +void SALOMEDS_AttributeTableOfReal::SetColumnTitles(const std::vector& theTitles) +{ + CheckLocked(); + int aLength = theTitles.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theTitles[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->SetColumnTitles(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theTitles[i].c_str(); + SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetColumnTitles(aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfReal::GetColumnTitles() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetColumnTitles(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aSeq->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetColumnTitles(); + aLength = aSeq->length(); + for(i = 0; iSetRowUnit(theIndex, + (char*)theUnit.c_str()); + else SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetRowUnit(theIndex, theUnit.c_str()); +} + +void SALOMEDS_AttributeTableOfReal::SetRowUnits(const std::vector& theUnits) +{ + CheckLocked(); + int aLength = theUnits.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theUnits[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->SetRowUnits(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theUnits[i].c_str(); + SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetRowUnits(aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfReal::GetRowUnits() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetRowUnits(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aSeq->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetRowUnits(); + aLength = aSeq->length(); + for(i = 0; iGetNbRows(); + else aNb = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetNbRows(); + return aNb; +} + +int SALOMEDS_AttributeTableOfReal::GetNbColumns() +{ + int aNb; + if(_isLocal) aNb = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetNbColumns(); + else aNb = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetNbColumns(); + return aNb; + +} + +void SALOMEDS_AttributeTableOfReal::AddRow(const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfReal) aRow = new TColStd_HSequenceOfReal; + for (int i = 0; i < aLength; i++) aRow->Append(theData[i]); + try { + aTable->SetRowData(aTable->GetNbRows() + 1, aRow); + } + catch(...) { + throw SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::DoubleSeq_var aSeq = new SALOMEDS::DoubleSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = theData[i]; + SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->AddRow(aSeq); + } +} + +void SALOMEDS_AttributeTableOfReal::SetRow(int theRow, const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfReal) aRow = new TColStd_HSequenceOfReal; + for (int i = 0; i < aLength; i++) aRow->Append(theData[i]); + try { + aTable->SetRowData(theRow, aRow); + } + catch(...) { + throw SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::DoubleSeq_var aSeq = new SALOMEDS::DoubleSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = theData[i]; + SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetRow(theRow, aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfReal::GetRow(int theRow) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfReal) aRow; + aRow = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetRowData(theRow); + aLength = aRow->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(aRow->Value(i)); + } + else { + SALOMEDS::DoubleSeq_var aRow = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetRow(theRow); + for(i = 0; i < aLength; i++) aVector.push_back(aRow[i]); + } + + return aVector; +} + +void SALOMEDS_AttributeTableOfReal::AddColumn(const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfReal) aColumn = new TColStd_HSequenceOfReal; + for (int i = 0; i < aLength; i++) aColumn->Append(theData[i]); + try { + aTable->SetColumnData(aTable->GetNbColumns() + 1, aColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::DoubleSeq_var aColumn = new SALOMEDS::DoubleSeq(); + aColumn->length(aLength); + for(i = 0; i < aLength; i++) aColumn[i] = theData[i]; + SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->AddColumn(aColumn); + } +} + +void SALOMEDS_AttributeTableOfReal::SetColumn(int theColumn, const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfReal) aColumn = new TColStd_HSequenceOfReal; + for (int i = 0; i < aLength; i++) aColumn->Append(theData[i]); + try { + aTable->SetRowData(theColumn, aColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::DoubleSeq_var aColumn = new SALOMEDS::DoubleSeq(); + aColumn->length(aLength); + for(i = 0; i < aLength; i++) aColumn[i] = theData[i]; + SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetRow(theColumn, aColumn); + } +} + +std::vector SALOMEDS_AttributeTableOfReal::GetColumn(int theColumn) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfReal) aColumn; + aColumn = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetColumnData(theColumn); + aLength = aColumn->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(aColumn->Value(i)); + } + else { + SALOMEDS::DoubleSeq_var aColumn = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetColumn(theColumn); + for(i = 0; i < aLength; i++) aVector.push_back(aColumn[i]); + } + return aVector; +} + +void SALOMEDS_AttributeTableOfReal::PutValue(double theValue, int theRow, int theColumn) +{ + CheckLocked(); + if(_isLocal) { + try { + Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->PutValue(theValue, theRow, theColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); + } + } + else { + SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->PutValue(theValue, theRow, theColumn); + } +} + +bool SALOMEDS_AttributeTableOfReal::HasValue(int theRow, int theColumn) +{ + bool ret; + if(_isLocal) ret = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->HasValue(theRow, theColumn); + else ret = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->HasValue(theRow, theColumn); + return ret; +} + +double SALOMEDS_AttributeTableOfReal::GetValue(int theRow, int theColumn) +{ + double aValue; + if(_isLocal) { + try { + aValue = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetValue(theRow, theColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); + } + } + else { + aValue = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetValue(theRow, theColumn); + } + return aValue; +} + +std::vector SALOMEDS_AttributeTableOfReal::GetRowSetIndices(int theRow) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfInteger) aSet; + aSet = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->GetSetRowIndices(theRow); + aLength = aSet->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(aSet->Value(i)); + } + else { + SALOMEDS::LongSeq_var aSet = SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->GetRowSetIndices(theRow); + for(i = 0; i < aLength; i++) aVector.push_back(aSet[i]); + } + return aVector; +} + +void SALOMEDS_AttributeTableOfReal::SetNbColumns(int theNbColumns) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_local_impl)->SetNbColumns(theNbColumns); + else SALOMEDS::AttributeTableOfReal::_narrow(_corba_impl)->SetNbColumns(theNbColumns); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfReal.hxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfReal.hxx new file mode 100644 index 000000000..755058cab --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfReal.hxx @@ -0,0 +1,56 @@ +// File : SALOMEDS_AttributeTableOfReal.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeTableOfReal_HeaderFile +#define SALOMEDS_AttributeTableOfReal_HeaderFile + +#include "SALOMEDSClient_AttributeTableOfReal.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeTableOfReal.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#include + +class SALOMEDS_AttributeTableOfReal: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeTableOfReal +{ +public: + SALOMEDS_AttributeTableOfReal(const Handle(SALOMEDSImpl_AttributeTableOfReal)& theAttr); + SALOMEDS_AttributeTableOfReal(SALOMEDS::AttributeTableOfReal_ptr theAttr); + ~SALOMEDS_AttributeTableOfReal(); + + virtual void SetTitle(const std::string& theTitle); + virtual std::string GetTitle(); + virtual void SetRowTitle(int theIndex, const std::string& theTitle); + virtual void SetRowTitles(const std::vector& theTitles); + virtual std::vector GetRowTitles(); + virtual void SetColumnTitle(int theIndex, const std::string& theTitle); + virtual void SetColumnTitles(const std::vector& theTitles); + virtual std::vector GetColumnTitles(); + + virtual void SetRowUnit(int theIndex, const std::string& theUnit); + virtual void SetRowUnits(const std::vector& theUnits); + virtual std::vector GetRowUnits(); + + virtual int GetNbRows(); + virtual int GetNbColumns(); + virtual void AddRow(const std::vector& theData); + virtual void SetRow(int theRow, const std::vector& theData); + virtual std::vector GetRow(int theRow); + virtual void AddColumn(const std::vector& theData); + virtual void SetColumn(int theColumn, const std::vector& theData); + virtual std::vector GetColumn(int theColumn); + virtual void PutValue(double theValue, int theRow, int theColumn); + virtual bool HasValue(int theRow, int theColumn); + virtual double GetValue(int theRow, int theColumn); + + virtual std::vector GetRowSetIndices(int theRow); + virtual void SetNbColumns(int theNbColumns); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfReal_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfReal_i.cxx index c550cf38b..6c638ced6 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTableOfReal_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfReal_i.cxx @@ -1,59 +1,37 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributeTableOfReal_i.cxx -// Author : Michael Ponikarov +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeTableOfReal_i.hxx" +#include "SALOMEDS.hxx" #include -#include #include #include #include #include +using namespace std; + #include "Utils_ExceptHandlers.hxx" UNEXPECT_CATCH(ATR_IncorrectIndex, SALOMEDS::AttributeTableOfReal::IncorrectIndex); UNEXPECT_CATCH(ATR_IncorrectArgumentLength, SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength); -#define SEPARATOR '\1' - -using namespace std; - -static TCollection_ExtendedString getUnit(TCollection_ExtendedString theString) -{ - TCollection_ExtendedString aString(theString); - int aPos = aString.Search(SEPARATOR); - if(aPos <= 0 || aPos == aString.Length() ) return TCollection_ExtendedString(); - return aString.Split(aPos); -} - -static TCollection_ExtendedString getTitle(TCollection_ExtendedString theString) +void SALOMEDS_AttributeTableOfReal_i::SetTitle(const char* theTitle) { - TCollection_ExtendedString aString(theString); - int aPos = aString.Search(SEPARATOR); - if(aPos < 1) return aString; - if(aPos == 1) return TCollection_ExtendedString(); - aString.Split(aPos-1); - return aString; -} - -void SALOMEDS_AttributeTableOfReal_i::SetTitle(const char* theTitle) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); CORBA::String_var aStr = CORBA::string_dup(theTitle); aTable->SetTitle(TCollection_ExtendedString(aStr)); } -char* SALOMEDS_AttributeTableOfReal_i::GetTitle() { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); +char* SALOMEDS_AttributeTableOfReal_i::GetTitle() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(aTable->GetTitle()).ToCString()); return c_s._retn(); } @@ -61,48 +39,45 @@ char* SALOMEDS_AttributeTableOfReal_i::GetTitle() { void SALOMEDS_AttributeTableOfReal_i::SetRowTitle(CORBA::Long theIndex, const char* theTitle) throw (SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch (ATR_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); - CORBA::String_var aStr = CORBA::string_dup(theTitle); - TCollection_ExtendedString aTitle(aStr); - TCollection_ExtendedString aUnit = getUnit(aTable->GetRowTitle(theIndex)); - if(aUnit.Length() > 0) { - aTitle += SEPARATOR; - aTitle += aUnit; - } - - aTable->SetRowTitle(theIndex, aTitle); + aTable->SetRowTitle(theIndex, TCollection_ExtendedString((char*)theTitle)); } void SALOMEDS_AttributeTableOfReal_i::SetRowTitles(const SALOMEDS::StringSeq& theTitles) throw (SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch (ATR_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theTitles.length() != aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength(); for (int i = 0; i < theTitles.length(); i++) { - SetRowTitle(i + 1, theTitles[i]); + aTable->SetRowTitle(i + 1, (char*)theTitles[i].in()); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfReal_i::GetRowTitles() { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfReal_i::GetRowTitles() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); SALOMEDS::StringSeq_var aTitles = new SALOMEDS::StringSeq; aTitles->length(aTable->GetNbRows()); for(int i = 0; i < aTitles->length(); i++) - aTitles[i] = CORBA::string_dup(TCollection_AsciiString(getTitle(aTable->GetRowTitle(i + 1))).ToCString()); + aTitles[i] = CORBA::string_dup(TCollection_AsciiString(aTable->GetRowTitle(i + 1)).ToCString()); return aTitles._retn(); } void SALOMEDS_AttributeTableOfReal_i::SetColumnTitle(CORBA::Long theIndex, const char* theTitle) throw (SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch (ATR_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); CORBA::String_var aStr = CORBA::string_dup(theTitle); aTable->SetColumnTitle(theIndex, TCollection_ExtendedString(aStr)); @@ -111,17 +86,20 @@ void SALOMEDS_AttributeTableOfReal_i::SetColumnTitle(CORBA::Long theIndex, const void SALOMEDS_AttributeTableOfReal_i::SetColumnTitles(const SALOMEDS::StringSeq& theTitles) throw (SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theTitles.length() != aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength(); for (int i = 0; i < theTitles.length(); i++) { - SetColumnTitle(i + 1, theTitles[i]); + aTable->SetColumnTitle(i + 1, (char*)theTitles[i].in()); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfReal_i::GetColumnTitles() { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfReal_i::GetColumnTitles() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); SALOMEDS::StringSeq_var aTitles = new SALOMEDS::StringSeq; aTitles->length(aTable->GetNbColumns()); for(int i = 0; i < aTitles->length(); i++) @@ -133,53 +111,58 @@ SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfReal_i::GetColumnTitles() { void SALOMEDS_AttributeTableOfReal_i::SetRowUnit(CORBA::Long theIndex, const char* theUnit) throw (SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch (ATR_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); - CORBA::String_var aStr = CORBA::string_dup(theUnit); - TCollection_ExtendedString aTitle = getTitle(aTable->GetRowTitle(theIndex)); - TCollection_ExtendedString aUnit(aStr); - aTitle += SEPARATOR; - aTitle += aUnit; - aTable->SetRowTitle(theIndex, aTitle); + aTable->SetRowUnit(theIndex, TCollection_ExtendedString((char*)theUnit)); } void SALOMEDS_AttributeTableOfReal_i::SetRowUnits(const SALOMEDS::StringSeq& theUnits) throw (SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch (ATR_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theUnits.length() != aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength(); for (int i = 0; i < theUnits.length(); i++) { - SetRowUnit(i + 1, theUnits[i]); + aTable->SetRowUnit(i + 1, (char*)theUnits[i].in()); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfReal_i::GetRowUnits() { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfReal_i::GetRowUnits() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); SALOMEDS::StringSeq_var aUnits = new SALOMEDS::StringSeq; aUnits->length(aTable->GetNbRows()); for(int i = 0; i < aUnits->length(); i++) - aUnits[i] = CORBA::string_dup(TCollection_AsciiString(getUnit(aTable->GetRowTitle(i + 1))).ToCString()); + aUnits[i] = CORBA::string_dup(TCollection_AsciiString(aTable->GetRowUnit(i + 1)).ToCString()); return aUnits._retn(); } -CORBA::Long SALOMEDS_AttributeTableOfReal_i::GetNbRows() { - return Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr)->GetNbRows(); +CORBA::Long SALOMEDS_AttributeTableOfReal_i::GetNbRows() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl)->GetNbRows(); } -CORBA::Long SALOMEDS_AttributeTableOfReal_i::GetNbColumns() { - return Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr)->GetNbColumns(); + +CORBA::Long SALOMEDS_AttributeTableOfReal_i::GetNbColumns() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl)->GetNbColumns(); } void SALOMEDS_AttributeTableOfReal_i::AddRow(const SALOMEDS::DoubleSeq& theData) throw (SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); Handle(TColStd_HSequenceOfReal) aRow = new TColStd_HSequenceOfReal; for (int i = 0; i < theData.length(); i++) aRow->Append(theData[i]); @@ -189,9 +172,10 @@ void SALOMEDS_AttributeTableOfReal_i::AddRow(const SALOMEDS::DoubleSeq& theData) void SALOMEDS_AttributeTableOfReal_i::SetRow(CORBA::Long theRow, const SALOMEDS::DoubleSeq& theData) throw (SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength, SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); Handle(TColStd_HSequenceOfReal) aRow = new TColStd_HSequenceOfReal; for (int i = 0; i < theData.length(); i++) aRow->Append(theData[i]); @@ -201,8 +185,9 @@ void SALOMEDS_AttributeTableOfReal_i::SetRow(CORBA::Long theRow, const SALOMEDS: SALOMEDS::DoubleSeq* SALOMEDS_AttributeTableOfReal_i::GetRow(CORBA::Long theRow) throw (SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectIndex); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theRow <= 0 || theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); SALOMEDS::DoubleSeq_var CorbaSeq = new SALOMEDS::DoubleSeq; @@ -217,9 +202,10 @@ SALOMEDS::DoubleSeq* SALOMEDS_AttributeTableOfReal_i::GetRow(CORBA::Long theRow) void SALOMEDS_AttributeTableOfReal_i::AddColumn(const SALOMEDS::DoubleSeq& theData) throw (SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); Handle(TColStd_HSequenceOfReal) aColumn = new TColStd_HSequenceOfReal; for (int i = 0; i < theData.length(); i++) aColumn->Append(theData[i]); @@ -229,9 +215,10 @@ void SALOMEDS_AttributeTableOfReal_i::AddColumn(const SALOMEDS::DoubleSeq& theDa void SALOMEDS_AttributeTableOfReal_i::SetColumn(CORBA::Long theColumn, const SALOMEDS::DoubleSeq& theData) throw (SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength, SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); Handle(TColStd_HSequenceOfReal) aColumn = new TColStd_HSequenceOfReal; for (int i = 0; i < theData.length(); i++) aColumn->Append(theData[i]); @@ -241,8 +228,9 @@ void SALOMEDS_AttributeTableOfReal_i::SetColumn(CORBA::Long theColumn, const SAL SALOMEDS::DoubleSeq* SALOMEDS_AttributeTableOfReal_i::GetColumn(CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectIndex); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theColumn <= 0 || theColumn > aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); SALOMEDS::DoubleSeq_var CorbaSeq = new SALOMEDS::DoubleSeq; @@ -257,22 +245,26 @@ SALOMEDS::DoubleSeq* SALOMEDS_AttributeTableOfReal_i::GetColumn(CORBA::Long theC void SALOMEDS_AttributeTableOfReal_i::PutValue(CORBA::Double theValue, CORBA::Long theRow, CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); aTable->PutValue(theValue, theRow, theColumn); } -CORBA::Boolean SALOMEDS_AttributeTableOfReal_i::HasValue(CORBA::Long theRow, CORBA::Long theColumn) { - return Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr)->HasValue(theRow, theColumn); +CORBA::Boolean SALOMEDS_AttributeTableOfReal_i::HasValue(CORBA::Long theRow, CORBA::Long theColumn) +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl)->HasValue(theRow, theColumn); } CORBA::Double SALOMEDS_AttributeTableOfReal_i::GetValue(CORBA::Long theRow, CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfReal::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATR_IncorrectIndex); - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if (theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); CORBA::Double aValue; @@ -290,7 +282,8 @@ CORBA::Double SALOMEDS_AttributeTableOfReal_i::GetValue(CORBA::Long theRow, CORB SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfReal_i::GetRowSetIndices(CORBA::Long theRow) { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); if(theRow <= 0 || theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfReal::IncorrectIndex(); @@ -306,13 +299,15 @@ SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfReal_i::GetRowSetIndices(CORBA::Long void SALOMEDS_AttributeTableOfReal_i::SetNbColumns(CORBA::Long theNbColumns) { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); aTable->SetNbColumns(theNbColumns); } bool SALOMEDS_AttributeTableOfReal_i::ReadFromFile(const SALOMEDS::TMPFile& theStream) { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); istrstream aStream((char*)&theStream[0], theStream.length()); return aTable->RestoreFromString(aStream); @@ -320,7 +315,8 @@ bool SALOMEDS_AttributeTableOfReal_i::ReadFromFile(const SALOMEDS::TMPFile& theS SALOMEDS::TMPFile* SALOMEDS_AttributeTableOfReal_i::SaveToFile() { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(_impl); ostrstream ostr; string aString; @@ -337,21 +333,3 @@ SALOMEDS::TMPFile* SALOMEDS_AttributeTableOfReal_i::SaveToFile() return aStreamFile._retn(); } - -char* SALOMEDS_AttributeTableOfReal_i::Store() { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); - - ostrstream ostr; - aTable->ConvertToString(ostr); - string aString = ostr.rdbuf()->str(); - - CORBA::String_var aBuffer = CORBA::string_dup(aString.c_str()); - return aBuffer._retn(); -} - -void SALOMEDS_AttributeTableOfReal_i::Restore(const char* value) { - Handle(SALOMEDS_TableOfRealAttribute) aTable = Handle(SALOMEDS_TableOfRealAttribute)::DownCast(_myAttr); - - istrstream aStream(value, strlen(value)); - aTable->RestoreFromString(aStream); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfReal_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfReal_i.hxx index 9726ec82a..0165154b7 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTableOfReal_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfReal_i.hxx @@ -1,33 +1,28 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributeTableOfReal_i.hxx // Author : Michael Ponikarov // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeTableOfReal_i_HeaderFile #define SALOMEDS_AttributeTableOfReal_i_HeaderFile -#include "SALOMEDS_TableOfRealAttribute.hxx" -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeTableOfReal,SALOMEDS_TableOfRealAttribute,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeTableOfReal.hxx" -class SALOMEDS_AttributeTableOfReal_i: - public virtual POA_SALOMEDS::AttributeTableOfReal, - public virtual SALOMEDS_TAttributeTableOfReal_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeTableOfReal,SALOMEDS_TableOfRealAttribute); +class SALOMEDS_AttributeTableOfReal_i: public virtual POA_SALOMEDS::AttributeTableOfReal, + public virtual SALOMEDS_GenericAttribute_i { + public: - virtual void SetTitle(const char* theTitle); + + SALOMEDS_AttributeTableOfReal_i(const Handle(SALOMEDSImpl_AttributeTableOfReal)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeTableOfReal_i() {}; + + virtual void SetTitle(const char* theTitle); virtual char* GetTitle(); virtual void SetRowTitle(CORBA::Long theIndex, const char* theTitle) throw (SALOMEDS::AttributeTableOfReal::IncorrectIndex); @@ -72,9 +67,6 @@ public: virtual bool ReadFromFile(const SALOMEDS::TMPFile& theStream); virtual SALOMEDS::TMPFile* SaveToFile(); - virtual char* Store(); - virtual void Restore(const char*); - }; #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfString.cxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfString.cxx new file mode 100644 index 000000000..dff594c8d --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfString.cxx @@ -0,0 +1,387 @@ +// File : SALOMEDS_AttributeTableOfString.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeTableOfString.hxx" + +#include +#include +#include +#include +#include +#include + +SALOMEDS_AttributeTableOfString +::SALOMEDS_AttributeTableOfString(const Handle(SALOMEDSImpl_AttributeTableOfString)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTableOfString::SALOMEDS_AttributeTableOfString(SALOMEDS::AttributeTableOfString_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTableOfString::~SALOMEDS_AttributeTableOfString() +{} + + +void SALOMEDS_AttributeTableOfString::SetTitle(const std::string& theTitle) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->SetTitle((char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetTitle(theTitle.c_str()); +} + +std::string SALOMEDS_AttributeTableOfString::GetTitle() +{ + std::string aStr; + if(_isLocal) + aStr = TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetTitle()).ToCString(); + else aStr = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetTitle(); + return aStr; +} + +void SALOMEDS_AttributeTableOfString::SetRowTitle(int theIndex, const std::string& theTitle) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->SetRowTitle(theIndex, + (char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetRowTitle(theIndex, theTitle.c_str()); +} + +void SALOMEDS_AttributeTableOfString::SetRowTitles(const std::vector& theTitles) +{ + CheckLocked(); + int aLength = theTitles.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theTitles[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->SetRowTitles(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theTitles[i].c_str(); + SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetRowTitles(aSeq); + } + +} + +std::vector SALOMEDS_AttributeTableOfString::GetRowTitles() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetRowTitles(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aSeq->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetRowTitles(); + aLength = aSeq->length(); + for(i = 0; iSetColumnTitle(theIndex, + (char*)theTitle.c_str()); + else SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetColumnTitle(theIndex, theTitle.c_str()); +} + +void SALOMEDS_AttributeTableOfString::SetColumnTitles(const std::vector& theTitles) +{ + CheckLocked(); + int aLength = theTitles.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theTitles[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->SetColumnTitles(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theTitles[i].c_str(); + SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetColumnTitles(aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfString::GetColumnTitles() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetColumnTitles(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aSeq->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetColumnTitles(); + aLength = aSeq->length(); + for(i = 0; iSetRowUnit(theIndex, + (char*)theUnit.c_str()); + else SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetRowUnit(theIndex, theUnit.c_str()); +} + +void SALOMEDS_AttributeTableOfString::SetRowUnits(const std::vector& theUnits) +{ + CheckLocked(); + int aLength = theUnits.size(), i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + for(i = 0; i < aLength; i++) aSeq->Append((char*)theUnits[i].c_str()); + Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->SetRowUnits(aSeq); + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theUnits[i].c_str(); + SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetRowUnits(aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfString::GetRowUnits() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetRowUnits(); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aSeq->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aSeq = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetRowUnits(); + aLength = aSeq->length(); + for(i = 0; iGetNbRows(); + else aNb = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetNbRows(); + return aNb; +} + +int SALOMEDS_AttributeTableOfString::GetNbColumns() +{ + int aNb; + if(_isLocal) aNb = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetNbColumns(); + else aNb = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetNbColumns(); + return aNb; + +} + +void SALOMEDS_AttributeTableOfString::AddRow(const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfString) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfExtendedString) aRow = new TColStd_HSequenceOfExtendedString; + for (int i = 0; i < aLength; i++) aRow->Append((char*)theData[i].c_str()); + try { + aTable->SetRowData(aTable->GetNbRows() + 1, aRow); + } + catch(...) { + throw SALOMEDS::AttributeTableOfString::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theData[i].c_str(); + SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->AddRow(aSeq); + } +} + +void SALOMEDS_AttributeTableOfString::SetRow(int theRow, const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfString) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfExtendedString) aRow = new TColStd_HSequenceOfExtendedString; + for (int i = 0; i < aLength; i++) aRow->Append((char*)theData[i].c_str()); + try { + aTable->SetRowData(theRow, aRow); + } + catch(...) { + throw SALOMEDS::AttributeTableOfString::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::StringSeq_var aSeq = new SALOMEDS::StringSeq(); + aSeq->length(aLength); + for(i = 0; i < aLength; i++) aSeq[i] = (char*)theData[i].c_str(); + SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetRow(theRow, aSeq); + } +} + +std::vector SALOMEDS_AttributeTableOfString::GetRow(int theRow) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aRow; + aRow = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetRowData(theRow); + aLength = aRow->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aRow->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aRow = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetRow(theRow); + for(i = 0; i < aLength; i++) aVector.push_back((char*)aRow[i].in()); + } + + return aVector; +} + +void SALOMEDS_AttributeTableOfString::AddColumn(const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfString) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfExtendedString) aColumn = new TColStd_HSequenceOfExtendedString; + for (int i = 0; i < aLength; i++) aColumn->Append((char*)theData[i].c_str()); + try { + aTable->SetColumnData(aTable->GetNbColumns() + 1, aColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfString::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::StringSeq_var aColumn = new SALOMEDS::StringSeq(); + aColumn->length(aLength); + for(i = 0; i < aLength; i++) aColumn[i] = (char*)theData[i].c_str(); + SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->AddColumn(aColumn); + } +} + +void SALOMEDS_AttributeTableOfString::SetColumn(int theColumn, const std::vector& theData) +{ + CheckLocked(); + int aLength = theData.size(), i; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTableOfString) aTable; + aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl); + Handle(TColStd_HSequenceOfExtendedString) aColumn = new TColStd_HSequenceOfExtendedString; + for (int i = 0; i < aLength; i++) aColumn->Append((char*)theData[i].c_str()); + try { + aTable->SetRowData(theColumn, aColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfString::IncorrectArgumentLength(); + } + } + else { + SALOMEDS::StringSeq_var aColumn = new SALOMEDS::StringSeq(); + aColumn->length(aLength); + for(i = 0; i < aLength; i++) aColumn[i] = (char*)theData[i].c_str(); + SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetRow(theColumn, aColumn); + } +} + +std::vector SALOMEDS_AttributeTableOfString::GetColumn(int theColumn) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfExtendedString) aColumn; + aColumn = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetColumnData(theColumn); + aLength = aColumn->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(TCollection_AsciiString(aColumn->Value(i)).ToCString()); + } + else { + SALOMEDS::StringSeq_var aColumn = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetColumn(theColumn); + for(i = 0; i < aLength; i++) aVector.push_back(aColumn[i].in()); + } + return aVector; +} + +void SALOMEDS_AttributeTableOfString::PutValue(const std::string& theValue, int theRow, int theColumn) +{ + CheckLocked(); + if(_isLocal) { + try { + Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->PutValue((char*)theValue.c_str(), + theRow, + theColumn); + } + catch(...) { + throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); + } + } + else { + SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->PutValue(theValue.c_str(), theRow, theColumn); + } +} + +bool SALOMEDS_AttributeTableOfString::HasValue(int theRow, int theColumn) +{ + bool ret; + if(_isLocal) ret = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->HasValue(theRow, theColumn); + else ret = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->HasValue(theRow, theColumn); + return ret; +} + +std::string SALOMEDS_AttributeTableOfString::GetValue(int theRow, int theColumn) +{ + std::string aValue; + if(_isLocal) { + try { + aValue = + TCollection_AsciiString(Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetValue(theRow, + theColumn)).ToCString(); + } + catch(...) { + throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); + } + } + else { + aValue = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetValue(theRow, theColumn); + } + return aValue; +} + +std::vector SALOMEDS_AttributeTableOfString::GetRowSetIndices(int theRow) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfInteger) aSet; + aSet = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->GetSetRowIndices(theRow); + aLength = aSet->Length(); + for(i = 1; i<= aLength; i++) aVector.push_back(aSet->Value(i)); + } + else { + SALOMEDS::LongSeq_var aSet = SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->GetRowSetIndices(theRow); + for(i = 0; i < aLength; i++) aVector.push_back(aSet[i]); + } + return aVector; +} + +void SALOMEDS_AttributeTableOfString::SetNbColumns(int theNbColumns) +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_local_impl)->SetNbColumns(theNbColumns); + else SALOMEDS::AttributeTableOfString::_narrow(_corba_impl)->SetNbColumns(theNbColumns); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfString.hxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfString.hxx new file mode 100644 index 000000000..cfffe3e27 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfString.hxx @@ -0,0 +1,56 @@ +// File : SALOMEDS_AttributeTableOfString.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeTableOfString_HeaderFile +#define SALOMEDS_AttributeTableOfString_HeaderFile + +#include "SALOMEDSClient_AttributeTableOfString.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeTableOfString.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#include + +class SALOMEDS_AttributeTableOfString: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeTableOfString +{ +public: + SALOMEDS_AttributeTableOfString(const Handle(SALOMEDSImpl_AttributeTableOfString)& theAttr); + SALOMEDS_AttributeTableOfString(SALOMEDS::AttributeTableOfString_ptr theAttr); + ~SALOMEDS_AttributeTableOfString(); + + virtual void SetTitle(const std::string& theTitle); + virtual std::string GetTitle(); + virtual void SetRowTitle(int theIndex, const std::string& theTitle); + virtual void SetRowTitles(const std::vector& theTitles); + virtual std::vector GetRowTitles(); + virtual void SetColumnTitle(int theIndex, const std::string& theTitle); + virtual void SetColumnTitles(const std::vector& theTitles); + virtual std::vector GetColumnTitles(); + + virtual void SetRowUnit(int theIndex, const std::string& theUnit); + virtual void SetRowUnits(const std::vector& theUnits); + virtual std::vector GetRowUnits(); + + virtual int GetNbRows(); + virtual int GetNbColumns(); + virtual void AddRow(const std::vector& theData); + virtual void SetRow(int theRow, const std::vector& theData); + virtual std::vector GetRow(int theRow); + virtual void AddColumn(const std::vector& theData); + virtual void SetColumn(int theColumn, const std::vector& theData); + virtual std::vector GetColumn(int theColumn); + virtual void PutValue(const std::string& theValue, int theRow, int theColumn); + virtual bool HasValue(int theRow, int theColumn); + virtual std::string GetValue(int theRow, int theColumn); + + virtual std::vector GetRowSetIndices(int theRow); + virtual void SetNbColumns(int theNbColumns); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfString_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfString_i.cxx index 8527cf8db..d893b5888 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTableOfString_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfString_i.cxx @@ -1,60 +1,41 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributeTableOfString_i.cxx -// Author : Sergey Ruin +// Author : Sergey RUIN // Module : SALOME + #include #include -#include +#include "SALOMEDS_AttributeTableOfString_i.hxx" +#include "SALOMEDS.hxx" + +#include #include #include #include #include -#include "SALOMEDS_AttributeTableOfString_i.hxx" - #include "Utils_ExceptHandlers.hxx" -UNEXPECT_CATCH(ATS_IncorrectIndex, SALOMEDS::AttributeTableOfString::IncorrectIndex); -UNEXPECT_CATCH(ATS_IncorrectArgumentLength, SALOMEDS::AttributeTableOfString::IncorrectArgumentLength); - using namespace std; -#define SEPARATOR '\1' -static TCollection_ExtendedString getUnit(TCollection_ExtendedString theString) -{ - TCollection_ExtendedString aString(theString); - int aPos = aString.Search(SEPARATOR); - if(aPos <= 0 || aPos == aString.Length() ) return TCollection_ExtendedString(); - return aString.Split(aPos); -} +UNEXPECT_CATCH(ATS_IncorrectIndex, SALOMEDS::AttributeTableOfString::IncorrectIndex); +UNEXPECT_CATCH(ATS_IncorrectArgumentLength, SALOMEDS::AttributeTableOfString::IncorrectArgumentLength); -static TCollection_ExtendedString getTitle(TCollection_ExtendedString theString) +void SALOMEDS_AttributeTableOfString_i::SetTitle(const char* theTitle) { - TCollection_ExtendedString aString(theString); - int aPos = aString.Search(SEPARATOR); - if(aPos < 1) return aString; - if(aPos == 1) return TCollection_ExtendedString(); - aString.Split(aPos-1); - return aString; -} - -void SALOMEDS_AttributeTableOfString_i::SetTitle(const char* theTitle) { + SALOMEDS::Locker lock; CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); CORBA::String_var aStr = CORBA::string_dup(theTitle); aTable->SetTitle(TCollection_ExtendedString(aStr)); } -char* SALOMEDS_AttributeTableOfString_i::GetTitle() { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); +char* SALOMEDS_AttributeTableOfString_i::GetTitle() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); CORBA::String_var c_s = CORBA::string_dup(TCollection_AsciiString(aTable->GetTitle()).ToCString()); return c_s._retn(); } @@ -62,67 +43,67 @@ char* SALOMEDS_AttributeTableOfString_i::GetTitle() { void SALOMEDS_AttributeTableOfString_i::SetRowTitle(CORBA::Long theIndex, const char* theTitle) throw (SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); - CORBA::String_var aStr = CORBA::string_dup(theTitle); - TCollection_ExtendedString aTitle(aStr); - TCollection_ExtendedString aUnit = getUnit(aTable->GetRowTitle(theIndex)); - if(aUnit.Length() > 0) { - aTitle += SEPARATOR; - aTitle += aUnit; - } - aTable->SetRowTitle(theIndex, aTitle); + aTable->SetRowTitle(theIndex, TCollection_ExtendedString((char*)theTitle)); } void SALOMEDS_AttributeTableOfString_i::SetRowTitles(const SALOMEDS::StringSeq& theTitles) throw (SALOMEDS::AttributeTableOfString::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theTitles.length() != aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfString::IncorrectArgumentLength(); for (int i = 0; i < theTitles.length(); i++) { - SetRowTitle(i + 1, CORBA::string_dup(theTitles[i])); + aTable->SetRowTitle(i + 1, TCollection_ExtendedString((char*)theTitles[i].in())); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetRowTitles() { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetRowTitles() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); SALOMEDS::StringSeq_var aTitles = new SALOMEDS::StringSeq; aTitles->length(aTable->GetNbRows()); for(int i = 0; i < aTitles->length(); i++) - aTitles[i] = CORBA::string_dup(TCollection_AsciiString(getTitle(aTable->GetRowTitle(i + 1))).ToCString()); + aTitles[i] =CORBA::string_dup(TCollection_AsciiString(aTable->GetRowTitle(i + 1)).ToCString()); return aTitles._retn(); } void SALOMEDS_AttributeTableOfString_i::SetColumnTitle(CORBA::Long theIndex, const char* theTitle) throw (SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); - CORBA::String_var aStr = CORBA::string_dup(theTitle); - aTable->SetColumnTitle(theIndex, TCollection_ExtendedString(aStr)); + aTable->SetColumnTitle(theIndex, TCollection_ExtendedString((char*)theTitle)); } void SALOMEDS_AttributeTableOfString_i::SetColumnTitles(const SALOMEDS::StringSeq& theTitles) throw (SALOMEDS::AttributeTableOfString::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theTitles.length() != aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfString::IncorrectArgumentLength(); for (int i = 0; i < theTitles.length(); i++) { - SetColumnTitle(i + 1, CORBA::string_dup(theTitles[i])); + aTable->SetColumnTitle(i + 1, TCollection_ExtendedString((char*)theTitles[i].in())); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetColumnTitles() { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetColumnTitles() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); SALOMEDS::StringSeq_var aTitles = new SALOMEDS::StringSeq; aTitles->length(aTable->GetNbColumns()); for(int i = 0; i < aTitles->length(); i++) @@ -134,53 +115,58 @@ SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetColumnTitles() { void SALOMEDS_AttributeTableOfString_i::SetRowUnit(CORBA::Long theIndex, const char* theUnit) throw (SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theIndex <= 0 || theIndex > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); - CORBA::String_var aStr = CORBA::string_dup(theUnit); - TCollection_ExtendedString aTitle = getTitle(aTable->GetRowTitle(theIndex)); - TCollection_ExtendedString aUnit(aStr); - aTitle += SEPARATOR; - aTitle += aUnit; - aTable->SetRowTitle(theIndex, aTitle); + aTable->SetRowUnit(theIndex, TCollection_ExtendedString((char*)theUnit)); } void SALOMEDS_AttributeTableOfString_i::SetRowUnits(const SALOMEDS::StringSeq& theUnits) throw (SALOMEDS::AttributeTableOfString::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theUnits.length() != aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfString::IncorrectArgumentLength(); for (int i = 0; i < theUnits.length(); i++) { - SetRowUnit(i + 1, CORBA::string_dup(theUnits[i])); + aTable->SetRowUnit(i + 1, TCollection_ExtendedString((char*)theUnits[i].in())); } } -SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetRowUnits() { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); +SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetRowUnits() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); SALOMEDS::StringSeq_var aUnits = new SALOMEDS::StringSeq; aUnits->length(aTable->GetNbRows()); for(int i = 0; i < aUnits->length(); i++) - aUnits[i] = CORBA::string_dup(TCollection_AsciiString(getUnit(aTable->GetRowTitle(i + 1))).ToCString()); + aUnits[i] = CORBA::string_dup(TCollection_AsciiString(aTable->GetRowUnit(i + 1)).ToCString()); return aUnits._retn(); } -CORBA::Long SALOMEDS_AttributeTableOfString_i::GetNbRows() { - return Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr)->GetNbRows(); +CORBA::Long SALOMEDS_AttributeTableOfString_i::GetNbRows() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl)->GetNbRows(); } -CORBA::Long SALOMEDS_AttributeTableOfString_i::GetNbColumns() { - return Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr)->GetNbColumns(); + +CORBA::Long SALOMEDS_AttributeTableOfString_i::GetNbColumns() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl)->GetNbColumns(); } void SALOMEDS_AttributeTableOfString_i::AddRow(const SALOMEDS::StringSeq& theData) throw (SALOMEDS::AttributeTableOfString::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); Handle(TColStd_HSequenceOfExtendedString) aRow = new TColStd_HSequenceOfExtendedString; for (int i = 0; i < theData.length(); i++) aRow->Append(TCollection_AsciiString(CORBA::string_dup(theData[i]))); @@ -190,9 +176,10 @@ void SALOMEDS_AttributeTableOfString_i::AddRow(const SALOMEDS::StringSeq& theDat void SALOMEDS_AttributeTableOfString_i::SetRow(CORBA::Long theRow, const SALOMEDS::StringSeq& theData) throw (SALOMEDS::AttributeTableOfString::IncorrectArgumentLength, SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); Handle(TColStd_HSequenceOfExtendedString) aRow = new TColStd_HSequenceOfExtendedString; for (int i = 0; i < theData.length(); i++) aRow->Append(TCollection_AsciiString(CORBA::string_dup(theData[i]))); @@ -202,8 +189,9 @@ void SALOMEDS_AttributeTableOfString_i::SetRow(CORBA::Long theRow, const SALOMED SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetRow(CORBA::Long theRow) throw (SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectIndex); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theRow <= 0 || theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); SALOMEDS::StringSeq_var CorbaSeq = new SALOMEDS::StringSeq; @@ -218,9 +206,10 @@ SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetRow(CORBA::Long theRo void SALOMEDS_AttributeTableOfString_i::AddColumn(const SALOMEDS::StringSeq& theData) throw (SALOMEDS::AttributeTableOfString::IncorrectArgumentLength) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); Handle(TColStd_HSequenceOfExtendedString) aColumn = new TColStd_HSequenceOfExtendedString; for (int i = 0; i < theData.length(); i++) aColumn->Append(TCollection_AsciiString(CORBA::string_dup(theData[i]))); @@ -230,9 +219,10 @@ void SALOMEDS_AttributeTableOfString_i::AddColumn(const SALOMEDS::StringSeq& the void SALOMEDS_AttributeTableOfString_i::SetColumn(CORBA::Long theColumn, const SALOMEDS::StringSeq& theData) throw (SALOMEDS::AttributeTableOfString::IncorrectArgumentLength, SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectArgumentLength); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); Handle(TColStd_HSequenceOfExtendedString) aColumn = new TColStd_HSequenceOfExtendedString; for (int i = 0; i < theData.length(); i++) aColumn->Append(TCollection_AsciiString(CORBA::string_dup(theData[i]))); @@ -242,8 +232,9 @@ void SALOMEDS_AttributeTableOfString_i::SetColumn(CORBA::Long theColumn, const S SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetColumn(CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectIndex); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theColumn <= 0 || theColumn > aTable->GetNbColumns()) throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); SALOMEDS::StringSeq_var CorbaSeq = new SALOMEDS::StringSeq; @@ -258,23 +249,27 @@ SALOMEDS::StringSeq* SALOMEDS_AttributeTableOfString_i::GetColumn(CORBA::Long th void SALOMEDS_AttributeTableOfString_i::PutValue(const char* theValue, CORBA::Long theRow, CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectIndex); CheckLocked(); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); char* aValue = CORBA::string_dup(theValue); aTable->PutValue(aValue, theRow, theColumn); } -CORBA::Boolean SALOMEDS_AttributeTableOfString_i::HasValue(CORBA::Long theRow, CORBA::Long theColumn) { - return Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr)->HasValue(theRow, theColumn); +CORBA::Boolean SALOMEDS_AttributeTableOfString_i::HasValue(CORBA::Long theRow, CORBA::Long theColumn) +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl)->HasValue(theRow, theColumn); } char* SALOMEDS_AttributeTableOfString_i::GetValue(CORBA::Long theRow, CORBA::Long theColumn) throw (SALOMEDS::AttributeTableOfString::IncorrectIndex) { + SALOMEDS::Locker lock; Unexpect aCatch(ATS_IncorrectIndex); - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if (theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); TCollection_AsciiString aValue; @@ -292,7 +287,8 @@ char* SALOMEDS_AttributeTableOfString_i::GetValue(CORBA::Long theRow, CORBA::Lon SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfString_i::GetRowSetIndices(CORBA::Long theRow) { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); if(theRow <= 0 || theRow > aTable->GetNbRows()) throw SALOMEDS::AttributeTableOfString::IncorrectIndex(); @@ -308,13 +304,15 @@ SALOMEDS::LongSeq* SALOMEDS_AttributeTableOfString_i::GetRowSetIndices(CORBA::Lo void SALOMEDS_AttributeTableOfString_i::SetNbColumns(CORBA::Long theNbColumns) { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); aTable->SetNbColumns(theNbColumns); } bool SALOMEDS_AttributeTableOfString_i::ReadFromFile(const SALOMEDS::TMPFile& theStream) { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); istrstream aStream((char*)&theStream[0], theStream.length()); return aTable->RestoreFromString(aStream); @@ -322,7 +320,8 @@ bool SALOMEDS_AttributeTableOfString_i::ReadFromFile(const SALOMEDS::TMPFile& th SALOMEDS::TMPFile* SALOMEDS_AttributeTableOfString_i::SaveToFile() { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(_impl); ostrstream ostr; aTable->ConvertToString(ostr); @@ -332,20 +331,3 @@ SALOMEDS::TMPFile* SALOMEDS_AttributeTableOfString_i::SaveToFile() return aStreamFile._retn(); } -char* SALOMEDS_AttributeTableOfString_i::Store() { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); - - ostrstream ostr; - aTable->ConvertToString(ostr); - string aString = ostr.rdbuf()->str(); - - CORBA::String_var aBuffer = CORBA::string_dup(aString.c_str()); - return aBuffer._retn(); -} - -void SALOMEDS_AttributeTableOfString_i::Restore(const char* value) { - Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(_myAttr); - - istrstream aStream(value, strlen(value)); - aTable->RestoreFromString(aStream); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTableOfString_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeTableOfString_i.hxx index cc2e84125..c6290525c 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTableOfString_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTableOfString_i.hxx @@ -1,31 +1,27 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_AttributeTableOfString_i.hxx -// Author : Sergey Ruin +// Author : Sergey RUIN // Module : SALOME #ifndef SALOMEDS_AttributeTableOfString_i_HeaderFile #define SALOMEDS_AttributeTableOfString_i_HeaderFile -#include "SALOMEDS_TableOfStringAttribute.hxx" -#include "SALOMEDS_GenericAttribute_i.hxx" - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -DEFINE_DERIVED_ATTR(AttributeTableOfString,SALOMEDS_TableOfStringAttribute,true); +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeTableOfString.hxx" -class SALOMEDS_AttributeTableOfString_i: - public virtual POA_SALOMEDS::AttributeTableOfString, - public virtual SALOMEDS_TAttributeTableOfString_i -{ - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeTableOfString,SALOMEDS_TableOfStringAttribute); +class SALOMEDS_AttributeTableOfString_i: public virtual POA_SALOMEDS::AttributeTableOfString, + public virtual SALOMEDS_GenericAttribute_i { + public: + + SALOMEDS_AttributeTableOfString_i(const Handle(SALOMEDSImpl_AttributeTableOfString)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeTableOfString_i() {}; + virtual void SetTitle(const char* theTitle); virtual char* GetTitle(); virtual void SetRowTitle(CORBA::Long theIndex, const char* theTitle) @@ -71,9 +67,6 @@ public: virtual bool ReadFromFile(const SALOMEDS::TMPFile& theStream); virtual SALOMEDS::TMPFile* SaveToFile(); - char* Store(); - void Restore(const char*); - }; #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTarget.cxx b/src/SALOMEDS/SALOMEDS_AttributeTarget.cxx new file mode 100644 index 000000000..e47608f3c --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTarget.cxx @@ -0,0 +1,63 @@ +// File : SALOMEDS_AttributeTarget.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeTarget.hxx" + +#include + +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDS_SObject.hxx" + + +SALOMEDS_AttributeTarget::SALOMEDS_AttributeTarget(const Handle(SALOMEDSImpl_AttributeTarget)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTarget::SALOMEDS_AttributeTarget(SALOMEDS::AttributeTarget_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTarget::~SALOMEDS_AttributeTarget() +{} + +void SALOMEDS_AttributeTarget::Add(const _PTR(SObject)& theObject) +{ + SALOMEDS_SObject* aSO = dynamic_cast(theObject.get()); + + if(_isLocal) Handle(SALOMEDSImpl_AttributeTarget)::DownCast(_local_impl)->Add(aSO->GetLocalImpl()); + else SALOMEDS::AttributeTarget::_narrow(_corba_impl)->Add(aSO->GetCORBAImpl()); +} + +std::vector<_PTR(SObject)> SALOMEDS_AttributeTarget::Get() +{ + std::vector<_PTR(SObject)> aVector; + int aLength, i; + SALOMEDSClient_SObject* aSO = NULL; + + if(_isLocal) { + Handle(TColStd_HSequenceOfTransient) aSeq = Handle(SALOMEDSImpl_AttributeTarget)::DownCast(_local_impl)->Get(); + aLength = aSeq->Length(); + for(i=1; i<=aLength; i++) { + aSO = new SALOMEDS_SObject(Handle(SALOMEDSImpl_SObject)::DownCast(aSeq->Value(i))); + aVector.push_back(_PTR(SObject)(aSO)); + } + } + else { + SALOMEDS::Study::ListOfSObject_var aSeq = SALOMEDS::AttributeTarget::_narrow(_corba_impl)->Get(); + aLength = aSeq->length(); + aSO = new SALOMEDS_SObject(aSeq[i].in()); + for(i = 0; i(theObject.get()); + + if(_isLocal) Handle(SALOMEDSImpl_AttributeTarget)::DownCast(_local_impl)->Remove(aSO->GetLocalImpl()); + else SALOMEDS::AttributeTarget::_narrow(_corba_impl)->Remove(aSO->GetCORBAImpl()); +} + diff --git a/src/SALOMEDS/SALOMEDS_AttributeTarget.hxx b/src/SALOMEDS/SALOMEDS_AttributeTarget.hxx new file mode 100644 index 000000000..d9a80b982 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTarget.hxx @@ -0,0 +1,31 @@ +// File : SALOMEDS_AttributeTarget.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeTarget_HeaderFile +#define SALOMEDS_AttributeTarget_HeaderFile + +#include + +#include "SALOMEDSClient.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeTarget.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeTarget: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeTarget +{ +public: + SALOMEDS_AttributeTarget(const Handle(SALOMEDSImpl_AttributeTarget)& theAttr); + SALOMEDS_AttributeTarget(SALOMEDS::AttributeTarget_ptr theAttr); + ~SALOMEDS_AttributeTarget(); + + virtual void Add(const _PTR(SObject)& theObject); + virtual std::vector<_PTR(SObject)> Get(); + virtual void Remove(const _PTR(SObject)& theObject); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTarget_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeTarget_i.cxx index 70f7b81b9..98ff924ad 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTarget_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTarget_i.cxx @@ -1,70 +1,45 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeTarget_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#include -#include -#include -#include + #include "SALOMEDS_AttributeTarget_i.hxx" -#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDS.hxx" + +#include using namespace std; -void SALOMEDS_AttributeTarget_i::Add(SALOMEDS::SObject_ptr anObject) +void SALOMEDS_AttributeTarget_i::Add(SALOMEDS::SObject_ptr anObject) { + SALOMEDS::Locker lock; TDF_Label aLabel; - TDF_Tool::Label(_myAttr->Label().Data(),anObject->GetID(),aLabel,1); - _myAttr->Append(aLabel); + TDF_Tool::Label(_impl->Label().Data(),anObject->GetID(),aLabel,1); + (Handle(SALOMEDSImpl_AttributeTarget)::DownCast(_impl))->Add(SALOMEDSImpl_Study::SObject(aLabel)); } -SALOMEDS::Study::ListOfSObject* SALOMEDS_AttributeTarget_i::Get() { - TDF_LabelList aLList; - - _myAttr->Get(aLList); +SALOMEDS::Study::ListOfSObject* SALOMEDS_AttributeTarget_i::Get() +{ + SALOMEDS::Locker lock; + Handle(TColStd_HSequenceOfTransient) aSeq = (Handle(SALOMEDSImpl_AttributeTarget)::DownCast(_impl))->Get(); SALOMEDS::Study::ListOfSObject_var aSList = new SALOMEDS::Study::ListOfSObject; - - if (aLList.Extent() == 0) - return aSList._retn(); - - aSList->length(aLList.Extent()); - TDF_ListIteratorOfLabelList anIter(aLList); - SALOMEDS_Study_i* aStudy = _mySObject->GetStudyServant(); - for(int index = 0; anIter.More(); anIter.Next(), index++){ - const TDF_Label& aLabel = anIter.Value(); - aSList[index] = SALOMEDS_SObject_i::NewRef(aStudy,aLabel)._retn(); + int aLength = aSeq->Length(), i; + if (aLength == 0) return aSList._retn(); + aSList->length(aLength); + for(i=1; i <=aLength; i++) { + SALOMEDS::SObject_var anSO = SALOMEDS_SObject_i::New(Handle(SALOMEDSImpl_SObject)::DownCast(aSeq->Value(i)), _orb); + aSList[i-1] = anSO; } return aSList._retn(); } -void SALOMEDS_AttributeTarget_i::Remove(SALOMEDS::SObject_ptr anObject) { +void SALOMEDS_AttributeTarget_i::Remove(SALOMEDS::SObject_ptr anObject) +{ + SALOMEDS::Locker lock; TDF_Label aLabel; - CORBA::String_var anID = anObject->GetID(); - TDF_Tool::Label(_myAttr->Label().Data(),anID.inout(),aLabel,1); - _myAttr->Remove(aLabel); + TDF_Tool::Label(_impl->Label().Data(),anObject->GetID(),aLabel,1); + (Handle(SALOMEDSImpl_AttributeTarget)::DownCast(_impl))->Remove(SALOMEDSImpl_Study::SObject(aLabel)); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeTarget_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeTarget_i.hxx index d6181dbcb..03e70cd89 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTarget_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTarget_i.hxx @@ -1,30 +1,6 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeTarget_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header: #ifndef SALOMEDS_AttributeTarget_i_HeaderFile #define SALOMEDS_AttributeTarget_i_HeaderFile @@ -32,24 +8,22 @@ // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) - -#include "SALOMEDS_TargetAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeTarget.hxx" -DEFINE_DERIVED_ATTR(AttributeTarget,SALOMEDS_TargetAttribute,false); - -class SALOMEDS_AttributeTarget_i: - public virtual POA_SALOMEDS::AttributeTarget, - public virtual SALOMEDS_TAttributeTarget_i +class SALOMEDS_AttributeTarget_i: public virtual POA_SALOMEDS::AttributeTarget, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeTarget,SALOMEDS_TargetAttribute); public: + + SALOMEDS_AttributeTarget_i(const Handle(SALOMEDSImpl_AttributeTarget)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeTarget_i() {}; + virtual void Add(SALOMEDS::SObject_ptr anObject) ; virtual SALOMEDS::Study::ListOfSObject* Get(); virtual void Remove(SALOMEDS::SObject_ptr anObject); - }; - - #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTextColor.cxx b/src/SALOMEDS/SALOMEDS_AttributeTextColor.cxx new file mode 100644 index 000000000..93b159e5e --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTextColor.cxx @@ -0,0 +1,56 @@ +// File : SALOMEDS_AttributeTextColor.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeTextColor.hxx" + +#include + +SALOMEDS_AttributeTextColor::SALOMEDS_AttributeTextColor(const Handle(SALOMEDSImpl_AttributeTextColor)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTextColor::SALOMEDS_AttributeTextColor(SALOMEDS::AttributeTextColor_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTextColor::~SALOMEDS_AttributeTextColor() +{} + + +STextColor SALOMEDS_AttributeTextColor::TextColor() +{ + STextColor aColor; + if(_isLocal) { + Handle(TColStd_HArray1OfReal) aSeq = Handle(SALOMEDSImpl_AttributeTextColor)::DownCast(_local_impl)->TextColor(); + aColor.R = aSeq->Value(1); + aColor.G = aSeq->Value(2); + aColor.B = aSeq->Value(3); + } + else { + SALOMEDS::Color anImplColor = SALOMEDS::AttributeTextColor::_narrow(_corba_impl)->TextColor(); + aColor.R = anImplColor.R; + aColor.G = anImplColor.G; + aColor.B = anImplColor.B; + } + return aColor; +} + +void SALOMEDS_AttributeTextColor::SetTextColor(STextColor value) +{ + CheckLocked(); + if(_isLocal) { + Handle(TColStd_HArray1OfReal) aSeq = new TColStd_HArray1OfReal(1, 3); + aSeq->SetValue(1, value.R); + aSeq->SetValue(2, value.G); + aSeq->SetValue(3, value.B); + Handle(SALOMEDSImpl_AttributeTextColor)::DownCast(_local_impl)->ChangeArray(aSeq); + } + else { + SALOMEDS::Color aColor; + aColor.R = value.R; + aColor.G = value.G; + aColor.B = value.B; + SALOMEDS::AttributeTextColor::_narrow(_corba_impl)->SetTextColor(aColor); + } +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTextColor.hxx b/src/SALOMEDS/SALOMEDS_AttributeTextColor.hxx new file mode 100644 index 000000000..fef62ebee --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTextColor.hxx @@ -0,0 +1,32 @@ +// File : SALOMEDS_AttributeTextColor.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeTextColor_HeaderFile +#define SALOMEDS_AttributeTextColor_HeaderFile + +#include "SALOMEDSClient_AttributeTextColor.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeTextColor.hxx" +#include "SALOMEDSClient_definitions.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#include + +class SALOMEDS_AttributeTextColor: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeTextColor +{ +public: + SALOMEDS_AttributeTextColor(const Handle(SALOMEDSImpl_AttributeTextColor)& theAttr); + SALOMEDS_AttributeTextColor(SALOMEDS::AttributeTextColor_ptr theAttr); + ~SALOMEDS_AttributeTextColor(); + + virtual STextColor TextColor(); + virtual void SetTextColor(STextColor value); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTextColor_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeTextColor_i.cxx index 32a79e68c..4b9d928d6 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTextColor_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTextColor_i.cxx @@ -1,39 +1,19 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeTextColor_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeTextColor_i.hxx" +#include "SALOMEDS.hxx" #include using namespace std; -SALOMEDS::Color SALOMEDS_AttributeTextColor_i::TextColor() { +SALOMEDS::Color SALOMEDS_AttributeTextColor_i::TextColor() +{ + SALOMEDS::Locker lock; SALOMEDS::Color TextColor; - Handle(TColStd_HArray1OfReal) anArray = Handle(SALOMEDS_TextColorAttribute)::DownCast(_myAttr)->Array(); + Handle(TColStd_HArray1OfReal) anArray = Handle(SALOMEDSImpl_AttributeTextColor)::DownCast(_impl)->TextColor(); if (anArray.IsNull() || anArray->Length()!=3) { TextColor.R = 0; TextColor.G = 0; @@ -47,28 +27,14 @@ SALOMEDS::Color SALOMEDS_AttributeTextColor_i::TextColor() { return TextColor; } -void SALOMEDS_AttributeTextColor_i::SetTextColor(const SALOMEDS::Color& value) { +void SALOMEDS_AttributeTextColor_i::SetTextColor(const SALOMEDS::Color& value) +{ + SALOMEDS::Locker lock; CheckLocked(); Handle(TColStd_HArray1OfReal) anArray = new TColStd_HArray1OfReal(1,3); anArray->SetValue(1, value.R); anArray->SetValue(2, value.G); anArray->SetValue(3, value.B); - Handle(SALOMEDS_TextColorAttribute)::DownCast(_myAttr)->ChangeArray(anArray); -} - -char* SALOMEDS_AttributeTextColor_i::Store() { - SALOMEDS::Color aColor = TextColor(); - char *Val = new char[75]; - sprintf(Val, "%f %f %f", (float)aColor.R, (float)aColor.G, (float)aColor.B); - return Val; + Handle(SALOMEDSImpl_AttributeTextColor)::DownCast(_impl)->ChangeArray(anArray); } -void SALOMEDS_AttributeTextColor_i::Restore(const char* value) { - SALOMEDS::Color aColor; - float r, g, b; - sscanf(value, "%f %f %f", &r, &g, &b); - aColor.R = r; - aColor.G = g; - aColor.B = b; - SetTextColor(aColor); -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTextColor_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeTextColor_i.hxx index 765eb1c16..4a83a08a0 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTextColor_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTextColor_i.hxx @@ -1,28 +1,5 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeTextColor_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME // $Header$ @@ -33,23 +10,22 @@ #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_TextColorAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeTextColor.hxx" -DEFINE_DERIVED_ATTR(AttributeTextColor,SALOMEDS_TextColorAttribute,false); - -class SALOMEDS_AttributeTextColor_i: - public virtual POA_SALOMEDS::AttributeTextColor, - public virtual SALOMEDS_TAttributeTextColor_i +class SALOMEDS_AttributeTextColor_i: public virtual POA_SALOMEDS::AttributeTextColor, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeTextColor,SALOMEDS_TextColorAttribute); public: + + SALOMEDS_AttributeTextColor_i(const Handle(SALOMEDSImpl_AttributeTextColor)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeTextColor_i() {}; + SALOMEDS::Color TextColor(); void SetTextColor(const SALOMEDS::Color& value); - char* Store(); - void Restore(const char*); - }; diff --git a/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor.cxx b/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor.cxx new file mode 100644 index 000000000..cbeab6dbd --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor.cxx @@ -0,0 +1,56 @@ +// File : SALOMEDS_AttributeTextHighlightColor.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeTextHighlightColor.hxx" + +#include + +SALOMEDS_AttributeTextHighlightColor::SALOMEDS_AttributeTextHighlightColor(const Handle(SALOMEDSImpl_AttributeTextHighlightColor)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTextHighlightColor::SALOMEDS_AttributeTextHighlightColor(SALOMEDS::AttributeTextHighlightColor_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTextHighlightColor::~SALOMEDS_AttributeTextHighlightColor() +{} + + +STextColor SALOMEDS_AttributeTextHighlightColor::TextHighlightColor() +{ + STextColor aColor; + if(_isLocal) { + Handle(TColStd_HArray1OfReal) aSeq; + aSeq = Handle(SALOMEDSImpl_AttributeTextHighlightColor)::DownCast(_local_impl)->TextHighlightColor(); + aColor.R = aSeq->Value(1); + aColor.G = aSeq->Value(2); + aColor.B = aSeq->Value(3); + } + else { + SALOMEDS::Color anImplColor = SALOMEDS::AttributeTextHighlightColor::_narrow(_corba_impl)->TextHighlightColor(); + aColor.R = anImplColor.R; + aColor.G = anImplColor.G; + aColor.B = anImplColor.B; + } + return aColor; +} + +void SALOMEDS_AttributeTextHighlightColor::SetTextHighlightColor(STextColor value) +{ + if(_isLocal) { + Handle(TColStd_HArray1OfReal) aSeq = new TColStd_HArray1OfReal(1, 3); + aSeq->SetValue(1, value.R); + aSeq->SetValue(2, value.G); + aSeq->SetValue(3, value.B); + Handle(SALOMEDSImpl_AttributeTextHighlightColor)::DownCast(_local_impl)->ChangeArray(aSeq); + } + else { + SALOMEDS::Color aColor; + aColor.R = value.R; + aColor.G = value.G; + aColor.B = value.B; + SALOMEDS::AttributeTextHighlightColor::_narrow(_corba_impl)->SetTextHighlightColor(aColor); + } +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor.hxx b/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor.hxx new file mode 100644 index 000000000..df2428696 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor.hxx @@ -0,0 +1,32 @@ +// File : SALOMEDS_AttributeTextHighlightColor.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeTextHighlightColor_HeaderFile +#define SALOMEDS_AttributeTextHighlightColor_HeaderFile + +#include "SALOMEDSClient_AttributeTextHighlightColor.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeTextHighlightColor.hxx" +#include "SALOMEDSClient_definitions.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#include + +class SALOMEDS_AttributeTextHighlightColor: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeTextHighlightColor +{ +public: + SALOMEDS_AttributeTextHighlightColor(const Handle(SALOMEDSImpl_AttributeTextHighlightColor)& theAttr); + SALOMEDS_AttributeTextHighlightColor(SALOMEDS::AttributeTextHighlightColor_ptr theAttr); + ~SALOMEDS_AttributeTextHighlightColor(); + + virtual STextColor TextHighlightColor(); + virtual void SetTextHighlightColor(STextColor value); + +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor_i.cxx index 672d81c45..8de0bd4c5 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor_i.cxx @@ -1,39 +1,19 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeTextHighlightColor_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeTextHighlightColor_i.hxx" +#include "SALOMEDS.hxx" #include using namespace std; -SALOMEDS::Color SALOMEDS_AttributeTextHighlightColor_i::TextHighlightColor() { +SALOMEDS::Color SALOMEDS_AttributeTextHighlightColor_i::TextHighlightColor() +{ + SALOMEDS::Locker lock; SALOMEDS::Color TextHighlightColor; - Handle(TColStd_HArray1OfReal) anArray = Handle(SALOMEDS_TextHighlightColorAttribute)::DownCast(_myAttr)->Array(); + Handle(TColStd_HArray1OfReal) anArray=Handle(SALOMEDSImpl_AttributeTextHighlightColor)::DownCast(_impl)->TextHighlightColor(); if (anArray.IsNull() || anArray->Length()!=3) { TextHighlightColor.R = 0; TextHighlightColor.G = 0; @@ -47,28 +27,13 @@ SALOMEDS::Color SALOMEDS_AttributeTextHighlightColor_i::TextHighlightColor() { return TextHighlightColor; } -void SALOMEDS_AttributeTextHighlightColor_i::SetTextHighlightColor(const SALOMEDS::Color& value) { +void SALOMEDS_AttributeTextHighlightColor_i::SetTextHighlightColor(const SALOMEDS::Color& value) +{ + SALOMEDS::Locker lock; CheckLocked(); Handle(TColStd_HArray1OfReal) anArray = new TColStd_HArray1OfReal(1,3); anArray->SetValue(1, value.R); anArray->SetValue(2, value.G); anArray->SetValue(3, value.B); - Handle(SALOMEDS_TextHighlightColorAttribute)::DownCast(_myAttr)->ChangeArray(anArray); -} - -char* SALOMEDS_AttributeTextHighlightColor_i::Store() { - SALOMEDS::Color aColor = TextHighlightColor(); - char *Val = new char[75]; - sprintf(Val, "%f %f %f", (float)aColor.R, (float)aColor.G, (float)aColor.B); - return Val; -} - -void SALOMEDS_AttributeTextHighlightColor_i::Restore(const char* value) { - SALOMEDS::Color aColor; - float r, g, b; - sscanf(value, "%f %f %f", &r, &g, &b); - aColor.R = r; - aColor.G = g; - aColor.B = b; - SetTextHighlightColor(aColor); + Handle(SALOMEDSImpl_AttributeTextHighlightColor)::DownCast(_impl)->ChangeArray(anArray); } diff --git a/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor_i.hxx index aa3ead5d2..da6fe461a 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTextHighlightColor_i.hxx @@ -1,30 +1,6 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeTextHighlightColor_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef SALOMEDS_AttributeTextHighlightColor_i_HeaderFile #define SALOMEDS_AttributeTextHighlightColor_i_HeaderFile @@ -33,23 +9,21 @@ #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include "SALOMEDS_TextHighlightColorAttribute.hxx" #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeTextHighlightColor.hxx" -DEFINE_DERIVED_ATTR(AttributeTextHighlightColor,SALOMEDS_TextHighlightColorAttribute,false); - -class SALOMEDS_AttributeTextHighlightColor_i: - public virtual POA_SALOMEDS::AttributeTextHighlightColor, - public virtual SALOMEDS_TAttributeTextHighlightColor_i +class SALOMEDS_AttributeTextHighlightColor_i: public virtual POA_SALOMEDS::AttributeTextHighlightColor, + public virtual SALOMEDS_GenericAttribute_i { - DEFINE_DERIVED_ATTR_METH_DEFAULT(AttributeTextHighlightColor,SALOMEDS_TextHighlightColorAttribute); public: - SALOMEDS::Color TextHighlightColor(); - void SetTextHighlightColor(const SALOMEDS::Color& value); + + SALOMEDS_AttributeTextHighlightColor_i(const Handle(SALOMEDSImpl_AttributeTextHighlightColor)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; - char* Store(); - void Restore(const char*); + ~SALOMEDS_AttributeTextHighlightColor_i() {}; + SALOMEDS::Color TextHighlightColor(); + void SetTextHighlightColor(const SALOMEDS::Color& value); }; diff --git a/src/SALOMEDS/SALOMEDS_AttributeTreeNode.cxx b/src/SALOMEDS/SALOMEDS_AttributeTreeNode.cxx new file mode 100644 index 000000000..93b66d5ed --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTreeNode.cxx @@ -0,0 +1,381 @@ +// File : SALOMEDS_AttributeTreeNode.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeTreeNode.hxx" + +#include +#include +#include +#include +#include +#include + +#include "SALOMEDSImpl_AttributeTreeNode.hxx" +#include "SALOMEDS_AttributeTreeNode.hxx" + +SALOMEDS_AttributeTreeNode::SALOMEDS_AttributeTreeNode(const Handle(SALOMEDSImpl_AttributeTreeNode)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTreeNode::SALOMEDS_AttributeTreeNode(SALOMEDS::AttributeTreeNode_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeTreeNode::~SALOMEDS_AttributeTreeNode() +{} + +void SALOMEDS_AttributeTreeNode::SetFather(const _PTR(AttributeTreeNode)& value) +{ + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, aFather; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aFather = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + aNode->SetFather(aFather); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var aFather = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + aNode->SetFather(aFather); + } +} + +bool SALOMEDS_AttributeTreeNode::HasFather() +{ + bool ret; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + ret = aNode->HasFather(); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + ret = aNode->HasFather(); + } + return ret; +} + +_PTR(AttributeTreeNode) SALOMEDS_AttributeTreeNode::GetFather() +{ + SALOMEDSClient_AttributeTreeNode* aTN = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aTN = new SALOMEDS_AttributeTreeNode(aNode->GetFather()); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + aTN = new SALOMEDS_AttributeTreeNode(aNode->GetFather()); + } + return _PTR(AttributeTreeNode)(aTN); +} + +void SALOMEDS_AttributeTreeNode::SetPrevious(const _PTR(AttributeTreeNode)& value) +{ + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, aPrev; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aPrev = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + aNode->SetPrevious(aPrev); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var aPrev = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + aNode->SetPrevious(aPrev); + } +} + +bool SALOMEDS_AttributeTreeNode::HasPrevious() +{ + bool ret; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + ret = aNode->HasPrevious(); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + ret = aNode->HasPrevious(); + } + return ret; +} + +_PTR(AttributeTreeNode) SALOMEDS_AttributeTreeNode::GetPrevious() +{ + SALOMEDSClient_AttributeTreeNode* aTN = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aTN = new SALOMEDS_AttributeTreeNode(aNode->GetPrevious()); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + aTN = new SALOMEDS_AttributeTreeNode(aNode->GetPrevious()); + } + return _PTR(AttributeTreeNode)(aTN); +} + +void SALOMEDS_AttributeTreeNode::SetNext(const _PTR(AttributeTreeNode)& value) +{ + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, aNext; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aNext = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + aNode->SetNext(aNext); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var aNext = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + aNode->SetNext(aNext); + } +} + +bool SALOMEDS_AttributeTreeNode::HasNext() +{ + bool ret; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + ret = aNode->HasNext(); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + ret = aNode->HasNext(); + } + return ret; +} + +_PTR(AttributeTreeNode) SALOMEDS_AttributeTreeNode::GetNext() +{ + SALOMEDSClient_AttributeTreeNode* aTN = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aTN = new SALOMEDS_AttributeTreeNode(aNode->GetNext()); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + aTN = new SALOMEDS_AttributeTreeNode(aNode->GetNext()); + } + return _PTR(AttributeTreeNode)(aTN); +} + +void SALOMEDS_AttributeTreeNode::SetFirst(const _PTR(AttributeTreeNode)& value) +{ + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, aFirst; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aFirst = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + aNode->SetFirst(aFirst); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var aFirst = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + aNode->SetFirst(aFirst); + } +} + +bool SALOMEDS_AttributeTreeNode::HasFirst() +{ + bool ret; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + ret = aNode->HasFirst(); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + ret = aNode->HasFirst(); + } + return ret; +} + +_PTR(AttributeTreeNode) SALOMEDS_AttributeTreeNode::GetFirst() +{ + SALOMEDSClient_AttributeTreeNode* aTN = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aTN = new SALOMEDS_AttributeTreeNode(aNode->GetFirst()); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + aTN = new SALOMEDS_AttributeTreeNode(aNode->GetFirst()); + } + return _PTR(AttributeTreeNode)(aTN); +} + +void SALOMEDS_AttributeTreeNode::SetTreeID(const std::string& value) +{ + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + aNode->SetTreeID(Standard_GUID((char*)value.c_str())); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + aNode->SetTreeID(value.c_str()); + } +} + +std::string SALOMEDS_AttributeTreeNode::GetTreeID() +{ + TCollection_AsciiString aGUID; + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + char guid[40]; + aNode->GetTreeID().ToCString(guid); + aGUID = TCollection_AsciiString(guid); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + aGUID = TCollection_AsciiString(aNode->GetTreeID()); + } + + return std::string(aGUID.ToCString()); +} + +void SALOMEDS_AttributeTreeNode::Append(const _PTR(AttributeTreeNode)& value) +{ + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, anOther; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + anOther = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + aNode->Append(anOther); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var anOther = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + aNode->Append(anOther); + } +} + +void SALOMEDS_AttributeTreeNode::Prepend(const _PTR(AttributeTreeNode)& value) +{ + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, anOther; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + anOther = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + aNode->Prepend(anOther); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var anOther = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + aNode->Prepend(anOther); + } +} + +void SALOMEDS_AttributeTreeNode::InsertBefore(const _PTR(AttributeTreeNode)& value) +{ + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, anOther; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + anOther = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + aNode->InsertBefore(anOther); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var anOther = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + aNode->InsertBefore(anOther); + } +} + +void SALOMEDS_AttributeTreeNode::InsertAfter(const _PTR(AttributeTreeNode)& value) +{ + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, anOther; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + anOther = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + aNode->InsertAfter(anOther); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var anOther = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + aNode->InsertAfter(anOther); + } +} + +void SALOMEDS_AttributeTreeNode::Remove() +{ + if(_isLocal) Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl)->Remove(); + else SALOMEDS::AttributeTreeNode::_narrow(_corba_impl)->Remove(); +} + +int SALOMEDS_AttributeTreeNode::Depth() +{ + int aDepth; + if(_isLocal) aDepth = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl)->Depth(); + else aDepth = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl)->Depth(); + return aDepth; +} + +bool SALOMEDS_AttributeTreeNode::IsRoot() +{ + bool ret; + if(_isLocal) ret = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl)->IsRoot(); + else ret = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl)->IsRoot(); + return ret; +} + +bool SALOMEDS_AttributeTreeNode::IsDescendant(const _PTR(AttributeTreeNode)& value) +{ + bool ret; + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, anOther; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + anOther = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + ret = aNode->IsDescendant(anOther); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var anOther = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + ret = aNode->IsDescendant(anOther); + } + return ret; +} + +bool SALOMEDS_AttributeTreeNode::IsFather(const _PTR(AttributeTreeNode)& value) +{ + bool ret; + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, anOther; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + anOther = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + ret = aNode->IsFather(anOther); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var anOther = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + ret = aNode->IsFather(anOther); + } + return ret; +} + +bool SALOMEDS_AttributeTreeNode::IsChild(const _PTR(AttributeTreeNode)& value) +{ + bool ret; + SALOMEDS_AttributeTreeNode* aTN = dynamic_cast(value.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, anOther; + aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_local_impl); + anOther = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(aTN->_local_impl); + ret = aNode->IsChild(anOther); + } + else { + SALOMEDS::AttributeTreeNode_var aNode = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl); + SALOMEDS::AttributeTreeNode_var anOther = SALOMEDS::AttributeTreeNode::_narrow(aTN->_corba_impl); + ret = aNode->IsChild(anOther); + } + return ret; +} + +std::string SALOMEDS_AttributeTreeNode::Label() +{ + TCollection_AsciiString aLabel; + if(_isLocal) TDF_Tool::Entry(_local_impl->Label(), aLabel); + else aLabel = SALOMEDS::AttributeTreeNode::_narrow(_corba_impl)->Label(); + return std::string(aLabel.ToCString()); +} + + diff --git a/src/SALOMEDS/SALOMEDS_AttributeTreeNode.hxx b/src/SALOMEDS/SALOMEDS_AttributeTreeNode.hxx new file mode 100644 index 000000000..bbb82abb9 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeTreeNode.hxx @@ -0,0 +1,51 @@ +// File : SALOMEDS_AttributeTreeNode.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeTreeNode_HeaderFile +#define SALOMEDS_AttributeTreeNode_HeaderFile + +#include "SALOMEDSClient_AttributeTreeNode.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeTreeNode.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeTreeNode: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeTreeNode +{ +public: + SALOMEDS_AttributeTreeNode(const Handle(SALOMEDSImpl_AttributeTreeNode)& theAttr); + SALOMEDS_AttributeTreeNode(SALOMEDS::AttributeTreeNode_ptr theAttr); + ~SALOMEDS_AttributeTreeNode(); + + virtual void SetFather(const _PTR(AttributeTreeNode)& value); + virtual bool HasFather(); + virtual _PTR(AttributeTreeNode) GetFather(); + virtual void SetPrevious(const _PTR(AttributeTreeNode)& value); + virtual bool HasPrevious(); + virtual _PTR(AttributeTreeNode) GetPrevious(); + virtual void SetNext(const _PTR(AttributeTreeNode)& value); + virtual bool HasNext(); + virtual _PTR(AttributeTreeNode) GetNext(); + virtual void SetFirst(const _PTR(AttributeTreeNode)& value); + virtual bool HasFirst(); + virtual _PTR(AttributeTreeNode) GetFirst(); + virtual void SetTreeID(const std::string& value); + virtual std::string GetTreeID(); + virtual void Append(const _PTR(AttributeTreeNode)& value); + virtual void Prepend(const _PTR(AttributeTreeNode)& value); + virtual void InsertBefore(const _PTR(AttributeTreeNode)& value); + virtual void InsertAfter(const _PTR(AttributeTreeNode)& value); + virtual void Remove(); + virtual int Depth(); + virtual bool IsRoot(); + virtual bool IsDescendant(const _PTR(AttributeTreeNode)& value); + virtual bool IsFather(const _PTR(AttributeTreeNode)& value); + virtual bool IsChild(const _PTR(AttributeTreeNode)& value); + virtual std::string Label(); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.cxx index 15449d603..22b6864c0 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.cxx @@ -1,47 +1,25 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeTreeNode_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#include -#include #include "SALOMEDS_AttributeTreeNode_i.hxx" - #include "utilities.h" +#include "SALOMEDS.hxx" +#include +#include +#include +#include using namespace std; -static Handle(TDataStd_TreeNode) GetNode(SALOMEDS::AttributeTreeNode_ptr value, - const Handle(TDataStd_TreeNode)& aNode) +static Handle(SALOMEDSImpl_AttributeTreeNode) GetNode(SALOMEDS::AttributeTreeNode_ptr value, + const Handle(SALOMEDSImpl_AttributeTreeNode)& aNode) { - Handle(TDataStd_TreeNode) aResult = new TDataStd_TreeNode; - CORBA::String_var aString = CORBA::string_dup(value->Label()); + Handle(SALOMEDSImpl_AttributeTreeNode) aResult = new SALOMEDSImpl_AttributeTreeNode; + TCollection_AsciiString anEntry = value->Label(); TDF_Label aLabel; - TDF_Tool::Label(aNode->Label().Data(), TCollection_AsciiString(aString), aLabel, 0); + TDF_Tool::Label(aNode->Label().Data(), anEntry, aLabel); if (aLabel.IsNull()) { MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such label") MESSAGE("SALOMEDS_AttributeTreeNode_i class: no such label") @@ -54,177 +32,207 @@ static Handle(TDataStd_TreeNode) GetNode(SALOMEDS::AttributeTreeNode_ptr value, return aResult; } -void SALOMEDS_AttributeTreeNode_i::SetFather(SALOMEDS::AttributeTreeNode_ptr theValue) { +void SALOMEDS_AttributeTreeNode_i::SetFather(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->SetFather(GetNode(theValue,_myAttr)); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->SetFather(GetNode(value, aNode)); } -CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFather() { - return _myAttr->HasFather(); +CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFather() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl)->HasFather(); } -SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFather() { - SALOMEDS_AttributeTreeNode_i* aTreeNode = - new SALOMEDS_AttributeTreeNode_i(_myAttr->Father(),_mySObject); - return aTreeNode->_this(); +SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFather() +{ + SALOMEDS::Locker lock; + SALOMEDS_AttributeTreeNode_i* aFather; + aFather = new SALOMEDS_AttributeTreeNode_i(Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl)->GetFather(), _orb); +#ifndef WNT + return aFather->POA_SALOMEDS::AttributeTreeNode::_this(); +#else + return aFather->AttributeTreeNode::_this(); +#endif } -void SALOMEDS_AttributeTreeNode_i::SetPrevious(SALOMEDS::AttributeTreeNode_ptr theValue) { +void SALOMEDS_AttributeTreeNode_i::SetPrevious(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->SetPrevious(GetNode(theValue,_myAttr)); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->SetPrevious(GetNode(value, aNode)); } -CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasPrevious() { - return _myAttr->HasPrevious(); +CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasPrevious() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl)->HasPrevious(); } -SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetPrevious() { - SALOMEDS_AttributeTreeNode_i* aTreeNode = - new SALOMEDS_AttributeTreeNode_i(_myAttr->Previous(),_mySObject); - return aTreeNode->_this(); +SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetPrevious() +{ + SALOMEDS::Locker lock; + SALOMEDS_AttributeTreeNode_i* aPrevious; + aPrevious=new SALOMEDS_AttributeTreeNode_i(Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl)->GetPrevious(), _orb); +#ifndef WNT + return aPrevious->POA_SALOMEDS::AttributeTreeNode::_this(); +#else + return aPrevious->AttributeTreeNode::_this(); +#endif } -void SALOMEDS_AttributeTreeNode_i::SetNext(SALOMEDS::AttributeTreeNode_ptr theValue) { +void SALOMEDS_AttributeTreeNode_i::SetNext(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->SetNext(GetNode(theValue,_myAttr)); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->SetNext(GetNode(value, aNode)); } -CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasNext() { - return _myAttr->HasNext(); +CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasNext() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl)->HasNext(); } -SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetNext() { - SALOMEDS_AttributeTreeNode_i* aTreeNode = - new SALOMEDS_AttributeTreeNode_i(_myAttr->Next(),_mySObject); - return aTreeNode->_this(); +SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetNext() +{ + SALOMEDS::Locker lock; + SALOMEDS_AttributeTreeNode_i* aNext; + aNext = new SALOMEDS_AttributeTreeNode_i(Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl)->GetNext(), _orb); +#ifndef WNT + return aNext->POA_SALOMEDS::AttributeTreeNode::_this(); +#else + return aNext->AttributeTreeNode::_this(); +#endif } -void SALOMEDS_AttributeTreeNode_i::SetFirst(SALOMEDS::AttributeTreeNode_ptr theValue) { +void SALOMEDS_AttributeTreeNode_i::SetFirst(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->SetFirst(GetNode(theValue,_myAttr)); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->SetFirst(GetNode(value, aNode)); } -CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFirst() { - return _myAttr->HasFirst(); +CORBA::Boolean SALOMEDS_AttributeTreeNode_i::HasFirst() +{ + SALOMEDS::Locker lock; + return Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl)->HasFirst(); } -SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFirst() { - SALOMEDS_AttributeTreeNode_i* aTreeNode = - new SALOMEDS_AttributeTreeNode_i(_myAttr->First(),_mySObject); - return aTreeNode->_this(); +SALOMEDS::AttributeTreeNode_ptr SALOMEDS_AttributeTreeNode_i::GetFirst() +{ + SALOMEDS::Locker lock; + SALOMEDS_AttributeTreeNode_i* aFirst; + aFirst = new SALOMEDS_AttributeTreeNode_i(Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl)->GetFirst(), _orb); +#ifndef WNT + return aFirst->POA_SALOMEDS::AttributeTreeNode::_this(); +#else + return aFirst->AttributeTreeNode::_this(); +#endif } -void SALOMEDS_AttributeTreeNode_i::SetTreeID(const char* value) { +void SALOMEDS_AttributeTreeNode_i::SetTreeID(const char* value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->SetTreeID(Standard_GUID(_myAttr->ID())); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->SetTreeID(Standard_GUID(aNode->ID())); } -char* SALOMEDS_AttributeTreeNode_i::GetTreeID() { +char* SALOMEDS_AttributeTreeNode_i::GetTreeID() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); char aGUID[40]; - _myAttr->ID().ToCString(aGUID); - return CORBA::string_dup(aGUID); + aNode->ID().ToCString(aGUID); + return CORBA::String_var(CORBA::string_dup(aGUID))._retn(); } -void SALOMEDS_AttributeTreeNode_i::Append(SALOMEDS::AttributeTreeNode_ptr theValue) { +void SALOMEDS_AttributeTreeNode_i::Append(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->Append(GetNode(theValue,_myAttr)); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->Append(GetNode(value, aNode)); } -void SALOMEDS_AttributeTreeNode_i::Prepend(SALOMEDS::AttributeTreeNode_ptr theValue) { +void SALOMEDS_AttributeTreeNode_i::Prepend(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->Prepend(GetNode(theValue,_myAttr)); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->Prepend(GetNode(value, aNode)); } -void SALOMEDS_AttributeTreeNode_i::InsertBefore(SALOMEDS::AttributeTreeNode_ptr theValue) { +void SALOMEDS_AttributeTreeNode_i::InsertBefore(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->InsertBefore(GetNode(theValue,_myAttr)); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->InsertBefore(GetNode(value, aNode)); } -void SALOMEDS_AttributeTreeNode_i::InsertAfter(SALOMEDS::AttributeTreeNode_ptr theValue) { +void SALOMEDS_AttributeTreeNode_i::InsertAfter(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->InsertAfter(GetNode(theValue,_myAttr)); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->InsertAfter(GetNode(value, aNode)); } -void SALOMEDS_AttributeTreeNode_i::Remove() { +void SALOMEDS_AttributeTreeNode_i::Remove() +{ + SALOMEDS::Locker lock; CheckLocked(); - _myAttr->Remove(); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + aNode->Remove(); } -CORBA::Long SALOMEDS_AttributeTreeNode_i::Depth() { - return _myAttr->Depth(); +CORBA::Long SALOMEDS_AttributeTreeNode_i::Depth() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + return aNode->Depth(); } -CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsRoot() { - return _myAttr->IsRoot(); +CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsRoot() +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + return aNode->IsRoot(); } -CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsDescendant(SALOMEDS::AttributeTreeNode_ptr theValue) { - return _myAttr->IsDescendant(GetNode(theValue,_myAttr)); +CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsDescendant(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + return aNode->IsDescendant(GetNode(value, aNode)); } -CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsFather(SALOMEDS::AttributeTreeNode_ptr theValue) { - return _myAttr->IsFather(GetNode(theValue,_myAttr)); +CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsFather(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + return aNode->IsFather(GetNode(value, aNode)); } -CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsChild(SALOMEDS::AttributeTreeNode_ptr theValue) { - return _myAttr->IsChild(GetNode(theValue,_myAttr)); +CORBA::Boolean SALOMEDS_AttributeTreeNode_i::IsChild(SALOMEDS::AttributeTreeNode_ptr value) +{ + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_AttributeTreeNode) aNode = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(_impl); + return aNode->IsChild(GetNode(value, aNode)); } -char* SALOMEDS_AttributeTreeNode_i::Label() { +char* SALOMEDS_AttributeTreeNode_i::Label() +{ + SALOMEDS::Locker lock; TCollection_AsciiString aLabelName; - TDF_Tool::Entry(_myAttr->Label(),aLabelName); - return CORBA::string_dup(aLabelName.ToCString()); -} - -char* SALOMEDS_AttributeTreeNode_i::Store() { - char* aStr[4]; - - if (HasFather()) aStr[0] = GetFather()->Label(); else aStr[0] = "!"; - if (HasPrevious()) aStr[1] = GetPrevious()->Label(); else aStr[1] = "!"; - if (HasNext()) aStr[2] = GetNext()->Label(); else aStr[2] = "!"; - if (HasFirst()) aStr[3] = GetFirst()->Label(); else aStr[3] = "!"; - - int aLength = 4; - aLength += strlen(aStr[0]) + strlen(aStr[1]) + strlen(aStr[2]) + strlen(aStr[3]); - CORBA::String_var aResult = new char[aLength]; - sprintf(aResult, "%s %s %s %s", aStr[0], aStr[1], aStr[2], aStr[3]); - return aResult._retn(); + TDF_Tool::Entry(_impl->Label(),aLabelName); + return CORBA::String_var(CORBA::string_dup(aLabelName.ToCString()))._retn(); } -void SALOMEDS_AttributeTreeNode_i::Restore(const char* value) { - Handle(TDataStd_TreeNode) aNode = Handle(TDataStd_TreeNode)::DownCast(_myAttr); - Handle(TDF_Data) DF = TDocStd_Document::Get(_myAttr->Label())->GetData(); - - char* aCopy = strdup(value); - char* adr = strtok(aCopy, " "); - - TDF_Label aLabel; - Handle(TDataStd_TreeNode) aDepNode; - - if (adr && adr[0] != '!') { - TDF_Tool::Label(DF, adr, aLabel, 1); - if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID()); - aNode->SetFather(aDepNode); - } - - adr = strtok(NULL, " "); - if (adr && adr[0] != '!') { - TDF_Tool::Label(DF, adr, aLabel, 1); - if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID()); - aNode->SetPrevious(aDepNode); - } - - adr = strtok(NULL, " "); - if (adr && adr[0] != '!') { - TDF_Tool::Label(DF, adr, aLabel, 1); - if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID()); - aNode->SetNext(aDepNode); - } - - adr = strtok(NULL, " "); - if (adr && adr[0] != '!') { - TDF_Tool::Label(DF, adr, aLabel, 1); - if (!aLabel.FindAttribute(aNode->ID(), aDepNode)) aDepNode = TDataStd_TreeNode::Set(aLabel, aNode->ID()); - aNode->SetFirst(aDepNode); - } -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.hxx index 718ffc641..e57c10c7c 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeTreeNode_i.hxx @@ -1,30 +1,6 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeTreeNode_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header: #ifndef SALOMEDS_AttributeTreeNode_i_HeaderFile #define SALOMEDS_AttributeTreeNode_i_HeaderFile @@ -33,18 +9,18 @@ #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeTreeNode.hxx" -DEFINE_DERIVED_ATTR(AttributeTreeNode,TDataStd_TreeNode,false); - -class SALOMEDS_AttributeTreeNode_i: - public virtual POA_SALOMEDS::AttributeTreeNode, - public virtual SALOMEDS_TAttributeTreeNode_i -{ - DEFINE_DERIVED_ATTR_METH(AttributeTreeNode,TDataStd_TreeNode::GetDefaultTreeID()); - +class SALOMEDS_AttributeTreeNode_i: public virtual POA_SALOMEDS::AttributeTreeNode, + public virtual SALOMEDS_GenericAttribute_i { public: + + SALOMEDS_AttributeTreeNode_i(const Handle(SALOMEDSImpl_AttributeTreeNode)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; + + ~SALOMEDS_AttributeTreeNode_i() {}; + void SetFather(SALOMEDS::AttributeTreeNode_ptr value); CORBA::Boolean HasFather(); SALOMEDS::AttributeTreeNode_ptr GetFather(); @@ -71,10 +47,6 @@ public: CORBA::Boolean IsChild(SALOMEDS::AttributeTreeNode_ptr value); char* Label(); - char* Store(); - void Restore(const char*); - }; - #endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeUserID.cxx b/src/SALOMEDS/SALOMEDS_AttributeUserID.cxx new file mode 100644 index 000000000..cc120dbf6 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeUserID.cxx @@ -0,0 +1,40 @@ +// File : SALOMEDS_AttributeUserID.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_AttributeUserID.hxx" + +#include +#include +#include +#include + +SALOMEDS_AttributeUserID::SALOMEDS_AttributeUserID(const Handle(SALOMEDSImpl_AttributeUserID)& theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeUserID::SALOMEDS_AttributeUserID(SALOMEDS::AttributeUserID_ptr theAttr) +:SALOMEDS_GenericAttribute(theAttr) +{} + +SALOMEDS_AttributeUserID::~SALOMEDS_AttributeUserID() +{} + +std::string SALOMEDS_AttributeUserID::Value() +{ + std::string aValue; + if(_isLocal) { + char guid[40]; + Handle(SALOMEDSImpl_AttributeUserID)::DownCast(_local_impl)->Value().ToCString(guid); + aValue = std::string(guid); + } + else aValue = SALOMEDS::AttributeUserID::_narrow(_corba_impl)->Value(); + return aValue; +} + +void SALOMEDS_AttributeUserID::SetValue(const std::string& value) +{ + CheckLocked(); + if(_isLocal) Handle(SALOMEDSImpl_AttributeUserID)::DownCast(_local_impl)->SetValue(Standard_GUID((char*)value.c_str())); + else SALOMEDS::AttributeUserID::_narrow(_corba_impl)->SetValue(value.c_str()); +} diff --git a/src/SALOMEDS/SALOMEDS_AttributeUserID.hxx b/src/SALOMEDS/SALOMEDS_AttributeUserID.hxx new file mode 100644 index 000000000..9ff898001 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_AttributeUserID.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDS_AttributeUserID.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDS_AttributeUserID_HeaderFile +#define SALOMEDS_AttributeUserID_HeaderFile + +#include "SALOMEDSClient_AttributeUserID.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeUserID.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +class SALOMEDS_AttributeUserID: public SALOMEDS_GenericAttribute, public SALOMEDSClient_AttributeUserID +{ +public: + SALOMEDS_AttributeUserID(const Handle(SALOMEDSImpl_AttributeUserID)& theAttr); + SALOMEDS_AttributeUserID(SALOMEDS::AttributeUserID_ptr theAttr); + ~SALOMEDS_AttributeUserID(); + + virtual std::string Value(); + virtual void SetValue(const std::string& value); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_AttributeUserID_i.cxx b/src/SALOMEDS/SALOMEDS_AttributeUserID_i.cxx index 6a3d2d3cd..632d63cfc 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeUserID_i.cxx +++ b/src/SALOMEDS/SALOMEDS_AttributeUserID_i.cxx @@ -1,52 +1,28 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeName_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_AttributeUserID_i.hxx" +#include "SALOMEDS.hxx" #include using namespace std; -char* SALOMEDS_AttributeUserID_i::Value() { +char* SALOMEDS_AttributeUserID_i::Value() +{ + SALOMEDS::Locker lock; char aGUID[40]; - Handle(TDataStd_UAttribute)::DownCast(_myAttr)->ID().ToCString(aGUID); + Handle(SALOMEDSImpl_AttributeUserID)::DownCast(_impl)->ID().ToCString(aGUID); CORBA::String_var c_s = CORBA::string_dup(aGUID); return c_s._retn(); } -void SALOMEDS_AttributeUserID_i::SetValue(const char* value) { +void SALOMEDS_AttributeUserID_i::SetValue(const char* value) +{ + SALOMEDS::Locker lock; CheckLocked(); CORBA::String_var Str = CORBA::string_dup(value); - Handle(TDataStd_UAttribute)::DownCast(_myAttr)->SetID(Standard_GUID(Standard_CString(Str))); -} - -char* SALOMEDS_AttributeUserID_i::Store() { - return ""; + Handle(SALOMEDSImpl_AttributeUserID)::DownCast(_impl)->SetValue(Standard_GUID(Standard_CString(Str))); } -void SALOMEDS_AttributeUserID_i::Restore(const char* value) { -} diff --git a/src/SALOMEDS/SALOMEDS_AttributeUserID_i.hxx b/src/SALOMEDS/SALOMEDS_AttributeUserID_i.hxx index d23f6d589..34884fb91 100644 --- a/src/SALOMEDS/SALOMEDS_AttributeUserID_i.hxx +++ b/src/SALOMEDS/SALOMEDS_AttributeUserID_i.hxx @@ -1,30 +1,6 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_AttributeUserID_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header: #ifndef SALOMEDS_AttributeUserID_i_HeaderFile #define SALOMEDS_AttributeUserID_i_HeaderFile @@ -33,25 +9,28 @@ #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) -#include #include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDSImpl_AttributeUserID.hxx" -DEFINE_DERIVED_ATTR(AttributeUserID,TDataStd_UAttribute,false); +class SALOMEDS_AttributeUserID_i: public virtual POA_SALOMEDS::AttributeUserID, + public virtual SALOMEDS_GenericAttribute_i { +public: + + SALOMEDS_AttributeUserID_i(const Handle(SALOMEDSImpl_AttributeUserID)& theAttr, CORBA::ORB_ptr orb) + :SALOMEDS_GenericAttribute_i(theAttr, orb) {}; -class SALOMEDS_AttributeUserID_i: - public virtual POA_SALOMEDS::AttributeUserID, - public virtual SALOMEDS_TAttributeUserID_i -{ - DEFINE_DERIVED_ATTR_METH(AttributeUserID,"FFFFFFFF-D9CD-11d6-945D-1050DA506788"); + ~SALOMEDS_AttributeUserID_i() {}; -public: char* Value(); void SetValue(const char* value); - char* Store(); - void Restore(const char*); + static const Standard_GUID& DefaultID() { + return SALOMEDSImpl_AttributeUserID::DefaultID(); + } }; + + #endif diff --git a/src/SALOMEDS/SALOMEDS_Attributes.hxx b/src/SALOMEDS/SALOMEDS_Attributes.hxx new file mode 100644 index 000000000..2d39bb79f --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_Attributes.hxx @@ -0,0 +1,107 @@ +// File : SALOMEDS_Attributes.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_ATTRIBUTES__H__ +#define __SALOMEDS_ATTRIBUTES__H__ + +#include "SALOMEDSImpl_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeName.hxx" +#include "SALOMEDSImpl_AttributeComment.hxx" +#include "SALOMEDSImpl_AttributeInteger.hxx" +#include "SALOMEDSImpl_AttributeReal.hxx" +#include "SALOMEDSImpl_AttributeTreeNode.hxx" +#include "SALOMEDSImpl_AttributeUserID.hxx" +#include "SALOMEDSImpl_AttributeReference.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfReal.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfInteger.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" +#include "SALOMEDSImpl_AttributePersistentRef.hxx" +#include "SALOMEDSImpl_AttributeDrawable.hxx" +#include "SALOMEDSImpl_AttributeSelectable.hxx" +#include "SALOMEDSImpl_AttributeExpandable.hxx" +#include "SALOMEDSImpl_AttributeOpened.hxx" +#include "SALOMEDSImpl_AttributeTextColor.hxx" +#include "SALOMEDSImpl_AttributeTextHighlightColor.hxx" +#include "SALOMEDSImpl_AttributePixMap.hxx" +#include "SALOMEDSImpl_AttributeLocalID.hxx" +#include "SALOMEDSImpl_AttributeTarget.hxx" +#include "SALOMEDSImpl_AttributeTableOfInteger.hxx" +#include "SALOMEDSImpl_AttributeTableOfReal.hxx" +#include "SALOMEDSImpl_AttributeTableOfString.hxx" +#include "SALOMEDSImpl_AttributeStudyProperties.hxx" +#include "SALOMEDSImpl_AttributePythonObject.hxx" +#include "SALOMEDSImpl_AttributeExternalFileDef.hxx" +#include "SALOMEDSImpl_AttributeFileType.hxx" +#include "SALOMEDSImpl_AttributeFlags.hxx" +#include "SALOMEDSImpl_AttributeGraphic.hxx" + +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDS_AttributeName_i.hxx" +#include "SALOMEDS_AttributeComment_i.hxx" +#include "SALOMEDS_AttributeInteger_i.hxx" +#include "SALOMEDS_AttributeReal_i.hxx" +#include "SALOMEDS_AttributeTreeNode_i.hxx" +#include "SALOMEDS_AttributeUserID_i.hxx" +#include "SALOMEDS_AttributeSequenceOfReal_i.hxx" +#include "SALOMEDS_AttributeSequenceOfInteger_i.hxx" +#include "SALOMEDS_AttributeIOR_i.hxx" +#include "SALOMEDS_AttributePersistentRef_i.hxx" +#include "SALOMEDS_AttributeDrawable_i.hxx" +#include "SALOMEDS_AttributeSelectable_i.hxx" +#include "SALOMEDS_AttributeExpandable_i.hxx" +#include "SALOMEDS_AttributeOpened_i.hxx" +#include "SALOMEDS_AttributeTextColor_i.hxx" +#include "SALOMEDS_AttributeTextHighlightColor_i.hxx" +#include "SALOMEDS_AttributePixMap_i.hxx" +#include "SALOMEDS_AttributeLocalID_i.hxx" +#include "SALOMEDS_AttributeTarget_i.hxx" +#include "SALOMEDS_AttributeTableOfInteger_i.hxx" +#include "SALOMEDS_AttributeTableOfReal_i.hxx" +#include "SALOMEDS_AttributeTableOfString_i.hxx" +#include "SALOMEDS_AttributeStudyProperties_i.hxx" +#include "SALOMEDS_AttributePythonObject_i.hxx" +#include "SALOMEDS_AttributeExternalFileDef_i.hxx" +#include "SALOMEDS_AttributeFileType_i.hxx" +#include "SALOMEDS_AttributeFlags_i.hxx" +#include "SALOMEDS_AttributeGraphic_i.hxx" + +#define __CreateCORBAAttribute(CORBA_Name) if (strcmp(aTypeOfAttribute, #CORBA_Name) == 0) { \ + Handle(SALOMEDSImpl_##CORBA_Name) A = Handle(SALOMEDSImpl_##CORBA_Name)::DownCast(theAttr); \ + SALOMEDS_##CORBA_Name##_i* Attr = new SALOMEDS_##CORBA_Name##_i(A, theOrb); \ + attr_servant = Attr; \ + anAttribute = Attr->CORBA_Name::_this(); \ + } + + +#define __CreateGenericCORBAAttribute \ +__CreateCORBAAttribute(AttributeReal) \ +__CreateCORBAAttribute(AttributeInteger) \ +__CreateCORBAAttribute(AttributeSequenceOfReal) \ +__CreateCORBAAttribute(AttributeSequenceOfInteger) \ +__CreateCORBAAttribute(AttributeName) \ +__CreateCORBAAttribute(AttributeComment) \ +__CreateCORBAAttribute(AttributeIOR) \ +__CreateCORBAAttribute(AttributePixMap) \ +__CreateCORBAAttribute(AttributeLocalID) \ +__CreateCORBAAttribute(AttributeTableOfInteger) \ +__CreateCORBAAttribute(AttributeTableOfReal) \ +__CreateCORBAAttribute(AttributeTableOfString) \ +__CreateCORBAAttribute(AttributePythonObject) \ +__CreateCORBAAttribute(AttributePersistentRef) \ +__CreateCORBAAttribute(AttributeDrawable) \ +__CreateCORBAAttribute(AttributeSelectable) \ +__CreateCORBAAttribute(AttributeExpandable) \ +__CreateCORBAAttribute(AttributeOpened) \ +__CreateCORBAAttribute(AttributeTextColor) \ +__CreateCORBAAttribute(AttributeTextHighlightColor) \ +__CreateCORBAAttribute(AttributeTarget) \ +__CreateCORBAAttribute(AttributeStudyProperties) \ +__CreateCORBAAttribute(AttributeExternalFileDef) \ +__CreateCORBAAttribute(AttributeFileType) \ +__CreateCORBAAttribute(AttributeFlags) \ +__CreateCORBAAttribute(AttributeGraphic) \ +__CreateCORBAAttribute(AttributeTreeNode) \ +__CreateCORBAAttribute(AttributeUserID) + +#endif diff --git a/src/SALOMEDS/SALOMEDS_ChildIterator.cxx b/src/SALOMEDS/SALOMEDS_ChildIterator.cxx new file mode 100644 index 000000000..e9dd1d4bc --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_ChildIterator.cxx @@ -0,0 +1,63 @@ +// File : SALOMEDS_ChildIterator.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include "SALOMEDS_ChildIterator.hxx" +#include "SALOMEDS_SObject.hxx" + +using namespace std; + +SALOMEDS_ChildIterator::SALOMEDS_ChildIterator(const Handle(SALOMEDSImpl_ChildIterator)& theIterator) +{ + _isLocal = true; + _local_impl = theIterator; + _corba_impl = SALOMEDS::ChildIterator::_nil(); +} + +SALOMEDS_ChildIterator::SALOMEDS_ChildIterator(SALOMEDS::ChildIterator_ptr theIterator) +{ + _isLocal = false; + _local_impl = NULL; + _corba_impl = SALOMEDS::ChildIterator::_duplicate(theIterator); +} + +SALOMEDS_ChildIterator::~SALOMEDS_ChildIterator() +{ + if(!_isLocal) _corba_impl->Destroy(); +} + +void SALOMEDS_ChildIterator::Init() +{ + if(_isLocal) _local_impl->Init(); + else _corba_impl->Init(); +} + +void SALOMEDS_ChildIterator::InitEx(bool theAllLevels) +{ + if(_isLocal) _local_impl->InitEx(theAllLevels); + else _corba_impl->InitEx(theAllLevels); +} + +bool SALOMEDS_ChildIterator::More() +{ + bool ret; + if(_isLocal) ret = _local_impl->More(); + else ret = _corba_impl->More(); + return ret; +} + +void SALOMEDS_ChildIterator::Next() +{ + if(_isLocal) _local_impl->Next(); + else _corba_impl->Next(); +} + +_PTR(SObject) SALOMEDS_ChildIterator::Value() +{ + SALOMEDSClient_SObject* aSO; + if(_isLocal) aSO = new SALOMEDS_SObject(_local_impl->Value()); + else aSO = new SALOMEDS_SObject(_corba_impl->Value()); + return _PTR(SObject)(aSO); +} diff --git a/src/SALOMEDS/SALOMEDS_ChildIterator.hxx b/src/SALOMEDS/SALOMEDS_ChildIterator.hxx new file mode 100644 index 000000000..127611f9b --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_ChildIterator.hxx @@ -0,0 +1,34 @@ +// File : SALOMEDS_ChildIterator.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_CHILDITERATOR_H__ +#define __SALOMEDS_CHILDITERATOR_H__ + +#include "SALOMEDSClient.hxx" +#include "SALOMEDSImpl_ChildIterator.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +class SALOMEDS_ChildIterator: public SALOMEDSClient_ChildIterator +{ +private: + bool _isLocal; + Handle(SALOMEDSImpl_ChildIterator) _local_impl; + SALOMEDS::ChildIterator_var _corba_impl; + +public: + + SALOMEDS_ChildIterator(const Handle(SALOMEDSImpl_ChildIterator)& theIterator); + SALOMEDS_ChildIterator(SALOMEDS::ChildIterator_ptr theIterator); + ~SALOMEDS_ChildIterator(); + + virtual void Init(); + virtual void InitEx(bool theAllLevels); + virtual bool More(); + virtual void Next(); + virtual _PTR(SObject) Value(); +}; +#endif diff --git a/src/SALOMEDS/SALOMEDS_ChildIterator_i.cxx b/src/SALOMEDS/SALOMEDS_ChildIterator_i.cxx index d256bb669..d57b0971c 100644 --- a/src/SALOMEDS/SALOMEDS_ChildIterator_i.cxx +++ b/src/SALOMEDS/SALOMEDS_ChildIterator_i.cxx @@ -1,35 +1,13 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_ChildIterator_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#include #include "SALOMEDS_ChildIterator_i.hxx" #include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDS.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_Study.hxx" #include "utilities.h" using namespace std; @@ -39,13 +17,12 @@ using namespace std; * Purpose : */ //============================================================================ -SALOMEDS_ChildIterator_i::SALOMEDS_ChildIterator_i(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel, - bool theIsAllLevels): - _it(theLabel,theIsAllLevels), - _lab(theLabel), - _study(theStudy) +SALOMEDS_ChildIterator_i::SALOMEDS_ChildIterator_i(const Handle(SALOMEDSImpl_ChildIterator)& theImpl, + CORBA::ORB_ptr orb) + : _it(theImpl) { + SALOMEDS::Locker lock; + _orb = CORBA::ORB::_duplicate(orb); } //============================================================================ @@ -64,7 +41,8 @@ SALOMEDS_ChildIterator_i::~SALOMEDS_ChildIterator_i() //============================================================================ void SALOMEDS_ChildIterator_i::Init() { - _it.Initialize(_lab); + SALOMEDS::Locker lock; + _it->Init(); } //============================================================================ @@ -72,9 +50,10 @@ void SALOMEDS_ChildIterator_i::Init() * */ //============================================================================ -void SALOMEDS_ChildIterator_i::InitEx(CORBA::Boolean theIsAllLevels) +void SALOMEDS_ChildIterator_i::InitEx(CORBA::Boolean allLevels) { - _it.Initialize(_lab,theIsAllLevels); + SALOMEDS::Locker lock; + _it->InitEx (allLevels); } //============================================================================ @@ -84,7 +63,8 @@ void SALOMEDS_ChildIterator_i::InitEx(CORBA::Boolean theIsAllLevels) //============================================================================ CORBA::Boolean SALOMEDS_ChildIterator_i::More() { - return _it.More(); + SALOMEDS::Locker lock; + return _it->More(); } //============================================================================ @@ -94,22 +74,22 @@ CORBA::Boolean SALOMEDS_ChildIterator_i::More() //============================================================================ void SALOMEDS_ChildIterator_i::Next() { - _it.Next(); + SALOMEDS::Locker lock; + _it->Next(); } //============================================================================ -/*! Function : +/*! Function : Value * Purpose : */ //============================================================================ SALOMEDS::SObject_ptr SALOMEDS_ChildIterator_i::Value() { - return SALOMEDS_SObject_i::NewRef(_study,_it.Value())._retn(); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_SObject) aSO = _it->Value(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } -SALOMEDS_SObject_i* SALOMEDS_ChildIterator_i::GetValue() -{ - return SALOMEDS_SObject_i::NewPtr(_study,_it.Value()); -} diff --git a/src/SALOMEDS/SALOMEDS_ChildIterator_i.hxx b/src/SALOMEDS/SALOMEDS_ChildIterator_i.hxx index dc7cfbe9c..e2baa2071 100644 --- a/src/SALOMEDS/SALOMEDS_ChildIterator_i.hxx +++ b/src/SALOMEDS/SALOMEDS_ChildIterator_i.hxx @@ -1,71 +1,41 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_ChildIterator_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef __SALOMEDS_CHILDITERATOR_I_H__ #define __SALOMEDS_CHILDITERATOR_I_H__ +// std C++ headers +#include + // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS) +#include // Cascade headers -#include -#include - -class SALOMEDS_Study_i; -class SALOMEDS_SObject_i; +#include "SALOMEDSImpl_ChildIterator.hxx" +#include -class SALOMEDS_ChildIterator_i: public POA_SALOMEDS::ChildIterator, - public PortableServer::RefCountServantBase +class SALOMEDS_ChildIterator_i: public virtual POA_SALOMEDS::ChildIterator, + public virtual PortableServer::RefCountServantBase, + public virtual SALOME::GenericObj_i { - SALOMEDS_ChildIterator_i(); // Not implemented - void operator=(const SALOMEDS_ChildIterator_i&); // Not implemented - private: - SALOMEDS_Study_i* _study; - TDF_Label _lab; - TDF_ChildIterator _it; - + CORBA::ORB_ptr _orb; + Handle(SALOMEDSImpl_ChildIterator) _it; public: - SALOMEDS_ChildIterator_i(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel, - bool theIsAllLevels = false); + //! standard constructor + SALOMEDS_ChildIterator_i(const Handle(SALOMEDSImpl_ChildIterator)&, CORBA::ORB_ptr); + + //! standard destructor ~SALOMEDS_ChildIterator_i(); - SALOMEDS_SObject_i* GetValue(); - virtual void Init(); virtual void InitEx(CORBA::Boolean); virtual CORBA::Boolean More(); virtual void Next(); virtual SALOMEDS::SObject_ptr Value(); }; - - #endif diff --git a/src/SALOMEDS/SALOMEDS_Client.cxx b/src/SALOMEDS/SALOMEDS_Client.cxx index a0cc035ce..8a19fe9e2 100644 --- a/src/SALOMEDS/SALOMEDS_Client.cxx +++ b/src/SALOMEDS/SALOMEDS_Client.cxx @@ -31,6 +31,7 @@ #include "SALOMEDS_StudyManager_i.hxx" #include "utilities.h" #include "SALOMEDS_AttributeName_i.hxx" +#include "HDFOI.hxx" using namespace std; //============================================================================ diff --git a/src/SALOMEDS/SALOMEDS_ClientAttributes.hxx b/src/SALOMEDS/SALOMEDS_ClientAttributes.hxx new file mode 100644 index 000000000..9f45d7e75 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_ClientAttributes.hxx @@ -0,0 +1,140 @@ +// File : SALOMEDS_Attributes.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSCLIENT_ATTRIBUTES__H__ +#define __SALOMEDSCLIENT_ATTRIBUTES__H__ + +#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) + +#include "SALOMEDSImpl_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeName.hxx" +#include "SALOMEDSImpl_AttributeComment.hxx" +#include "SALOMEDSImpl_AttributeInteger.hxx" +#include "SALOMEDSImpl_AttributeReal.hxx" +#include "SALOMEDSImpl_AttributeTreeNode.hxx" +#include "SALOMEDSImpl_AttributeUserID.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfReal.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfInteger.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" +#include "SALOMEDSImpl_AttributePersistentRef.hxx" +#include "SALOMEDSImpl_AttributeDrawable.hxx" +#include "SALOMEDSImpl_AttributeSelectable.hxx" +#include "SALOMEDSImpl_AttributeExpandable.hxx" +#include "SALOMEDSImpl_AttributeOpened.hxx" +#include "SALOMEDSImpl_AttributeTextColor.hxx" +#include "SALOMEDSImpl_AttributeTextHighlightColor.hxx" +#include "SALOMEDSImpl_AttributePixMap.hxx" +#include "SALOMEDSImpl_AttributeLocalID.hxx" +#include "SALOMEDSImpl_AttributeTarget.hxx" +#include "SALOMEDSImpl_AttributeTableOfInteger.hxx" +#include "SALOMEDSImpl_AttributeTableOfReal.hxx" +#include "SALOMEDSImpl_AttributeTableOfString.hxx" +#include "SALOMEDSImpl_AttributeStudyProperties.hxx" +#include "SALOMEDSImpl_AttributePythonObject.hxx" +#include "SALOMEDSImpl_AttributeExternalFileDef.hxx" +#include "SALOMEDSImpl_AttributeFileType.hxx" +#include "SALOMEDSImpl_AttributeFlags.hxx" +#include "SALOMEDSImpl_AttributeGraphic.hxx" + +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDS_AttributeName.hxx" +#include "SALOMEDS_AttributeComment.hxx" +#include "SALOMEDS_AttributeInteger.hxx" +#include "SALOMEDS_AttributeReal.hxx" +#include "SALOMEDS_AttributeTreeNode.hxx" +#include "SALOMEDS_AttributeUserID.hxx" +#include "SALOMEDS_AttributeSequenceOfReal.hxx" +#include "SALOMEDS_AttributeSequenceOfInteger.hxx" +#include "SALOMEDS_AttributeIOR.hxx" +#include "SALOMEDS_AttributePersistentRef.hxx" +#include "SALOMEDS_AttributeDrawable.hxx" +#include "SALOMEDS_AttributeSelectable.hxx" +#include "SALOMEDS_AttributeExpandable.hxx" +#include "SALOMEDS_AttributeOpened.hxx" +#include "SALOMEDS_AttributeTextColor.hxx" +#include "SALOMEDS_AttributeTextHighlightColor.hxx" +#include "SALOMEDS_AttributePixMap.hxx" +#include "SALOMEDS_AttributeLocalID.hxx" +#include "SALOMEDS_AttributeTarget.hxx" +#include "SALOMEDS_AttributeTableOfInteger.hxx" +#include "SALOMEDS_AttributeTableOfReal.hxx" +#include "SALOMEDS_AttributeTableOfString.hxx" +#include "SALOMEDS_AttributeStudyProperties.hxx" +#include "SALOMEDS_AttributePythonObject.hxx" +#include "SALOMEDS_AttributeExternalFileDef.hxx" +#include "SALOMEDS_AttributeFileType.hxx" +#include "SALOMEDS_AttributeFlags.hxx" +#include "SALOMEDS_AttributeGraphic.hxx" + +#define __CreateClientAttributeLocal(CORBA_Name) if (strcmp(aTypeOfAttribute.c_str(), #CORBA_Name) == 0) { \ + Handle(SALOMEDSImpl_##CORBA_Name) A = Handle(SALOMEDSImpl_##CORBA_Name)::DownCast(theGA); \ + aGA = new SALOMEDS_##CORBA_Name(A); \ + } + +#define __CreateClientAttributeCORBA(CORBA_Name) if (strcmp(aTypeOfAttribute.c_str(), #CORBA_Name) == 0) { \ + SALOMEDS::CORBA_Name##_var A = SALOMEDS::CORBA_Name::_narrow(theGA); \ + aGA = new SALOMEDS_##CORBA_Name(A); \ + } + +#define __CreateGenericClientAttributeLocal \ +__CreateClientAttributeLocal(AttributeReal) \ +__CreateClientAttributeLocal(AttributeInteger) \ +__CreateClientAttributeLocal(AttributeSequenceOfReal) \ +__CreateClientAttributeLocal(AttributeSequenceOfInteger) \ +__CreateClientAttributeLocal(AttributeName) \ +__CreateClientAttributeLocal(AttributeComment) \ +__CreateClientAttributeLocal(AttributeIOR) \ +__CreateClientAttributeLocal(AttributePixMap) \ +__CreateClientAttributeLocal(AttributeLocalID) \ +__CreateClientAttributeLocal(AttributeTableOfInteger) \ +__CreateClientAttributeLocal(AttributeTableOfReal) \ +__CreateClientAttributeLocal(AttributeTableOfString) \ +__CreateClientAttributeLocal(AttributePythonObject) \ +__CreateClientAttributeLocal(AttributePersistentRef) \ +__CreateClientAttributeLocal(AttributeDrawable) \ +__CreateClientAttributeLocal(AttributeSelectable) \ +__CreateClientAttributeLocal(AttributeExpandable) \ +__CreateClientAttributeLocal(AttributeOpened) \ +__CreateClientAttributeLocal(AttributeTextColor) \ +__CreateClientAttributeLocal(AttributeTextHighlightColor) \ +__CreateClientAttributeLocal(AttributeTarget) \ +__CreateClientAttributeLocal(AttributeStudyProperties) \ +__CreateClientAttributeLocal(AttributeExternalFileDef) \ +__CreateClientAttributeLocal(AttributeFileType) \ +__CreateClientAttributeLocal(AttributeFlags) \ +__CreateClientAttributeLocal(AttributeGraphic) \ +__CreateClientAttributeLocal(AttributeTreeNode) \ +__CreateClientAttributeLocal(AttributeUserID) + +#define __CreateGenericClientAttributeCORBA \ +__CreateClientAttributeCORBA(AttributeReal) \ +__CreateClientAttributeCORBA(AttributeInteger) \ +__CreateClientAttributeCORBA(AttributeSequenceOfReal) \ +__CreateClientAttributeCORBA(AttributeSequenceOfInteger) \ +__CreateClientAttributeCORBA(AttributeName) \ +__CreateClientAttributeCORBA(AttributeComment) \ +__CreateClientAttributeCORBA(AttributeIOR) \ +__CreateClientAttributeCORBA(AttributePixMap) \ +__CreateClientAttributeCORBA(AttributeLocalID) \ +__CreateClientAttributeCORBA(AttributeTableOfInteger) \ +__CreateClientAttributeCORBA(AttributeTableOfReal) \ +__CreateClientAttributeCORBA(AttributeTableOfString) \ +__CreateClientAttributeCORBA(AttributePythonObject) \ +__CreateClientAttributeCORBA(AttributePersistentRef) \ +__CreateClientAttributeCORBA(AttributeDrawable) \ +__CreateClientAttributeCORBA(AttributeSelectable) \ +__CreateClientAttributeCORBA(AttributeExpandable) \ +__CreateClientAttributeCORBA(AttributeOpened) \ +__CreateClientAttributeCORBA(AttributeTextColor) \ +__CreateClientAttributeCORBA(AttributeTextHighlightColor) \ +__CreateClientAttributeCORBA(AttributeTarget) \ +__CreateClientAttributeCORBA(AttributeStudyProperties) \ +__CreateClientAttributeCORBA(AttributeExternalFileDef) \ +__CreateClientAttributeCORBA(AttributeFileType) \ +__CreateClientAttributeCORBA(AttributeFlags) \ +__CreateClientAttributeCORBA(AttributeGraphic) \ +__CreateClientAttributeCORBA(AttributeTreeNode) \ +__CreateClientAttributeCORBA(AttributeUserID) + +#endif diff --git a/src/SALOMEDS/SALOMEDS_Driver_i.cxx b/src/SALOMEDS/SALOMEDS_Driver_i.cxx new file mode 100644 index 000000000..12a1848d6 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_Driver_i.cxx @@ -0,0 +1,251 @@ + + +#include "SALOMEDS_Driver_i.hxx" +#include "utilities.h" +#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDS_SComponent_i.hxx" +#include "SALOMEDS_Study_i.hxx" +#include "SALOMEDS.hxx" +#include + +using namespace std; + +SALOMEDS_Driver_i::~SALOMEDS_Driver_i() +{ +} + +unsigned char* SALOMEDS_Driver_i::Save(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const TCollection_AsciiString& theURL, + long& theStreamLength, + bool isMultiFile) +{ + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (theComponent, _orb); + SALOMEDS::TMPFile_var aStream; + CORBA::String_var url = CORBA::string_dup(theURL.ToCString()); + SALOMEDS::unlock(); + aStream = _driver->Save(sco.in(), url, isMultiFile); + theStreamLength = aStream->length(); + unsigned char* aRetStream = NULL; + if(theStreamLength > 0) { + aRetStream = new unsigned char[theStreamLength]; + memcpy(aRetStream, aStream->NP_data(), theStreamLength); + } + return aRetStream; +} + +unsigned char* SALOMEDS_Driver_i::SaveASCII(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const TCollection_AsciiString& theURL, + long& theStreamLength, + bool isMultiFile) +{ + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (theComponent, _orb); + SALOMEDS::TMPFile_var aStream; + CORBA::String_var url = CORBA::string_dup(theURL.ToCString()); + SALOMEDS::unlock(); + aStream = _driver->SaveASCII(sco.in(), url, isMultiFile); + theStreamLength = aStream->length(); + unsigned char* aRetStream = NULL; + if(theStreamLength > 0) { + aRetStream = new unsigned char[theStreamLength]; + memcpy(aRetStream, aStream->NP_data(), theStreamLength); + } + return aRetStream; +} + +bool SALOMEDS_Driver_i::Load(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const unsigned char* theStream, + const long theStreamLength, + const TCollection_AsciiString& theURL, + bool isMultiFile) +{ + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (theComponent, _orb); + CORBA::String_var url = CORBA::string_dup(theURL.ToCString()); + CORBA::Octet* anOctetBuf = (CORBA::Octet*)theStream; + + SALOMEDS::TMPFile_var aStream; + if(theStreamLength > 0) + aStream = new SALOMEDS::TMPFile(theStreamLength, theStreamLength, anOctetBuf, 0); + else + aStream = new SALOMEDS::TMPFile(0); + + SALOMEDS::unlock(); + return _driver->Load(sco.in(), aStream.in(), url, isMultiFile); +} + +bool SALOMEDS_Driver_i::LoadASCII(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const unsigned char* theStream, + const long theStreamLength, + const TCollection_AsciiString& theURL, + bool isMultiFile) +{ + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (theComponent, _orb); + CORBA::String_var url = CORBA::string_dup(theURL.ToCString()); + CORBA::Octet* anOctetBuf = (CORBA::Octet*)theStream; + + SALOMEDS::TMPFile_var aStream; + if(theStreamLength > 0) + aStream = new SALOMEDS::TMPFile(theStreamLength, theStreamLength, anOctetBuf, 0); + else + aStream = new SALOMEDS::TMPFile(0); + + SALOMEDS::unlock(); + return _driver->LoadASCII(sco.in(), aStream.in(), url, isMultiFile); +} + +void SALOMEDS_Driver_i::Close(const Handle(SALOMEDSImpl_SComponent)& theComponent) +{ + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (theComponent, _orb); + SALOMEDS::unlock(); + _driver->Close(sco.in()); +} + + + +TCollection_AsciiString SALOMEDS_Driver_i::IORToLocalPersistentID(const Handle(SALOMEDSImpl_SObject)& theSObject, + const TCollection_AsciiString& IORString, + bool isMultiFile, + bool isASCII) +{ + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (theSObject, _orb); + CORBA::String_var ior = CORBA::string_dup(IORString.ToCString()); + SALOMEDS::unlock(); + CORBA::String_var pers_string =_driver->IORToLocalPersistentID(so.in(), ior.in(), isMultiFile, isASCII); + return TCollection_AsciiString(pers_string); +} + + +TCollection_AsciiString SALOMEDS_Driver_i::LocalPersistentIDToIOR(const Handle(SALOMEDSImpl_SObject)& theObject, + const TCollection_AsciiString& aLocalPersistentID, + bool isMultiFile, + bool isASCII) +{ + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (theObject, _orb); + CORBA::String_var pers_string = CORBA::string_dup(aLocalPersistentID.ToCString()); + SALOMEDS::unlock(); + CORBA::String_var IOR =_driver->LocalPersistentIDToIOR(so.in(), pers_string.in(), isMultiFile, isASCII); + return TCollection_AsciiString(IOR); +} + +bool SALOMEDS_Driver_i::CanCopy(const Handle(SALOMEDSImpl_SObject)& theObject) +{ + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (theObject, _orb); + SALOMEDS::unlock(); + return _driver->CanCopy(so.in()); +} + + +unsigned char* SALOMEDS_Driver_i::CopyFrom(const Handle(SALOMEDSImpl_SObject)& theObject, + int& theObjectID, + long& theStreamLength) +{ + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (theObject, _orb); + SALOMEDS::TMPFile_var aStream; + CORBA::Long anObjectID; + + SALOMEDS::unlock(); + aStream = _driver->CopyFrom(so.in(), anObjectID); + + theObjectID = anObjectID; + theStreamLength = aStream->length(); + + unsigned char* aRetStream = NULL; + if(theStreamLength > 0) { + aRetStream = new unsigned char[theStreamLength]; + memcpy(aRetStream, aStream->NP_data(), theStreamLength); + } + + return aRetStream; +} + +bool SALOMEDS_Driver_i::CanPaste(const TCollection_AsciiString& theComponentName, int theObjectID) +{ + SALOMEDS::unlock(); + return _driver->CanPaste(theComponentName.ToCString(), theObjectID); +} + +TCollection_AsciiString SALOMEDS_Driver_i::PasteInto(const unsigned char* theStream, + const long theStreamLength, + int theObjectID, + const Handle(SALOMEDSImpl_SObject)& theObject) +{ + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (theObject, _orb); + CORBA::Octet* anOctetBuf = (CORBA::Octet*)theStream; + + SALOMEDS::TMPFile_var aStream; + if(theStreamLength > 0) + aStream = new SALOMEDS::TMPFile(theStreamLength, theStreamLength, anOctetBuf, 0); + else + aStream = new SALOMEDS::TMPFile(0); + + SALOMEDS::unlock(); + SALOMEDS::SObject_var ret_so = _driver->PasteInto(aStream.in(), theObjectID, so.in()); + + return TCollection_AsciiString((char*)ret_so->GetID()); +} + +unsigned char* SALOMEDS_Driver_i::DumpPython(const Handle(SALOMEDSImpl_Study)& theStudy, + bool isPublished, + bool& isValidScript, + long& theStreamLength) +{ + SALOMEDS_Study_i * st_servant = new SALOMEDS_Study_i (theStudy, _orb); + SALOMEDS::Study_var st = SALOMEDS::Study::_narrow(st_servant->_this()); + Engines::TMPFile_var aStream; + CORBA::Boolean aValidScript, aPublished; + aPublished = isPublished; + Engines::Component_ptr aComponent = Engines::Component::_narrow(_driver); + SALOMEDS::unlock(); + aStream = aComponent->DumpPython(st.in(), aPublished, aValidScript); + SALOMEDS::lock(); + isValidScript = aValidScript; + theStreamLength = aStream->length(); + unsigned char* aRetStream = NULL; + + if(theStreamLength > 0) { + aRetStream = new unsigned char[theStreamLength]; + memcpy(aRetStream, aStream->NP_data(), theStreamLength); + } + + return aRetStream; +} + +//############################################################################################################### +// SALOMEDS_DriverFactory +//############################################################################################################### + +SALOMEDSImpl_Driver* SALOMEDS_DriverFactory_i::GetDriverByType(const TCollection_AsciiString& theComponentType) +{ + CORBA::Object_var obj; + + TCollection_AsciiString aFactoryType; + if (theComponentType == "SUPERV") aFactoryType = "SuperVisionContainer"; + else aFactoryType = "FactoryServer"; + + SALOMEDS::unlock(); + obj = SALOME_LifeCycleCORBA(_name_service).FindOrLoad_Component(aFactoryType.ToCString(), + theComponentType.ToCString()); + + if (CORBA::is_nil(obj)) { + obj = SALOME_LifeCycleCORBA(_name_service).FindOrLoad_Component("FactoryServerPy", theComponentType.ToCString()); + } + + if (!CORBA::is_nil(obj)) { + SALOMEDS::Driver_var aDriver = SALOMEDS::Driver::_narrow(obj); + return new SALOMEDS_Driver_i(aDriver, _orb); + } + + return NULL; +} + +SALOMEDSImpl_Driver* SALOMEDS_DriverFactory_i::GetDriverByIOR(const TCollection_AsciiString& theIOR) +{ + CORBA::Object_var obj; + obj = _orb->string_to_object(theIOR.ToCString()); + + if (!CORBA::is_nil(obj)) { + SALOMEDS::Driver_var aDriver = SALOMEDS::Driver::_narrow(obj); + return new SALOMEDS_Driver_i(aDriver, _orb); + } + + return NULL; +} diff --git a/src/SALOMEDS/SALOMEDS_Driver_i.hxx b/src/SALOMEDS/SALOMEDS_Driver_i.hxx new file mode 100644 index 000000000..14abb3bbe --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_Driver_i.hxx @@ -0,0 +1,124 @@ +#ifndef __SALOMEDS_DRIVER_I_H__ +#define __SALOMEDS_DRIVER_I_H__ + +#include +#include +#include "SALOMEDSImpl_Driver.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_SObject.hxx" + +#include +#include CORBA_SERVER_HEADER(SALOMEDS) +#include CORBA_SERVER_HEADER(SALOME_Component) + +class Standard_EXPORT SALOMEDS_Driver_i : public virtual SALOMEDSImpl_Driver +{ +protected: + SALOMEDS::Driver_var _driver; + CORBA::ORB_var _orb; + +public: + + SALOMEDS_Driver_i(SALOMEDS::Driver_ptr theDriver, CORBA::ORB_ptr theORB) + { + _driver = SALOMEDS::Driver::_duplicate(theDriver); + _orb = CORBA::ORB::_duplicate(theORB); + } + + ~SALOMEDS_Driver_i(); + + virtual TCollection_AsciiString GetIOR() + { + CORBA::String_var ior = _orb->object_to_string(_driver); + return TCollection_AsciiString(ior); + } + + virtual unsigned char* Save(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const TCollection_AsciiString& theURL, + long& theStreamLength, + bool isMultiFile); + + virtual unsigned char* SaveASCII(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const TCollection_AsciiString& theURL, + long& theStreamLength, + bool isMultiFile); + + virtual bool Load(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const unsigned char* theStream, + const long theStreamLength, + const TCollection_AsciiString& theURL, + bool isMultiFile); + + virtual bool LoadASCII(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const unsigned char* theStream, + const long theStreamLength, + const TCollection_AsciiString& theURL, + bool isMultiFile); + + virtual void Close(const Handle(SALOMEDSImpl_SComponent)& theComponent); + + virtual TCollection_AsciiString ComponentDataType() + { + CORBA::String_var ior = _driver->ComponentDataType(); + return TCollection_AsciiString(ior); + } + + + virtual TCollection_AsciiString IORToLocalPersistentID(const Handle(SALOMEDSImpl_SObject)& theSObject, + const TCollection_AsciiString& IORString, + bool isMultiFile, + bool isASCII); + + virtual TCollection_AsciiString LocalPersistentIDToIOR(const Handle(SALOMEDSImpl_SObject)& theSObject, + const TCollection_AsciiString& aLocalPersistentID, + bool isMultiFile, + bool isASCII); + + virtual bool CanCopy(const Handle(SALOMEDSImpl_SObject)& theObject); + + virtual unsigned char* CopyFrom(const Handle(SALOMEDSImpl_SObject)& theObject, + int& theObjectID, + long& theStreamLength); + + virtual bool CanPaste(const TCollection_AsciiString& theComponentName, int theObjectID); + + virtual TCollection_AsciiString PasteInto(const unsigned char* theStream, + const long theStreamLength, + int theObjectID, + const Handle(SALOMEDSImpl_SObject)& theObject); + + virtual unsigned char* DumpPython(const Handle(SALOMEDSImpl_Study)& theStudy, + bool isPublished, + bool& isValidScript, + long& theStreamLength); +}; + +#include "SALOME_NamingService.hxx" +#include "SALOME_LifeCycleCORBA.hxx" + +class SALOMEDS_DriverFactory_i : public virtual SALOMEDSImpl_DriverFactory +{ +protected: + CORBA::ORB_ptr _orb; + SALOME_NamingService* _name_service; + +public: + + SALOMEDS_DriverFactory_i(CORBA::ORB_ptr theORB) + { + _orb = CORBA::ORB::_duplicate(theORB); + _name_service = new SALOME_NamingService(_orb); + } + + + ~SALOMEDS_DriverFactory_i() + { + delete _name_service; + } + + virtual SALOMEDSImpl_Driver* GetDriverByType(const TCollection_AsciiString& theComponentType); + + virtual SALOMEDSImpl_Driver* GetDriverByIOR(const TCollection_AsciiString& theIOR); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_GenericAttribute.cxx b/src/SALOMEDS/SALOMEDS_GenericAttribute.cxx new file mode 100644 index 000000000..c1c4e23c4 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_GenericAttribute.cxx @@ -0,0 +1,127 @@ +// File : SALOMEDS_GenericAttribute.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include +#include + +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDS_SObject.hxx" +#include "SALOMEDS_ClientAttributes.hxx" + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include "OpUtil.hxx" + +using namespace std; + +SALOMEDS_GenericAttribute::SALOMEDS_GenericAttribute(const Handle(SALOMEDSImpl_GenericAttribute)& theGA) +{ + _isLocal = true; + _local_impl = theGA; + _corba_impl = SALOMEDS::GenericAttribute::_nil(); +} + +SALOMEDS_GenericAttribute::SALOMEDS_GenericAttribute(SALOMEDS::GenericAttribute_ptr theGA) +{ +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + + long addr = theGA->GetLocalImpl(GetHostname().c_str(), pid, _isLocal); + if(_isLocal) { + _local_impl = ((SALOMEDSImpl_GenericAttribute*)(addr)); + _corba_impl = SALOMEDS::GenericAttribute::_nil(); + } + else { + _local_impl = NULL; + _corba_impl = SALOMEDS::GenericAttribute::_duplicate(theGA); + } +} + +SALOMEDS_GenericAttribute::~SALOMEDS_GenericAttribute() +{ + if (!_isLocal) { + _corba_impl->Destroy(); + } +} + +void SALOMEDS_GenericAttribute::CheckLocked() +{ + if(_isLocal) { + try { + _local_impl->CheckLocked(); + } + catch(...) { + throw SALOMEDS::GenericAttribute::LockProtection(); + } + } + else { + _corba_impl->CheckLocked(); + } +} + +std::string SALOMEDS_GenericAttribute::Type() +{ + std::string aType; + if(_isLocal) { + aType = _local_impl->Type().ToCString(); + } + else { + aType = _corba_impl->Type(); + } + return aType; +} + +std::string SALOMEDS_GenericAttribute::GetClassType() +{ + std::string aType; + if(_isLocal) { + aType = _local_impl->GetClassType().ToCString(); + } + else { + aType = _corba_impl->GetClassType(); + } + return aType; +} + +_PTR(SObject) SALOMEDS_GenericAttribute::GetSObject() +{ + SALOMEDSClient_SObject* aSO = NULL; + if(_isLocal) { + aSO = new SALOMEDS_SObject(_local_impl->GetSObject()); + } + else { + aSO = new SALOMEDS_SObject(_corba_impl->GetSObject()); + } + + return _PTR(SObject)(aSO); +} + + +SALOMEDS_GenericAttribute* SALOMEDS_GenericAttribute::CreateAttribute(const Handle(SALOMEDSImpl_GenericAttribute)& theGA) +{ + SALOMEDS_GenericAttribute* aGA = NULL; + std::string aTypeOfAttribute = theGA->GetClassType().ToCString(); + __CreateGenericClientAttributeLocal + return aGA; +} + +SALOMEDS_GenericAttribute* SALOMEDS_GenericAttribute::CreateAttribute(SALOMEDS::GenericAttribute_ptr theGA) +{ + SALOMEDS_GenericAttribute* aGA = NULL; + std::string aTypeOfAttribute = theGA->GetClassType(); + __CreateGenericClientAttributeCORBA + return aGA; +} + diff --git a/src/SALOMEDS/SALOMEDS_GenericAttribute.hxx b/src/SALOMEDS/SALOMEDS_GenericAttribute.hxx new file mode 100644 index 000000000..8e7e4164d --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_GenericAttribute.hxx @@ -0,0 +1,38 @@ +// File : SALOMEDS_GenericAttribute.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _GENERIC_ATTRIBUTE_HXX_ +#define _GENERIC_ATTRIBUTE_HXX_ + +#include +#include "SALOMEDSClient.hxx" +#include "SALOMEDSImpl_GenericAttribute.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + + +class Standard_EXPORT SALOMEDS_GenericAttribute: public virtual SALOMEDSClient_GenericAttribute +{ +protected: + bool _isLocal; + Handle(SALOMEDSImpl_GenericAttribute) _local_impl; + SALOMEDS::GenericAttribute_var _corba_impl; + +public: + SALOMEDS_GenericAttribute(const Handle(SALOMEDSImpl_GenericAttribute)& theGA); + SALOMEDS_GenericAttribute(SALOMEDS::GenericAttribute_ptr theGA); + virtual ~SALOMEDS_GenericAttribute(); + + void CheckLocked(); + std::string Type(); + std::string GetClassType(); + _PTR(SObject) GetSObject(); + + static SALOMEDS_GenericAttribute* CreateAttribute(const Handle(SALOMEDSImpl_GenericAttribute)& theGA); + static SALOMEDS_GenericAttribute* CreateAttribute(SALOMEDS::GenericAttribute_ptr theGA); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_GenericAttribute_i.cxx b/src/SALOMEDS/SALOMEDS_GenericAttribute_i.cxx index b9a24946a..3be0736cd 100644 --- a/src/SALOMEDS/SALOMEDS_GenericAttribute_i.cxx +++ b/src/SALOMEDS/SALOMEDS_GenericAttribute_i.cxx @@ -1,59 +1,123 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_GenericAttribute_i.cxx -// Author : Mikhail PONIKAROV +// Author : Sergey RUIN // Module : SALOME -// $Header$ + +#include "utilities.h" #include "SALOMEDS_GenericAttribute_i.hxx" -#include "SALOMEDS_SObject_i.hxx" -#include "SALOMEDS_Study_i.hxx" +#include "SALOMEDS_Attributes.hxx" +#include "SALOMEDS.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "Utils_ExceptHandlers.hxx" +#include +#include + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include "OpUtil.hxx" using namespace std; +UNEXPECT_CATCH(GALockProtection, SALOMEDS::GenericAttribute::LockProtection); -SALOMEDS_GenericAttribute_i::SALOMEDS_GenericAttribute_i(const Handle(TDF_Attribute)& theAttr, - SALOMEDS_SObject_i* theSObject): - _myBasicAttr(theAttr), - _mySObject(theSObject) +SALOMEDS_GenericAttribute_i::SALOMEDS_GenericAttribute_i(const Handle(TDF_Attribute)& theImpl, CORBA::ORB_ptr theOrb) { + _orb = CORBA::ORB::_duplicate(theOrb); + _impl = theImpl; } - -SALOMEDS_GenericAttribute_i::~SALOMEDS_GenericAttribute_i() +void SALOMEDS_GenericAttribute_i::CheckLocked() throw (SALOMEDS::GenericAttribute::LockProtection) { + SALOMEDS::Locker lock; + Unexpect aCatch(GALockProtection); + + if (!_impl.IsNull() && _impl->IsValid() && !CORBA::is_nil(_orb)) { + try { + SALOMEDSImpl_GenericAttribute::Impl_CheckLocked(_impl); + } + catch (...) { + throw SALOMEDS::GenericAttribute::LockProtection(); + } + } } - -char* SALOMEDS_GenericAttribute_i::Store() -{ - return CORBA::string_dup(""); -} - - -void SALOMEDS_GenericAttribute_i::Restore(const char*) +SALOMEDS::SObject_ptr SALOMEDS_GenericAttribute_i::GetSObject() { + SALOMEDS::Locker lock; + if (_impl.IsNull() || _impl->Label().IsNull()) return SALOMEDS::SObject::_nil(); + Handle(SALOMEDSImpl_SObject) so_impl = SALOMEDSImpl_Study::SObject(_impl->Label()); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (so_impl, _orb); + return so._retn(); } char* SALOMEDS_GenericAttribute_i::Type() { - return CORBA::string_dup(SALOMEDS::GetType(_myBasicAttr).c_str()); -} + SALOMEDS::Locker lock; + if (!_impl.IsNull()) { + return CORBA::string_dup(SALOMEDSImpl_GenericAttribute::Impl_GetType(_impl)); + } + return ""; +} -SALOMEDS::SObject_ptr SALOMEDS_GenericAttribute_i::GetSObject() +char* SALOMEDS_GenericAttribute_i::GetClassType() { - return _mySObject->_this();; -} + SALOMEDS::Locker lock; + if (!_impl.IsNull()) { + return CORBA::string_dup(SALOMEDSImpl_GenericAttribute::Impl_GetClassType(_impl)); + } + + return ""; +} -void SALOMEDS_GenericAttribute_i::CheckLocked() - throw (SALOMEDS::GenericAttribute::LockProtection) +SALOMEDS::GenericAttribute_ptr SALOMEDS_GenericAttribute_i::CreateAttribute(const Handle(TDF_Attribute)& theAttr, + CORBA::ORB_ptr theOrb) +{ +/* + SALOMEDS::Locker lock; + + static std::map _mapOfAttrib; + SALOMEDS::GenericAttribute_var anAttribute; + SALOMEDS_GenericAttribute_i* attr_servant = NULL; + + if(_mapOfAttrib.find(theAttr.operator->()) != _mapOfAttrib.end()) { + attr_servant = _mapOfAttrib[theAttr.operator->()]; + anAttribute = SALOMEDS::GenericAttribute::_narrow(attr_servant->_this()); + } + else { + char* aTypeOfAttribute = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(theAttr)->GetClassType().ToCString(); + __CreateGenericCORBAAttribute + _mapOfAttrib[theAttr.operator->()] = attr_servant; + } +*/ + // mpv: now servants Destroyed by common algos of CORBA + char* aTypeOfAttribute = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(theAttr)->GetClassType().ToCString(); + SALOMEDS::GenericAttribute_var anAttribute; + SALOMEDS_GenericAttribute_i* attr_servant = NULL; + __CreateGenericCORBAAttribute + + return anAttribute._retn(); +} + +//=========================================================================== +// PRIVATE FUNCTIONS +//=========================================================================== +long SALOMEDS_GenericAttribute_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal) { - _mySObject->GetStudyServant()->CheckLocked(); +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + isLocal = (strcmp(theHostname, GetHostname().c_str()) == 0 && pid == thePID)?1:0; + TDF_Attribute* local_impl = _impl.operator->(); + return ((long)local_impl); } diff --git a/src/SALOMEDS/SALOMEDS_GenericAttribute_i.hxx b/src/SALOMEDS/SALOMEDS_GenericAttribute_i.hxx index 80a7c96e0..3525bde15 100644 --- a/src/SALOMEDS/SALOMEDS_GenericAttribute_i.hxx +++ b/src/SALOMEDS/SALOMEDS_GenericAttribute_i.hxx @@ -1,160 +1,44 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_GenericAttribute_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef _GENERIC_ATTRIBUTE_I_HXX_ #define _GENERIC_ATTRIBUTE_I_HXX_ -#include -#include - // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS) +#include +#include +#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDSImpl_GenericAttribute.hxx" -class SALOMEDS_SObject_i; - -class SALOMEDS_GenericAttribute_i: - public virtual POA_SALOMEDS::GenericAttribute, - public virtual PortableServer::RefCountServantBase -{ -private: - friend class SALOMEDS_SObject_i; - - SALOMEDS_GenericAttribute_i(); // Not implemented - void operator=(const SALOMEDS_GenericAttribute_i&); //Not implemented +class Standard_EXPORT SALOMEDS_GenericAttribute_i: public virtual POA_SALOMEDS::GenericAttribute, + public virtual PortableServer::RefCountServantBase, + public virtual SALOME::GenericObj_i +{ protected: - SALOMEDS_SObject_i* _mySObject; - Handle(TDF_Attribute) _myBasicAttr; - - SALOMEDS_GenericAttribute_i(const Handle(TDF_Attribute)& theAttr, - SALOMEDS_SObject_i* theSObject); - - virtual ~SALOMEDS_GenericAttribute_i(); + Handle(TDF_Attribute) _impl; + CORBA::ORB_ptr _orb; - void SetBasicAttribute(const Handle(TDF_Attribute)& theAttr){ - _myBasicAttr = theAttr; - } - public: - void Restore(const char*); - - char* Store(); + SALOMEDS_GenericAttribute_i(const Handle(TDF_Attribute)& theImpl, CORBA::ORB_ptr theOrb); + virtual ~SALOMEDS_GenericAttribute_i() {}; - char* Type(); + void CheckLocked() throw (SALOMEDS::GenericAttribute::LockProtection); - SALOMEDS::SObject_ptr GetSObject(); - - void CheckLocked() - throw (SALOMEDS::GenericAttribute::LockProtection); - - virtual void SetAttribute(const Handle(TDF_Attribute)& theAttr) = 0; - - virtual const Handle(TDF_Attribute)& GetAttribute() const = 0; - -}; + virtual char* Type(); + char* GetClassType(); -template -class SALOMEDS_TGenericAttribute_i: - public virtual SALOMEDS_GenericAttribute_i -{ -public: - typedef TDFAttribute TAttr; - typedef TStoreTDFAttribute TStoreAttr; - - virtual void SetAttribute(const Handle(TDF_Attribute)& theAttr){ - _myAttr = TStoreAttr::DownCast(theAttr); - SetBasicAttribute(theAttr); - } - virtual const Handle(TDF_Attribute)& GetAttribute() const{ - return _myAttr; - } - static bool IsCheckLockedStudy(){ - return TIsCheckLockedStudy; - } - static Handle(TDF_Attribute) NewAttribute(){ - return new TAttr; - } - -protected: - TStoreAttr _myAttr; - - SALOMEDS_TGenericAttribute_i(const Handle(TDF_Attribute)& theAttr, - SALOMEDS_SObject_i* theSObject): - SALOMEDS_GenericAttribute_i(theAttr,theSObject), - _myAttr(TStoreAttr::DownCast(theAttr)) - { - } + SALOMEDS::SObject_ptr GetSObject(); -private: - friend class SALOMEDS_SObject_i; + virtual Handle(TDF_Attribute) GetImpl() { return _impl; } - SALOMEDS_TGenericAttribute_i(); //Not implemented - void operator=(const SALOMEDS_TGenericAttribute_i&); //Not implemented + static SALOMEDS::GenericAttribute_ptr CreateAttribute(const Handle(TDF_Attribute)& theAttr, CORBA::ORB_ptr theOrb); + virtual long GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal); }; - -#define DEFINE_DERIVED_ATTR(TName,TAttr,TCheck) \ - typedef SALOMEDS_TGenericAttribute_i \ - SALOMEDS_T##TName##_i - - -#define DEFINE_DERIVED_ATTR_METH_BASE(TName) \ -public: \ - friend class SALOMEDS_SObject_i; \ - static SALOMEDS_GenericAttribute_i* \ - NewInstance(const Handle(TDF_Attribute)& theAttr, \ - SALOMEDS_SObject_i* theSObject) \ - { return new SALOMEDS_##TName##_i(theAttr,theSObject);} \ -private: \ - SALOMEDS_##TName##_i(const Handle(TDF_Attribute)& theAttr, \ - SALOMEDS_SObject_i* theSObject): \ - SALOMEDS_GenericAttribute_i(theAttr,theSObject), \ - SALOMEDS_T##TName##_i(theAttr,theSObject) \ - {} \ - void operator=(const SALOMEDS_##TName##_i&); \ - SALOMEDS_##TName##_i() - - -#define DEFINE_DERIVED_ATTR_METH_DEFAULT(TName,TAttr) \ -DEFINE_DERIVED_ATTR_METH_BASE(TName); \ -public: \ - static Standard_GUID GetGUID(){ return TAttr::GetID(); } \ -private: - - -#define DEFINE_DERIVED_ATTR_METH(TName,theGUID) \ -DEFINE_DERIVED_ATTR_METH_BASE(TName); \ -public: \ - static Standard_GUID GetGUID(){ return theGUID; } \ -private: - - #endif diff --git a/src/SALOMEDS/SALOMEDS_SAttribute_i.hxx b/src/SALOMEDS/SALOMEDS_SAttribute_i.hxx index d7c739be5..1a5232031 100644 --- a/src/SALOMEDS/SALOMEDS_SAttribute_i.hxx +++ b/src/SALOMEDS/SALOMEDS_SAttribute_i.hxx @@ -30,7 +30,7 @@ #define __SALOMEDS_SATTRIBUTE_I_H__ // std C++ headers -#include +#include // IDL headers #include diff --git a/src/SALOMEDS/SALOMEDS_SComponent.cxx b/src/SALOMEDS/SALOMEDS_SComponent.cxx new file mode 100644 index 000000000..651483595 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SComponent.cxx @@ -0,0 +1,67 @@ +// File : SALOMEDS_SComponent.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include "SALOMEDS_SComponent.hxx" +#include "SALOMEDS_SComponent_i.hxx" +#include +#include + +using namespace std; + +SALOMEDS_SComponent::SALOMEDS_SComponent(SALOMEDS::SComponent_ptr theSComponent) +:SALOMEDS_SObject(theSComponent) +{} + +SALOMEDS_SComponent::SALOMEDS_SComponent(const Handle(SALOMEDSImpl_SComponent)& theSComponent) +:SALOMEDS_SObject(theSComponent) +{} + +SALOMEDS_SComponent::~SALOMEDS_SComponent() +{} + +std::string SALOMEDS_SComponent::ComponentDataType() +{ + std::string aType; + if(_isLocal) { + aType = (Handle(SALOMEDSImpl_SComponent)::DownCast(GetLocalImpl()))->ComponentDataType().ToCString(); + } + else aType = (SALOMEDS::SComponent::_narrow(GetCORBAImpl()))->ComponentDataType(); + + return aType; +} + +bool SALOMEDS_SComponent::ComponentIOR(std::string& theID) +{ + bool ret; + if(_isLocal) { + TCollection_AsciiString anIOR; + ret = (Handle(SALOMEDSImpl_SComponent)::DownCast(GetLocalImpl()))->ComponentIOR(anIOR); + theID = anIOR.ToCString(); + } + else { + CORBA::String_var anIOR; + ret = (SALOMEDS::SComponent::_narrow(GetCORBAImpl()))->ComponentIOR(anIOR.out()); + theID = std::string(anIOR.in()); + } + + return ret; +} + +SALOMEDS::SComponent_ptr SALOMEDS_SComponent::GetSComponent() +{ + if(_isLocal) { + if(!CORBA::is_nil(_corba_impl)) return SALOMEDS::SComponent::_narrow(GetCORBAImpl()); + SALOMEDS::SComponent_var aSCO = SALOMEDS_SComponent_i::New(Handle(SALOMEDSImpl_SComponent)::DownCast(GetLocalImpl()), + _orb); + return aSCO._retn(); + } + else { + return SALOMEDS::SComponent::_narrow(GetCORBAImpl()); + } + + return SALOMEDS::SComponent::_nil(); +} + diff --git a/src/SALOMEDS/SALOMEDS_SComponent.hxx b/src/SALOMEDS/SALOMEDS_SComponent.hxx new file mode 100644 index 000000000..096ad908d --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SComponent.hxx @@ -0,0 +1,29 @@ +// File : SALOMEDS_SComponent.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_SCOMPONENT_H__ +#define __SALOMEDS_SCOMPONENT_H__ + +#include "SALOMEDSClient_SComponent.hxx" +#include "SALOMEDS_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +class Standard_EXPORT SALOMEDS_SComponent: public SALOMEDS_SObject, public SALOMEDSClient_SComponent +{ +public: + + SALOMEDS_SComponent(const Handle(SALOMEDSImpl_SComponent)& theSComponent); + SALOMEDS_SComponent(SALOMEDS::SComponent_ptr theSComponent); + ~SALOMEDS_SComponent(); + + virtual std::string ComponentDataType(); + virtual bool ComponentIOR(std::string& theID); + + SALOMEDS::SComponent_ptr GetSComponent(); +}; +#endif diff --git a/src/SALOMEDS/SALOMEDS_SComponentIterator.cxx b/src/SALOMEDS/SALOMEDS_SComponentIterator.cxx new file mode 100644 index 000000000..64c64abf8 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SComponentIterator.cxx @@ -0,0 +1,53 @@ +// File : SALOMEDS_SComponentIterator.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDS_SComponentIterator.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDS_SComponent.hxx" + +SALOMEDS_SComponentIterator::SALOMEDS_SComponentIterator(const SALOMEDSImpl_SComponentIterator& theIterator) +:_local_impl(theIterator) +{ + _isLocal = true; + _corba_impl = SALOMEDS::SComponentIterator::_nil(); +} + +SALOMEDS_SComponentIterator::SALOMEDS_SComponentIterator(SALOMEDS::SComponentIterator_ptr theIterator) +{ + _isLocal = false; + _corba_impl = SALOMEDS::SComponentIterator::_duplicate(theIterator); +} + +SALOMEDS_SComponentIterator::~SALOMEDS_SComponentIterator() +{ + if(!_isLocal) _corba_impl->Destroy(); +} + +void SALOMEDS_SComponentIterator::Init() +{ + if(_isLocal) _local_impl.Init(); + else _corba_impl->Init(); +} + +bool SALOMEDS_SComponentIterator::More() +{ + bool ret; + if(_isLocal) ret = _local_impl.More(); + else ret = _corba_impl->More(); + return ret; +} + +void SALOMEDS_SComponentIterator::Next() +{ + if(_isLocal) _local_impl.Next(); + else _corba_impl->Next(); +} + +_PTR(SComponent) SALOMEDS_SComponentIterator::Value() +{ + SALOMEDSClient_SComponent* aSCO = NULL; + if(_isLocal) aSCO = new SALOMEDS_SComponent(_local_impl.Value()); + else aSCO = new SALOMEDS_SComponent(_corba_impl->Value()); + return _PTR(SComponent)(aSCO); +} diff --git a/src/SALOMEDS/SALOMEDS_SComponentIterator.hxx b/src/SALOMEDS/SALOMEDS_SComponentIterator.hxx new file mode 100644 index 000000000..5d6495ac4 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SComponentIterator.hxx @@ -0,0 +1,33 @@ +// File : SALOMEDS_SComponentIterator.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_SCOMPONENTITERATOR_H__ +#define __SALOMEDS_SCOMPONENTITERATOR_H__ + +#include "SALOMEDSClient.hxx" +#include "SALOMEDSImpl_SComponentIterator.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +class SALOMEDS_SComponentIterator: public SALOMEDSClient_SComponentIterator +{ +public: + SALOMEDS_SComponentIterator(const SALOMEDSImpl_SComponentIterator& theIterator); + SALOMEDS_SComponentIterator(SALOMEDS::SComponentIterator_ptr theIterator); + ~SALOMEDS_SComponentIterator(); + +private: + bool _isLocal; + SALOMEDSImpl_SComponentIterator _local_impl; + SALOMEDS::SComponentIterator_var _corba_impl; + +public: + virtual void Init(); + virtual bool More(); + virtual void Next(); + virtual _PTR(SComponent) Value(); +}; +#endif diff --git a/src/SALOMEDS/SALOMEDS_SComponentIterator_i.cxx b/src/SALOMEDS/SALOMEDS_SComponentIterator_i.cxx index adf77476a..fb709652a 100644 --- a/src/SALOMEDS/SALOMEDS_SComponentIterator_i.cxx +++ b/src/SALOMEDS/SALOMEDS_SComponentIterator_i.cxx @@ -1,33 +1,11 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_SComponentIterator_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ + #include "SALOMEDS_SComponentIterator_i.hxx" -#include "SALOMEDS_SComponent_i.hxx" +#include "SALOMEDS.hxx" +#include "SALOMEDSImpl_SComponent.hxx" using namespace std; @@ -37,12 +15,11 @@ using namespace std; */ //============================================================================ -SALOMEDS_SComponentIterator_i::SALOMEDS_SComponentIterator_i(SALOMEDS_Study_i* theStudy, - const Handle(TDocStd_Document)& theDocument): - _it(theDocument->Main()), - _lab(theDocument->Main()), - _study(theStudy) +SALOMEDS_SComponentIterator_i::SALOMEDS_SComponentIterator_i(const SALOMEDSImpl_SComponentIterator& theImpl, + CORBA::ORB_ptr orb) +:_impl(theImpl) { + _orb = CORBA::ORB::_duplicate(orb); } //============================================================================ @@ -61,7 +38,8 @@ SALOMEDS_SComponentIterator_i::~SALOMEDS_SComponentIterator_i() //============================================================================ void SALOMEDS_SComponentIterator_i::Init() { - _it.Initialize (_lab); + SALOMEDS::Locker lock; + _impl.Init(); } //============================================================================ @@ -71,13 +49,8 @@ void SALOMEDS_SComponentIterator_i::Init() //============================================================================ CORBA::Boolean SALOMEDS_SComponentIterator_i::More() { - if (!_it.More()) - return false; - TDF_Label L = _it.Value(); - if (SALOMEDS_SComponent_i::IsA(L)) - return true; - - return _it.More(); + SALOMEDS::Locker lock; + return _impl.More(); } //============================================================================ @@ -85,8 +58,9 @@ CORBA::Boolean SALOMEDS_SComponentIterator_i::More() */ //============================================================================ void SALOMEDS_SComponentIterator_i::Next() -{ - _it.Next(); +{ + SALOMEDS::Locker lock; + _impl.Next(); } @@ -97,6 +71,8 @@ void SALOMEDS_SComponentIterator_i::Next() //============================================================================ SALOMEDS::SComponent_ptr SALOMEDS_SComponentIterator_i::Value() { - return SALOMEDS_SComponent_i::NewRef(_study,_it.Value())._retn(); + SALOMEDS::Locker lock; + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (_impl.Value(), _orb); + return sco._retn(); } diff --git a/src/SALOMEDS/SALOMEDS_SComponentIterator_i.hxx b/src/SALOMEDS/SALOMEDS_SComponentIterator_i.hxx index 919f65fab..4eb829e45 100644 --- a/src/SALOMEDS/SALOMEDS_SComponentIterator_i.hxx +++ b/src/SALOMEDS/SALOMEDS_SComponentIterator_i.hxx @@ -1,69 +1,41 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_SComponentIterator_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef __SALOMEDS_SCOMPONENTITERATOR_I_H__ #define __SALOMEDS_SCOMPONENTITERATOR_I_H__ +// std C++ headers +#include + // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS) +#include -// Cascade headers -#include -#include -#include - -class SALOMEDS_Study_i; +//SALOMEDS headers +#include "SALOMEDS_SComponent_i.hxx" +#include "SALOMEDSImpl_SComponentIterator.hxx" class SALOMEDS_SComponentIterator_i:public virtual POA_SALOMEDS::SComponentIterator, - public virtual PortableServer::RefCountServantBase + public virtual PortableServer::RefCountServantBase, + public virtual SALOME::GenericObj_i { - SALOMEDS_SComponentIterator_i(); // Not implemented - void operator=(const SALOMEDS_SComponentIterator_i&); // Not implemented private: - TDF_ChildIterator _it; - TDF_Label _lab; - SALOMEDS_Study_i* _study; + + CORBA::ORB_ptr _orb; + SALOMEDSImpl_SComponentIterator _impl; public: - SALOMEDS_SComponentIterator_i(SALOMEDS_Study_i* theStudy, - const Handle(TDocStd_Document)& theDocument); + + SALOMEDS_SComponentIterator_i(const SALOMEDSImpl_SComponentIterator& theImpl, CORBA::ORB_ptr); ~SALOMEDS_SComponentIterator_i(); - TDF_Label GetValue() { return _it.Value();} - virtual void Init(); virtual CORBA::Boolean More(); virtual void Next(); virtual SALOMEDS::SComponent_ptr Value(); }; - - #endif diff --git a/src/SALOMEDS/SALOMEDS_SComponent_i.cxx b/src/SALOMEDS/SALOMEDS_SComponent_i.cxx index c9cc82ac6..01f0b62e6 100644 --- a/src/SALOMEDS/SALOMEDS_SComponent_i.cxx +++ b/src/SALOMEDS/SALOMEDS_SComponent_i.cxx @@ -1,85 +1,46 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_SComponent_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#include "SALOMEDS_SComponent_i.hxx" -#include "SALOMEDS_Study_i.hxx" +#include "SALOMEDS_SComponent_i.hxx" +#include "SALOMEDS.hxx" #include "utilities.h" +#include using namespace std; -SALOMEDS_Study_i::TSObjectHolder -SALOMEDS_SComponent_i::New(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel) +SALOMEDS::SComponent_ptr SALOMEDS_SComponent_i::New(const Handle(SALOMEDSImpl_SComponent)& theImpl, CORBA::ORB_ptr theORB) { - SALOMEDS_Study_i::TSObjectHolder aSObjectHolder; - SALOMEDS_Study_i::TSObjectMap& anSObjectMap = theStudy->GetSObjectMap(); - SALOMEDS_Study_i::TSObjectMap::const_iterator anIter = anSObjectMap.find(theLabel); - if(anIter != anSObjectMap.end()){ - aSObjectHolder = anIter->second; - SALOMEDS_SObject_i* aSObject = aSObjectHolder.first; - if(dynamic_cast(aSObject)) - return aSObjectHolder; +/* + static std::map _mapOfSCO; + SALOMEDS::SComponent_var sco; + SALOMEDS_SComponent_i* sco_servant = NULL; + + if(_mapOfSCO.find(theImpl.operator->()) != _mapOfSCO.end()) { + sco_servant = _mapOfSCO[theImpl.operator->()]; + } + else { + sco_servant = new SALOMEDS_SComponent_i(theImpl, theORB); + _mapOfSCO[theImpl.operator->()] = sco_servant; } - TCollection_AsciiString anEntry; - TDF_Tool::Entry(theLabel,anEntry); - SALOMEDS_SComponent_i* aSComponent = new SALOMEDS_SComponent_i(theStudy,theLabel); - aSObjectHolder.first = aSComponent; - aSObjectHolder.second = aSComponent->_this(); - anSObjectMap[theLabel] = aSObjectHolder; - return aSObjectHolder; -} + sco = SALOMEDS::SComponent::_narrow(sco_servant->SComponent::_this()); +*/ + SALOMEDS_SComponent_i* sco_servant = new SALOMEDS_SComponent_i(theImpl, theORB); + SALOMEDS::SComponent_var sco = SALOMEDS::SComponent::_narrow(sco_servant->SComponent::_this()); -SALOMEDS_SComponent_i* -SALOMEDS_SComponent_i::NewPtr(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel) -{ - return dynamic_cast(New(theStudy,theLabel).first); -} - -SALOMEDS::SComponent_var -SALOMEDS_SComponent_i::NewRef(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel) -{ - return SALOMEDS::SComponent::_narrow(New(theStudy,theLabel).second); -} + return sco._retn(); +} //============================================================================ /*! Function : constructor * Purpose : */ //============================================================================ -SALOMEDS_SComponent_i::SALOMEDS_SComponent_i(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel): - SALOMEDS_SObject_i(theStudy,theLabel) -{ -} +SALOMEDS_SComponent_i::SALOMEDS_SComponent_i(const Handle(SALOMEDSImpl_SComponent)& theImpl, CORBA::ORB_ptr orb) + :SALOMEDS_SObject_i(theImpl, orb) +{} //============================================================================ /*! Function : destructor @@ -87,10 +48,8 @@ SALOMEDS_SComponent_i::SALOMEDS_SComponent_i(SALOMEDS_Study_i* theStudy, */ //============================================================================ SALOMEDS_SComponent_i::~SALOMEDS_SComponent_i() -{ -} - - +{} + //============================================================================ /*! Function : ComponentDataType * Purpose : @@ -98,21 +57,9 @@ SALOMEDS_SComponent_i::~SALOMEDS_SComponent_i() //============================================================================ char* SALOMEDS_SComponent_i::ComponentDataType() { - //DEB - // MESSAGE("In SALOMEDS_SComponent_i::ComponentDataType"); - // TCollection_AsciiString anEntry; - // TDF_Tool::Entry (_lab,anEntry); - // MESSAGE("in SALOMEDS_SComponent_i, Entry :"<Get()); - res = ch.ToCString(); - } - - return CORBA::string_dup(res); + SALOMEDS::Locker lock; + TCollection_AsciiString aType = Handle(SALOMEDSImpl_SComponent)::DownCast(_impl)->ComponentDataType(); + return CORBA::string_dup(aType.ToCString()); } @@ -123,28 +70,9 @@ char* SALOMEDS_SComponent_i::ComponentDataType() //============================================================================ CORBA::Boolean SALOMEDS_SComponent_i::ComponentIOR(CORBA::String_out IOR) { - Handle(SALOMEDS_IORAttribute) ior; - if (!_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),ior) ) - return false; - TCollection_AsciiString ch(ior->Get()); - IOR = CORBA::string_dup(ch.ToCString()); + SALOMEDS::Locker lock; + TCollection_AsciiString ior; + if(!Handle(SALOMEDSImpl_SComponent)::DownCast(_impl)->ComponentIOR(ior)) return false; + IOR = CORBA::string_dup(ior.ToCString()); return true; } - - -//============================================================================ -/*! Function : IsA - * Purpose : - */ -//============================================================================ -Standard_Boolean SALOMEDS_SComponent_i::IsA(const TDF_Label& Lab) -{ - Handle(TDF_Attribute) Att; - // scomponent must contain comment and belong to the 2th depth label - if ( Lab.FindAttribute(TDataStd_Comment::GetID(), Att) && Lab.Depth() == 2) { - return Standard_True; - } - return Standard_False; -} - - diff --git a/src/SALOMEDS/SALOMEDS_SComponent_i.hxx b/src/SALOMEDS/SALOMEDS_SComponent_i.hxx index 1018b7bb5..de70f530f 100644 --- a/src/SALOMEDS/SALOMEDS_SComponent_i.hxx +++ b/src/SALOMEDS/SALOMEDS_SComponent_i.hxx @@ -1,71 +1,37 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_SComponent_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef __SALOMEDS_SCOMPONENT_I_H__ #define __SALOMEDS_SCOMPONENT_I_H__ -#include "SALOMEDS_SObject_i.hxx" +// std C++ headers +#include -class SALOMEDS_SComponent_i: public virtual POA_SALOMEDS::SComponent, - public virtual SALOMEDS_SObject_i -{ - SALOMEDS_SComponent_i(); // Not implemented - void operator=(const SALOMEDS_SComponent_i&); // Not implemented +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) - SALOMEDS_SComponent_i(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel); - -public: +//SALOMEDS headers +#include "SALOMEDS_SObject_i.hxx" - static - SALOMEDS_Study_i::TSObjectHolder - New(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel); +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" - static - SALOMEDS_SComponent_i* - NewPtr(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel); +class Standard_EXPORT SALOMEDS_SComponent_i: public POA_SALOMEDS::SComponent, + public SALOMEDS_SObject_i +{ - static - SALOMEDS::SComponent_var - NewRef(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel); +public: - ~SALOMEDS_SComponent_i(); + static SALOMEDS::SComponent_ptr New(const Handle(SALOMEDSImpl_SComponent)&, CORBA::ORB_ptr); - virtual char* ComponentDataType(); + SALOMEDS_SComponent_i(const Handle(SALOMEDSImpl_SComponent)&, CORBA::ORB_ptr); + + virtual ~SALOMEDS_SComponent_i(); + virtual char* ComponentDataType(); virtual CORBA::Boolean ComponentIOR(CORBA::String_out theID); - - static Standard_Boolean IsA(const TDF_Label& Lab); }; - - #endif diff --git a/src/SALOMEDS/SALOMEDS_SObject.cxx b/src/SALOMEDS/SALOMEDS_SObject.cxx new file mode 100644 index 000000000..1960ddcf8 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SObject.cxx @@ -0,0 +1,268 @@ +// File : SALOMEDS_SObject.hxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include +#include +#include + +#include "SALOMEDS_SObject.hxx" +#include "SALOMEDS_SComponent.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_GenericAttribute.hxx" +#include "SALOMEDS_Study.hxx" +#include "SALOMEDSImpl_Study.hxx" + +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include "OpUtil.hxx" +#include "utilities.h" + +using namespace std; + +SALOMEDS_SObject::SALOMEDS_SObject(SALOMEDS::SObject_ptr theSObject) +{ +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + + long addr = theSObject->GetLocalImpl(GetHostname().c_str(), pid, _isLocal); + if(_isLocal) { + _local_impl = ((SALOMEDSImpl_SObject*)(addr)); + _corba_impl = SALOMEDS::SObject::_duplicate(theSObject); + } + else { + _local_impl = NULL; + _corba_impl = SALOMEDS::SObject::_duplicate(theSObject); + } + + init_orb(); +} + +SALOMEDS_SObject::SALOMEDS_SObject(const Handle(SALOMEDSImpl_SObject)& theSObject) +:_isLocal(true) +{ + _corba_impl = SALOMEDS::SObject::_nil(); + _local_impl = theSObject; + + init_orb(); +} + +SALOMEDS_SObject::~SALOMEDS_SObject() +{ + if (!_isLocal) { + _corba_impl->Destroy(); + } +} + +std::string SALOMEDS_SObject::GetID() +{ + std::string aValue; + if(_isLocal) aValue = _local_impl->GetID().ToCString(); + else aValue = _corba_impl->GetID(); + return aValue; +} + +_PTR(SComponent) SALOMEDS_SObject::GetFatherComponent() +{ + if(_isLocal) { + Handle(SALOMEDSImpl_SComponent) aSCO = Handle(SALOMEDSImpl_SComponent)::DownCast(_local_impl->GetFatherComponent()); + return _PTR(SComponent)(new SALOMEDS_SComponent(aSCO)); + } + return _PTR(SComponent)(new SALOMEDS_SComponent(_corba_impl->GetFatherComponent())); +} + +_PTR(SObject) SALOMEDS_SObject::GetFather() +{ + if(_isLocal) return _PTR(SObject)(new SALOMEDS_SObject(_local_impl->GetFather())); + return _PTR(SObject)(new SALOMEDS_SObject(_corba_impl->GetFather())); +} + +bool SALOMEDS_SObject::FindAttribute(_PTR(GenericAttribute)& anAttribute, const std::string& aTypeOfAttribute) +{ + bool ret = false; + if(_isLocal) { + Handle(SALOMEDSImpl_GenericAttribute) anAttr; + ret = _local_impl->FindAttribute(anAttr, (char*)aTypeOfAttribute.c_str()); + if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(anAttr)); + } + else { + SALOMEDS::GenericAttribute_var anAttr; + ret = _corba_impl->FindAttribute(anAttr.out(), aTypeOfAttribute.c_str()); + if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(anAttr)); + } + + return ret; +} + +bool SALOMEDS_SObject::ReferencedObject(_PTR(SObject)& theObject) +{ + bool ret = false; + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO; + ret = _local_impl->ReferencedObject(aSO); + if(ret) theObject = _PTR(SObject)(new SALOMEDS_SObject(aSO)); + } + else { + SALOMEDS::SObject_var aSO; + ret = _corba_impl->ReferencedObject(aSO.out()); + if(ret) theObject = _PTR(SObject)(new SALOMEDS_SObject(aSO)); + } + + return ret; +} + + +bool SALOMEDS_SObject::FindSubObject(int theTag, _PTR(SObject)& theObject) +{ + bool ret = false; + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO; + ret = _local_impl->FindSubObject(theTag, aSO); + if(ret) theObject = _PTR(SObject)(new SALOMEDS_SObject(aSO)); + } + else { + SALOMEDS::SObject_var aSO; + ret = _corba_impl->FindSubObject(theTag, aSO.out()); + if(ret) theObject = _PTR(SObject)(new SALOMEDS_SObject(aSO)); + } + + return ret; +} + +_PTR(Study) SALOMEDS_SObject::GetStudy() +{ + if(_isLocal) return _PTR(Study)(new SALOMEDS_Study(_local_impl->GetStudy())); + return _PTR(Study)(new SALOMEDS_Study(_corba_impl->GetStudy())); +} + +std::string SALOMEDS_SObject::Name() +{ + std::string aName; + if(_isLocal) aName = _local_impl->Name().ToCString(); + else aName = _corba_impl->Name(); + + return aName; +} + +void SALOMEDS_SObject::Name(const std::string& theName) +{ + if(_isLocal) _local_impl->Name((char*)theName.c_str()); + else _corba_impl->Name(theName.c_str()); +} + +vector<_PTR(GenericAttribute)> SALOMEDS_SObject::GetAllAttributes() +{ + vector<_PTR(GenericAttribute)> aVector; + int aLength = 0; + SALOMEDSClient_GenericAttribute* anAttr; + + if(_isLocal) { + Handle(TColStd_HSequenceOfTransient) aSeq = _local_impl->GetAllAttributes(); + aLength = aSeq->Length(); + for(int i = 1; i <= aLength; i++) { + anAttr = SALOMEDS_GenericAttribute::CreateAttribute(Handle(SALOMEDSImpl_GenericAttribute)::DownCast(aSeq->Value(i))); + aVector.push_back(_PTR(GenericAttribute)(anAttr)); + } + } + else { + SALOMEDS::ListOfAttributes_var aSeq = _corba_impl->GetAllAttributes(); + aLength = aSeq->length(); + for(int i = 0; i < aLength; i++) { + anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aSeq[i]); + aVector.push_back(_PTR(GenericAttribute)(anAttr)); + } + } + + return aVector; +} + +std::string SALOMEDS_SObject::GetName() +{ + std::string aName; + if(_isLocal) aName = _local_impl->GetName().ToCString(); + else aName = _corba_impl->GetName(); + + return aName; +} + +std::string SALOMEDS_SObject::GetComment() +{ + std::string aComment; + if(_isLocal) aComment = _local_impl->GetComment().ToCString(); + else aComment = _corba_impl->GetComment(); + + return aComment; +} + +std::string SALOMEDS_SObject::GetIOR() +{ + std::string anIOR; + if(_isLocal) anIOR = _local_impl->GetIOR().ToCString(); + else anIOR = _corba_impl->GetIOR(); + + return anIOR; +} + +int SALOMEDS_SObject::Tag() +{ + if(_isLocal) return _local_impl->Tag(); + return _corba_impl->Tag(); +} + +int SALOMEDS_SObject::Depth() +{ + if(_isLocal) return _local_impl->Depth(); + return _corba_impl->Depth(); +} + +CORBA::Object_ptr SALOMEDS_SObject::GetObject() +{ + CORBA::Object_var obj; + if(_isLocal) { + std::string anIOR = GetIOR(); + if (!anIOR.empty()) + obj = _orb->string_to_object(anIOR.c_str()); + return obj._retn(); + } + else { + obj = _corba_impl->GetObject(); + return obj._retn(); + } + + return CORBA::Object::_nil(); +} + +SALOMEDS::SObject_ptr SALOMEDS_SObject::GetSObject() +{ + if(_isLocal) { + if(!CORBA::is_nil(_corba_impl)) return _corba_impl; + SALOMEDS::SObject_var aSO = SALOMEDS_SObject_i::New(_local_impl, _orb); + return aSO._retn(); + } + else { + return _corba_impl; + } + return SALOMEDS::SObject::_nil(); +} + + +void SALOMEDS_SObject::init_orb() +{ + ORB_INIT &init = *SINGLETON_::Instance() ; + ASSERT(SINGLETON_::IsAlreadyExisting()); + _orb = init(0 , 0 ) ; +} diff --git a/src/SALOMEDS/SALOMEDS_SObject.hxx b/src/SALOMEDS/SALOMEDS_SObject.hxx new file mode 100644 index 000000000..0f5346fb6 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SObject.hxx @@ -0,0 +1,61 @@ +// File : SALOMEDS_SObject.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_SOBJECT_H__ +#define __SALOMEDS_SOBJECT_H__ + +// std C++ headers +#include + +#include + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDSImpl_SObject.hxx" + +class Standard_EXPORT SALOMEDS_SObject: public virtual SALOMEDSClient_SObject +{ +protected: + + bool _isLocal; + Handle(SALOMEDSImpl_SObject) _local_impl; + SALOMEDS::SObject_var _corba_impl; + CORBA::ORB_var _orb; + +public: + + SALOMEDS_SObject(SALOMEDS::SObject_ptr theSObject); + SALOMEDS_SObject(const Handle(SALOMEDSImpl_SObject)& theSObject); + virtual ~SALOMEDS_SObject(); + + virtual std::string GetID(); + virtual _PTR(SComponent) GetFatherComponent(); + virtual _PTR(SObject) GetFather(); + virtual bool FindAttribute(_PTR(GenericAttribute)& anAttribute, const std::string& aTypeOfAttribute); + virtual bool ReferencedObject(_PTR(SObject)& theObject); + virtual bool FindSubObject(int theTag, _PTR(SObject)& theObject); + virtual _PTR(Study) GetStudy(); + virtual std::string Name(); + virtual void Name(const std::string& theName); + virtual vector<_PTR(GenericAttribute)> GetAllAttributes(); + virtual std::string GetName(); + virtual std::string GetComment(); + virtual std::string GetIOR(); + virtual int Tag(); + virtual int Depth(); + + CORBA::Object_ptr GetObject(); + SALOMEDS::SObject_ptr GetSObject(); + + SALOMEDS::SObject_ptr GetCORBAImpl() { return SALOMEDS::SObject::_duplicate(_corba_impl); } + Handle(SALOMEDSImpl_SObject) GetLocalImpl() { return _local_impl; } + +private: + void init_orb(); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_SObject_i.cxx b/src/SALOMEDS/SALOMEDS_SObject_i.cxx index 35c5087af..184a0af06 100644 --- a/src/SALOMEDS/SALOMEDS_SObject_i.cxx +++ b/src/SALOMEDS/SALOMEDS_SObject_i.cxx @@ -1,760 +1,312 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_SObject_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SALOMEDS_SObject_i.hxx" - -//SALOMEDS Headers -#include "SALOMEDS_Study_i.hxx" -#include "SALOMEDS_StudyManager_i.hxx" -#include "SALOMEDS_SComponent_i.hxx" -#include "SALOMEDS_AttributeComment_i.hxx" - -#include "SALOMEDS_AttributeTreeNode_i.hxx" -#include "SALOMEDS_AttributeUserID_i.hxx" - -#include "SALOMEDS_AttributePersistentRef_i.hxx" -#include "SALOMEDS_AttributeIOR_i.hxx" -#include "SALOMEDS_AttributeExternalFileDef_i.hxx" -#include "SALOMEDS_AttributeFileType_i.hxx" -#include "SALOMEDS_AttributeName_i.hxx" -#include "SALOMEDS_AttributeSequenceOfInteger_i.hxx" -#include "SALOMEDS_AttributeSequenceOfReal_i.hxx" -#include "SALOMEDS_AttributeTableOfInteger_i.hxx" -#include "SALOMEDS_AttributeTableOfReal_i.hxx" -#include "SALOMEDS_AttributeTableOfString_i.hxx" -#include "SALOMEDS_AttributeInteger_i.hxx" -#include "SALOMEDS_AttributeReal_i.hxx" -#include "SALOMEDS_AttributeDrawable_i.hxx" -#include "SALOMEDS_AttributeSelectable_i.hxx" -#include "SALOMEDS_AttributeExpandable_i.hxx" -#include "SALOMEDS_AttributeOpened_i.hxx" -#include "SALOMEDS_AttributeTextColor_i.hxx" -#include "SALOMEDS_AttributeTextHighlightColor_i.hxx" -#include "SALOMEDS_AttributePixMap_i.hxx" -#include "SALOMEDS_AttributeTarget_i.hxx" -#include "SALOMEDS_AttributeLocalID_i.hxx" -#include "SALOMEDS_AttributeStudyProperties_i.hxx" -#include "SALOMEDS_AttributePythonObject_i.hxx" - -#include "SALOMEDS_AttributeGraphic_i.hxx" -#include "SALOMEDS_AttributeFlags_i.hxx" - -#include "Utils_ExceptHandlers.hxx" -UNEXPECT_CATCH(GALockProtection, SALOMEDS::GenericAttribute::LockProtection); #include "utilities.h" +#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDS_SComponent_i.hxx" +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDS_StudyManager_i.hxx" +#include "SALOMEDS.hxx" +#include "SALOMEDSImpl_GenericAttribute.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" -using namespace std; -using namespace SALOMEDS; - - -inline bool operator<(const Standard_GUID& theLeft, const Standard_GUID& theRight) -{ - char aLeft[40] = ""; - theLeft.ToCString(aLeft); - - char aRight[40] = ""; - theRight.ToCString(aRight); - - return strcmp(aLeft,aRight) < 0; -} - - -namespace SALOMEDS{ - - const char* Str(const TCollection_ExtendedString& theString) - { - return TCollection_AsciiString(theString).ToCString(); - } - - typedef std::string TAttributeID; - - typedef Standard_GUID (*TGetGUID)(); - typedef bool (*TIsCheckLockedStudy)(); - typedef Handle(TDF_Attribute) (*TNewAttribute)(); - typedef SALOMEDS_GenericAttribute_i* (*TNewInstance)(const Handle(TDF_Attribute)&, SALOMEDS_SObject_i*); - - struct TAttrFun{ - TAttrFun(const TGetGUID& theGetGUID, - const TIsCheckLockedStudy& theIsCheckLockedStudy, - const TNewAttribute& theNewAttribute, - const TNewInstance& theNewInstance): - myGetGUID(theGetGUID), - myIsCheckLockedStudy(theIsCheckLockedStudy), - myNewAttribute(theNewAttribute), - myNewInstance(theNewInstance) - { - } - - TGetGUID myGetGUID; - TIsCheckLockedStudy myIsCheckLockedStudy; - TNewAttribute myNewAttribute; - TNewInstance myNewInstance; - }; - - typedef std::map TAttrID2FunMap; - static TAttrID2FunMap __AttrID2FunMap__; - - - typedef std::map TGUID2AttrIDMap; - static TGUID2AttrIDMap __GUID2AttrIDMap__; - - bool Init() - { - -#define ADD_ATTRID2FUNMAP_ITEM(theName) \ - __AttrID2FunMap__.insert( \ - TAttrID2FunMap::value_type(#theName,TAttrFun( \ - &(SALOMEDS_##theName##_i::GetGUID), \ - &(SALOMEDS_##theName##_i::IsCheckLockedStudy), \ - &(SALOMEDS_##theName##_i::NewAttribute), \ - &(SALOMEDS_##theName##_i::NewInstance) \ - ))) - - ADD_ATTRID2FUNMAP_ITEM(AttributeName); - ADD_ATTRID2FUNMAP_ITEM(AttributeComment); - ADD_ATTRID2FUNMAP_ITEM(AttributeIOR); - ADD_ATTRID2FUNMAP_ITEM(AttributeReal); - ADD_ATTRID2FUNMAP_ITEM(AttributeInteger); - ADD_ATTRID2FUNMAP_ITEM(AttributeSequenceOfInteger); - ADD_ATTRID2FUNMAP_ITEM(AttributeSequenceOfReal); - ADD_ATTRID2FUNMAP_ITEM(AttributeTableOfInteger); - ADD_ATTRID2FUNMAP_ITEM(AttributeTableOfReal); - ADD_ATTRID2FUNMAP_ITEM(AttributeTableOfString); - ADD_ATTRID2FUNMAP_ITEM(AttributeLocalID); - ADD_ATTRID2FUNMAP_ITEM(AttributePythonObject); - - ADD_ATTRID2FUNMAP_ITEM(AttributeUserID); - ADD_ATTRID2FUNMAP_ITEM(AttributeTreeNode); - - ADD_ATTRID2FUNMAP_ITEM(AttributePersistentRef); - ADD_ATTRID2FUNMAP_ITEM(AttributeDrawable); - ADD_ATTRID2FUNMAP_ITEM(AttributeSelectable); - ADD_ATTRID2FUNMAP_ITEM(AttributeExpandable); - ADD_ATTRID2FUNMAP_ITEM(AttributeOpened); - ADD_ATTRID2FUNMAP_ITEM(AttributeTextColor); - ADD_ATTRID2FUNMAP_ITEM(AttributeTextHighlightColor); - ADD_ATTRID2FUNMAP_ITEM(AttributePixMap); - ADD_ATTRID2FUNMAP_ITEM(AttributeTarget); - ADD_ATTRID2FUNMAP_ITEM(AttributeStudyProperties); - ADD_ATTRID2FUNMAP_ITEM(AttributeExternalFileDef); - ADD_ATTRID2FUNMAP_ITEM(AttributeFileType); - - ADD_ATTRID2FUNMAP_ITEM(AttributeGraphic); - ADD_ATTRID2FUNMAP_ITEM(AttributeFlags); - - TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.begin(); - TAttrID2FunMap::const_iterator anEnd = __AttrID2FunMap__.end(); - for(; anIter != anEnd; anIter++){ - const TAttrID2FunMap::key_type& aKey = anIter->first; - const TAttrID2FunMap::mapped_type& aValue = anIter->second; - __GUID2AttrIDMap__[aValue.myGetGUID()] = aKey; - }; - -#undef ADD_ATTRID2FUNMAP_ITEM - return true; - } - - - static bool __IsInitilized__ = Init(); - - - //============================================================================ - bool GetAttrFun(const Standard_GUID& theGUID, TAttrFun& theAttrFun) - { - TGUID2AttrIDMap::const_iterator anIter = __GUID2AttrIDMap__.find(theGUID); - if(anIter != __GUID2AttrIDMap__.end()) - { - const TAttributeID& anAttributeID = anIter->second; - TAttrID2FunMap::const_iterator anIter2 = __AttrID2FunMap__.find(anAttributeID); - if(anIter2 != __AttrID2FunMap__.end()) - { - theAttrFun = anIter2->second; - return true; - } - } - return false; - } +// OCC Headers +#include +#include +#include +#include +#ifdef WIN32 +#include +#else +#include +#include +#endif - //============================================================================ - Standard_GUID GetGUID(const char* theType) - { - TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType); - if(anIter != __AttrID2FunMap__.end()){ - const TAttrID2FunMap::mapped_type& aValue = anIter->second; - return aValue.myGetGUID(); - } - // create tree node GUID by name - if(strncmp(theType,"AttributeTreeNodeGUID",21) == 0){ - char aGUIDString[40] = ""; - sprintf(aGUIDString,&theType[21]); - return aGUIDString; - } - - return Standard_GUID(); - } +#include "OpUtil.hxx" +using namespace std; - //============================================================================ - std::string GetType(const Handle(TDF_Attribute)& theAttr) - { - if(theAttr.IsNull()) - return CORBA::string_dup(""); - - Standard_GUID aGUID = theAttr->ID(); - TGUID2AttrIDMap::const_iterator anIter = __GUID2AttrIDMap__.find(aGUID); - if(anIter != __GUID2AttrIDMap__.end()) - { - const TAttributeID& anAttributeID = anIter->second; - return anAttributeID; - } - - char aType[60] = ""; - { - Handle(TDataStd_TreeNode) anAttr = Handle(TDataStd_TreeNode)::DownCast(theAttr); - if (!anAttr.IsNull()) { - char aGUID[40] = ""; - anAttr->ID().ToCString(aGUID); - sprintf(aType, "AttributeTreeNodeGUID%s",aGUID); - return aType; - } - } - { - Handle(TDataStd_UAttribute) anAttr = Handle(TDataStd_UAttribute)::DownCast(theAttr); - if (!anAttr.IsNull()) { - char aGUID[40] = ""; - anAttr->ID().ToCString(aGUID); - sprintf(aType, "AttributeUserID_%s",aGUID); - return aType; - } - } - return aType; - } - -} - -//============================================================================ -SALOMEDS_Study_i::TSObjectHolder -SALOMEDS_SObject_i::New(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel) +SALOMEDS::SObject_ptr SALOMEDS_SObject_i::New(const Handle(SALOMEDSImpl_SObject)& theImpl, CORBA::ORB_ptr theORB) { - SALOMEDS_Study_i::TSObjectHolder aSObjectHolder; - SALOMEDS_Study_i::TSObjectMap& anSObjectMap = theStudy->GetSObjectMap(); - SALOMEDS_Study_i::TSObjectMap::const_iterator anIter = anSObjectMap.find(theLabel); - if(anIter != anSObjectMap.end()) - aSObjectHolder = anIter->second; - else{ - SALOMEDS_SObject_i* aSObject = new SALOMEDS_SObject_i(theStudy,theLabel); - aSObjectHolder.first = aSObject; - aSObjectHolder.second = aSObject->_this(); - anSObjectMap[theLabel] = aSObjectHolder; - - //TCollection_AsciiString anEntry; - //TDF_Tool::Entry(theLabel,anEntry); - //cout<<"APO - SALOMEDS_SObject_i::New - anEntry = "<_this()); -SALOMEDS_SObject_i* -SALOMEDS_SObject_i::NewPtr(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel) -{ - return New(theStudy,theLabel).first; + return so._retn(); } -SALOMEDS::SObject_var -SALOMEDS_SObject_i::NewRef(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel) -{ - return New(theStudy,theLabel).second; -} //============================================================================ /*! Function : constructor - * Purpose : + * Purpose : */ //============================================================================ -SALOMEDS_SObject_i::SALOMEDS_SObject_i(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel): - _lab(theLabel), - _study(theStudy) +SALOMEDS_SObject_i::SALOMEDS_SObject_i(const Handle(SALOMEDSImpl_SObject)& impl, CORBA::ORB_ptr orb) + : _impl(impl) { + _orb = CORBA::ORB::_duplicate(orb); + //SALOME::GenericObj_i::myPOA = SALOMEDS_StudyManager_i::GetPOA(GetStudy()); } + //============================================================================ /*! Function : destructor - * Purpose : + * Purpose : */ //============================================================================ SALOMEDS_SObject_i::~SALOMEDS_SObject_i() -{ -} - +{} + +//============================================================================ +/*! Function :GetID + * Purpose : + */ //============================================================================ -CORBA::ORB_var SALOMEDS_SObject_i::GetORB() const +char* SALOMEDS_SObject_i::GetID() { - return _study->GetORB(); + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->GetID().ToCString()); } - //============================================================================ -PortableServer::POA_var SALOMEDS_SObject_i::GetPOA() const +/*! Function : GetFatherComponent + * Purpose : + */ +//============================================================================ +SALOMEDS::SComponent_ptr SALOMEDS_SObject_i::GetFatherComponent() { - return _study->GetPOA(); + SALOMEDS::Locker lock; + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (_impl->GetFatherComponent(), _orb); + return sco._retn(); } - //============================================================================ -/*! Function : - * Purpose : +/*! Function : GetFather + * Purpose : */ //============================================================================ -char* SALOMEDS_SObject_i::GetID() +SALOMEDS::SObject_ptr SALOMEDS_SObject_i::GetFather() { - TCollection_AsciiString anEntry; - TDF_Tool::Entry(_lab,anEntry); - return CORBA::string_dup(anEntry.ToCString()); + SALOMEDS::Locker lock; + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (_impl->GetFather(), _orb); + return so._retn(); } - + //============================================================================ /*! Function : - * Purpose : + * Purpose : */ //============================================================================ -TDF_Label SALOMEDS_SObject_i::GetFatherComponentLabel() +SALOMEDS::Study_ptr SALOMEDS_SObject_i::GetStudy() { - TDF_Label aLabel = _lab; - while(!SALOMEDS_SComponent_i::IsA(aLabel) && !aLabel.IsRoot()) - aLabel = aLabel.Father(); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_Study) aStudy = _impl->GetStudy(); + if(aStudy.IsNull()) { + MESSAGE("Problem GetStudy"); + return SALOMEDS::Study::_nil(); + } - return aLabel; + TCollection_AsciiString IOR = aStudy->GetTransientReference(); + CORBA::Object_var obj = _orb->string_to_object(IOR.ToCString()); + SALOMEDS::Study_var Study = SALOMEDS::Study::_narrow(obj) ; + ASSERT(!CORBA::is_nil(Study)); + return SALOMEDS::Study::_duplicate(Study); } -SALOMEDS::SComponent_ptr SALOMEDS_SObject_i::GetFatherComponent() -{ - TDF_Label aSCompLabel = GetFatherComponentLabel(); - - return SALOMEDS_SComponent_i::NewRef(_study,aSCompLabel)._retn(); -} - //============================================================================ -/*! Function : - * Purpose : +/*! Function : FindAttribute + * Purpose : Find attribute of given type on this SObject */ //============================================================================ -SALOMEDS::SObject_ptr SALOMEDS_SObject_i::GetFather() +CORBA::Boolean SALOMEDS_SObject_i::FindAttribute (SALOMEDS::GenericAttribute_out anAttribute, + const char* aTypeOfAttribute) { - return SALOMEDS_SObject_i::NewRef(_study,_lab.Father())._retn(); + SALOMEDS::Locker lock; + Handle(TDF_Attribute) anAttr; + if(_impl->FindAttribute(anAttr, (char*)aTypeOfAttribute)) { + anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb)); + return Standard_True; + } + + return Standard_False; } //============================================================================ -/*! Function : - * Purpose : +/*! Function : GetAllAttributes + * Purpose : Returns list of all attributes for this sobject */ //============================================================================ -SALOMEDS::Study_ptr SALOMEDS_SObject_i::GetStudy() + +SALOMEDS::ListOfAttributes* SALOMEDS_SObject_i::GetAllAttributes() { - return _study->_this(); + SALOMEDS::Locker lock; + Handle(TColStd_HSequenceOfTransient) aSeq = _impl->GetAllAttributes(); + SALOMEDS::ListOfAttributes_var SeqOfAttr = new SALOMEDS::ListOfAttributes; + Standard_Integer length = aSeq->Length(); + + SeqOfAttr->length(length); + + if (length != 0) { + for(int i = 1; i<= length; i++) { + Handle(SALOMEDSImpl_GenericAttribute) anAttr = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(aSeq->Value(i)); + SALOMEDS::GenericAttribute_var anAttribute; + anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb)); + if (!CORBA::is_nil(anAttribute)) { + SeqOfAttr[i - 1] = anAttribute; + } + } + } + return SeqOfAttr._retn(); } + //============================================================================ /*! Function : ReferencedObject - * Purpose : + * Purpose : */ //============================================================================ -CORBA::Boolean SALOMEDS_SObject_i::ReferencedObject(SALOMEDS::SObject_out theSObject) +CORBA::Boolean SALOMEDS_SObject_i::ReferencedObject(SALOMEDS::SObject_out obj) { - Handle(TDF_Reference) aRef; - if (!_lab.FindAttribute(TDF_Reference::GetID(),aRef)) - return false; - - theSObject = SALOMEDS_SObject_i::NewRef(_study,aRef->Get())._retn(); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_SObject) aRefObj; + if(!_impl->ReferencedObject(aRefObj)) return false; + + obj = SALOMEDS_SObject_i::New (aRefObj, _orb); return true; } //============================================================================ -/*! Function : - * Purpose : +/*! Function : FindSubObject + * Purpose : */ //============================================================================ -CORBA::Boolean SALOMEDS_SObject_i::FindSubObject(CORBA::Long theTag, SALOMEDS::SObject_out theSObject) +CORBA::Boolean SALOMEDS_SObject_i::FindSubObject(long atag, SALOMEDS::SObject_out obj) { - TDF_Label aLabel = _lab.FindChild(theTag,false); - if(aLabel.IsNull()) - return false; - - theSObject = SALOMEDS_SObject_i::NewRef(_study,aLabel)._retn(); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_SObject) aSubObj; + if(!_impl->FindSubObject(atag, aSubObj)) return false; + + obj = SALOMEDS_SObject_i::New (aSubObj, _orb); return true; -} + +} //============================================================================ -/*! Function : - * Purpose : +/*! Function : Name + * Purpose : gets a name */ //============================================================================ char* SALOMEDS_SObject_i::Name() { - return CORBA::string_dup(_name.c_str()); + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->Name().ToCString()); } - + //============================================================================ -/*! Function : - * Purpose : +/*! Function : Name + * Purpose : sets a name */ //============================================================================ -void SALOMEDS_SObject_i::Name(const char* theName) +void SALOMEDS_SObject_i::Name(const char* name) { - _name = theName; + SALOMEDS::Locker lock; + TCollection_AsciiString aName((char*)name); + _impl->Name(aName); } - + //============================================================================ -/*! Function : - * Purpose : +/*! Function : Tag + * Purpose : */ //============================================================================ CORBA::Short SALOMEDS_SObject_i::Tag() { - return _lab.Tag(); + SALOMEDS::Locker lock; + return _impl->Tag(); } //============================================================================ -/*! Function : - * Purpose : +/*! Function : Depth + * Purpose : */ //============================================================================ CORBA::Short SALOMEDS_SObject_i::Depth() { - return _lab.Depth(); + SALOMEDS::Locker lock; + return _impl->Depth(); } //============================================================================ -/*! Function : - * Purpose : +/*! Function : GetObject + * Purpose : */ //============================================================================ CORBA::Object_ptr SALOMEDS_SObject_i::GetObject() { + SALOMEDS::Locker lock; + CORBA::Object_ptr obj = CORBA::Object::_nil(); try { - Handle(SALOMEDS_IORAttribute) anAttr; - if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)){ - CORBA::ORB_var anORB = _study->GetStudyManager()->GetORB(); - return anORB->string_to_object(Str(anAttr->Get())); - } - }catch(...){ - } - return CORBA::Object::_nil(); -} - -//============================================================================ -/*! Function : - * Purpose : - */ -//============================================================================ -char* SALOMEDS_SObject_i::GetName() { - Handle(TDataStd_Name) anAttr; - if(_lab.FindAttribute(TDataStd_Name::GetID(),anAttr)) - return CORBA::string_dup(Str(anAttr->Get())); - - return CORBA::string_dup(""); -} - -//============================================================================ -/*! Function : - * Purpose : - */ -//============================================================================ -char* SALOMEDS_SObject_i::GetComment() { - Handle(TDataStd_Comment) anAttr; - if(_lab.FindAttribute(TDataStd_Comment::GetID(), anAttr)) - return CORBA::string_dup(Str(anAttr->Get())); - - return CORBA::string_dup(""); -} - -//============================================================================ -/*! Function : - * Purpose : - */ -//============================================================================ -char* SALOMEDS_SObject_i::GetIOR() { - Handle(SALOMEDS_IORAttribute) anAttr; - if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)) - return CORBA::string_dup(Str(anAttr->Get())); - - return CORBA::string_dup(""); + TCollection_AsciiString IOR = _impl->GetIOR(); + char* c_ior = CORBA::string_dup(IOR.ToCString()); + obj = _orb->string_to_object(c_ior); + CORBA::string_free(c_ior); + } catch(...) {} + return obj; } - //============================================================================ -/*! Function : GetAllAttributes - * Purpose : Returns list of all attributes for this sobject +/*! Function : GetName + * Purpose : */ //============================================================================ -SALOMEDS_SObject_i::TAttrHolder -SALOMEDS_SObject_i::_FindGenAttribute(const Handle(TDF_Attribute)& theAttr) +char* SALOMEDS_SObject_i::GetName() { - std::string aType = GetType(theAttr); - return _FindGenAttribute(aType.c_str()); + SALOMEDS::Locker lock; + CORBA::String_var aStr = CORBA::string_dup(_impl->GetName().ToCString()); + return aStr._retn(); } - -SALOMEDS::ListOfAttributes* SALOMEDS_SObject_i::GetAllAttributes() -{ - SALOMEDS::ListOfAttributes_var aSeqOfAttr = new SALOMEDS::ListOfAttributes; - if(_lab.NbAttributes() > 0){ - Standard_Integer i = 0; - for(TDF_AttributeIterator iter(_lab); iter.More(); iter.Next()) { - Handle(TDF_Attribute) anAttr = iter.Value(); - TAttrHolder anAttrHolder = _FindGenAttribute(anAttr); - SALOMEDS::GenericAttribute_var anGenAttr = anAttrHolder.second; - if(!anGenAttr->_is_nil()) - { - aSeqOfAttr->length(++i); - aSeqOfAttr[i-1] = anGenAttr._retn(); - } - } - } - - return aSeqOfAttr._retn(); -} - - //============================================================================ -/*! Function : FindAttribute - * Purpose : Find attribute of given type on this SObject +/*! Function : GetComment + * Purpose : */ //============================================================================ -SALOMEDS_SObject_i::TAttrHolder -SALOMEDS_SObject_i::_CreateGenAttribute(const Handle(TDF_Attribute)& theAttr, - const char* theType) +char* SALOMEDS_SObject_i::GetComment() { - SALOMEDS_GenericAttribute_i* anAttr; - TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType); - if(anIter != __AttrID2FunMap__.end()){ - const TAttrID2FunMap::mapped_type& aValue = anIter->second; - - //if(aValue.myIsCheckLockedStudy()) // mpv 03.02.05: creation of CORBA objects does not modify the study - // _study->CheckLocked(); - - anAttr = aValue.myNewInstance(theAttr,this); - return TAttrHolder(anAttr,anAttr->_this()); - } - - if(strncmp(theType,"AttributeTreeNode",17) == 0){ - anAttr = new SALOMEDS_AttributeTreeNode_i(theAttr,this); - return TAttrHolder(anAttr,anAttr->_this()); - } - - if(strncmp(theType,"AttributeUserID",15) == 0){ - anAttr = new SALOMEDS_AttributeUserID_i(theAttr,this); - return TAttrHolder(anAttr,anAttr->_this()); - } - - return TAttrHolder(); + SALOMEDS::Locker lock; + CORBA::String_var aStr = CORBA::string_dup(_impl->GetComment().ToCString()); + return aStr._retn(); } - -SALOMEDS_SObject_i::TAttrHolder -SALOMEDS_SObject_i::_FindGenAttribute(const char* theType) -{ - TAttrHolder anAttrHolder; - TAttrMap::const_iterator anIter = myAttrMap.find(theType); - if(anIter != myAttrMap.end()) - anAttrHolder = anIter->second; - - Standard_GUID aGUID = ::GetGUID(theType); - Handle(TDF_Attribute) anAttr; - - if(_lab.FindAttribute(aGUID,anAttr)){ - SALOMEDS_GenericAttribute_i* aGenAttr = anAttrHolder.first; - if(aGenAttr != NULL){ - if(aGenAttr->GetAttribute() != anAttr) - aGenAttr->SetAttribute(anAttr); - }else{ - anAttrHolder = _CreateGenAttribute(anAttr,theType); - } - aGenAttr = anAttrHolder.first; - if(aGenAttr != NULL) - myAttrMap[theType] = anAttrHolder; - }else{ - //myAttrMap.erase(theType); - //if(anGenAttr != NULL) - // anGenAttr->Destroy(); - return TAttrHolder(); - } - - return anAttrHolder; -} - - -CORBA::Boolean -SALOMEDS_SObject_i::FindAttribute(SALOMEDS::GenericAttribute_out theAttribute, - const char* theType) -{ - TAttrHolder anAttr = _FindGenAttribute(theType); - SALOMEDS::GenericAttribute_var anGenAttr = anAttr.second; - if(!CORBA::is_nil(anGenAttr)){ - theAttribute = SALOMEDS::GenericAttribute::_duplicate(anGenAttr); - return true; - } - return false; -} - - //============================================================================ -/*! Function : FindAttribute - * Purpose : Find attribute of given type on this SObject +/*! Function : GetIOR + * Purpose : */ //============================================================================ -Handle(TDF_Attribute) - SALOMEDS_SObject_i::_AddAttribute(const char* theType) +char* SALOMEDS_SObject_i::GetIOR() { - Handle(TDF_Attribute) anAttr; - TAttrID2FunMap::const_iterator anIter = __AttrID2FunMap__.find(theType); - if(anIter != __AttrID2FunMap__.end()){ - const TAttrID2FunMap::mapped_type& aValue = anIter->second; - - if(aValue.myIsCheckLockedStudy()) - _study->CheckLocked(); - - anAttr = aValue.myNewAttribute(); - _lab.AddAttribute(anAttr); - return anAttr; - } - - if(strncmp(theType, "AttributeTreeNode",17) == 0){ - Standard_GUID aGUID; - if(strcmp(theType, "AttributeTreeNode") == 0){ - aGUID = TDataStd_TreeNode::GetDefaultTreeID(); - }else{ - char aString[40] = ""; - sprintf(aString, &theType[21]); - aGUID = Standard_GUID(aString); // create tree node GUID by name - } - if(!_lab.FindAttribute(aGUID,anAttr)){ - _study->CheckLocked(); - anAttr = TDataStd_TreeNode::Set(_lab,aGUID); - return anAttr; - } - } - - if(strncmp(theType, "AttributeUserID",15) == 0){ - Standard_GUID aGUID = SALOMEDS_AttributeUserID_i::GetGUID(); - if(!_lab.FindAttribute(aGUID,anAttr)){ - _study->CheckLocked(); - anAttr = TDataStd_UAttribute::Set(_lab,aGUID); - return anAttr; - } - } - - - return anAttr; + SALOMEDS::Locker lock; + CORBA::String_var aStr = CORBA::string_dup(_impl->GetIOR().ToCString()); + return aStr._retn(); } - -SALOMEDS::GenericAttribute_ptr -SALOMEDS_SObject_i::FindOrCreateAttribute(const char* theType) +//=========================================================================== +// PRIVATE FUNCTIONS +//=========================================================================== +long SALOMEDS_SObject_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal) { - TAttrHolder anAttrHolder = _FindGenAttribute(theType); - SALOMEDS::GenericAttribute_var anGenAttr = anAttrHolder.second; - if(!anGenAttr->_is_nil()) - return anGenAttr._retn(); - - Handle(TDF_Attribute) anAttr = _AddAttribute(theType); - if(!anAttr.IsNull()){ - anAttrHolder = _CreateGenAttribute(anAttr,theType); - anGenAttr = anAttrHolder.second; - if(!anGenAttr->_is_nil()) - return anGenAttr._retn(); - } - - return SALOMEDS::GenericAttribute::_nil(); -} - - -//============================================================================ -/*! Function : FindAttribute - * Purpose : Find attribute of given type on this SObject - */ -//============================================================================ -void SALOMEDS_SObject_i::RemoveAttribute(const char* theType) -{ - _study->CheckLocked(); - if(strcmp(theType, "AttributeIOR") == 0) { // postponed removing of CORBA objects - Handle(SALOMEDS_IORAttribute) anAttr; - if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(), anAttr)) - _study->AddPostponed(Str(anAttr->Get())); - else - return; - } - TAttrMap::iterator anIter = myAttrMap.find(theType); - if(anIter != myAttrMap.end()){ - //myAttrMap.erase(anIter); - } - _lab.ForgetAttribute(::GetGUID(theType)); -} - - -void SALOMEDS_SObject_i::OnRemove() -{ - Handle(TDF_Reference) aReference; - if(_lab.FindAttribute(TDF_Reference::GetID(),aReference)){ - Handle(SALOMEDS_TargetAttribute) aTarget; - if(aReference->Get().FindAttribute(SALOMEDS_TargetAttribute::GetID(),aTarget)) - aTarget->Remove(_lab); - } - - Handle(SALOMEDS_IORAttribute) anAttr; // postponed removing of CORBA objects - if(_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)){ - _study->AddPostponed(TCollection_AsciiString(anAttr->Get()).ToCString()); - } - - //myAttrMap.clear(); - - //SALOMEDS_Study_i::TSObjectMap& anSObjectMap = _study->GetSObjectMap(); - //anSObjectMap.erase(_lab); +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + isLocal = (strcmp(theHostname, GetHostname().c_str()) == 0 && pid == thePID)?1:0; + SALOMEDSImpl_SObject* local_impl = _impl.operator->(); + return ((long)local_impl); } diff --git a/src/SALOMEDS/SALOMEDS_SObject_i.hxx b/src/SALOMEDS/SALOMEDS_SObject_i.hxx index c5f534180..812e13059 100644 --- a/src/SALOMEDS/SALOMEDS_SObject_i.hxx +++ b/src/SALOMEDS/SALOMEDS_SObject_i.hxx @@ -1,157 +1,63 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_SObject_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef __SALOMEDS_SOBJECT_I_H__ #define __SALOMEDS_SOBJECT_I_H__ -#include -#include - -// Cascade headers -#include -#include -#include - -#include "SALOMEDS_Study_i.hxx" +// std C++ headers +#include // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS) +#include -class SALOMEDS_GenericAttribute_i; +// Cascade headers +#include "SALOMEDSImpl_SObject.hxx" +#ifdef GetObject +#undef GetObject +#endif -namespace SALOMEDS +class Standard_EXPORT SALOMEDS_SObject_i: public virtual POA_SALOMEDS::SObject, + public virtual PortableServer::RefCountServantBase, + public virtual SALOME::GenericObj_i { - const char* Str(const TCollection_ExtendedString& theString); - - std::string GetType(const Handle(TDF_Attribute)& theAttr); - - Standard_GUID GetGUID(const char* theType); - -} - +protected: + CORBA::ORB_ptr _orb; + Handle(SALOMEDSImpl_SObject) _impl; -class SALOMEDS_SObject_i: public virtual POA_SALOMEDS::SObject, - public virtual PortableServer::RefCountServantBase -{ public: - static - SALOMEDS_Study_i::TSObjectHolder - New(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel); - static - SALOMEDS_SObject_i* - NewPtr(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel); - - static - SALOMEDS::SObject_var - NewRef(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel); - - virtual SALOMEDS::SObject_ptr GetFather() ; + static SALOMEDS::SObject_ptr New(const Handle(SALOMEDSImpl_SObject)&, CORBA::ORB_ptr); + + SALOMEDS_SObject_i(const Handle(SALOMEDSImpl_SObject)&, CORBA::ORB_ptr); + + virtual ~SALOMEDS_SObject_i(); + + virtual char* GetID(); virtual SALOMEDS::SComponent_ptr GetFatherComponent(); - virtual CORBA::Boolean ReferencedObject(SALOMEDS::SObject_out theSObject); - virtual CORBA::Boolean FindSubObject(CORBA::Long theTag, SALOMEDS::SObject_out theSObject); + virtual SALOMEDS::SObject_ptr GetFather() ; + virtual CORBA::Boolean FindAttribute(SALOMEDS::GenericAttribute_out anAttribute, const char* aTypeOfAttribute); + virtual CORBA::Boolean ReferencedObject(SALOMEDS::SObject_out obj) ; + virtual CORBA::Boolean FindSubObject(long atag, SALOMEDS::SObject_out obj ); - virtual SALOMEDS::Study_ptr GetStudy(); + virtual SALOMEDS::Study_ptr GetStudy() ; + virtual char* Name(); + virtual void Name(const char*); virtual SALOMEDS::ListOfAttributes* GetAllAttributes(); virtual CORBA::Object_ptr GetObject(); - virtual char* GetID(); - virtual CORBA::Short Tag(); - virtual CORBA::Short Depth(); - - virtual char* Name(); - virtual void Name(const char* theName); - virtual char* GetName(); virtual char* GetComment(); virtual char* GetIOR(); - CORBA::Boolean - FindAttribute(SALOMEDS::GenericAttribute_out theAttribute, - const char* theTypeOfAttribute); - - SALOMEDS::GenericAttribute_ptr - FindOrCreateAttribute(const char* theTypeOfAttribute); - - void RemoveAttribute(const char* theTypeOfAttribute); - void OnRemove(); - - SALOMEDS_Study_i* GetStudyServant(){ return _study;} - - TDF_Label GetLabel(){ return _lab;} - TDF_Label GetFatherLabel(){ return _lab.Father();} - TDF_Label GetFatherComponentLabel(); - - CORBA::ORB_var GetORB() const; - - PortableServer::POA_var GetPOA() const; - -protected: - friend class SALOMEDS_GenericAttribute_i; - - typedef std::string TAttributeID; - typedef std::pair TAttrHolder; - typedef std::map TAttrMap; - TAttrMap myAttrMap; - - TAttrHolder - _FindGenAttribute(const Handle(TDF_Attribute)& theAttr); - - TAttrHolder - _CreateGenAttribute(const Handle(TDF_Attribute)& theAttr, - const char* theTypeOfAttribute); - - TAttrHolder - _FindGenAttribute(const char* theTypeOfAttribute); - - Handle(TDF_Attribute) - _AddAttribute(const char* theTypeOfAttribute); - - SALOMEDS_Study_i* _study; - std::string _name; - TDF_Label _lab; - - SALOMEDS_SObject_i(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel); - - ~SALOMEDS_SObject_i(); - -private: - SALOMEDS_SObject_i(); // Not implemented - void operator=(const SALOMEDS_SObject_i&); // Not implemented + virtual CORBA::Short Tag(); + virtual CORBA::Short Depth(); + virtual long GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal); }; - #endif diff --git a/src/SALOMEDS/SALOMEDS_Server.cxx b/src/SALOMEDS/SALOMEDS_Server.cxx index 70919bba0..d39465cbe 100644 --- a/src/SALOMEDS/SALOMEDS_Server.cxx +++ b/src/SALOMEDS/SALOMEDS_Server.cxx @@ -53,10 +53,14 @@ int main(int argc, char** argv) try { // Initialise the ORB. +#if OMNIORB_VERSION >= 4 + const char* options[][2] = { { "giopMaxMsgSize", "104857600" }, { 0, 0 } }; + CORBA::ORB_var orb = CORBA::ORB_init( argc , argv , "omniORB4", options) ; +#else CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "omniORB3"); omniORB::MaxMessageSize(100 * 1024 * 1024); +#endif // Obtain a reference to the root POA. - // long TIMESleep = 500000000; int NumberOfTries = 40; int a; @@ -83,7 +87,11 @@ int main(int argc, char** argv) for (int i = 1; i<=NumberOfTries; i++) { if (i!=1) +#ifndef WNT a=nanosleep(&ts_req,&ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try { obj = orb->resolve_initial_references("RootPOA"); @@ -106,7 +114,11 @@ int main(int argc, char** argv) for(int j=1; j<=NumberOfTries; j++) { if (j!=1) +#ifndef WNT a=nanosleep(&ts_req, &ts_rem); +#else + Sleep(TIMESleep/1000000); +#endif try { object = inc->resolve(name); diff --git a/src/SALOMEDS/SALOMEDS_Study.cxx b/src/SALOMEDS/SALOMEDS_Study.cxx new file mode 100644 index 000000000..4f202bad9 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_Study.cxx @@ -0,0 +1,571 @@ +// File : SALOMEDS_Study.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include "utilities.h" + +#include "SALOMEDS_Study.hxx" +#include "SALOMEDS_SComponent.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDS_SObject.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDS_StudyBuilder.hxx" +#include "SALOMEDSImpl_StudyBuilder.hxx" +#include "SALOMEDS_ChildIterator.hxx" +#include "SALOMEDSImpl_ChildIterator.hxx" +#include "SALOMEDS_SComponentIterator.hxx" +#include "SALOMEDSImpl_SComponentIterator.hxx" +#include "SALOMEDS_AttributeStudyProperties.hxx" +#include "SALOMEDSImpl_AttributeStudyProperties.hxx" +#include "SALOMEDS_UseCaseBuilder.hxx" +#include "SALOMEDSImpl_UseCaseBuilder.hxx" + +#include "SALOMEDS_Driver_i.hxx" +#include "SALOMEDS_Study_i.hxx" + +#include +#include +#include + +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include "OpUtil.hxx" + +using namespace std; + +SALOMEDS_Study::SALOMEDS_Study(const Handle(SALOMEDSImpl_Study)& theStudy) +{ + _isLocal = true; + _local_impl = theStudy; + _corba_impl = SALOMEDS::Study::_nil(); + init_orb(); +} + +SALOMEDS_Study::SALOMEDS_Study(SALOMEDS::Study_ptr theStudy) +{ +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + + long addr = theStudy->GetLocalImpl(GetHostname().c_str(), pid, _isLocal); + if(_isLocal) { + _local_impl = ((SALOMEDSImpl_Study*)(addr)); + _corba_impl = SALOMEDS::Study::_duplicate(theStudy); + } + else { + _local_impl = NULL; + _corba_impl = SALOMEDS::Study::_duplicate(theStudy); + } + + init_orb(); +} + +SALOMEDS_Study::~SALOMEDS_Study() +{ +} + +std::string SALOMEDS_Study::GetPersistentReference() +{ + std::string aRef; + if(_isLocal) aRef = _local_impl->GetPersistentReference().ToCString(); + else aRef = _corba_impl->GetPersistentReference(); + return aRef; +} + +std::string SALOMEDS_Study::GetTransientReference() +{ + std::string aRef; + if(_isLocal) aRef = _local_impl->GetTransientReference().ToCString(); + else aRef = _corba_impl->GetTransientReference(); + return aRef; +} + +bool SALOMEDS_Study::IsEmpty() +{ + bool ret; + if(_isLocal) ret = _local_impl->IsEmpty(); + else ret = _corba_impl->IsEmpty(); + return ret; +} + +_PTR(SComponent) SALOMEDS_Study::FindComponent (const std::string& aComponentName) +{ + SALOMEDSClient_SComponent* aSCO = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_SComponent) aSCO_impl =_local_impl->FindComponent((char*)aComponentName.c_str()); + if(aSCO_impl.IsNull()) return _PTR(SComponent)(aSCO); + aSCO = new SALOMEDS_SComponent(aSCO_impl); + } + else { + SALOMEDS::SComponent_var aSCO_impl = _corba_impl->FindComponent((char*)aComponentName.c_str()); + if(CORBA::is_nil(aSCO_impl)) return _PTR(SComponent)(aSCO); + aSCO = new SALOMEDS_SComponent(aSCO_impl); + } + return _PTR(SComponent)(aSCO); +} + +_PTR(SComponent) SALOMEDS_Study::FindComponentID(const std::string& aComponentID) +{ + SALOMEDSClient_SComponent* aSCO = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_SComponent) aSCO_impl =_local_impl->FindComponentID((char*)aComponentID.c_str()); + if(aSCO_impl.IsNull()) return _PTR(SComponent)(aSCO); + aSCO = new SALOMEDS_SComponent(aSCO_impl); + } + else { + SALOMEDS::SComponent_var aSCO_impl = _corba_impl->FindComponentID((char*)aComponentID.c_str()); + if(CORBA::is_nil(aSCO_impl)) return _PTR(SComponent)(aSCO); + aSCO = new SALOMEDS_SComponent(aSCO_impl); + } + return _PTR(SComponent)(aSCO); + +} + +_PTR(SObject) SALOMEDS_Study::FindObject(const std::string& anObjectName) +{ + SALOMEDSClient_SObject* aSO = NULL; + + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->FindObject((char*)anObjectName.c_str()); + if(aSO_impl.IsNull()) return _PTR(SObject)(aSO); + Handle(SALOMEDSImpl_SComponent) aSCO_impl = Handle(SALOMEDSImpl_SComponent)::DownCast(aSO_impl); + if(!aSCO_impl.IsNull()) return _PTR(SObject)(new SALOMEDS_SComponent(aSCO_impl)); + aSO = new SALOMEDS_SObject(aSO_impl); + } + else { + SALOMEDS::SObject_var aSO_impl = _corba_impl->FindObject((char*)anObjectName.c_str()); + if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO); + SALOMEDS::SComponent_var aSCO_impl = SALOMEDS::SComponent::_narrow(aSO_impl); + if(!CORBA::is_nil(aSCO_impl)) return _PTR(SObject)(new SALOMEDS_SComponent(aSCO_impl)); + aSO = new SALOMEDS_SObject(aSO_impl); + } + + return _PTR(SObject)(aSO); +} + +std::vector<_PTR(SObject)> SALOMEDS_Study::FindObjectByName(const std::string& anObjectName, + const std::string& aComponentName) +{ + std::vector<_PTR(SObject)> aVector; + int i, aLength = 0; + + if(_isLocal) { + Handle(TColStd_HSequenceOfTransient) aSeq = _local_impl->FindObjectByName((char*)anObjectName.c_str(), (char*)aComponentName.c_str()); + aLength = aSeq->Length(); + for(i = 1; i<= aLength; i++) + aVector.push_back(_PTR(SObject)(new SALOMEDS_SObject(Handle(SALOMEDSImpl_SObject)::DownCast(aSeq->Value(i))))); + } + else { + SALOMEDS::Study::ListOfSObject_var aSeq = _corba_impl->FindObjectByName((char*)anObjectName.c_str(), + (char*)aComponentName.c_str()); + aLength = aSeq->length(); + for(i = 0; i< aLength; i++) aVector.push_back(_PTR(SObject)(new SALOMEDS_SObject(aSeq[i]))); + } + + return aVector; +} + +_PTR(SObject) SALOMEDS_Study::FindObjectID(const std::string& anObjectID) +{ + SALOMEDSClient_SObject* aSO = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->FindObjectID((char*)anObjectID.c_str()); + if(aSO_impl.IsNull()) return _PTR(SObject)(aSO); + return _PTR(SObject)(new SALOMEDS_SObject(aSO_impl)); + } + else { + SALOMEDS::SObject_var aSO_impl = _corba_impl->FindObjectID((char*)anObjectID.c_str()); + if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO); + return _PTR(SObject)(new SALOMEDS_SObject(aSO_impl)); + } + return _PTR(SObject)(aSO); +} + +_PTR(SObject) SALOMEDS_Study::CreateObjectID(const std::string& anObjectID) +{ + SALOMEDSClient_SObject* aSO = NULL; + if(_isLocal) aSO = new SALOMEDS_SObject(_local_impl->CreateObjectID((char*)anObjectID.c_str())); + else aSO = new SALOMEDS_SObject(_corba_impl->CreateObjectID((char*)anObjectID.c_str())); + return _PTR(SObject)(aSO); +} + +_PTR(SObject) SALOMEDS_Study::FindObjectIOR(const std::string& anObjectIOR) +{ + SALOMEDSClient_SObject* aSO = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->FindObjectIOR((char*)anObjectIOR.c_str()); + if(aSO_impl.IsNull()) return _PTR(SObject)(aSO); + aSO = new SALOMEDS_SObject(aSO_impl); + } + else { + SALOMEDS::SObject_var aSO_impl = _corba_impl->FindObjectIOR((char*)anObjectIOR.c_str()); + if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO); + aSO = new SALOMEDS_SObject(aSO_impl); + } + return _PTR(SObject)(aSO); +} + +_PTR(SObject) SALOMEDS_Study::FindObjectByPath(const std::string& thePath) +{ + SALOMEDSClient_SObject* aSO = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->FindObjectByPath((char*)thePath.c_str()); + if(aSO_impl.IsNull()) return _PTR(SObject)(aSO); + aSO = new SALOMEDS_SObject(aSO_impl); + } + else { + SALOMEDS::SObject_var aSO_impl = _corba_impl->FindObjectByPath((char*)thePath.c_str()); + if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO); + aSO = new SALOMEDS_SObject(aSO_impl); + } + return _PTR(SObject)(aSO); +} + +std::string SALOMEDS_Study::GetObjectPath(const _PTR(SObject)& theSO) +{ + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + std::string aPath; + if(_isLocal) aPath = _local_impl->GetObjectPath(aSO->GetLocalImpl()).ToCString(); + else aPath = _corba_impl->GetObjectPath(aSO->GetCORBAImpl()); + return aPath; +} + +void SALOMEDS_Study::SetContext(const std::string& thePath) +{ + if(_isLocal) _local_impl->SetContext((char*)thePath.c_str()); + else _corba_impl->SetContext((char*)thePath.c_str()); +} + +std::string SALOMEDS_Study::GetContext() +{ + std::string aPath; + if(_isLocal) aPath = _local_impl->GetContext().ToCString(); + else aPath = _corba_impl->GetContext(); + return aPath; +} + +std::vector SALOMEDS_Study::GetObjectNames(const std::string& theContext) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetObjectNames((char*)theContext.c_str()); + aLength = aSeq->Length(); + for(i = 1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString()); + } + else { + SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetObjectNames((char*)theContext.c_str()); + aLength = aSeq->length(); + for(i = 0; i SALOMEDS_Study::GetDirectoryNames(const std::string& theContext) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetDirectoryNames((char*)theContext.c_str()); + aLength = aSeq->Length(); + for(i = 1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString()); + } + else { + SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetDirectoryNames((char*)theContext.c_str()); + aLength = aSeq->length(); + for(i = 0; i SALOMEDS_Study::GetFileNames(const std::string& theContext) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetFileNames((char*)theContext.c_str()); + aLength = aSeq->Length(); + for(i = 1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString()); + } + else { + SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetFileNames((char*)theContext.c_str()); + aLength = aSeq->length(); + + for(i = 0; i SALOMEDS_Study::GetComponentNames(const std::string& theContext) +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetComponentNames((char*)theContext.c_str()); + aLength = aSeq->Length(); + for(i = 1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString()); + } + else { + SALOMEDS::ListOfStrings_var aSeq = _corba_impl->GetComponentNames((char*)theContext.c_str()); + aLength = aSeq->length(); + for(i = 0; i(theSO.get()); + SALOMEDSClient_ChildIterator* aCI = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_ChildIterator) aCIimpl = _local_impl->NewChildIterator(aSO->GetLocalImpl()); + aCI = new SALOMEDS_ChildIterator(aCIimpl); + } + else { + SALOMEDS::ChildIterator_var aCIimpl = _corba_impl->NewChildIterator(aSO->GetCORBAImpl()); + aCI = new SALOMEDS_ChildIterator(aCIimpl); + } + + return _PTR(ChildIterator)(aCI); +} + +_PTR(SComponentIterator) SALOMEDS_Study::NewComponentIterator() +{ + SALOMEDSClient_SComponentIterator* aCI = NULL; + if(_isLocal) { + SALOMEDSImpl_SComponentIterator aCIimpl = _local_impl->NewComponentIterator(); + aCI = new SALOMEDS_SComponentIterator(aCIimpl); + } + else { + SALOMEDS::SComponentIterator_var aCIimpl = _corba_impl->NewComponentIterator(); + aCI = new SALOMEDS_SComponentIterator(aCIimpl); + } + + return _PTR(SComponentIterator)(aCI); +} + +_PTR(StudyBuilder) SALOMEDS_Study::NewBuilder() +{ + SALOMEDSClient_StudyBuilder* aSB = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_StudyBuilder) aSBimpl = _local_impl->NewBuilder(); + aSB = new SALOMEDS_StudyBuilder(aSBimpl); + } + else { + SALOMEDS::StudyBuilder_var aSBimpl = _corba_impl->NewBuilder(); + aSB = new SALOMEDS_StudyBuilder(aSBimpl); + } + + return _PTR(StudyBuilder)(aSB); +} + +std::string SALOMEDS_Study::Name() +{ + std::string aName; + if(_isLocal) aName = _local_impl->Name().ToCString(); + else aName = _corba_impl->Name(); + return aName; +} + +void SALOMEDS_Study::Name(const std::string& theName) +{ + if(_isLocal) _local_impl->Name((char*)theName.c_str()); + else _corba_impl->Name((char*)theName.c_str()); +} + +bool SALOMEDS_Study::IsSaved() +{ + bool isSaved; + if(_isLocal) isSaved = _local_impl->IsSaved(); + else isSaved = _corba_impl->IsSaved(); + return isSaved; +} + +void SALOMEDS_Study::IsSaved(bool save) +{ + if(_isLocal) _local_impl->IsSaved(save); + else _corba_impl->IsSaved(save); +} + +bool SALOMEDS_Study::IsModified() +{ + bool isModified; + if(_isLocal) isModified = _local_impl->IsModified(); + else isModified = _corba_impl->IsModified(); + return isModified; +} + +std::string SALOMEDS_Study::URL() +{ + std::string aURL; + if(_isLocal) aURL = _local_impl->URL().ToCString(); + else aURL = _corba_impl->URL(); + return aURL; +} + +void SALOMEDS_Study::URL(const std::string& url) +{ + if(_isLocal) _local_impl->URL((char*)url.c_str()); + else _corba_impl->URL((char*)url.c_str()); +} + +int SALOMEDS_Study::StudyId() +{ + int anID; + if(_isLocal) anID = _local_impl->StudyId(); + else anID = _corba_impl->StudyId(); + return anID; +} + +void SALOMEDS_Study::StudyId(int id) +{ + if(_isLocal) _local_impl->StudyId(id); + else _corba_impl->StudyId(id); +} + +std::vector<_PTR(SObject)> SALOMEDS_Study::FindDependances(const _PTR(SObject)& theSO) +{ + std::vector<_PTR(SObject)> aVector; + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfTransient) aSeq = _local_impl->FindDependances(aSO->GetLocalImpl()); + if ( !aSeq.IsNull() ) + { + aLength = aSeq->Length(); + for(i=1; i<=aLength; i++) + aVector.push_back(_PTR(SObject)( + new SALOMEDS_SObject(Handle(SALOMEDSImpl_SObject)::DownCast(aSeq->Value(i))))); + } + } + else { + SALOMEDS::Study::ListOfSObject_var aSeq = _corba_impl->FindDependances(aSO->GetCORBAImpl()); + aLength = aSeq->length(); + for(i=0; iGetProperties()); + else aProp = new SALOMEDS_AttributeStudyProperties(_corba_impl->GetProperties()); + return _PTR(AttributeStudyProperties)(aProp); +} + +std::string SALOMEDS_Study::GetLastModificationDate() +{ + std::string aDate; + if(_isLocal) aDate = _local_impl->GetLastModificationDate().ToCString(); + else aDate = _corba_impl->GetLastModificationDate(); + return aDate; +} + +std::vector SALOMEDS_Study::GetModificationsDate() +{ + std::vector aVector; + int aLength, i; + if(_isLocal) { + Handle(TColStd_HSequenceOfAsciiString) aSeq = _local_impl->GetModificationsDate(); + aLength = aSeq->Length(); + for(i=1; i<=aLength; i++) aVector.push_back(aSeq->Value(i).ToCString()); + } + else { + SALOMEDS::ListOfDates_var aSeq = _corba_impl->GetModificationsDate(); + aLength = aSeq->length(); + for(i=0; iGetUseCaseBuilder(); + aUB = new SALOMEDS_UseCaseBuilder(aUBimpl); + } + else { + SALOMEDS::UseCaseBuilder_var aUBimpl = _corba_impl->GetUseCaseBuilder(); + aUB = new SALOMEDS_UseCaseBuilder(aUBimpl); + } + + return _PTR(UseCaseBuilder)(aUB); +} + +void SALOMEDS_Study::Close() +{ + if(_isLocal) _local_impl->Close(); + else _corba_impl->Close(); +} + +void SALOMEDS_Study::EnableUseCaseAutoFilling(bool isEnabled) +{ + if(_isLocal) _local_impl->EnableUseCaseAutoFilling(isEnabled); + else _corba_impl->EnableUseCaseAutoFilling(isEnabled); +} + +bool SALOMEDS_Study::DumpStudy(const std::string& thePath, const std::string& theBaseName, bool isPublished) +{ + bool ret; + if(_isLocal) { + SALOMEDS_DriverFactory_i* aFactory = new SALOMEDS_DriverFactory_i(_orb); + ret = _local_impl->DumpStudy((char*)thePath.c_str(), (char*)theBaseName.c_str(), isPublished, aFactory); + delete aFactory; + } + else ret = _corba_impl->DumpStudy((char*)thePath.c_str(), (char*)theBaseName.c_str(), isPublished); + return ret; +} + +std::string SALOMEDS_Study::ConvertObjectToIOR(CORBA::Object_ptr theObject) +{ + return _orb->object_to_string(theObject); +} + +CORBA::Object_ptr SALOMEDS_Study::ConvertIORToObject(const std::string& theIOR) +{ + return _orb->string_to_object(theIOR.c_str()); +} + +void SALOMEDS_Study::init_orb() +{ + ORB_INIT &init = *SINGLETON_::Instance() ; + ASSERT(SINGLETON_::IsAlreadyExisting()); + _orb = init(0 , 0 ) ; +} + +SALOMEDS::Study_ptr SALOMEDS_Study::GetStudy() +{ + if(_isLocal) { + if(!CORBA::is_nil(_corba_impl)) return _corba_impl; + std::string anIOR = _local_impl->GetTransientReference().ToCString(); + SALOMEDS::Study_var aStudy; + if(!_local_impl->IsError() && anIOR != "") { + aStudy = SALOMEDS::Study::_narrow(_orb->string_to_object(anIOR.c_str())); + } + else { + SALOMEDS_Study_i *aStudy_servant = new SALOMEDS_Study_i(_local_impl, _orb); + aStudy = aStudy_servant->_this(); + _local_impl->SetTransientReference(_orb->object_to_string(aStudy)); + } + return aStudy._retn(); + } + else { + return _corba_impl; + } + + return SALOMEDS::Study::_nil(); +} diff --git a/src/SALOMEDS/SALOMEDS_Study.hxx b/src/SALOMEDS/SALOMEDS_Study.hxx new file mode 100644 index 000000000..83f1ec4d2 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_Study.hxx @@ -0,0 +1,81 @@ +// File : SALOMEDS_Study.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_STUDY_H__ +#define __SALOMEDS_STUDY_H__ + +#include +#include + +#include "SALOMEDSClient.hxx" +#include "SALOMEDSImpl_Study.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +class Standard_EXPORT SALOMEDS_Study: public SALOMEDSClient_Study +{ + +private: + bool _isLocal; + Handle(SALOMEDSImpl_Study) _local_impl; + SALOMEDS::Study_var _corba_impl; + CORBA::ORB_var _orb; + +public: + + SALOMEDS_Study(const Handle(SALOMEDSImpl_Study)& theStudy); + SALOMEDS_Study(SALOMEDS::Study_ptr theStudy); + ~SALOMEDS_Study(); + + virtual std::string GetPersistentReference(); + virtual std::string GetTransientReference(); + virtual bool IsEmpty(); + virtual _PTR(SComponent) FindComponent (const std::string& aComponentName); + virtual _PTR(SComponent) FindComponentID(const std::string& aComponentID); + virtual _PTR(SObject) FindObject(const std::string& anObjectName); + virtual std::vector<_PTR(SObject)> FindObjectByName( const std::string& anObjectName, const std::string& aComponentName ) ; + virtual _PTR(SObject) FindObjectID(const std::string& anObjectID); + virtual _PTR(SObject) CreateObjectID(const std::string& anObjectID); + virtual _PTR(SObject) FindObjectIOR(const std::string& anObjectIOR); + virtual _PTR(SObject) FindObjectByPath(const std::string& thePath); + virtual std::string GetObjectPath(const _PTR(SObject)& theSO); + virtual void SetContext(const std::string& thePath); + virtual std::string GetContext(); + virtual std::vector GetObjectNames(const std::string& theContext); + virtual std::vector GetDirectoryNames(const std::string& theContext); + virtual std::vector GetFileNames(const std::string& theContext); + virtual std::vector GetComponentNames(const std::string& theContext); + virtual _PTR(ChildIterator) NewChildIterator(const _PTR(SObject)& theSO); + virtual _PTR(SComponentIterator) NewComponentIterator(); + virtual _PTR(StudyBuilder) NewBuilder(); + virtual std::string Name(); + virtual void Name(const std::string& name); + virtual bool IsSaved(); + virtual void IsSaved(bool save); + virtual bool IsModified(); + virtual std::string URL(); + virtual void URL(const std::string& url); + virtual int StudyId(); + virtual void StudyId(int id); + virtual std::vector<_PTR(SObject)> FindDependances(const _PTR(SObject)& theSO); + virtual _PTR(AttributeStudyProperties) GetProperties(); + virtual std::string GetLastModificationDate(); + virtual std::vector GetModificationsDate(); + virtual _PTR(UseCaseBuilder) GetUseCaseBuilder(); + virtual void Close(); + virtual void EnableUseCaseAutoFilling(bool isEnabled); + virtual bool DumpStudy(const std::string& thePath, const std::string& theBaseName, bool isPublished); + + std::string ConvertObjectToIOR(CORBA::Object_ptr theObject); + CORBA::Object_ptr ConvertIORToObject(const std::string& theIOR); + + SALOMEDS::Study_ptr GetStudy(); + +private: + void init_orb(); + +}; +#endif diff --git a/src/SALOMEDS/SALOMEDS_StudyBuilder.cxx b/src/SALOMEDS/SALOMEDS_StudyBuilder.cxx new file mode 100644 index 000000000..df622bb97 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_StudyBuilder.cxx @@ -0,0 +1,423 @@ +// File : SALOMEDS_StudyBuilder.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include "utilities.h" + +#include "SALOMEDS_StudyBuilder.hxx" +#include "SALOMEDS_SObject.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDS_SComponent.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDS_Driver_i.hxx" +#include "SALOMEDS_GenericAttribute.hxx" +#include "SALOMEDSImpl_GenericAttribute.hxx" +#include +#include +#include +#include "SALOMEDS_StudyManager.hxx" + +#include "Utils_CorbaException.hxx" +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" + +using namespace std; + +SALOMEDS_StudyBuilder::SALOMEDS_StudyBuilder(const Handle(SALOMEDSImpl_StudyBuilder)& theBuilder) +{ + _isLocal = true; + _local_impl = theBuilder; + _corba_impl = SALOMEDS::StudyBuilder::_nil(); + + init_orb(); +} + +SALOMEDS_StudyBuilder::SALOMEDS_StudyBuilder(SALOMEDS::StudyBuilder_ptr theBuilder) +{ + _isLocal = false; + _local_impl = NULL; + _corba_impl = SALOMEDS::StudyBuilder::_duplicate(theBuilder); + + init_orb(); +} + +SALOMEDS_StudyBuilder::~SALOMEDS_StudyBuilder() +{ +} + +_PTR(SComponent) SALOMEDS_StudyBuilder::NewComponent(const std::string& ComponentDataType) +{ + CheckLocked(); + + SALOMEDSClient_SComponent* aSCO = NULL; + + if(_isLocal) { + Handle(SALOMEDSImpl_SComponent) aSCO_impl =_local_impl->NewComponent((char*)ComponentDataType.c_str()); + if(aSCO_impl.IsNull()) return _PTR(SComponent)(aSCO); + aSCO = new SALOMEDS_SComponent(aSCO_impl); + } + else { + SALOMEDS::SComponent_var aSCO_impl = _corba_impl->NewComponent((char*)ComponentDataType.c_str()); + if(CORBA::is_nil(aSCO_impl)) return _PTR(SComponent)(aSCO); + aSCO = new SALOMEDS_SComponent(aSCO_impl); + } + + return _PTR(SComponent)(aSCO); +} + +void SALOMEDS_StudyBuilder::DefineComponentInstance (const _PTR(SComponent)& theSCO, + const std::string& ComponentIOR) +{ + CheckLocked(); + + SALOMEDS_SComponent* aSCO = dynamic_cast(theSCO.get()); + if(_isLocal) _local_impl->DefineComponentInstance(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()), + (char*)ComponentIOR.c_str()); + else { + CORBA::Object_var obj = _orb->string_to_object(ComponentIOR.c_str()); + _corba_impl->DefineComponentInstance(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()), obj); + } +} + +void SALOMEDS_StudyBuilder::RemoveComponent(const _PTR(SComponent)& theSCO) +{ + CheckLocked(); + + SALOMEDS_SComponent* aSCO = dynamic_cast(theSCO.get()); + if(_isLocal) _local_impl->RemoveComponent(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl())); + else _corba_impl->RemoveComponent(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl())); +} + +_PTR(SObject) SALOMEDS_StudyBuilder::NewObject(const _PTR(SObject)& theFatherObject) +{ + CheckLocked(); + + SALOMEDSClient_SObject* aSO = NULL; + SALOMEDS_SObject* father = dynamic_cast< SALOMEDS_SObject*>(theFatherObject.get()); + if(father == NULL) return _PTR(SObject)(aSO); + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->NewObject(father->GetLocalImpl()); + if(aSO_impl.IsNull()) return _PTR(SObject)(aSO); + aSO = new SALOMEDS_SObject(aSO_impl); + } + else { + SALOMEDS::SObject_var aSO_impl = _corba_impl->NewObject(father->GetCORBAImpl()); + if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO); + aSO = new SALOMEDS_SObject(aSO_impl); + } + + return _PTR(SObject)(aSO); +} + +_PTR(SObject) SALOMEDS_StudyBuilder::NewObjectToTag(const _PTR(SObject)& theFatherObject, int theTag) +{ + CheckLocked(); + + SALOMEDSClient_SObject* aSO = NULL; + SALOMEDS_SObject* father = dynamic_cast< SALOMEDS_SObject*>(theFatherObject.get()); + if(father == NULL) return _PTR(SObject)(aSO); + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->NewObjectToTag(father->GetLocalImpl(), theTag); + if(aSO_impl.IsNull()) return _PTR(SObject)(aSO); + aSO = new SALOMEDS_SObject(aSO_impl); + } + else { + SALOMEDS::SObject_var aSO_impl = _corba_impl->NewObjectToTag(father->GetCORBAImpl(), theTag); + if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO); + aSO = new SALOMEDS_SObject(aSO_impl); + } + + return _PTR(SObject)(aSO); + +} + +void SALOMEDS_StudyBuilder::AddDirectory(const std::string& thePath) +{ + CheckLocked(); + + if(_isLocal) { + _local_impl->AddDirectory((char*)thePath.c_str()); + if(_local_impl->IsError()) { + std::string anErrorCode = _local_impl->GetErrorCode().ToCString(); + if(anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed(); + if(anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory(); + if(anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent(); + } + } + else _corba_impl->AddDirectory((char*)thePath.c_str()); +} + +void SALOMEDS_StudyBuilder::LoadWith(const _PTR(SComponent)& theSCO, const std::string& theIOR) +{ + SALOMEDS_SComponent* aSCO = dynamic_cast(theSCO.get()); + CORBA::Object_var obj = _orb->string_to_object(theIOR.c_str()); + SALOMEDS::Driver_var aDriver = SALOMEDS::Driver::_narrow(obj); + + if(_isLocal) { + SALOMEDS_Driver_i* drv = new SALOMEDS_Driver_i(aDriver, _orb); + Handle(SALOMEDSImpl_SComponent) aSCO_impl = Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()); + bool isDone = _local_impl->LoadWith(aSCO_impl, drv); + delete drv; + if(!isDone && _local_impl->IsError()) + THROW_SALOME_CORBA_EXCEPTION(_local_impl->GetErrorCode().ToCString(),SALOME::BAD_PARAM); + } + else { + _corba_impl->LoadWith(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()), aDriver); + } +} + +void SALOMEDS_StudyBuilder::Load(const _PTR(SObject)& theSCO) +{ + SALOMEDS_SComponent* aSCO = dynamic_cast(theSCO.get()); + if(_isLocal) _local_impl->Load(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl())); + else _corba_impl->Load(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl())); +} + +void SALOMEDS_StudyBuilder::RemoveObject(const _PTR(SObject)& theSO) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + if(_isLocal) _local_impl->RemoveObject(aSO->GetLocalImpl()); + else _corba_impl->RemoveObject(aSO->GetCORBAImpl()); +} + +void SALOMEDS_StudyBuilder::RemoveObjectWithChildren(const _PTR(SObject)& theSO) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + if(_isLocal) _local_impl->RemoveObjectWithChildren(aSO->GetLocalImpl()); + else _corba_impl->RemoveObjectWithChildren(aSO->GetCORBAImpl()); +} + +_PTR(GenericAttribute) SALOMEDS_StudyBuilder::FindOrCreateAttribute(const _PTR(SObject)& theSO, + const std::string& aTypeOfAttribute) +{ + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + SALOMEDSClient_GenericAttribute* anAttr = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_GenericAttribute) aGA; + try { + aGA=Handle(SALOMEDSImpl_GenericAttribute)::DownCast(_local_impl->FindOrCreateAttribute(aSO->GetLocalImpl(), + (char*)aTypeOfAttribute.c_str())); + } + catch (...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } + anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aGA); + } + else { + SALOMEDS::GenericAttribute_var aGA = _corba_impl->FindOrCreateAttribute(aSO->GetCORBAImpl(), (char*)aTypeOfAttribute.c_str()); + anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aGA); + } + + return _PTR(GenericAttribute)(anAttr); +} + +bool SALOMEDS_StudyBuilder::FindAttribute(const _PTR(SObject)& theSO, + _PTR(GenericAttribute)& anAttribute, + const std::string& aTypeOfAttribute) +{ + bool ret; + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + if(_isLocal) { + Handle(SALOMEDSImpl_GenericAttribute) aGA; + ret = _local_impl->FindAttribute(aSO->GetLocalImpl(), aGA, (char*)aTypeOfAttribute.c_str()); + if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(aGA)); + } + else { + SALOMEDS::GenericAttribute_var aGA; + ret = _corba_impl->FindAttribute(aSO->GetCORBAImpl(), aGA.out(), (char*)aTypeOfAttribute.c_str()); + if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(aGA)); + } + + return ret; +} + +void SALOMEDS_StudyBuilder::RemoveAttribute(const _PTR(SObject)& theSO, const std::string& aTypeOfAttribute) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + if(_isLocal) _local_impl->RemoveAttribute(aSO->GetLocalImpl(), (char*)aTypeOfAttribute.c_str()); + else _corba_impl->RemoveAttribute(aSO->GetCORBAImpl(), (char*)aTypeOfAttribute.c_str()); +} + +void SALOMEDS_StudyBuilder::Addreference(const _PTR(SObject)& me, const _PTR(SObject)& thereferencedObject) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(me.get()); + SALOMEDS_SObject* aRefSO = dynamic_cast(thereferencedObject.get()); + if(_isLocal) _local_impl->Addreference(aSO->GetLocalImpl(), aRefSO->GetLocalImpl()); + else _corba_impl->Addreference(aSO->GetCORBAImpl(), aRefSO->GetCORBAImpl()); +} + +void SALOMEDS_StudyBuilder::RemoveReference(const _PTR(SObject)& me) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(me.get()); + if(_isLocal) _local_impl->RemoveReference(aSO->GetLocalImpl()); + else _corba_impl->RemoveReference(aSO->GetCORBAImpl()); +} + +void SALOMEDS_StudyBuilder::SetGUID(const _PTR(SObject)& theSO, const std::string& theGUID) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + if(_isLocal) _local_impl->SetGUID(aSO->GetLocalImpl(), (char*)theGUID.c_str()); + else _corba_impl->SetGUID(aSO->GetCORBAImpl(), (char*)theGUID.c_str()); +} + +bool SALOMEDS_StudyBuilder::IsGUID(const _PTR(SObject)& theSO, const std::string& theGUID) +{ + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + bool ret; + if(_isLocal) ret = _local_impl->IsGUID(aSO->GetLocalImpl(), (char*)theGUID.c_str()); + else ret = _corba_impl->IsGUID(aSO->GetCORBAImpl(), (char*)theGUID.c_str()); + + return ret; +} + +void SALOMEDS_StudyBuilder::NewCommand() +{ + if(_isLocal) _local_impl->NewCommand(); + else _corba_impl->NewCommand(); +} + +void SALOMEDS_StudyBuilder::CommitCommand() +{ + if(_isLocal) { + try { + _local_impl->CommitCommand(); + } + catch(...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } + } + else _corba_impl->CommitCommand(); +} + +bool SALOMEDS_StudyBuilder::HasOpenCommand() +{ + bool ret; + if(_isLocal) ret = _local_impl->HasOpenCommand(); + else ret = _corba_impl->HasOpenCommand(); + return ret; +} + +void SALOMEDS_StudyBuilder::AbortCommand() +{ + if(_isLocal) _local_impl->AbortCommand(); + else _corba_impl->AbortCommand(); +} + +void SALOMEDS_StudyBuilder::Undo() +{ + if(_isLocal) { + try { + _local_impl->Undo(); + } + catch(...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } + } + else _corba_impl->Undo(); +} + +void SALOMEDS_StudyBuilder::Redo() +{ + if(_isLocal) { + try { + _local_impl->Redo(); + } + catch(...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } + } + else _corba_impl->Redo(); +} + +bool SALOMEDS_StudyBuilder::GetAvailableUndos() +{ + bool ret; + if(_isLocal) ret = _local_impl->GetAvailableUndos(); + else ret = _corba_impl->GetAvailableUndos(); + return ret; +} + +bool SALOMEDS_StudyBuilder::GetAvailableRedos() +{ + bool ret; + if(_isLocal) ret = _local_impl->GetAvailableRedos(); + else ret = _corba_impl->GetAvailableRedos(); + return ret; +} + +int SALOMEDS_StudyBuilder::UndoLimit() +{ + int aLimit; + if(_isLocal) aLimit = _local_impl->UndoLimit(); + else aLimit = _corba_impl->UndoLimit(); + return aLimit; +} + +void SALOMEDS_StudyBuilder::UndoLimit(int theLimit) +{ + CheckLocked(); + + if(_isLocal) _local_impl->UndoLimit(theLimit); + else _corba_impl->UndoLimit(theLimit); +} + +void SALOMEDS_StudyBuilder::CheckLocked() +{ + //There is only local part as CORBA part throws the correct exeception + if(_isLocal) { + try { + _local_impl->CheckLocked(); + } + catch(...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } + } +} + +void SALOMEDS_StudyBuilder::SetName(const _PTR(SObject)& theSO, const std::string& theValue) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + if(_isLocal) _local_impl->SetName(aSO->GetLocalImpl(), (char*)theValue.c_str()); + else _corba_impl->SetName(aSO->GetCORBAImpl(), (char*)theValue.c_str()); +} + +void SALOMEDS_StudyBuilder::SetComment(const _PTR(SObject)& theSO, const std::string& theValue) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + if(_isLocal) _local_impl->SetComment(aSO->GetLocalImpl(), (char*)theValue.c_str()); + else _corba_impl->SetComment(aSO->GetCORBAImpl(), (char*)theValue.c_str()); +} + +void SALOMEDS_StudyBuilder::SetIOR(const _PTR(SObject)& theSO, const std::string& theValue) +{ + CheckLocked(); + + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + if(_isLocal) _local_impl->SetIOR(aSO->GetLocalImpl(), (char*)theValue.c_str()); + else _corba_impl->SetIOR(aSO->GetCORBAImpl(), (char*)theValue.c_str()); +} + +void SALOMEDS_StudyBuilder::init_orb() +{ + ORB_INIT &init = *SINGLETON_::Instance() ; + ASSERT(SINGLETON_::IsAlreadyExisting()); + _orb = init(0 , 0 ) ; +} diff --git a/src/SALOMEDS/SALOMEDS_StudyBuilder.hxx b/src/SALOMEDS/SALOMEDS_StudyBuilder.hxx new file mode 100644 index 000000000..f13561376 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_StudyBuilder.hxx @@ -0,0 +1,68 @@ +// File : SALOMEDS_StudyBuilder.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_STUDYBUILDER_H__ +#define __SALOMEDS_STUDYBUILDER_H__ + +#include "SALOMEDSClient.hxx" +#include "SALOMEDSImpl_StudyBuilder.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + + +class SALOMEDS_StudyBuilder: public SALOMEDSClient_StudyBuilder +{ +private: + bool _isLocal; + Handle(SALOMEDSImpl_StudyBuilder) _local_impl; + SALOMEDS::StudyBuilder_var _corba_impl; + CORBA::ORB_var _orb; + +public: + + SALOMEDS_StudyBuilder(const Handle(SALOMEDSImpl_StudyBuilder)& theBuilder); + SALOMEDS_StudyBuilder(SALOMEDS::StudyBuilder_ptr theBuilder); + ~SALOMEDS_StudyBuilder(); + + virtual _PTR(SComponent) NewComponent(const std::string& ComponentDataType); + virtual void DefineComponentInstance (const _PTR(SComponent)&, const std::string& ComponentIOR); + virtual void RemoveComponent(const _PTR(SComponent)& theSCO); + virtual _PTR(SObject) NewObject(const _PTR(SObject)& theFatherObject); + virtual _PTR(SObject) NewObjectToTag(const _PTR(SObject)& theFatherObject, int theTag); + virtual void AddDirectory(const std::string& thePath); + virtual void LoadWith(const _PTR(SComponent)& theSCO, const std::string& theIOR); + virtual void Load(const _PTR(SObject)& theSCO); + virtual void RemoveObject(const _PTR(SObject)& theSO); + virtual void RemoveObjectWithChildren(const _PTR(SObject)& theSO); + virtual _PTR(GenericAttribute) FindOrCreateAttribute(const _PTR(SObject)& theSO, + const std::string& aTypeOfAttribute); + virtual bool FindAttribute(const _PTR(SObject)& theSO, + _PTR(GenericAttribute)& theAttribute, + const std::string& aTypeOfAttribute); + virtual void RemoveAttribute(const _PTR(SObject)& theSO, const std::string& aTypeOfAttribute); + virtual void Addreference(const _PTR(SObject)& me, const _PTR(SObject)& thereferencedObject); + virtual void RemoveReference(const _PTR(SObject)& me); + virtual void SetGUID(const _PTR(SObject)& theSO, const std::string& theGUID); + virtual bool IsGUID(const _PTR(SObject)& theSO, const std::string& theGUID); + virtual void NewCommand(); + virtual void CommitCommand(); + virtual bool HasOpenCommand(); + virtual void AbortCommand(); + virtual void Undo(); + virtual void Redo(); + virtual bool GetAvailableUndos(); + virtual bool GetAvailableRedos(); + virtual int UndoLimit(); + virtual void UndoLimit(int theLimit); + virtual void SetName(const _PTR(SObject)& theSO, const std::string& theValue); + virtual void SetComment(const _PTR(SObject)& theSO, const std::string& theValue); + virtual void SetIOR(const _PTR(SObject)& theSO, const std::string& theValue); + +private: + void CheckLocked(); + void init_orb(); +}; +#endif diff --git a/src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx b/src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx index 42aefe220..a020990f5 100644 --- a/src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx +++ b/src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx @@ -1,71 +1,27 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_StudyBuilder_i.cxx -// Author : Yves FRICAUD +// Author : Seregy RUIN // Module : SALOME -// $Header$ + +#include "utilities.h" #include "SALOMEDS_StudyBuilder_i.hxx" -#include "SALOMEDS_StudyManager_i.hxx" #include "SALOMEDS_Study_i.hxx" - #include "SALOMEDS_SObject_i.hxx" #include "SALOMEDS_SComponent_i.hxx" -#include "SALOMEDS_ChildIterator_i.hxx" +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDS_Driver_i.hxx" +#include "SALOMEDS.hxx" -#include "SALOMEDS_TargetAttribute.hxx" -#include "SALOMEDS_IORAttribute.hxx" -#include "SALOMEDS_PersRefAttribute.hxx" -#include "SALOMEDS_LocalIDAttribute.hxx" -#include "SALOMEDS_StudyPropertiesAttribute.hxx" - -#include "SALOMEDS_Tool.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" #include "Utils_CorbaException.hxx" #include "Utils_ExceptHandlers.hxx" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include +#include #include -#define USE_CASE_LABEL_TAG 2 -#define DIRECTORYID 16661 -#define FILELOCALID 26662 - -#include "utilities.h" - using namespace std; UNEXPECT_CATCH(SBSalomeException, SALOME::SALOME_Exception); @@ -76,11 +32,11 @@ UNEXPECT_CATCH(SBLockProtection, SALOMEDS::StudyBuilder::LockProtection); * Purpose : */ //============================================================================ -SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(SALOMEDS_Study_i* theStudy, - const Handle(TDocStd_Document)& theDocument): - _study(theStudy), - _doc(theDocument) +SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(const Handle(SALOMEDSImpl_StudyBuilder) theImpl, + CORBA::ORB_ptr orb) { + _orb = CORBA::ORB::_duplicate(orb); + _impl = theImpl; } //============================================================================ @@ -89,54 +45,24 @@ SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(SALOMEDS_Study_i* theStudy, */ //============================================================================ SALOMEDS_StudyBuilder_i::~SALOMEDS_StudyBuilder_i() -{ -} - - -//============================================================================ -CORBA::ORB_var SALOMEDS_StudyBuilder_i::GetORB() const -{ - return _study->GetORB(); -} - - -//============================================================================ -PortableServer::POA_var SALOMEDS_StudyBuilder_i::GetPOA() const -{ - return _study->GetPOA(); -} - +{} //============================================================================ /*! Function : NewComponent * Purpose : Create a new component (Scomponent) */ //============================================================================ -SALOMEDS::SComponent_ptr -SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType) +SALOMEDS::SComponent_ptr SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType) { + SALOMEDS::Locker lock; CheckLocked(); - //Always create component under main label. - TDF_Label L = _doc->Main(); - - // YFR DEBUG : 13/02/2002 TDF_Label NL = L.NewChild(); - - Standard_Integer imax = 0; - for (TDF_ChildIterator it(L); it.More(); it.Next()) { - if (it.Value().Tag() > imax) - imax = it.Value().Tag(); - } - imax++; - TDF_Label NL = L.FindChild(imax); + //char* aDataType = CORBA::string_dup(DataType); + Handle(SALOMEDSImpl_SComponent) aSCO = _impl->NewComponent(TCollection_AsciiString((char*)DataType)); + //CORBA::free_string(aDataType); + if(aSCO.IsNull()) return SALOMEDS::SComponent::_nil(); - TDataStd_Comment::Set(NL,Standard_CString(DataType)); - // TDataStd_Comment::Set(NL,Standard_CString(CORBA::string_dup(DataType))); - - SALOMEDS::SComponent_var aSComponent = SALOMEDS_SComponent_i::NewRef(_study,NL); - - OnAddSObject(aSComponent); - - return aSComponent._retn(); + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aSCO,_orb); + return sco._retn(); } //============================================================================ @@ -144,22 +70,16 @@ SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType) * Purpose : Add IOR attribute of a Scomponent */ //============================================================================ -void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr theComponent, - CORBA::Object_ptr theObject) +void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr aComponent, + CORBA::Object_ptr IOR) { + SALOMEDS::Locker lock; CheckLocked(); + Handle(SALOMEDSImpl_SComponent) aSCO; + aSCO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSComponent((char*)aComponent->GetID()); - if(CORBA::is_nil(theComponent) || CORBA::is_nil(theObject)) - return; - - //Find label - TDF_Label Lab; - CORBA::String_var aString = theComponent->GetID(); - TDF_Tool::Label(_doc->GetData(),const_cast(aString.in()),Lab); - - //add theObject definition - aString = GetORB()->object_to_string(theObject); - SALOMEDS_IORAttribute::Set(Lab,const_cast(aString.in()),_study); + CORBA::String_var iorstr = _orb->object_to_string(IOR); + _impl->DefineComponentInstance(aSCO, (char*)iorstr); } //============================================================================ @@ -167,11 +87,14 @@ void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr t * Purpose : Delete a Scomponent */ //============================================================================ -void -SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr theComponent) +void SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr aComponent) { + SALOMEDS::Locker lock; CheckLocked(); - RemoveObject(theComponent); + ASSERT(!CORBA::is_nil(aComponent)); + Handle(SALOMEDSImpl_SComponent) aSCO; + aSCO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSComponent((char*)aComponent->GetID()); + _impl->RemoveComponent(aSCO); } //============================================================================ @@ -179,36 +102,18 @@ SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr theComponent) * Purpose : Create a new SObject */ //============================================================================ -SALOMEDS::SObject_ptr -SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject) +SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject) { + SALOMEDS::Locker lock; CheckLocked(); - - if(CORBA::is_nil(theFatherObject)) - return SALOMEDS::SObject::_nil(); - - //Find label of father - TDF_Label aLabel; - TCollection_AsciiString anEntry; - - CORBA::String_var aFatherID = theFatherObject->GetID(); - TDF_Tool::Label(_doc->GetData(),aFatherID,aLabel); - - //Create a new label - //YFR DEBUG : 13/02/2002 TDF_Label NewLab = Lab.NewChild(); - Standard_Integer imax = 0; - for (TDF_ChildIterator it(aLabel); it.More(); it.Next()) { - if (it.Value().Tag() > imax) - imax = it.Value().Tag(); - } - imax++; - TDF_Label aNewLabel = aLabel.FindChild(imax); - SALOMEDS::SObject_var aSObject = SALOMEDS_SObject_i::NewRef(_study,aNewLabel); + Handle(SALOMEDSImpl_SObject) aFO, aSO; + aFO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theFatherObject->GetID()); + aSO = _impl->NewObject(aFO); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO,_orb); - OnAddSObject(aSObject); - - return aSObject._retn(); + return so._retn(); } //============================================================================ @@ -216,28 +121,17 @@ SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject) * Purpose : */ //============================================================================ -SALOMEDS::SObject_ptr -SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject, - CORBA::Long theTag) +SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject, + CORBA::Long atag) { + SALOMEDS::Locker lock; CheckLocked(); - - if(CORBA::is_nil(theFatherObject)) - return SALOMEDS::SObject::_nil(); - - //Find label of father - TDF_Label Lab; - CORBA::String_var aFatherID = theFatherObject->GetID(); - TDF_Tool::Label(_doc->GetData(),aFatherID,Lab); - - //Create or find label - TDF_Label aNewLab = Lab.FindChild(theTag,1); - - SALOMEDS::SObject_var aSObject = SALOMEDS_SObject_i::NewRef(_study,aNewLab); - - OnAddSObject(aSObject); - - return aSObject._retn(); + Handle(SALOMEDSImpl_SObject) aFO, aSO; + aFO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theFatherObject->GetID()); + aSO = _impl->NewObjectToTag(aFO, atag); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } //============================================================================ @@ -245,28 +139,13 @@ SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject, * Purpose : */ //============================================================================ -void SALOMEDS_StudyBuilder_i::RemoveObject(SALOMEDS::SObject_ptr theSObject) -{ - RemoveSObject(theSObject); -} - -SALOMEDS_SObject_i* -SALOMEDS_StudyBuilder_i::RemoveSObject(SALOMEDS::SObject_ptr theSObject, - bool theIsForgetAllAttributes) +void SALOMEDS_StudyBuilder_i::RemoveObject(SALOMEDS::SObject_ptr anObject) { + SALOMEDS::Locker lock; CheckLocked(); - - if(SALOMEDS_SObject_i* aSObject = _study->DownCast(theSObject)){ - OnRemoveSObject(theSObject); - aSObject->OnRemove(); - if(theIsForgetAllAttributes){ - TDF_Label aLabel = aSObject->GetLabel(); - aLabel.ForgetAllAttributes(); - } - return aSObject; - } - - return NULL; + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID()); + _impl->RemoveObject(aSO); } //============================================================================ @@ -274,53 +153,13 @@ SALOMEDS_StudyBuilder_i::RemoveSObject(SALOMEDS::SObject_ptr theSObject, * Purpose : */ //============================================================================ -void SALOMEDS_StudyBuilder_i::RemoveObjectWithChildren(SALOMEDS::SObject_ptr theSObject) +void SALOMEDS_StudyBuilder_i::RemoveObjectWithChildren(SALOMEDS::SObject_ptr anObject) { - if(SALOMEDS_SObject_i* aSObject = RemoveSObject(theSObject,false)){ - SALOMEDS_ChildIterator_i aChildIter(_study,aSObject->GetLabel(),true); - for(; aChildIter.More(); aChildIter.Next()){ - if(SALOMEDS_SObject_i* aSObj = aChildIter.GetValue()) - aSObj->OnRemove(); - } - TDF_Label aLabel = aSObject->GetLabel(); - aLabel.ForgetAllAttributes(Standard_True); - } -} - -//============================================================================ -/*! Function : Translate_persistentID_to_IOR - * Purpose : - */ -//============================================================================ -static void Translate_persistentID_to_IOR(TDF_Label theLabel, - SALOMEDS::Driver_ptr theDriver, - SALOMEDS_Study_i* theStudy, - CORBA::Boolean theIsMultiFile, - CORBA::Boolean theIsASCII) -{ - if(CORBA::is_nil(theDriver)) - return; - - for (TDF_ChildIterator aChildIter (theLabel); aChildIter.More(); aChildIter.Next()){ - TDF_Label aCurrentLabel = aChildIter.Value(); - Handle(TDF_Attribute) anAttr; - if(aCurrentLabel.FindAttribute(SALOMEDS_PersRefAttribute::GetID(),anAttr)){ - Handle(SALOMEDS_LocalIDAttribute) anID; - if (aCurrentLabel.FindAttribute(SALOMEDS_LocalIDAttribute::GetID(),anID)) - if (anID->Get() == FILELOCALID) continue; //SRN: This attribute store a file name, skip it - - TCollection_ExtendedString res = Handle(TDataStd_Comment)::DownCast(anAttr)->Get(); - TCollection_AsciiString ch(res); - - SALOMEDS::SObject_var aSObject = SALOMEDS_SObject_i::NewRef(theStudy,aCurrentLabel); - - CORBA::String_var anIOR = - theDriver->LocalPersistentIDToIOR(aSObject,ch.ToCString(),theIsMultiFile,theIsASCII); - SALOMEDS_IORAttribute::Set(aCurrentLabel,const_cast(anIOR.in()),theStudy); - } - - Translate_persistentID_to_IOR(aCurrentLabel,theDriver,theStudy,theIsMultiFile,theIsASCII); - } + SALOMEDS::Locker lock; + CheckLocked(); + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID()); + _impl->RemoveObjectWithChildren(aSO); } //============================================================================ @@ -328,153 +167,21 @@ static void Translate_persistentID_to_IOR(TDF_Label theLabel, * Purpose : */ //============================================================================ - -//============================================================================ -void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr theSComponent, - SALOMEDS::Driver_ptr theDriver) - throw(SALOME::SALOME_Exception) +void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr anSCO, + SALOMEDS::Driver_ptr aDriver) throw(SALOME::SALOME_Exception) { + SALOMEDS::Locker lock; Unexpect aCatch(SBSalomeException); - if(CORBA::is_nil(theSComponent)) - return; + Handle(SALOMEDSImpl_SComponent) aSCO; + aSCO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSComponent((char*)anSCO->GetID()); + SALOMEDS_Driver_i* driver = new SALOMEDS_Driver_i(aDriver, _orb); + bool isDone = _impl->LoadWith(aSCO, driver); + delete driver; - TDF_Label Lab; - CORBA::String_var aString = theSComponent->GetID(); - TDF_Tool::Label(_doc->GetData(),const_cast(aString.in()),Lab); - - //Find the current Url of the study - Handle(TDF_Attribute) Att; - if (_doc->Main().FindAttribute(SALOMEDS_PersRefAttribute::GetID(),Att)) { - if(CORBA::is_nil(theDriver)) - return; - - int aLocked = _study->GetProperties()->IsLocked(); - if(aLocked) - _study->GetProperties()->SetLocked(false); - - // mpv 06.03.2003: SAL1927 - if component data if already loaded, it is not necessary to do it again - if (Lab.FindAttribute(SALOMEDS_IORAttribute::GetID(), Att)) { - if(aLocked) - _study->GetProperties()->SetLocked(true); - return; - } - DefineComponentInstance (theSComponent,theDriver); - - TCollection_AsciiString aHDFPath(Handle(TDataStd_Comment)::DownCast(Att)->Get()); - - bool isASCII = false; - std::ostringstream anURLStream; - if(HDFascii::isASCII(aHDFPath.ToCString())){ - isASCII = true; - auto_ptr aResultPath(HDFascii::ConvertFromASCIIToHDF(aHDFPath.ToCString())); - anURLStream< hdf_file(new HDFfile(const_cast(aHDFUrl.c_str()))); - - char aMultifileState[2]; - char ASCIIfileState[2]; - try { - CORBA::String_var scoid = theSComponent->GetID(); - hdf_file->OpenOnDisk(HDF_RDONLY); - HDFgroup *hdf_group = new HDFgroup("DATACOMPONENT",hdf_file.get()); - hdf_group->OpenOnDisk(); - HDFgroup *hdf_sco_group = new HDFgroup(scoid, hdf_group); - hdf_sco_group->OpenOnDisk(); - - SALOMEDS::TMPFile_var aStreamFile; - if (hdf_sco_group->ExistInternalObject("FILE_STREAM")) { - HDFdataset *hdf_dataset = new HDFdataset("FILE_STREAM", hdf_sco_group); - hdf_dataset->OpenOnDisk(); - int aStreamSize = hdf_dataset->GetSize(); - unsigned char* aBuffer = new unsigned char[aStreamSize]; - if(aBuffer == NULL) - throw HDFexception("Unable to open dataset FILE_STREAM"); - hdf_dataset->ReadFromDisk(aBuffer); - aStreamFile = new SALOMEDS::TMPFile(aStreamSize, aStreamSize, aBuffer, 1); - hdf_dataset->CloseOnDisk(); - hdf_dataset = 0; - } else - aStreamFile = new SALOMEDS::TMPFile(0); - - HDFdataset *multifile_hdf_dataset = new HDFdataset("MULTIFILE_STATE", hdf_sco_group); - multifile_hdf_dataset->OpenOnDisk(); - multifile_hdf_dataset->ReadFromDisk(aMultifileState); - - HDFdataset *ascii_hdf_dataset = new HDFdataset("ASCII_STATE", hdf_sco_group); - ascii_hdf_dataset->OpenOnDisk(); - ascii_hdf_dataset->ReadFromDisk(ASCIIfileState); - - // set path without file name from URL - std::string aDir(aHDFPath.ToCString()); - aDir = aDir.substr(0,aDir.rfind('/') + 1); - - CORBA::Boolean aResult = (ASCIIfileState[0]=='A')? - theDriver->LoadASCII(theSComponent, aStreamFile.in(), aDir.c_str(), aMultifileState[0]=='M'): - theDriver->Load(theSComponent, aStreamFile.in(), aDir.c_str(), aMultifileState[0]=='M'); - if(!aResult) { - RemoveAttribute( theSComponent, "AttributeIOR" ); - if (isASCII) { - SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames; - aFilesToRemove->length(1); - std::string aDir = SALOMEDS_Tool::GetDirFromPath(aHDFUrl); - aFilesToRemove[0] = CORBA::string_dup(&aHDFUrl[strlen(aDir.c_str())]); - SALOMEDS_Tool::RemoveTemporaryFiles(aDir,aFilesToRemove,true); - } - MESSAGE("Can't load component"); - THROW_SALOME_CORBA_EXCEPTION("Unable to load component data",SALOME::BAD_PARAM); - } - - multifile_hdf_dataset->CloseOnDisk(); - multifile_hdf_dataset = 0; - ascii_hdf_dataset->CloseOnDisk(); - ascii_hdf_dataset = 0; - hdf_sco_group->CloseOnDisk(); - hdf_sco_group = 0; - hdf_group->CloseOnDisk(); - hdf_group = 0; - hdf_file->CloseOnDisk(); - - if (isASCII) { - SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames; - aFilesToRemove->length(1); - std::string aDir = SALOMEDS_Tool::GetDirFromPath(aHDFUrl); - aFilesToRemove[0] = CORBA::string_dup(&aHDFUrl[strlen(aDir.c_str())]); - SALOMEDS_Tool::RemoveTemporaryFiles(aDir,aFilesToRemove,true); - } - } - catch (HDFexception) { - INFOS("No persistent file Name"); - if (isASCII) { - SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames; - aFilesToRemove->length(1); - std::string aDir = SALOMEDS_Tool::GetDirFromPath(aHDFUrl); - aFilesToRemove[0] = CORBA::string_dup(&aHDFUrl[strlen(aDir.c_str())]); - SALOMEDS_Tool::RemoveTemporaryFiles(aDir,aFilesToRemove,true); - } - if(aLocked) - _study->GetProperties()->SetLocked(true); - THROW_SALOME_CORBA_EXCEPTION("No persistent file Name found",SALOME::BAD_PARAM); - } - - try { - Translate_persistentID_to_IOR(Lab,theDriver,_study,aMultifileState[0]=='M',ASCIIfileState[0] == 'A'); - } catch (SALOME::SALOME_Exception) { - INFOS("Can't translate PersRef to IOR"); - if (aLocked) - _study->GetProperties()->SetLocked(true); - THROW_SALOME_CORBA_EXCEPTION("Unable to convert component persistent data to the transient",SALOME::BAD_PARAM); - // throw HDFexception("Unable to load component data"); - } - if(aLocked) - _study->GetProperties()->SetLocked(true); - } else - MESSAGE("No persistent file Name"); + if(!isDone && _impl->IsError()) { + THROW_SALOME_CORBA_EXCEPTION(_impl->GetErrorCode().ToCString(),SALOME::BAD_PARAM); + } } @@ -494,14 +201,26 @@ void SALOMEDS_StudyBuilder_i::Load(SALOMEDS::SObject_ptr sco) * existing one */ //============================================================================ -SALOMEDS::GenericAttribute_ptr -SALOMEDS_StudyBuilder_i::FindOrCreateAttribute(SALOMEDS::SObject_ptr theObject, - const char* theTypeOfAttribute) +SALOMEDS::GenericAttribute_ptr SALOMEDS_StudyBuilder_i::FindOrCreateAttribute(SALOMEDS::SObject_ptr anObject, + const char* aTypeOfAttribute) { - if(SALOMEDS_SObject_i* aSObject = _study->DownCast(theObject)) - return aSObject->FindOrCreateAttribute(theTypeOfAttribute); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_SObject) aSO; + char* anID = anObject->GetID(); + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject(anID); + delete [] anID; + Handle(TDF_Attribute) anAttr; + try { + anAttr = _impl->FindOrCreateAttribute(aSO, TCollection_AsciiString((char*)aTypeOfAttribute)); + } + catch (...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } + + SALOMEDS::GenericAttribute_var anAttribute; + anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb)); - return SALOMEDS::GenericAttribute::_nil(); + return anAttribute._retn(); } //============================================================================ @@ -510,14 +229,20 @@ SALOMEDS_StudyBuilder_i::FindOrCreateAttribute(SALOMEDS::SObject_ptr theObject, */ //============================================================================ -CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr theObject, - SALOMEDS::GenericAttribute_out theAttr, - const char* theTypeOfAttribute) +CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr anObject, + SALOMEDS::GenericAttribute_out anAttribute, + const char* aTypeOfAttribute) { - if(SALOMEDS_SObject_i* aSObject = _study->DownCast(theObject)) - return aSObject->FindAttribute(theAttr,theTypeOfAttribute); + SALOMEDS::Locker lock; + ASSERT(!CORBA::is_nil(anObject)); + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID()); + Handle(TDF_Attribute) anAttr; - return Standard_False; + if(!_impl->FindAttribute(aSO, anAttr, TCollection_AsciiString((char*)aTypeOfAttribute))) return false; + + anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb)); + return true; } //============================================================================ @@ -526,27 +251,15 @@ CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr theO */ //============================================================================ -void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr theSObject, +void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr anObject, const char* aTypeOfAttribute) { + SALOMEDS::Locker lock; CheckLocked(); - - if(CORBA::is_nil(theSObject)) - return; - - TDF_Label Lab; - CORBA::String_var anobid = theSObject->GetID(); - TDF_Tool::Label(_doc->GetData(),anobid,Lab); - - if (strcmp(aTypeOfAttribute, "AttributeIOR") == 0) { // postponed removing of CORBA objects - Handle(SALOMEDS_IORAttribute) anAttr; - if (Lab.FindAttribute(SALOMEDS_IORAttribute::GetID(), anAttr)) - _study->AddPostponed(TCollection_AsciiString(anAttr->Get()).ToCString()); - else - return; - } - - Lab.ForgetAttribute(SALOMEDS::GetGUID(aTypeOfAttribute)); + ASSERT(!CORBA::is_nil(anObject)); + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID()); + _impl->RemoveAttribute(aSO, TCollection_AsciiString((char*)aTypeOfAttribute)); } //============================================================================ @@ -554,27 +267,18 @@ void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr theSObject, * Purpose : */ //============================================================================ -void -SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me, - SALOMEDS::SObject_ptr theReferencedObject) +void SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me, + SALOMEDS::SObject_ptr theReferencedObject) { + SALOMEDS::Locker lock; CheckLocked(); - if(CORBA::is_nil(me) || CORBA::is_nil(theReferencedObject)) - return; - - TDF_Label Lab; - CORBA::String_var meid = me->GetID(); - TDF_Tool::Label(_doc->GetData(),meid,Lab); - - TDF_Label RefLab; - CORBA::String_var roid = theReferencedObject->GetID(); - TDF_Tool::Label(_doc->GetData(),roid,RefLab); - - TDF_Reference::Set(Lab,RefLab); - SALOMEDS_TargetAttribute::Set(RefLab)->Append(Lab); - - if(Lab.IsDescendant(_doc->Main())) - OnRemoveSObject(me); + ASSERT(!CORBA::is_nil(me)); + ASSERT(!CORBA::is_nil(theReferencedObject)); + + Handle(SALOMEDSImpl_SObject) aSO, aRefSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)me->GetID()); + aRefSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theReferencedObject->GetID()); + _impl->Addreference(aSO, aRefSO); } //============================================================================ @@ -584,28 +288,15 @@ SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me, //============================================================================ void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me) { - SALOMEDS::SObject_var theReferencedObject; - if(!me->ReferencedObject(theReferencedObject)) return; //No reference is found - - if(CORBA::is_nil(me) || CORBA::is_nil(theReferencedObject)) - return; - + SALOMEDS::Locker lock; CheckLocked(); - TDF_Label Lab; - CORBA::String_var meid = me->GetID(); - TDF_Tool::Label(_doc->GetData(),meid,Lab); - - Lab.ForgetAttribute(TDF_Reference::GetID()); - - TDF_Label RefLab; - CORBA::String_var roid = theReferencedObject->GetID(); - TDF_Tool::Label(_doc->GetData(),roid,RefLab); - - RemoveAttribute(theReferencedObject, "AttributeTarget"); + ASSERT(!CORBA::is_nil(me)); + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)me->GetID()); + _impl->RemoveReference(aSO); } - //============================================================================ /*! Function : AddDirectory * Purpose : adds a new directory with a path = thePath @@ -613,62 +304,15 @@ void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me) //============================================================================ void SALOMEDS_StudyBuilder_i::AddDirectory(const char* thePath) { + SALOMEDS::Locker lock; CheckLocked(); if(thePath == NULL || strlen(thePath) == 0) throw SALOMEDS::Study::StudyInvalidDirectory(); - - TCollection_AsciiString aPath(CORBA::string_dup(thePath)), aContext(""), aFatherPath; - Handle(TDataStd_Name) aName; - TDF_Label aLabel; - SALOMEDS::SObject_var anObject = SALOMEDS_SObject_i::NewRef(_study,_doc->Main()); - - try { - anObject = _study->FindObjectByPath(thePath); //Check if the directory already exists + if(!_impl->AddDirectory(TCollection_AsciiString((char*)thePath))) { + TCollection_AsciiString anErrorCode = _impl->GetErrorCode(); + if(anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed(); + if(anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory(); + if(anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent(); } - catch(...) { } - - if(!anObject->_is_nil()) throw SALOMEDS::Study::StudyNameAlreadyUsed(); - - if(aPath.Value(1) != '/') { //Relative path - aPath.Prepend('/'); - aPath = TCollection_AsciiString(_study->GetContext()) + aPath; - } - - TCollection_AsciiString aToken = aPath.Token("/", 1); - if(aToken.Length() == 0) aFatherPath = "/"; - - int i = 1; - while(aToken.Length() != 0) { - if(aPath.Token("/", i+1).Length() > 0) { - aFatherPath += "/"; - aFatherPath += aToken; - } - aToken = aPath.Token("/", ++i); - } - - anObject = SALOMEDS::SObject::_nil(); - try { - anObject = _study->FindObjectByPath(aFatherPath.ToCString()); //Check if the father directory exists - } - catch(...) { ; } - if(anObject->_is_nil()) - throw SALOMEDS::Study::StudyInvalidDirectory(); - - SALOMEDS::SObject_var aNewObject = NewObject(anObject); - TDF_Tool::Label(_doc->GetData(), aNewObject->GetID(), aLabel); - if(aLabel.IsNull()) { - MESSAGE("### NULL label"); - throw SALOMEDS::Study::StudyInvalidComponent(); - } - - TDataStd_Name::Set(aLabel, aPath.Token("/", i-1)); - - //Set LocalID attribute to identify the directory object - SALOMEDS::GenericAttribute_var anAttr = FindOrCreateAttribute(aNewObject, "AttributeLocalID"); - SALOMEDS::AttributeLocalID_var aPersRef = SALOMEDS::AttributeLocalID::_narrow(anAttr); - if(aPersRef->_is_nil()) - throw SALOMEDS::Study::StudyInvalidDirectory(); - - aPersRef->SetValue(DIRECTORYID); } @@ -679,15 +323,12 @@ void SALOMEDS_StudyBuilder_i::AddDirectory(const char* thePath) //============================================================================ void SALOMEDS_StudyBuilder_i::SetGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID) { + SALOMEDS::Locker lock; CheckLocked(); - - if(CORBA::is_nil(anObject)) - return; - - TDF_Label aLabel; - CORBA::String_var anEntry = anObject->GetID(); - TDF_Tool::Label(_doc->GetData(), anEntry, aLabel); - TDataStd_UAttribute::Set(aLabel, (char*)theGUID); + ASSERT(!CORBA::is_nil(anObject)); + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID()); + _impl->SetGUID(aSO, TCollection_AsciiString((char*)theGUID)); } //============================================================================ @@ -697,13 +338,11 @@ void SALOMEDS_StudyBuilder_i::SetGUID(SALOMEDS::SObject_ptr anObject, const char //============================================================================ bool SALOMEDS_StudyBuilder_i::IsGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID) { - if(CORBA::is_nil(anObject)) - return false; - - TDF_Label aLabel; - CORBA::String_var anEntry = anObject->GetID(); - TDF_Tool::Label(_doc->GetData(), anEntry, aLabel); - return aLabel.IsAttribute((char*)theGUID); + SALOMEDS::Locker lock; + ASSERT(!CORBA::is_nil(anObject)); + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID()); + return _impl->IsGUID(aSO, TCollection_AsciiString((char*)theGUID)); } @@ -714,15 +353,8 @@ bool SALOMEDS_StudyBuilder_i::IsGUID(SALOMEDS::SObject_ptr anObject, const char* //============================================================================ void SALOMEDS_StudyBuilder_i::NewCommand() { - // mpv: for SAL2114 - unset "lock changed" flag at the operation start - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if (!_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(), anAttr)) { - anAttr = new SALOMEDS_StudyPropertiesAttribute; - _doc->Main().AddAttribute(anAttr); - } - anAttr->IsLockChanged(true); - - _doc->NewCommand(); + SALOMEDS::Locker lock; + _impl->NewCommand(); } //============================================================================ @@ -732,23 +364,14 @@ void SALOMEDS_StudyBuilder_i::NewCommand() //============================================================================ void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if (!_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(), anAttr)) { - anAttr = new SALOMEDS_StudyPropertiesAttribute; - _doc->Main().AddAttribute(anAttr); + try { + _impl->CommitCommand(); } - if (anAttr->IsLocked() && !anAttr->IsLockChanged(true)) { + catch(...) { MESSAGE("Locked document modification !!!"); - AbortCommand(); throw SALOMEDS::StudyBuilder::LockProtection(); - } else { - _study->RemovePostponed(_doc->GetUndoLimit()); - - int aModif = anAttr->GetModified(); - if (aModif < 0) aModif = 1000; // if user make undo and then - new transaction "modify" will never be zero - anAttr->SetModified(aModif+1); - _doc->CommitCommand(); } } @@ -759,7 +382,8 @@ void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::Loc //============================================================================ CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand() { - return _doc->HasOpenCommand(); + SALOMEDS::Locker lock; + return _impl->HasOpenCommand(); } //============================================================================ @@ -769,9 +393,8 @@ CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand() //============================================================================ void SALOMEDS_StudyBuilder_i::AbortCommand() { - _study->UndoPostponed(0); - - _doc->AbortCommand(); + SALOMEDS::Locker lock; + _impl->AbortCommand(); } //============================================================================ @@ -781,19 +404,14 @@ void SALOMEDS_StudyBuilder_i::AbortCommand() //============================================================================ void SALOMEDS_StudyBuilder_i::Undo() throw (SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if (!_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(), anAttr)) { - anAttr = new SALOMEDS_StudyPropertiesAttribute; - _doc->Main().AddAttribute(anAttr); - } - if (anAttr->IsLocked()) { + try { + _impl->Undo(); + } + catch(...) { MESSAGE("Locked document modification !!!"); throw SALOMEDS::StudyBuilder::LockProtection(); - } else { - _study->UndoPostponed(1); - _doc->Undo(); - anAttr->SetModified(anAttr->GetModified()-1); } } @@ -804,22 +422,16 @@ void SALOMEDS_StudyBuilder_i::Undo() throw (SALOMEDS::StudyBuilder::LockProtecti //============================================================================ void SALOMEDS_StudyBuilder_i::Redo() throw (SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if (!_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(), anAttr)) { - anAttr = new SALOMEDS_StudyPropertiesAttribute; - _doc->Main().AddAttribute(anAttr); + try { + _impl->Redo(); } - - if (anAttr->IsLocked()) { + catch(...) { MESSAGE("Locked document modification !!!"); throw SALOMEDS::StudyBuilder::LockProtection(); - } else { - _doc->Redo(); - _study->UndoPostponed(-1); - anAttr->SetModified(anAttr->GetModified()+1); } - } +} //============================================================================ /*! Function : GetAvailableUndos @@ -828,7 +440,8 @@ void SALOMEDS_StudyBuilder_i::Redo() throw (SALOMEDS::StudyBuilder::LockProtecti //============================================================================ CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableUndos() { - return _doc->GetAvailableUndos(); + SALOMEDS::Locker lock; + return _impl->GetAvailableUndos(); } //============================================================================ @@ -838,7 +451,8 @@ CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableUndos() //============================================================================ CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableRedos() { - return _doc->GetAvailableRedos(); + SALOMEDS::Locker lock; + return _impl->GetAvailableRedos(); } //============================================================================ @@ -848,7 +462,8 @@ CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableRedos() //============================================================================ CORBA::Long SALOMEDS_StudyBuilder_i::UndoLimit() { - return _doc->GetUndoLimit(); + SALOMEDS::Locker lock; + return _impl->UndoLimit(); } //============================================================================ @@ -858,38 +473,9 @@ CORBA::Long SALOMEDS_StudyBuilder_i::UndoLimit() //============================================================================ void SALOMEDS_StudyBuilder_i::UndoLimit(CORBA::Long n) { + SALOMEDS::Locker lock; CheckLocked(); - _doc->SetUndoLimit (n); -} - -//============================================================================ -/*! Function : SetOnAddSObject - * Purpose : - */ -//============================================================================ -SALOMEDS::Callback_ptr SALOMEDS_StudyBuilder_i::SetOnAddSObject(SALOMEDS::Callback_ptr theCallback) -{ - return _study->SetOnAddSObject(theCallback); -} - -void SALOMEDS_StudyBuilder_i::OnAddSObject(SALOMEDS::SObject_ptr theObject) -{ - _study->OnAddSObject(theObject); -} - -//============================================================================ -/*! Function : SetOnNewSObject - * Purpose : - */ -//============================================================================ -SALOMEDS::Callback_ptr SALOMEDS_StudyBuilder_i::SetOnRemoveSObject(SALOMEDS::Callback_ptr theCallback) -{ - return _study->SetOnRemoveSObject(theCallback); -} - -void SALOMEDS_StudyBuilder_i::OnRemoveSObject(SALOMEDS::SObject_ptr theObject) -{ - _study->OnRemoveSObject(theObject); + _impl->UndoLimit(n); } //============================================================================ @@ -897,8 +483,16 @@ void SALOMEDS_StudyBuilder_i::OnRemoveSObject(SALOMEDS::SObject_ptr theObject) * Purpose : */ //============================================================================ -void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection) { - _study->CheckLocked(); +void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection) +{ + SALOMEDS::Locker lock; + Unexpect aCatch(SBLockProtection); + try { + _impl->CheckLocked(); + } + catch(...) { + throw SALOMEDS::StudyBuilder::LockProtection(); + } } //============================================================================ @@ -909,17 +503,13 @@ void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockP void SALOMEDS_StudyBuilder_i::SetName(SALOMEDS::SObject_ptr theSO, const char* theValue) throw(SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); CheckLocked(); - - if(CORBA::is_nil(theSO)) - return; - - //Find label - TDF_Label aLabel; - CORBA::String_var aSOID = theSO->GetID(); - TDF_Tool::Label(_doc->GetData(), aSOID, aLabel); - TDataStd_Name::Set(aLabel, (char*)theValue); + + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID()); + _impl->SetName(aSO, TCollection_AsciiString((char*)theValue)); } //============================================================================ @@ -928,19 +518,15 @@ void SALOMEDS_StudyBuilder_i::SetName(SALOMEDS::SObject_ptr theSO, const char* t */ //============================================================================ void SALOMEDS_StudyBuilder_i::SetComment(SALOMEDS::SObject_ptr theSO, const char* theValue) - throw(SALOMEDS::StudyBuilder::LockProtection) + throw(SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); CheckLocked(); - if(CORBA::is_nil(theSO)) - return; - - //Find label - TDF_Label aLabel; - CORBA::String_var aSOID = theSO->GetID(); - TDF_Tool::Label(_doc->GetData(), aSOID, aLabel); - TDataStd_Comment::Set(aLabel, (char*)theValue); + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID()); + _impl->SetComment(aSO, TCollection_AsciiString((char*)theValue)); } //============================================================================ @@ -951,15 +537,11 @@ void SALOMEDS_StudyBuilder_i::SetComment(SALOMEDS::SObject_ptr theSO, const char void SALOMEDS_StudyBuilder_i::SetIOR(SALOMEDS::SObject_ptr theSO, const char* theValue) throw(SALOMEDS::StudyBuilder::LockProtection) { + SALOMEDS::Locker lock; Unexpect aCatch(SBLockProtection); CheckLocked(); - if(CORBA::is_nil(theSO)) - return; - - //Find label - TDF_Label aLabel; - CORBA::String_var aSOID = theSO->GetID(); - TDF_Tool::Label(_doc->GetData(), aSOID, aLabel); - SALOMEDS_IORAttribute::Set(aLabel, TCollection_ExtendedString((char*)theValue),_study); + Handle(SALOMEDSImpl_SObject) aSO; + aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID()); + _impl->SetIOR(aSO, TCollection_AsciiString((char*)theValue)); } diff --git a/src/SALOMEDS/SALOMEDS_StudyBuilder_i.hxx b/src/SALOMEDS/SALOMEDS_StudyBuilder_i.hxx index 38f29b440..77a24578b 100644 --- a/src/SALOMEDS/SALOMEDS_StudyBuilder_i.hxx +++ b/src/SALOMEDS/SALOMEDS_StudyBuilder_i.hxx @@ -1,67 +1,35 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_StudyBuilder_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#ifndef __SALOMEDS_STUDYBUIlDER_I_H__ +#ifndef __SALOMEDS_STUDYBUILDER_I_H__ #define __SALOMEDS_STUDYBUILDER_I_H__ +// std C++ headers +#include + // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS) #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) +#include "SALOMEDSImpl_StudyBuilder.hxx" + // Cascade header #include -class SALOMEDS_Study_i; -class SALOMEDS_SObject_i; -class SALOMEDS_Callback_i; - -class SALOMEDS_StudyBuilder_i: public virtual POA_SALOMEDS::StudyBuilder, - public virtual PortableServer::RefCountServantBase +class SALOMEDS_StudyBuilder_i: public POA_SALOMEDS::StudyBuilder, + public PortableServer::RefCountServantBase { - SALOMEDS_StudyBuilder_i(); // Not implemented - void operator=(const SALOMEDS_StudyBuilder_i&); // Not implemented - - SALOMEDS_Study_i* _study; - Handle(TDocStd_Document) _doc; // OCAF Document - - void OnAddSObject(SALOMEDS::SObject_ptr theObject); - void OnRemoveSObject(SALOMEDS::SObject_ptr theObject); - +private: + CORBA::ORB_ptr _orb; + Handle(SALOMEDSImpl_StudyBuilder) _impl; // OCAF Document public: - SALOMEDS_StudyBuilder_i(SALOMEDS_Study_i* theStudy, - const Handle(TDocStd_Document)& theDocument); + + SALOMEDS_StudyBuilder_i(const Handle(SALOMEDSImpl_StudyBuilder), CORBA::ORB_ptr); ~SALOMEDS_StudyBuilder_i(); - CORBA::ORB_var GetORB() const; - PortableServer::POA_var GetPOA() const; - //! NewComponent /*! \param ComponentDataType @@ -111,8 +79,6 @@ public: throw(SALOME::SALOME_Exception); virtual void Load(SALOMEDS::SObject_ptr sco); - SALOMEDS_SObject_i* RemoveSObject(SALOMEDS::SObject_ptr theSObject, - bool theIsForgetAllAttributes = true); virtual void RemoveObject(SALOMEDS::SObject_ptr anObject); virtual void RemoveObjectWithChildren(SALOMEDS::SObject_ptr anObject); @@ -142,9 +108,6 @@ public: void CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection); - virtual SALOMEDS::Callback_ptr SetOnAddSObject(SALOMEDS::Callback_ptr theCallback); - virtual SALOMEDS::Callback_ptr SetOnRemoveSObject(SALOMEDS::Callback_ptr theCallback); - virtual void SetName(SALOMEDS::SObject_ptr theSO, const char* theValue) throw(SALOMEDS::StudyBuilder::LockProtection); virtual void SetComment(SALOMEDS::SObject_ptr theSO, const char* theValue) throw(SALOMEDS::StudyBuilder::LockProtection); virtual void SetIOR(SALOMEDS::SObject_ptr theSO, const char* theValue) throw(SALOMEDS::StudyBuilder::LockProtection); diff --git a/src/SALOMEDS/SALOMEDS_StudyManager.cxx b/src/SALOMEDS/SALOMEDS_StudyManager.cxx new file mode 100644 index 000000000..9374f0bca --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_StudyManager.cxx @@ -0,0 +1,294 @@ +// File : SALOMEDSClient_StudyManager.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDS_StudyManager.hxx" + +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDS_Study.hxx" +#include "SALOMEDS_SObject.hxx" +#include "SALOMEDS_Driver_i.hxx" + +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" + +#ifdef WIN32 +#include +#else +#include +#include +#endif + +#include +#include +#include + +#include "OpUtil.hxx" + +using namespace std; + +SALOMEDS_Driver_i* GetDriver(const Handle(SALOMEDSImpl_SObject)& theObject, CORBA::ORB_ptr orb); + +SALOMEDS_StudyManager::SALOMEDS_StudyManager(SALOMEDS::StudyManager_ptr theManager) +{ + +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + + long addr = theManager->GetLocalImpl(GetHostname().c_str(), pid, _isLocal); + if(_isLocal) { + _local_impl = ((SALOMEDSImpl_StudyManager*)(addr)); + _corba_impl = SALOMEDS::StudyManager::_duplicate(theManager); + } + else { + _local_impl = NULL; + _corba_impl = SALOMEDS::StudyManager::_duplicate(theManager); + } + + init_orb(); +} + +SALOMEDS_StudyManager::SALOMEDS_StudyManager() +{ + init_orb(); + + SALOME_NamingService namingService(_orb); + CORBA::Object_var obj = namingService.Resolve( "/myStudyManager" ); + SALOMEDS::StudyManager_var theManager = SALOMEDS::StudyManager::_narrow( obj ); + ASSERT( !CORBA::is_nil(theManager) ); + +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + + long addr = theManager->GetLocalImpl(GetHostname().c_str(), pid, _isLocal); + if(_isLocal) { + _local_impl = ((SALOMEDSImpl_StudyManager*)(addr)); + _corba_impl = SALOMEDS::StudyManager::_duplicate(theManager); + } + else { + _local_impl = NULL; + _corba_impl = SALOMEDS::StudyManager::_duplicate(theManager); + } +} + +SALOMEDS_StudyManager::~SALOMEDS_StudyManager() +{ +} + +_PTR(Study) SALOMEDS_StudyManager::NewStudy(const std::string& study_name) +{ + //SRN: Pure CORBA NewStudy as it does more initialization than the local one + SALOMEDSClient_Study* aStudy = NULL; + + SALOMEDS::Study_var aStudy_impl = _corba_impl->NewStudy((char*)study_name.c_str()); + if(CORBA::is_nil(aStudy_impl)) return _PTR(Study)(aStudy); + aStudy = new SALOMEDS_Study(aStudy_impl); + + return _PTR(Study)(aStudy); +} + +_PTR(Study) SALOMEDS_StudyManager::Open(const std::string& theStudyUrl) +{ + //SRN: Pure CORBA Open as it does more initialization than the local one + SALOMEDSClient_Study* aStudy = NULL; + + SALOMEDS::Study_var aStudy_impl = _corba_impl->Open((char*)theStudyUrl.c_str()); + if(CORBA::is_nil(aStudy_impl)) return _PTR(Study)(aStudy); + + aStudy = new SALOMEDS_Study(aStudy_impl.in()); + + return _PTR(Study)(aStudy); +} + +void SALOMEDS_StudyManager::Close(const _PTR(Study)& theStudy) +{ + //SRN: Pure CORBA close as it does more cleaning than the local one + SALOMEDS::Study_var aStudy = _corba_impl->GetStudyByID(theStudy->StudyId()); + _corba_impl->Close(aStudy); +} + +void SALOMEDS_StudyManager::Save(const _PTR(Study)& theStudy, bool theMultiFile) +{ + //SRN: Pure CORBA save as the save operation require CORBA in any case + SALOMEDS::Study_var aStudy = _corba_impl->GetStudyByID(theStudy->StudyId()); + _corba_impl->Save(aStudy, theMultiFile); +} + +void SALOMEDS_StudyManager::SaveASCII(const _PTR(Study)& theStudy, bool theMultiFile) +{ + //SRN: Pure CORBA save as the save operation require CORBA in any case + SALOMEDS::Study_var aStudy = _corba_impl->GetStudyByID(theStudy->StudyId()); + _corba_impl->SaveASCII(aStudy, theMultiFile); +} + +void SALOMEDS_StudyManager::SaveAs(const std::string& theUrl, const _PTR(Study)& theStudy, bool theMultiFile) +{ + //SRN: Pure CORBA save as the save operation require CORBA in any case + SALOMEDS::Study_var aStudy = _corba_impl->GetStudyByID(theStudy->StudyId()); + _corba_impl->SaveAs((char*)theUrl.c_str(), aStudy, theMultiFile); +} + +void SALOMEDS_StudyManager::SaveAsASCII(const std::string& theUrl, const _PTR(Study)& theStudy, bool theMultiFile) +{ + //SRN: Pure CORBA save as the save operation require CORBA in any case + SALOMEDS::Study_var aStudy = _corba_impl->GetStudyByID(theStudy->StudyId()); + _corba_impl->SaveAsASCII((char*)theUrl.c_str(), aStudy, theMultiFile); +} + +std::vector SALOMEDS_StudyManager::GetOpenStudies() +{ + std::vector aVector; + int aLength, i; + + if(_isLocal) { + Handle(TColStd_HSequenceOfTransient) aSeq = _local_impl->GetOpenStudies(); + aLength = aSeq->Length(); + for(i = 1; i <= aLength; i++) + aVector.push_back(Handle(SALOMEDSImpl_Study)::DownCast(aSeq->Value(i))->Name().ToCString()); + } + else { + SALOMEDS::ListOfOpenStudies_var aSeq = _corba_impl->GetOpenStudies(); + aLength = aSeq->length(); + for(i = 0; i < aLength; i++) + aVector.push_back(aSeq[i].in()); + } + return aVector; +} + +_PTR(Study) SALOMEDS_StudyManager::GetStudyByName(const std::string& theStudyName) +{ + SALOMEDSClient_Study* aStudy = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_Study) aStudy_impl = _local_impl->GetStudyByName((char*)theStudyName.c_str()); + if(aStudy_impl.IsNull()) return _PTR(Study)(aStudy); + aStudy = new SALOMEDS_Study(aStudy_impl); + } + else { + SALOMEDS::Study_var aStudy_impl = _corba_impl->GetStudyByName((char*)theStudyName.c_str()); + if(CORBA::is_nil(aStudy_impl)) return _PTR(Study)(aStudy); + aStudy = new SALOMEDS_Study(aStudy_impl); + } + return _PTR(Study)(aStudy); +} + +_PTR(Study) SALOMEDS_StudyManager::GetStudyByID(int theStudyID) +{ + SALOMEDSClient_Study* aStudy = NULL; + if(_isLocal) { + Handle(SALOMEDSImpl_Study) aStudy_impl = _local_impl->GetStudyByID(theStudyID); + if(aStudy_impl.IsNull()) return _PTR(Study)(aStudy); + aStudy = new SALOMEDS_Study(aStudy_impl); + } + else { + SALOMEDS::Study_var aStudy_impl = _corba_impl->GetStudyByID(theStudyID); + if(CORBA::is_nil(aStudy_impl)) return _PTR(Study)(aStudy); + aStudy = new SALOMEDS_Study(aStudy_impl); + } + return _PTR(Study)(aStudy); +} + +bool SALOMEDS_StudyManager::CanCopy(const _PTR(SObject)& theSO) +{ + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + bool ret; + + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = aSO->GetLocalImpl(); + SALOMEDS_Driver_i* aDriver = GetDriver(aSO_impl, _orb); + ret = _local_impl->CanCopy(aSO_impl, aDriver); + delete aDriver; + } + else { + ret = _corba_impl->CanCopy(aSO->GetCORBAImpl()); + } + + return ret; +} + +bool SALOMEDS_StudyManager::Copy(const _PTR(SObject)& theSO) +{ + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + bool ret; + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = aSO->GetLocalImpl(); + SALOMEDS_Driver_i* aDriver = GetDriver(aSO_impl, _orb); + ret = _local_impl->Copy(aSO_impl, aDriver); + delete aDriver; + } + else { + ret = _corba_impl->Copy(aSO->GetCORBAImpl()); + } + return ret; +} + +bool SALOMEDS_StudyManager::CanPaste(const _PTR(SObject)& theSO) +{ + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + bool ret; + + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = aSO->GetLocalImpl(); + SALOMEDS_Driver_i* aDriver = GetDriver(aSO_impl, _orb); + ret = _local_impl->CanPaste(aSO_impl, aDriver); + delete aDriver; + } + else { + ret = _corba_impl->CanPaste(aSO->GetCORBAImpl()); + } + + return ret; +} + +_PTR(SObject) SALOMEDS_StudyManager::Paste(const _PTR(SObject)& theSO) +{ + SALOMEDS_SObject* aSO = dynamic_cast(theSO.get()); + SALOMEDSClient_SObject* aResult = NULL; + + if(_isLocal) { + Handle(SALOMEDSImpl_SObject) aSO_impl = aSO->GetLocalImpl(); + SALOMEDS_Driver_i* aDriver = GetDriver(aSO_impl, _orb); + Handle(SALOMEDSImpl_SObject) aNewSO = _local_impl->Paste(aSO_impl, aDriver); + delete aDriver; + if(aNewSO.IsNull()) return _PTR(SObject)(aResult); + aResult = new SALOMEDS_SObject(aNewSO); + } + else { + SALOMEDS::SObject_ptr aNewSO = _corba_impl->Paste(aSO->GetCORBAImpl()); + if(CORBA::is_nil(aNewSO)) return _PTR(SObject)(aResult); + aResult = new SALOMEDS_SObject(aNewSO); + } + + return _PTR(SObject)(aResult); +} + + +void SALOMEDS_StudyManager::init_orb() +{ + ORB_INIT &init = *SINGLETON_::Instance() ; + ASSERT(SINGLETON_::IsAlreadyExisting()); + _orb = init(0 , 0 ) ; +} + +SALOMEDS_Driver_i* GetDriver(const Handle(SALOMEDSImpl_SObject)& theObject, CORBA::ORB_ptr orb) +{ + SALOMEDS_Driver_i* driver = NULL; + + Handle(SALOMEDSImpl_SComponent) aSCO = theObject->GetFatherComponent(); + if(!aSCO.IsNull()) { + TCollection_AsciiString IOREngine = aSCO->GetIOR(); + if(!IOREngine.IsEmpty()) { + CORBA::Object_var obj = orb->string_to_object(IOREngine.ToCString()); + SALOMEDS::Driver_var Engine = SALOMEDS::Driver::_narrow(obj) ; + driver = new SALOMEDS_Driver_i(Engine, orb); + } + } + + return driver; +} diff --git a/src/SALOMEDS/SALOMEDS_StudyManager.hxx b/src/SALOMEDS/SALOMEDS_StudyManager.hxx new file mode 100644 index 000000000..8aeaf4ae5 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_StudyManager.hxx @@ -0,0 +1,52 @@ +// File : SALOMEDS_StudyManager.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_STUDYMANAGER_H__ +#define __SALOMEDS_STUDYMANAGER_H__ + +#include +#include + +#include "SALOMEDSClient.hxx" +#include "SALOMEDSImpl_StudyManager.hxx" + +// IDL headers + +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +class Standard_EXPORT SALOMEDS_StudyManager: public SALOMEDSClient_StudyManager +{ +private: + bool _isLocal; + Handle(SALOMEDSImpl_StudyManager) _local_impl; + SALOMEDS::StudyManager_var _corba_impl; + CORBA::ORB_var _orb; + +public: + + SALOMEDS_StudyManager(SALOMEDS::StudyManager_ptr theManager); + SALOMEDS_StudyManager(); + ~SALOMEDS_StudyManager(); + + virtual _PTR(Study) NewStudy(const std::string& study_name); + virtual _PTR(Study) Open(const std::string& theStudyUrl); + virtual void Close(const _PTR(Study)& theStudy); + virtual void Save(const _PTR(Study)& theStudy, bool theMultiFile); + virtual void SaveASCII(const _PTR(Study)& theStudy, bool theMultiFile); + virtual void SaveAs(const std::string& theUrl, const _PTR(Study)& theStudy, bool theMultiFile); + virtual void SaveAsASCII(const std::string& theUrl, const _PTR(Study)& theStudy, bool theMultiFile); + virtual std::vector GetOpenStudies(); + virtual _PTR(Study) GetStudyByName(const std::string& theStudyName) ; + virtual _PTR(Study) GetStudyByID(int theStudyID) ; + virtual bool CanCopy(const _PTR(SObject)& theSO); + virtual bool Copy(const _PTR(SObject)& theSO); + virtual bool CanPaste(const _PTR(SObject)& theSO); + virtual _PTR(SObject) Paste(const _PTR(SObject)& theSO); + +private: + void init_orb(); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_StudyManager_i.cxx b/src/SALOMEDS/SALOMEDS_StudyManager_i.cxx index 588019be2..872c753c9 100644 --- a/src/SALOMEDS/SALOMEDS_StudyManager_i.cxx +++ b/src/SALOMEDS/SALOMEDS_StudyManager_i.cxx @@ -1,245 +1,65 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_StudyManager_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "SALOMEDS_StudyManager_i.hxx" +#include "utilities.h" #include "SALOME_LifeCycleCORBA.hxx" - +#include "SALOMEDS_StudyManager_i.hxx" #include "SALOMEDS_Study_i.hxx" -#include "SALOMEDS_SObject_i.hxx" -#include "SALOMEDS_StudyBuilder_i.hxx" +#include "SALOMEDS_SComponent_i.hxx" +#include "SALOMEDS_Driver_i.hxx" +#include "SALOMEDS.hxx" -#include "SALOMEDS_IORAttribute.hxx" -#include "SALOMEDS_PersRefAttribute.hxx" -#include "SALOMEDS_TargetAttribute.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" -#include "SALOMEDS_Tool.hxx" -#include "HDFexplorer.hxx" - -// IDL headers -#include -#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) +#include +#include +#include -#include "SALOME_GenericObj_i.hh" #include "Utils_CorbaException.hxx" -#include "Utils_ExceptHandlers.hxx" - -UNEXPECT_CATCH(SalomeException,SALOME::SALOME_Exception); -UNEXPECT_CATCH(LockProtection, SALOMEDS::StudyBuilder::LockProtection); - -#define USE_CASE_LABEL_ID "0:2" -#define AUTO_SAVE_GUID "128268A3-71C9-4036-89B1-F81BD6A4FCF2" -#define AUTO_SAVE_TAG "0:8" -#define AUTO_SAVE_TIME_OUT_IN_SECONDS 1200 - -#include "utilities.h" +#include +#include using namespace std; -//=========================================================================== -namespace SALOMEDS{ - - CORBA::Object_var - GetObject(const TDF_Label& theLabel, CORBA::ORB_ptr theORB) - { - try { - Handle(SALOMEDS_IORAttribute) anAttr; - if(theLabel.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)) - return theORB->string_to_object(TCollection_AsciiString(anAttr->Get()).ToCString()); - }catch(...){ - } - return CORBA::Object::_nil(); - } +#ifdef WIN32 +#include +#else +#include +#include +#endif +#include "OpUtil.hxx" - PortableServer::ServantBase_var - GetServant(CORBA::Object_ptr theObject, PortableServer::POA_ptr thePOA) - { - if(CORBA::is_nil(theObject)) - return NULL; - try{ - return thePOA->reference_to_servant(theObject); - }catch(...){ - return NULL; - } - } - -} - -//=========================================================================== -//Function : LoadAttributes -//=========================================================================== -static -void -ReadAttributes(SALOMEDS_Study_i* theStudy, - SALOMEDS::SObject_ptr aSO, - HDFdataset* hdf_dataset) -{ - hdf_dataset->OpenOnDisk(); - - SALOMEDS::GenericAttribute_var anAttr; - - char* current_string = new char[hdf_dataset->GetSize()]; - hdf_dataset->ReadFromDisk(current_string); - - if (!strcmp(hdf_dataset->GetName(),"COMPONENTDATATYPE")) { - anAttr = theStudy->GetBuilder()->FindOrCreateAttribute(aSO, "AttributeComment"); - } else if (!strcmp(hdf_dataset->GetName(),"Reference")) { - theStudy->GetBuilder()->Addreference(aSO, theStudy->CreateObjectID(current_string)); - delete(current_string); - hdf_dataset->CloseOnDisk(); - return; - } else { - MESSAGE("Read attribute "<GetName()) - anAttr = theStudy->GetBuilder()->FindOrCreateAttribute(aSO, hdf_dataset->GetName()); - } - - if (!CORBA::is_nil(anAttr)) { - anAttr->Restore(current_string); - MESSAGE("Restoring attribute "<GetName()<<" by string '"<GetName()); - MESSAGE("LoadAttributes: unknown types"); - } - delete(current_string); - hdf_dataset->CloseOnDisk(); -} +#include "SALOME_GenericObj_i.hh" -//============================================================================ -//Function : Translate_IOR_to_persistentID -//============================================================================ -static void Translate_IOR_to_persistentID(SALOMEDS_Study_i* theStudy, - SALOMEDS_StudyBuilder_i* theBuilder, - SALOMEDS::SObject_ptr theSObject, - SALOMEDS::Driver_ptr theEngine, - CORBA::Boolean theIsMultiFile, - CORBA::Boolean theIsASCII) -{ - MESSAGE("In Translate_IOR_to_persistentID"); - SALOMEDS_ChildIterator_i anIter = theStudy->GetChildIterator(theSObject); - for(; anIter.More(); anIter.Next()){ - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::SObject_var aSObject = anIter.Value(); - if(aSObject->FindAttribute(anAttr,"AttributeIOR")){ - SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - CORBA::String_var aString = anIOR->Value(); - CORBA::String_var aPersistentID = - theEngine->IORToLocalPersistentID(aSObject,aString,theIsMultiFile,theIsASCII); - anAttr = theBuilder->FindOrCreateAttribute(aSObject,"AttributePersistentRef"); - SALOMEDS::AttributePersistentRef_var aPersistentRef = SALOMEDS::AttributePersistentRef::_narrow(anAttr); - aPersistentRef->SetValue(aPersistentID); - aString = aSObject->GetID(); - } - Translate_IOR_to_persistentID(theStudy,theBuilder,aSObject,theEngine,theIsMultiFile,theIsASCII); - } -} +#include "Utils_ExceptHandlers.hxx" -//============================================================================ -//Function : BuildlTree -//============================================================================ -static -void -BuildTree(SALOMEDS_Study_i* theStudy, HDFgroup* hdf_current_group) -{ - hdf_current_group->OpenOnDisk(); - - SALOMEDS::SObject_var aSO; - char* Entry = hdf_current_group->GetName(); - if (strcmp(Entry,"STUDY_STRUCTURE") == 0) { - MESSAGE("find the root of the document"); - aSO = theStudy->CreateObjectID("0:1"); - } - else { - aSO = theStudy->CreateObjectID(Entry); - MESSAGE("BuildTree : Create a new label"<nInternalObjects(); - - for (Standard_Integer i=0; iInternalObjectIndentify(i,name); - if (strncmp(name, "INTERNAL_COMPLEX",16) == 0) continue; - hdf_object_type type = hdf_current_group->InternalObjectType(name); - - if (type == HDF_DATASET) { - MESSAGE("--> Dataset: Internal Object Name : " << name); - HDFdataset* new_dataset = new HDFdataset(name,hdf_current_group); - ReadAttributes(theStudy,aSO,new_dataset); - new_dataset = 0; // will be deleted by father destructor +UNEXPECT_CATCH(SalomeException,SALOME::SALOME_Exception); +UNEXPECT_CATCH(LockProtection, SALOMEDS::StudyBuilder::LockProtection); - } - else if (type == HDF_GROUP) { - MESSAGE( "--> Group: Internal Object Name : " << name); - HDFgroup* new_group = new HDFgroup(name,hdf_current_group); - BuildTree(theStudy, new_group); - new_group = 0; // will be deleted by father destructor - } - } - hdf_current_group->CloseOnDisk(); -} +static SALOMEDS_Driver_i* GetDriver(const Handle(SALOMEDSImpl_SObject)& theObject, CORBA::ORB_ptr orb); +static std::map _mapOfPOA; //============================================================================ /*! Function : SALOMEDS_StudyManager_i - * Purpose : SALOMEDS_StudyManager_i constructor + * Purpose : SALOMEDS_StudyManager_i constructor */ //============================================================================ -SALOMEDS_StudyManager_i::SALOMEDS_StudyManager_i(CORBA::ORB_ptr theORB, - PortableServer::POA_ptr thePOA): - _orb(CORBA::ORB::_duplicate(theORB)), - _poa(PortableServer::POA::_duplicate(thePOA)), - _OCAFApp(new SALOMEDS_OCAFApplication()), - _name_service(theORB) -{ +SALOMEDS_StudyManager_i::SALOMEDS_StudyManager_i(CORBA::ORB_ptr orb, PortableServer::POA_ptr thePOA) +{ + _orb = CORBA::ORB::_duplicate(orb); + _poa = PortableServer::POA::_duplicate(thePOA); + _name_service = new SALOME_NamingService(_orb); // Study directory creation in the naming service : to register all // open studies in the session - _name_service.Create_Directory("/Study"); - _IDcounter = 0; + _name_service->Create_Directory("/Study"); + _impl = new SALOMEDSImpl_StudyManager; + _factory = new SALOMEDS_DriverFactory_i(_orb); } //============================================================================ @@ -250,30 +70,20 @@ SALOMEDS_StudyManager_i::SALOMEDS_StudyManager_i(CORBA::ORB_ptr theORB, SALOMEDS_StudyManager_i::~SALOMEDS_StudyManager_i() { // Destroy directory to register open studies - _name_service.Destroy_Directory("/Study"); -} - -SALOMEDS_Study_i* -SALOMEDS_StudyManager_i::DownCast(SALOMEDS::Study_ptr theStudy) const -{ - if(!CORBA::is_nil(theStudy)){ - PortableServer::POA_var aPOA = GetPOA(); - PortableServer::ServantBase_var aServant = SALOMEDS::GetServant(theStudy,aPOA); - if(aServant.in()) - return dynamic_cast(aServant.in()); - } - return NULL; + _name_service->Destroy_Directory("/Study"); + delete _factory; } //============================================================================ /*! Function : register_name - * Purpose : Register the study Manager in the naming service under the + * Purpose : Register the study Manager in the naming service under the * context name */ //============================================================================ -void SALOMEDS_StudyManager_i::register_name(char * theName) { +void SALOMEDS_StudyManager_i::register_name(char * name) +{ SALOMEDS::StudyManager_var aManager(_this()); - _name_service.Register(aManager.in(),theName); + _name_service->Register(aManager.in(), name); } @@ -282,45 +92,36 @@ void SALOMEDS_StudyManager_i::register_name(char * theName) { * Purpose : Create a New Study of name study_name */ //============================================================================ -SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::NewStudy(const char* theStudyName) +SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::NewStudy(const char* study_name) { - Handle(TDocStd_Document) aDocument; - _OCAFApp->NewDocument("SALOME_STUDY",aDocument); + SALOMEDS::Locker lock; + + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->NewStudy(TCollection_AsciiString((char*)study_name)); + if(aStudyImpl.IsNull()) { + MESSAGE("NewStudy : Error : " << _impl->GetErrorCode()); + return SALOMEDS::Study::_nil(); + } MESSAGE("NewStudy : Creating the CORBA servant holding it... "); - SALOMEDS_Study_i* aStudyServant = new SALOMEDS_Study_i(this,aDocument,theStudyName); - SALOMEDS::Study_var aStudy = aStudyServant->_this(); - //Study->StudyId( _OCAFApp->NbDocuments() ); - _IDcounter++; - aStudyServant->StudyId( _IDcounter ); + SALOMEDS_Study_i *Study_servant = new SALOMEDS_Study_i(aStudyImpl, _orb); + SALOMEDS::Study_var Study = SALOMEDS::Study::_narrow(Study_servant->_this()); // Register study in the naming service // Path to acces the study - if(!_name_service.Change_Directory("/Study")){ - MESSAGE( "Unable to access the study directory" ); - }else - _name_service.Register(aStudy, theStudyName); - + if(!_name_service->Change_Directory("/Study")) + MESSAGE( "Unable to access the study directory" ) + else + _name_service->Register(Study, study_name); + // Assign the value of the IOR in the study->root - CORBA::String_var anIOR = _orb->object_to_string(aStudy); - SALOMEDS_IORAttribute::Set(aDocument->Main().Root(), - const_cast(anIOR.in()), - aStudyServant); - - // set Study properties - SALOMEDS::AttributeStudyProperties_var aProp = aStudyServant->GetProperties(); - OSD_Process aProcess; - Quantity_Date aDate = aProcess.SystemDate(); - aProp->SetCreationDate(CORBA::Long(aDate.Minute()), - CORBA::Long(aDate.Hour()), - CORBA::Long(aDate.Day()), - CORBA::Long(aDate.Month()), - CORBA::Long(aDate.Year())); - aProp->SetCreationMode("from scratch"); - aProp->SetUserName(aProcess.UserName().ToCString()); + const char* IORStudy = _orb->object_to_string(Study); - return aStudy._retn(); + aStudyImpl->SetTransientReference((char*)IORStudy); + + _mapOfPOA[Study->StudyId()] = _poa; + + return Study; } //============================================================================ @@ -328,98 +129,32 @@ SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::NewStudy(const char* theStudyName) * Purpose : Open a Study from it's persistent reference */ //============================================================================ -SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::Open(const char* theURL) +SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::Open(const char* aUrl) throw(SALOME::SALOME_Exception) { + SALOMEDS::Locker lock; + Unexpect aCatch(SalomeException); MESSAGE("Begin of SALOMEDS_StudyManager_i::Open"); - bool isASCII = false; - std::ostringstream anURLStream; - if (HDFascii::isASCII(theURL)) { - isASCII = true; - auto_ptr aResultPath(HDFascii::ConvertFromASCIIToHDF(theURL)); - anURLStream< hdf_file(new HDFfile(const_cast(aHDFUrl.c_str()))); + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->Open(TCollection_AsciiString((char*)aUrl)); - try { - hdf_file->OpenOnDisk(HDF_RDONLY);// mpv: was RDWR, but opened file can be write-protected too - }catch(HDFexception){ - std::ostringstream aStream; - aStream<<"Can't open file "<NewDocument("SALOME_STUDY",Doc); - - SALOMEDS_Study_i* aStudyServant = new SALOMEDS_Study_i(this,Doc,theURL); - SALOMEDS::Study_var aStudy = aStudyServant->_this(); - - // aStudy->StudyId( _OCAFApp->NbDocuments() ); - _IDcounter++; - aStudy->StudyId( _IDcounter ); - - // Assign the value of the URL in the study object - aStudyServant->URL(theURL); - SCRUTE(theURL); + SALOMEDS_Study_i * Study_servant = new SALOMEDS_Study_i(aStudyImpl, _orb); + SALOMEDS::Study_var Study = SALOMEDS::Study::_narrow(Study_servant->_this()); // Assign the value of the IOR in the study->root - CORBA::String_var anIOR = _orb->object_to_string(aStudy); - SALOMEDS_IORAttribute::Set(Doc->Main().Root(), - const_cast(anIOR.in()), - aStudyServant); - - SALOMEDS_PersRefAttribute::Set(Doc->Main(),const_cast(theURL)); - - if (!hdf_file->ExistInternalObject("STUDY_STRUCTURE")) { - MESSAGE("SALOMEDS_StudyManager::Open : the study is empty"); - return aStudy._retn(); - } - - //Create the Structure of the OCAF Document - HDFgroup *hdf_group_study_structure = new HDFgroup("STUDY_STRUCTURE",hdf_file.get()); - - Handle(TDF_Data) DF = Doc->GetData(); - - try{ - BuildTree(aStudyServant,hdf_group_study_structure); - }catch(HDFexception){ - std::ostringstream aStream; - aStream<<"Can't open file "<CloseOnDisk(); + CORBA::String_var IORStudy = _orb->object_to_string(Study); + aStudyImpl->SetTransientReference((char*)IORStudy); // Register study in the naming service // Path to acces the study - if(!_name_service.Change_Directory("/Study")){ - MESSAGE( "Unable to access the study directory" ); - }else{ - CORBA::String_var aString(aStudyServant->Name()); - _name_service.Register(aStudy,aString.in()); - } - - if (isASCII) { - SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames; - aFilesToRemove->length(1); - std::string aDir = SALOMEDS_Tool::GetDirFromPath(aHDFUrl); - aFilesToRemove[0] = CORBA::string_dup(&aHDFUrl[strlen(aDir.c_str())]); - SALOMEDS_Tool::RemoveTemporaryFiles(aDir,aFilesToRemove,true); - } + if(!_name_service->Change_Directory("/Study")) MESSAGE( "Unable to access the study directory" ) + else _name_service->Register(Study, CORBA::string_dup(aStudyImpl->Name().ToCString())); - return aStudy._retn(); + return Study; } @@ -428,22 +163,24 @@ SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::Open(const char* theURL) /*! Function : Close * Purpose : Close a study. * If the study hasn't been saved, ask the user to confirm the - * close action without saving + * close action without saving */ //============================================================================ -void SALOMEDS_StudyManager_i::Close(SALOMEDS::Study_ptr aStudy) +void SALOMEDS_StudyManager_i::Close(SALOMEDS::Study_ptr aStudy) { + SALOMEDS::Locker lock; + if(aStudy->_is_nil()) return; - - aStudy->RemovePostponed(-1); - + // Destroy study name in the naming service - if(_name_service.Change_Directory("/Study")){ + if(_name_service->Change_Directory("/Study")){ CORBA::String_var aString(aStudy->Name()); - _name_service.Destroy_Name(aString.in()); + _name_service->Destroy_Name(aString.in()); } + SALOMEDS::unlock(); aStudy->Close(); + SALOMEDS::lock(); } //============================================================================ @@ -451,24 +188,30 @@ void SALOMEDS_StudyManager_i::Close(SALOMEDS::Study_ptr aStudy) * Purpose : Save a Study to it's persistent reference */ //============================================================================ -void SALOMEDS_StudyManager_i::Save(SALOMEDS::Study_ptr theStudy, CORBA::Boolean theMultiFile) +void SALOMEDS_StudyManager_i::Save(SALOMEDS::Study_ptr aStudy, CORBA::Boolean theMultiFile) { - CORBA::String_var anURL = theStudy->URL(); - if(strcmp(anURL.in(),"") == 0){ - MESSAGE( "No path specified to save the study. Nothing done"); - }else{ - _SaveAs(anURL,theStudy,theMultiFile,false); + SALOMEDS::Locker lock; + + if(aStudy->_is_nil()) { + MESSAGE("Save error: Study is null"); + return; } + + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudy->StudyId()); + _impl->Save(aStudyImpl, _factory, theMultiFile); } -void SALOMEDS_StudyManager_i::SaveASCII(SALOMEDS::Study_ptr theStudy, CORBA::Boolean theMultiFile) +void SALOMEDS_StudyManager_i::SaveASCII(SALOMEDS::Study_ptr aStudy, CORBA::Boolean theMultiFile) { - CORBA::String_var anURL = theStudy->URL(); - if(strcmp(anURL.in(),"") == 0){ - MESSAGE( "No path specified to save the study. Nothing done"); - }else{ - _SaveAs(anURL,theStudy,theMultiFile,true); + SALOMEDS::Locker lock; + + if(aStudy->_is_nil()) { + MESSAGE("SaveASCII error: Study is null"); + return; } + + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudy->StudyId()); + _impl->SaveASCII(aStudyImpl, _factory, theMultiFile); } //============================================================================= @@ -476,15 +219,30 @@ void SALOMEDS_StudyManager_i::SaveASCII(SALOMEDS::Study_ptr theStudy, CORBA::Boo * Purpose : Save a study to the persistent reference aUrl */ //============================================================================ -void SALOMEDS_StudyManager_i::SaveAs(const char* aUrl, SALOMEDS::Study_ptr theStudy, CORBA::Boolean theMultiFile) +void SALOMEDS_StudyManager_i::SaveAs(const char* aUrl, SALOMEDS::Study_ptr aStudy, CORBA::Boolean theMultiFile) { - _SaveAs(aUrl,theStudy,theMultiFile, false); + SALOMEDS::Locker lock; + + if(aStudy->_is_nil()) { + MESSAGE("SaveASCII error: Study is null"); + return; + } + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudy->StudyId()); + _impl->SaveAs(TCollection_AsciiString((char*)aUrl), aStudyImpl, _factory, theMultiFile); } -void SALOMEDS_StudyManager_i::SaveAsASCII(const char* aUrl, SALOMEDS::Study_ptr theStudy, CORBA::Boolean theMultiFile) +void SALOMEDS_StudyManager_i::SaveAsASCII(const char* aUrl, SALOMEDS::Study_ptr aStudy, CORBA::Boolean theMultiFile) { - _SaveAs(aUrl,theStudy,theMultiFile, true); + SALOMEDS::Locker lock; + + if(aStudy->_is_nil()) { + MESSAGE("SaveASCII error: Study is null"); + return; + } + + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudy->StudyId()); + _impl->SaveAsASCII(TCollection_AsciiString((char*)aUrl), aStudyImpl, _factory, theMultiFile); } //============================================================================ @@ -494,21 +252,28 @@ void SALOMEDS_StudyManager_i::SaveAsASCII(const char* aUrl, SALOMEDS::Study_ptr //============================================================================ SALOMEDS::ListOfOpenStudies* SALOMEDS_StudyManager_i::GetOpenStudies() { - // MESSAGE("Begin of GetOpenStudies"); - SALOMEDS::ListOfOpenStudies_var aStudyList = new SALOMEDS::ListOfOpenStudies; - - if(!_name_service.Change_Directory("/Study")){ - MESSAGE("No active study in this session"); - }else{ - vector aList = _name_service.list_directory(); - aStudyList->length(aList.size()); - for(unsigned int ind = 0; ind < aList.size(); ind++){ - aStudyList[ind] = CORBA::string_dup(aList[ind].c_str()); - SCRUTE(aStudyList[ind]) ; - } - } + SALOMEDS::Locker lock; + + Handle(TColStd_HSequenceOfTransient) anOpened = _impl->GetOpenStudies(); + int aLength = anOpened->Length(); + + SALOMEDS::ListOfOpenStudies_var _list_open_studies = new SALOMEDS::ListOfOpenStudies; + _list_open_studies->length(aLength); - return aStudyList._retn(); + if(!aLength) + { + MESSAGE("No active study in this session"); + } + else + { + for (unsigned int ind=1; ind <= aLength; ind++) + { + Handle(SALOMEDSImpl_Study) aStudy = Handle(SALOMEDSImpl_Study)::DownCast(anOpened->Value(ind)); + _list_open_studies[ind-1] = CORBA::string_dup(aStudy->Name().ToCString()); + SCRUTE(_list_open_studies[ind-1]) ; + } + } + return _list_open_studies._retn(); } //============================================================================ @@ -516,25 +281,22 @@ SALOMEDS::ListOfOpenStudies* SALOMEDS_StudyManager_i::GetOpenStudies() * Purpose : Get a study from its name */ //============================================================================ -SALOMEDS::Study_ptr -SALOMEDS_StudyManager_i::GetStudyByName(const char* theStudyName) +SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::GetStudyByName(const char* aStudyName) { - SALOMEDS::Study_var aStudy; + SALOMEDS::Locker lock; - // Go to study directory and look for aStudyName - if(!_name_service.Change_Directory("/Study")){ - MESSAGE("No active study in this session"); - ASSERT(false); // Stop here... - } - - if(_name_service.Find(theStudyName) > 0){ - // Study found - CORBA::Object_ptr anObj = _name_service.Resolve(theStudyName) ; - aStudy = SALOMEDS::Study::_narrow(anObj); - MESSAGE("Study " << theStudyName << " found in the naming service"); - }else{ - MESSAGE("Study " << theStudyName << " not found in the naming service"); + Handle(SALOMEDSImpl_Study) aStudyImpl = + _impl->GetStudyByName(TCollection_AsciiString((char*)aStudyName)); + + if (aStudyImpl.IsNull()) + { + MESSAGE(_impl->GetErrorCode().ToCString()); + return SALOMEDS::Study::_nil(); } + + SALOMEDS_Study_i* aStudy_servant = new SALOMEDS_Study_i(aStudyImpl, _orb); + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(aStudy_servant->_this()); + return aStudy._retn(); } @@ -543,552 +305,42 @@ SALOMEDS_StudyManager_i::GetStudyByName(const char* theStudyName) * Purpose : Get a study from its ID */ //============================================================================ -SALOMEDS::Study_ptr -SALOMEDS_StudyManager_i::GetStudyByID(CORBA::Short aStudyID) +SALOMEDS::Study_ptr SALOMEDS_StudyManager_i::GetStudyByID(CORBA::Short aStudyID) { - SALOMEDS::Study_var aStudy; - - if(!_name_service.Change_Directory("/Study")){ - MESSAGE("No active study in this session"); - }else{ - vector aList = _name_service.list_directory(); - for(unsigned int ind = 0; ind < aList.size(); ind++){ - const char* aStudyName = aList[ind].c_str(); - MESSAGE( "GetStudyByID = " << aStudyName ); - if(_name_service.Find(aStudyName) > 0){ - CORBA::Object_ptr anObj = _name_service.Resolve(aStudyName) ; - aStudy = SALOMEDS::Study::_narrow(anObj); - MESSAGE( " aStudyID : " << aStudyID << "-" << aStudy->StudyId() ); - if(aStudyID == aStudy->StudyId()){ - MESSAGE("Study with studyID = " << aStudyID << " found in the naming service"); - return aStudy._retn(); - } - }else{ - MESSAGE("Study " << aStudyName << " not found in the naming service"); - } - } - } - - return aStudy._retn(); -} -//============================================================================ -/*! Function : SaveAttributes - * Purpose : Save attributes for object - */ -//============================================================================ -static void SaveAttributes(SALOMEDS::SObject_ptr SO, HDFgroup *hdf_group_sobject) { - int a; - hdf_size size[1]; - SALOMEDS::ListOfAttributes_var anAttrList = SO->GetAllAttributes(); - for(a = anAttrList->length() - 1; a >= 0; a--) { - if (strcmp(anAttrList[a]->Type(), "AttributeIOR") == 0) continue; // never write AttributeIOR to file - if (strcmp(anAttrList[a]->Type(), "AttributeExternalFileDef") == 0) continue; // never write ExternalFileDef to file - if (strcmp(anAttrList[a]->Type(), "AttributeFileType") == 0) continue; // never write FileType to file - CORBA::String_var aSaveStr(anAttrList[a]->Store()); - size[0] = (hdf_int32) strlen(aSaveStr.in()) + 1; - HDFdataset *hdf_dataset = new HDFdataset(anAttrList[a]->Type(),hdf_group_sobject,HDF_STRING,size,1); - hdf_dataset->CreateOnDisk(); - hdf_dataset->WriteOnDisk(aSaveStr); - hdf_dataset->CloseOnDisk(); - //cout<<"********** Write Attribute "<Type()<<" : "<ReferencedObject(RefSO)) { - CORBA::String_var attribute_reference(RefSO->GetID()); - size[0] = strlen(attribute_reference) + 1 ; - HDFdataset *hdf_dataset = new HDFdataset("Reference",hdf_group_sobject,HDF_STRING,size,1); - hdf_dataset->CreateOnDisk(); - hdf_dataset->WriteOnDisk(attribute_reference); - hdf_dataset->CloseOnDisk(); - hdf_dataset = 0; // will be deleted by father hdf object destructor - } -} + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudyID); -//============================================================================= -/*! Function : _SaveProperties - * Purpose : save the study properties in HDF file - */ -//============================================================================ -void SALOMEDS_StudyManager_i::_SaveProperties(SALOMEDS_Study_i* theStudy, HDFgroup *hdf_group) -{ - // add modifications list (user and date of save) - SALOMEDS::AttributeStudyProperties_ptr aProp = theStudy->GetProperties(); - int aLocked = aProp->IsLocked(); - if (aLocked) - aProp->SetLocked(Standard_False); - OSD_Process aProcess; - Quantity_Date aDate = aProcess.SystemDate(); - aProp->SetModification(aProcess.UserName().ToCString(), - CORBA::Long(aDate.Minute()), - CORBA::Long(aDate.Hour()), - CORBA::Long(aDate.Day()), - CORBA::Long(aDate.Month()), - CORBA::Long(aDate.Year())); - if(aLocked) - aProp->SetLocked(Standard_True); - - SALOMEDS::StringSeq_var aNames; - SALOMEDS::LongSeq_var aMinutes, aHours, aDays, aMonths, aYears; - aProp->GetModificationsList(aNames,aMinutes,aHours,aDays,aMonths,aYears,true); - - std::ostringstream aPropertyList; - aPropertyList<<(strlen(aProp->GetCreationMode()) != 0? aProp->GetCreationMode()[0] : '0'); - aPropertyList<<(aProp->IsLocked()? 'l': 'u'); - - int aLength = aNames->length(); - for(int anIndex = 0; anIndex < aLength; anIndex++) { - aPropertyList<GetErrorCode().ToCString()); + return SALOMEDS::Study::_nil(); } - std::string aProperty = aPropertyList.str(); - - hdf_size size[] = {aProperty.size() + 1}; - HDFdataset *hdf_dataset = new HDFdataset("AttributeStudyProperties",hdf_group,HDF_STRING,size,1); - hdf_dataset->CreateOnDisk(); - hdf_dataset->WriteOnDisk(const_cast(aProperty.c_str())); - MESSAGE("attribute StudyProperties " << aProperty << " wrote on file"); - hdf_dataset->CloseOnDisk(); - hdf_dataset = 0; //will be deleted by hdf_sco_group destructor - aProp->SetModified(0); -} -//============================================================================= -/*! Function : _SaveAs - * Purpose : save the study in HDF file - */ -//============================================================================ -void SALOMEDS_StudyManager_i::_SaveAs(const char* aUrl, - SALOMEDS::Study_ptr theStudy, - CORBA::Boolean theMultiFile, - CORBA::Boolean theASCII) -{ - // HDF File will be composed of differents part : - // * For each ComponentDataType, all data created by the component - // Informations in data group hdf_group_datacomponent - // * Study Structure -> Exactly what is contained in OCAF document - // Informations in data group hdf_group_study_structure - - if(SALOMEDS_Study_i* aStudy = DownCast(theStudy)){ - HDFfile *hdf_file=0; - HDFgroup *hdf_group_study_structure =0; - HDFgroup *hdf_sco_group =0; - HDFgroup *hdf_sco_group2 =0; - - HDFgroup *hdf_group_datacomponent =0; - HDFdataset *hdf_dataset =0; - hdf_size size[1]; - hdf_int32 name_len = 0; - - int aLocked = aStudy->GetProperties()->IsLocked(); - if(aLocked) - aStudy->GetProperties()->SetLocked(false); - - SALOMEDS_StudyBuilder_i* SB= aStudy->GetBuilder(); - try{ - // mpv 15.12.2003: for saving components we have to load all data from all modules - SALOMEDS_SComponentIterator_i aComponentIter = aStudy->GetComponentIterator(); - for(; aComponentIter.More(); aComponentIter.Next()){ - SALOMEDS::SComponent_var sco = aComponentIter.Value(); - // if there is an associated Engine call its method for saving - CORBA::String_var IOREngine; - try{ - if(!sco->ComponentIOR(IOREngine)){ - SALOMEDS::GenericAttribute_var aGeneric; - SALOMEDS::AttributeName_var aName; - if(sco->FindAttribute(aGeneric, "AttributeName")) - aName = SALOMEDS::AttributeName::_narrow(aGeneric); - - if(!aName->_is_nil()){ - CORBA::String_var aCompType = aName->Value(); - - CORBA::String_var aFactoryType; - if(strcmp(aCompType, "SUPERV") == 0) - aFactoryType = "SuperVisionContainer"; - else - aFactoryType = "FactoryServer"; - - Engines::Component_var aComp = - SALOME_LifeCycleCORBA(&_name_service).FindOrLoad_Component(aFactoryType, aCompType); - - if(aComp->_is_nil()){ - Engines::Component_var aComp = - SALOME_LifeCycleCORBA(&_name_service).FindOrLoad_Component("FactoryServerPy", aCompType); - } - - if(!aComp->_is_nil()){ - SALOMEDS::Driver_var aDriver = SALOMEDS::Driver::_narrow(aComp); - if (!CORBA::is_nil(aDriver)) { - SB->LoadWith(sco, aDriver); - } - } - } - } - }catch(...){ - MESSAGE("Can not restore information to resave it"); - return; - } - } - - CORBA::String_var anOldName = aStudy->Name(); - aStudy->URL(aUrl); - - // To change for Save - // Do not have to do a new file but just a Open??? Rewrite all informations after erasing evrything?? - hdf_file = new HDFfile((char *)aUrl); - hdf_file->CreateOnDisk(); - MESSAGE("File " << aUrl << " created"); - - //----------------------------------------------------------------------- - // 1 - Create a groupe for each SComponent and Update the PersistanceRef - //----------------------------------------------------------------------- - hdf_group_datacomponent = new HDFgroup("DATACOMPONENT",hdf_file); - hdf_group_datacomponent->CreateOnDisk(); - - //SRN: Added 17 Nov, 2003 - SALOMEDS::SObject_var anAutoSaveSO = aStudy->FindObjectID(AUTO_SAVE_TAG); - //SRN: End - - aComponentIter.Init(); - for(; aComponentIter.More(); aComponentIter.Next()){ - SALOMEDS::SComponent_var sco = aComponentIter.Value(); - - CORBA::String_var scoid = sco->GetID(); - hdf_sco_group = new HDFgroup(scoid,hdf_group_datacomponent); - hdf_sco_group->CreateOnDisk(); - - CORBA::String_var componentDataType = sco->ComponentDataType(); - MESSAGE ( "Look for an engine for data type :"<< componentDataType); - - //SRN: Added 17 Nov 2003: If there is a specified attribute, the component peforms a special save - if(!CORBA::is_nil(anAutoSaveSO) && SB->IsGUID(sco, AUTO_SAVE_GUID)){ - SALOMEDS::GenericAttribute_var aGeneric; - SALOMEDS::AttributeTableOfString_var aTable; - if(anAutoSaveSO->FindAttribute(aGeneric, "AttributeTableOfString")){ - aTable = SALOMEDS::AttributeTableOfString::_narrow(aGeneric); - Standard_Integer nbRows = aTable->GetNbRows(), k, aTimeOut = 0; - if(nbRows > 0 && aTable->GetNbColumns() > 1) { - SALOMEDS::StringSeq_var aRow; - for(k=1; k<=nbRows; k++){ - aRow = aTable->GetRow(k); - if(strcmp(aRow[0], componentDataType) == 0){ - CORBA::String_var anEntry = CORBA::string_dup(aRow[1]); - SALOMEDS::SObject_var aCompSpecificSO = aStudy->FindObjectID(anEntry); - if(!CORBA::is_nil(aCompSpecificSO)) { - SALOMEDS::AttributeInteger_var anInteger; - if(aCompSpecificSO->FindAttribute(aGeneric, "AttributeInteger")) { - anInteger = SALOMEDS::AttributeInteger::_narrow(aGeneric); - anInteger->SetValue(-1); - while(anInteger->Value() < 0) { sleep(2); if(++aTimeOut > AUTO_SAVE_TIME_OUT_IN_SECONDS) break; } - } // if(aCompSpecificSO->FindAttribute(anInteger, "AttributeInteger")) - } // if(!CORBA::is_nil(aCompSpecificSO)) - } // if (strcmp(aRow[0], componentDataType) == 0) - } // for - - } // if(nbRows > 0 && aTable->GetNbColumns() > 1) - - } // if(anAutoSaveSO->FindAttribute(aTable, "AttributeTableOfString") - - } // if(SB->IsGUID(AUTO_SAVE_GUID) - - //SRN: End - - CORBA::String_var IOREngine; - if(sco->ComponentIOR(IOREngine)){ - // we have found the associated engine to write the data - MESSAGE ( "We have found an engine for data type :"<< componentDataType); - CORBA::Object_var obj = _orb->string_to_object(IOREngine); - SALOMEDS::Driver_var Engine = SALOMEDS::Driver::_narrow(obj) ; - - if(!CORBA::is_nil(Engine)){ - MESSAGE ( "Save the data of type:"<< componentDataType); - MESSAGE("Engine :"<ComponentDataType()); - - SALOMEDS::TMPFile_var aStream; - - if(theASCII) - aStream = Engine->SaveASCII(sco,SALOMEDS_Tool::GetDirFromPath(aUrl).c_str(),theMultiFile); - else - aStream = Engine->Save(sco,SALOMEDS_Tool::GetDirFromPath(aUrl).c_str(),theMultiFile); - - HDFdataset *hdf_dataset; - hdf_size aHDFSize[1]; - if(aStream->length() > 0){ //The component saved some auxiliary files, then put them into HDF file - - aHDFSize[0] = aStream->length(); - - HDFdataset *hdf_dataset = new HDFdataset("FILE_STREAM", hdf_sco_group, HDF_STRING, aHDFSize, 1); - hdf_dataset->CreateOnDisk(); - hdf_dataset->WriteOnDisk((unsigned char*) &aStream[0]); //Save the stream in the HDF file - hdf_dataset->CloseOnDisk(); - } - // store multifile state - aHDFSize[0] = 2; - hdf_dataset = new HDFdataset("MULTIFILE_STATE", hdf_sco_group, HDF_STRING, aHDFSize, 1); - hdf_dataset->CreateOnDisk(); - hdf_dataset->WriteOnDisk((void*)(theMultiFile?"M":"S")); // save: multi or single - hdf_dataset->CloseOnDisk(); - hdf_dataset=0; //will be deleted by hdf_sco_AuxFiles destructor - - // store ASCII state - aHDFSize[0] = 2; - hdf_dataset = new HDFdataset("ASCII_STATE", hdf_sco_group, HDF_STRING, aHDFSize, 1); - hdf_dataset->CreateOnDisk(); - hdf_dataset->WriteOnDisk((void*)(theASCII?"A":"B")); // save: ASCII or BINARY - hdf_dataset->CloseOnDisk(); - hdf_dataset=0; //will be deleted by hdf_sco_AuxFiles destructor - - Translate_IOR_to_persistentID(aStudy,SB,sco,Engine,theMultiFile, theASCII); - MESSAGE("After Translate_IOR_to_persistentID"); - - // Creation of the persistance reference attribute - } - } - hdf_sco_group->CloseOnDisk(); - hdf_sco_group=0; // will be deleted by hdf_group_datacomponent destructor - } - hdf_group_datacomponent->CloseOnDisk(); - hdf_group_datacomponent =0; // will be deleted by hdf_file destructor - - - //----------------------------------------------------------------------- - //3 - Write the Study Structure - //----------------------------------------------------------------------- - hdf_group_study_structure = new HDFgroup("STUDY_STRUCTURE",hdf_file); - hdf_group_study_structure->CreateOnDisk(); - - // save component attributes - aComponentIter.Init(); - for(; aComponentIter.More(); aComponentIter.Next()){ - SALOMEDS::SComponent_var SC = aComponentIter.Value(); - - CORBA::String_var scid = SC->GetID(); - hdf_sco_group2 = new HDFgroup(scid,hdf_group_study_structure); - hdf_sco_group2->CreateOnDisk(); - SaveAttributes(SC, hdf_sco_group2); - // ComponentDataType treatment - CORBA::String_var component_name = SC->ComponentDataType(); - MESSAGE("Component data type " << component_name << " treated"); - - name_len = (hdf_int32) strlen(component_name.in()); - size[0] = name_len +1 ; - hdf_dataset = new HDFdataset("COMPONENTDATATYPE",hdf_sco_group2,HDF_STRING,size,1); - hdf_dataset->CreateOnDisk(); - hdf_dataset->WriteOnDisk(const_cast(component_name.in())); - MESSAGE("component name " << component_name << " wrote on file"); - hdf_dataset->CloseOnDisk(); - hdf_dataset=0; //will be deleted by hdf_sco_group destructor - _SaveObject(aStudy, SC, hdf_sco_group2); - hdf_sco_group2->CloseOnDisk(); - hdf_sco_group2=0; // will be deleted by hdf_group_study_structure destructor - } - //----------------------------------------------------------------------- - //4 - Write the Study UseCases Structure - //----------------------------------------------------------------------- - SALOMEDS::SObject_var aSO = aStudy->FindObjectID(USE_CASE_LABEL_ID); - if(!aSO->_is_nil()){ - HDFgroup *hdf_soo_group = new HDFgroup(USE_CASE_LABEL_ID,hdf_group_study_structure); - hdf_soo_group->CreateOnDisk(); - SaveAttributes(aSO, hdf_soo_group); - _SaveObject(aStudy, aSO, hdf_soo_group); - MESSAGE("Use cases data structure writed"); - hdf_soo_group->CloseOnDisk(); - hdf_soo_group=0; // will be deleted by hdf_group_study_structure destructor - } - - if (aLocked) - aStudy->GetProperties()->SetLocked(true); - //----------------------------------------------------------------------- - //5 - Write the Study Properties - //----------------------------------------------------------------------- - name_len = (hdf_int32) strlen(aStudy->Name()); - size[0] = name_len +1 ; - hdf_dataset = new HDFdataset("STUDY_NAME",hdf_group_study_structure,HDF_STRING,size,1); - hdf_dataset->CreateOnDisk(); - CORBA::String_var studid = aStudy->Name(); - hdf_dataset->WriteOnDisk(studid); - MESSAGE("study name " << studid << " wrote on file"); - hdf_dataset->CloseOnDisk(); - hdf_dataset=0; // will be deleted by hdf_group_study_structure destructor - - _SaveProperties(aStudy, hdf_group_study_structure); - - hdf_group_study_structure->CloseOnDisk(); - hdf_file->CloseOnDisk(); - - _name_service.Change_Directory("/Study"); - _name_service.Destroy_Name(anOldName); - _name_service.Register(theStudy, aStudy->Name()); - - aStudy->IsSaved(true); - hdf_group_study_structure =0; // will be deleted by hdf_file destructor - delete hdf_file; // recursively deletes all hdf objects... - }catch(HDFexception){ - MESSAGE( "HDFexception ! " ); - } - if(theASCII){ // save file in ASCII format - HDFascii::ConvertFromHDFToASCII(aUrl, true); - } - } -} + SALOMEDS_Study_i* aStudy_servant = new SALOMEDS_Study_i(aStudyImpl, _orb); + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(aStudy_servant->_this()); -//============================================================================ -/*! Function : _SaveObject - * Purpose : - */ -//============================================================================ -void SALOMEDS_StudyManager_i::_SaveObject(SALOMEDS_Study_i* theStudy, - SALOMEDS::SObject_ptr theSObject, - HDFgroup *hdf_group_datatype) -{ - // Write in group hdf_group_datatype all informations of SObject SC - // Iterative function to parse all SObjects under a SComponent - SALOMEDS::SObject_var RefSO; - HDFgroup *hdf_group_sobject = 0; - - SALOMEDS_ChildIterator_i aChildIter = theStudy->GetChildIterator(theSObject); - for(; aChildIter.More(); aChildIter.Next()){ - SALOMEDS::SObject_var aSObject = aChildIter.Value(); - SALOMEDS::ListOfAttributes_var anAllAttributes = aSObject->GetAllAttributes(); - - // mpv: don't save empty labels - if(anAllAttributes->length() == 0 && !aSObject->ReferencedObject(RefSO)){ - SALOMEDS_ChildIterator_i aSubChildIter = theStudy->GetChildIterator(theSObject); - if(!aSubChildIter.More()) - continue; - - aSubChildIter.InitEx(true); - bool anEmpty = true; - for(; aSubChildIter.More() && anEmpty; aSubChildIter.Next()){ - SALOMEDS::SObject_var aSObj = aSubChildIter.Value(); - SALOMEDS::ListOfAttributes_var anAllAttr = aSObj->GetAllAttributes(); - if(anAllAttr->length() != 0 || aSObj->ReferencedObject(RefSO)) - anEmpty = false; - } - if(anEmpty) - continue; - } - - CORBA::String_var scoid(aSObject->GetID()); - hdf_group_sobject = new HDFgroup(scoid,hdf_group_datatype); - hdf_group_sobject->CreateOnDisk(); - SaveAttributes(aSObject, hdf_group_sobject); - _SaveObject(theStudy,aSObject, hdf_group_sobject); - hdf_group_sobject->CloseOnDisk(); - hdf_group_sobject =0; // will be deleted by father hdf object destructor - } + return aStudy._retn(); } -//============================================================================ -/*! Function : _SubstituteSlash - * Purpose : - */ -//============================================================================ - -std::string SALOMEDS_StudyManager_i::_SubstituteSlash(const char *theUrl) -{ - ASSERT(1==0); - TCollection_ExtendedString aUrl(const_cast(theUrl)); - aUrl.ChangeAll(ToExtCharacter('/'),ToExtCharacter(':')); - TCollection_AsciiString ch(aUrl); - return ch.ToCString(); -} //============================================================================ /*! Function : CanCopy - * Purpose : + * Purpose : */ //============================================================================ -CORBA::Boolean SALOMEDS_StudyManager_i::CanCopy(SALOMEDS::SObject_ptr theObject) { - SALOMEDS::SComponent_var aComponent = theObject->GetFatherComponent(); - - if(aComponent->_is_nil()) - return false; - - if(aComponent == theObject) - return false; - - CORBA::String_var IOREngine; - if(!aComponent->ComponentIOR(IOREngine)) - return false; +CORBA::Boolean SALOMEDS_StudyManager_i::CanCopy(SALOMEDS::SObject_ptr theObject) +{ + SALOMEDS::Locker lock; - CORBA::Object_var obj = _orb->string_to_object(IOREngine); - SALOMEDS::Driver_var Engine = SALOMEDS::Driver::_narrow(obj) ; - if (CORBA::is_nil(Engine)) - return false; + SALOMEDS::Study_var aStudy = theObject->GetStudy(); + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudy->StudyId()); + Handle(SALOMEDSImpl_SObject) anObject = aStudyImpl->GetSObject((char*)theObject->GetID()); - return Engine->CanCopy(theObject); -} - -//============================================================================ -/*! Function : CopyLabel - * Purpose : - */ -//============================================================================ -void SALOMEDS_StudyManager_i::CopyLabel(SALOMEDS_Study_i* theSourceStudy, - const SALOMEDS::Driver_ptr theEngine, - const Standard_Integer theSourceStartDepth, - const TDF_Label& theSource, - const TDF_Label& theDestinationMain) -{ - int a; - TDF_Label aTargetLabel = theDestinationMain; - TDF_Label aAuxTargetLabel = theDestinationMain.Father().FindChild(2); - for(a = theSource.Depth() - theSourceStartDepth; a > 0 ; a--) { - TDF_Label aSourceLabel = theSource; - for(int aNbFather = 1; aNbFather < a; aNbFather++) aSourceLabel = aSourceLabel.Father(); - aTargetLabel = aTargetLabel.FindChild(aSourceLabel.Tag()); - aAuxTargetLabel = aAuxTargetLabel.FindChild(aSourceLabel.Tag()); - } - // iterate attributes - TDF_AttributeIterator anAttrIterator(theSource); - Handle(TDF_RelocationTable) aRT = new TDF_RelocationTable(); - for(; anAttrIterator.More(); anAttrIterator.Next()) { - Handle(TDF_Attribute) anAttr = anAttrIterator.Value(); - if (!Handle(TDataStd_TreeNode)::DownCast(anAttr).IsNull()) continue; // never copy tree node attribute - if (!Handle(SALOMEDS_TargetAttribute)::DownCast(anAttr).IsNull()) continue; // and target attribute - - if (!Handle(TDF_Reference)::DownCast(anAttr).IsNull()) { // reference copied as Comment in auxiliary tree - TDF_Label aReferenced = Handle(TDF_Reference)::DownCast(anAttr)->Get(); - TCollection_AsciiString anEntry; - TDF_Tool::Entry(aReferenced, anEntry); - // store the value of name attribute of referenced label - Handle(TDataStd_Name) aNameAttribute; - if (aReferenced.FindAttribute(TDataStd_Name::GetID(), aNameAttribute)) { - anEntry += " "; - anEntry += aNameAttribute->Get(); - } - TDataStd_Comment::Set(aAuxTargetLabel, TCollection_ExtendedString(anEntry)); - continue; - } - - if (!Handle(SALOMEDS_IORAttribute)::DownCast(anAttr).IsNull()) { // IOR => ID and TMPFile of Engine - TCollection_AsciiString anEntry; - TDF_Tool::Entry(theSource, anEntry); - SALOMEDS::SObject_var aSO = theSourceStudy->FindObjectID(anEntry.ToCString()); - CORBA::Long anObjID; - SALOMEDS::TMPFile_var aStream = theEngine->CopyFrom(aSO, anObjID); - int aLen = aStream->length(); - TCollection_ExtendedString aResStr(""); - for(a = 0; a < aLen; a++) { - aResStr += TCollection_ExtendedString(ToExtCharacter((Standard_Character)aStream[a])); - } - TDataStd_Integer::Set(aAuxTargetLabel, anObjID); - TDataStd_Name::Set(aAuxTargetLabel, aResStr); - continue; - } - Handle(TDF_Attribute) aNewAttribute = anAttr->NewEmpty(); - aTargetLabel.AddAttribute(aNewAttribute); - anAttr->Paste(aNewAttribute, aRT); -// aRT->SetRelocation(anAttr, aNewAttribute); - } + SALOMEDS_Driver_i* aDriver = GetDriver(anObject, _orb); + bool ret = _impl->CanCopy(anObject, aDriver); + delete aDriver; + return ret; } //============================================================================ @@ -1096,201 +348,39 @@ void SALOMEDS_StudyManager_i::CopyLabel(SALOMEDS_Study_i* theSourceStudy, * Purpose : */ //============================================================================ -CORBA::Boolean SALOMEDS_StudyManager_i::Copy(SALOMEDS::SObject_ptr theObject) { - // adoptation for alliances datamodel copy: without IOR attributes !!! - // copy only SObjects and attributes without component help - SALOMEDS::GenericAttribute_var anAttribute; - bool aStructureOnly = !theObject->FindAttribute(anAttribute, "AttributeIOR"); - - PortableServer::ServantBase_var aServant = GetServant(theObject,_poa); - SALOMEDS_SObject_i* aSObject = dynamic_cast(aServant.in()); - if(aSObject == NULL) - return false; - - SALOMEDS_Study_i* aStudy = aSObject->GetStudyServant(); - SALOMEDS::Driver_var anEngine; - CORBA::String_var aString; - if (!aStructureOnly) { - SALOMEDS::SComponent_var aComponent = theObject->GetFatherComponent(); - if(!aComponent->ComponentIOR(aString)) - return false; - - CORBA::Object_var anObj = _orb->string_to_object(aString); - anEngine = SALOMEDS::Driver::_narrow(anObj) ; - } - - // CAF document of current study usage - Handle(TDocStd_Document) aDocument = aStudy->GetDocument(); - if(aDocument.IsNull()) - return false; - - // create new document for clipboard - Handle(TDocStd_Document) aTargetDocument; - _OCAFApp->NewDocument("SALOME_STUDY", aTargetDocument); - // set component data type to the name attribute of root label - if(!aStructureOnly){ - aString = anEngine->ComponentDataType(); - TDataStd_Comment::Set(aTargetDocument->Main().Root(),const_cast(aString.in())); - } - // set to the Root label integer attribute: study id - TDataStd_Integer::Set(aTargetDocument->Main().Root(),aStudy->StudyId()); - - // iterate all theObject's label children - TDF_Label aStartLabel; - aString = theObject->GetID(); - TDF_Tool::Label(aDocument->GetData(),const_cast(aString.in()),aStartLabel); - Standard_Integer aSourceStartDepth = aStartLabel.Depth(); - - // copy main source label - CopyLabel(aStudy,anEngine,aSourceStartDepth,aStartLabel,aTargetDocument->Main()); - - // copy all subchildren of the main source label (all levels) - TDF_ChildIterator anIterator(aStartLabel,Standard_True); - for(; anIterator.More(); anIterator.Next()){ - CopyLabel(aStudy,anEngine,aSourceStartDepth,anIterator.Value(),aTargetDocument->Main()); - } - - // done: free old clipboard document and - if (!_clipboard.IsNull()) { -// Handle(TDocStd_Owner) anOwner; -// if (_clipboard->Main().Root().FindAttribute(TDocStd_Owner::GetID(), anOwner)) { -// Handle(TDocStd_Document) anEmptyDoc; -// anOwner->SetDocument(anEmptyDoc); -// } - _OCAFApp->Close(_clipboard); - } +CORBA::Boolean SALOMEDS_StudyManager_i::Copy(SALOMEDS::SObject_ptr theObject) +{ + SALOMEDS::Locker lock; - _clipboard = aTargetDocument; + SALOMEDS::Study_var aStudy = theObject->GetStudy(); + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudy->StudyId()); + Handle(SALOMEDSImpl_SObject) anObject = aStudyImpl->GetSObject((char*)theObject->GetID()); - return true; + SALOMEDS_Driver_i* aDriver = GetDriver(anObject, _orb); + bool ret = _impl->Copy(anObject, aDriver); + delete aDriver; + return ret; } + //============================================================================ /*! Function : CanPaste * Purpose : */ //============================================================================ -CORBA::Boolean SALOMEDS_StudyManager_i::CanPaste(SALOMEDS::SObject_ptr theObject) { - if (_clipboard.IsNull()) return false; - - Handle(TDataStd_Comment) aCompName; - if (!_clipboard->Main().Root().FindAttribute(TDataStd_Comment::GetID(), aCompName)) return false; - Handle(TDataStd_Integer) anObjID; - if (!_clipboard->Main().Father().FindChild(2).FindAttribute(TDataStd_Integer::GetID(), anObjID)) - return false; - - SALOMEDS::SComponent_var aComponent = theObject->GetFatherComponent(); - if(aComponent->_is_nil()) - return false; - - CORBA::String_var IOREngine; - if(!aComponent->ComponentIOR(IOREngine)) - return false; - - CORBA::Object_var obj = _orb->string_to_object(IOREngine); - SALOMEDS::Driver_var Engine = SALOMEDS::Driver::_narrow(obj) ; - if (CORBA::is_nil(Engine)) - return false; - - return Engine->CanPaste(TCollection_AsciiString(aCompName->Get()).ToCString(),anObjID->Get()); -} -//============================================================================ -/*! Function : PasteLabel - * Purpose : - */ -//============================================================================ -TDF_Label SALOMEDS_StudyManager_i::PasteLabel(SALOMEDS_Study_i* theDestinationStudy, - const SALOMEDS::Driver_ptr theEngine, - const TDF_Label& theSource, - const TDF_Label& theDestinationStart, - const int theCopiedStudyID, - const bool isFirstElement) +CORBA::Boolean SALOMEDS_StudyManager_i::CanPaste(SALOMEDS::SObject_ptr theObject) { + SALOMEDS::Locker lock; - // get corresponding source, target and auxiliary labels - TDF_Label aTargetLabel = theDestinationStart; - TDF_Label aAuxSourceLabel = theSource.Root().FindChild(2); - int a; - if (!isFirstElement) { - for(a = theSource.Depth() - 1; a > 0 ; a--) { - TDF_Label aSourceLabel = theSource; - for(int aNbFather = 1; aNbFather < a; aNbFather++) - aSourceLabel = aSourceLabel.Father(); - aTargetLabel = aTargetLabel.FindChild(aSourceLabel.Tag()); - aAuxSourceLabel = aAuxSourceLabel.FindChild(aSourceLabel.Tag()); - } - } - - // check auxiliary label for TMPFile => IOR - Handle(TDataStd_Name) aNameAttribute; - if (aAuxSourceLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttribute)) { - Handle(TDataStd_Integer) anObjID; - - aAuxSourceLabel.FindAttribute(TDataStd_Integer::GetID(), anObjID); - Handle(TDataStd_Comment) aComponentName; - theSource.Root().FindAttribute(TDataStd_Comment::GetID(), aComponentName); - std::string aCompName = TCollection_AsciiString(aComponentName->Get()).ToCString(); - if (theEngine->CanPaste(aCompName.c_str(),anObjID->Get())) { - SALOMEDS::TMPFile_var aTMPFil = new SALOMEDS::TMPFile(); - TCollection_ExtendedString aTMPStr = aNameAttribute->Get(); - int aLen = aTMPStr.Length(); - aTMPFil->length(aLen); - for(a = 0; a < aLen; a++) { - aTMPFil[a] = ToCharacter(aTMPStr.Value(a+1)); - } - TCollection_AsciiString anEntry; - TDF_Tool::Entry(aTargetLabel, anEntry); - SALOMEDS::SObject_var aPastedSO = theDestinationStudy->FindObjectID(anEntry.ToCString()); - if(isFirstElement){ - SALOMEDS::SObject_var aDestSO = - theEngine->PasteInto(aTMPFil.in(), - anObjID->Get(), - aPastedSO->GetFatherComponent()); - TDF_Tool::Label(theDestinationStart.Data(), aDestSO->GetID(), aTargetLabel); - }else - theEngine->PasteInto(aTMPFil.in(),anObjID->Get(),aPastedSO); - } - } + SALOMEDS::Study_var aStudy = theObject->GetStudy(); + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudy->StudyId()); + Handle(SALOMEDSImpl_SObject) anObject = aStudyImpl->GetSObject((char*)theObject->GetID()); - // iterate attributes - TDF_AttributeIterator anAttrIterator(theSource); - Handle(TDF_RelocationTable) aRT = new TDF_RelocationTable(); - for(; anAttrIterator.More(); anAttrIterator.Next()) { - Handle(TDF_Attribute) anAttr = anAttrIterator.Value(); - if (aTargetLabel.FindAttribute(anAttr->ID(), anAttr)) { - aTargetLabel.ForgetAttribute(anAttr->ID()); - anAttr = anAttrIterator.Value(); - } - Handle(TDF_Attribute) aNewAttribute = anAttr->NewEmpty(); - aTargetLabel.AddAttribute(aNewAttribute); - anAttr->Paste(aNewAttribute, aRT); -// aRT->SetRelocation(anAttr, aNewAttribute); - } - // check auxiliary label for Comment => reference or name attribute of the referenced object - Handle(TDataStd_Comment) aCommentAttribute; - if (aAuxSourceLabel.FindAttribute(TDataStd_Comment::GetID(), aCommentAttribute)) { - std::string anEntry(TCollection_AsciiString(aCommentAttribute->Get()).ToCString()); - std::size_t aNameStart = anEntry.find(' '); - std::string aName; - if(aNameStart != std::string::npos){ - aName = anEntry.substr(aNameStart+1); - anEntry = anEntry.substr(0,aNameStart); - } - if (theCopiedStudyID == theDestinationStudy->StudyId()) { // if copy to the same study, reanimate reference - TDF_Label aRefLabel; - TDF_Tool::Label(aTargetLabel.Data(),&anEntry[0],aRefLabel); - TDF_Reference::Set(aTargetLabel, aRefLabel); - SALOMEDS_TargetAttribute::Set(aRefLabel)->Append(aTargetLabel); // target attributes structure support - } else { - if(aNameStart != std::string::npos) - TDataStd_Name::Set(aTargetLabel, &aName[0]); - else - TDataStd_Name::Set(aTargetLabel, - TCollection_ExtendedString("Reference to:") + &anEntry[0]); - } - } - - return aTargetLabel; + SALOMEDS_Driver_i* aDriver = GetDriver(anObject, _orb); + bool ret = _impl->CanPaste(anObject, aDriver); + delete aDriver; + return ret; } + //============================================================================ /*! Function : Paste * Purpose : @@ -1299,56 +389,95 @@ TDF_Label SALOMEDS_StudyManager_i::PasteLabel(SALOMEDS_Study_i* theDestinationSt SALOMEDS::SObject_ptr SALOMEDS_StudyManager_i::Paste(SALOMEDS::SObject_ptr theObject) throw(SALOMEDS::StudyBuilder::LockProtection) { - Unexpect aCatch(LockProtection); + SALOMEDS::Locker lock; - PortableServer::ServantBase_var aServant = GetServant(theObject,_poa); - SALOMEDS_SObject_i* aSObject = dynamic_cast(aServant.in()); - if(aSObject == NULL) - return false; + Unexpect aCatch(LockProtection); + SALOMEDS::Study_var aStudy = theObject->GetStudy(); - SALOMEDS_Study_i* aStudy = aSObject->GetStudyServant(); + Handle(SALOMEDSImpl_Study) aStudyImpl = _impl->GetStudyByID(aStudy->StudyId()); + Handle(SALOMEDSImpl_SObject) anObject = aStudyImpl->GetSObject((char*)theObject->GetID()); + Handle(SALOMEDSImpl_SObject) aNewSO; - // if study is locked, then paste can't be done - if (aStudy->GetProperties()->IsLocked()) + try { + SALOMEDS_Driver_i* aDriver = GetDriver(anObject, _orb); + aNewSO = _impl->Paste(anObject, aDriver); + delete aDriver; + } + catch (...) { throw SALOMEDS::StudyBuilder::LockProtection(); + } - // if there is no component name, then paste only SObjects and attributes: without component help - Handle(TDataStd_Comment) aComponentName; - bool aStructureOnly = !_clipboard->Main().Root().FindAttribute(TDataStd_Comment::GetID(), aComponentName); - - // get copied study ID - Handle(TDataStd_Integer) aStudyIDAttribute; - if (!_clipboard->Main().Root().FindAttribute(TDataStd_Integer::GetID(), aStudyIDAttribute)) - return SALOMEDS::SObject::_nil(); - - // get component-engine - SALOMEDS::SComponent_var aComponent; - SALOMEDS::Driver_var anEngine; - CORBA::String_var aString; - if (!aStructureOnly) { - aComponent = theObject->GetFatherComponent(); - if(!aComponent->ComponentIOR(aString)) - return SALOMEDS::SObject::_nil(); - - CORBA::Object_var anObj = _orb->string_to_object(aString); - anEngine = SALOMEDS::Driver::_narrow(anObj) ; + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aNewSO, _orb); + return so._retn(); +} + + +SALOMEDS_Driver_i* GetDriver(const Handle(SALOMEDSImpl_SObject)& theObject, CORBA::ORB_ptr orb) +{ + SALOMEDS_Driver_i* driver = NULL; + + Handle(SALOMEDSImpl_SComponent) aSCO = theObject->GetFatherComponent(); + if(!aSCO.IsNull()) { + TCollection_AsciiString IOREngine = aSCO->GetIOR(); + if(!IOREngine.IsEmpty()) { + CORBA::Object_var obj = orb->string_to_object(IOREngine.ToCString()); + SALOMEDS::Driver_var Engine = SALOMEDS::Driver::_narrow(obj) ; + driver = new SALOMEDS_Driver_i(Engine, orb); + } } - // CAF document of current study usage - Handle(TDocStd_Document) aDocument = aStudy->GetDocument(); - if (aDocument.IsNull()) - return SALOMEDS::SObject::_nil(); + return driver; +} + +PortableServer::POA_ptr SALOMEDS_StudyManager_i::GetPOA(const SALOMEDS::Study_ptr theStudy) { + if (_mapOfPOA.find(theStudy->StudyId()) != _mapOfPOA.end()) return _mapOfPOA[theStudy->StudyId()]; + return PortableServer::POA::_nil(); +} - // fill root inserted SObject - int aCStudyID = aStudyIDAttribute->Get(); - TDF_Label aLabel = aStructureOnly? aSObject->GetLabel(): aSObject->GetFatherComponentLabel(); - TDF_Label aStartLabel = PasteLabel(aStudy,anEngine,_clipboard->Main(),aLabel,aCStudyID,true); +//=========================================================================== +// PRIVATE FUNCTIONS +//=========================================================================== +long SALOMEDS_StudyManager_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal) +{ +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + isLocal = (strcmp(theHostname, GetHostname().c_str()) == 0 && pid == thePID)?1:0; + SALOMEDSImpl_StudyManager* aManager = _impl.operator->(); + return ((long)aManager); +} - // paste all sublebels - TDF_ChildIterator anIterator(_clipboard->Main(),Standard_True); - for(; anIterator.More(); anIterator.Next()) { - PasteLabel(aStudy,anEngine,anIterator.Value(),aStartLabel,aCStudyID,false); +//=========================================================================== +namespace SALOMEDS +{ +/* + CORBA::Object_var + GetObject(const TDF_Label& theLabel, CORBA::ORB_ptr theORB) + { + try { + Handle(SALOMEDS_IORAttribute) anAttr; + if(theLabel.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)) + return theORB->string_to_object(TCollection_AsciiString(anAttr->Get()).ToCString()); + }catch(...){ + } + return CORBA::Object::_nil(); + } +*/ + + PortableServer::ServantBase_var + GetServant(CORBA::Object_ptr theObject, PortableServer::POA_ptr thePOA) + { + if(CORBA::is_nil(theObject)) + return NULL; + try{ + return thePOA->reference_to_servant(theObject); + }catch(...){ + return NULL; + } } - return SALOMEDS_SObject_i::NewRef(aStudy,aStartLabel)._retn(); } + +//=========================================================================== diff --git a/src/SALOMEDS/SALOMEDS_StudyManager_i.hxx b/src/SALOMEDS/SALOMEDS_StudyManager_i.hxx index a6e4c9e6c..beb62ba7b 100644 --- a/src/SALOMEDS/SALOMEDS_StudyManager_i.hxx +++ b/src/SALOMEDS/SALOMEDS_StudyManager_i.hxx @@ -1,113 +1,55 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_StudyManager_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef __SALOMEDS_STUDYMANAGER_I_H__ #define __SALOMEDS_STUDYMANAGER_I_H__ // std C++ headers -#include -#include +#include // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS) -// Cascade headers -#include -#include -#include -#include -#include -#include - -#include "SALOMEDS_OCAFApplication.hxx" +// Naming Service header #include "SALOME_NamingService.hxx" -// HDF -#include "HDFOI.hxx" +#include -class SALOMEDS_Study_i; +//Standard not implemented +#include +#include "SALOMEDS_Driver_i.hxx" +#include "SALOMEDSImpl_StudyManager.hxx" namespace SALOMEDS{ // To convert IOR from SALOMEDS_IORAttribute to CORBA::Object - CORBA::Object_var - GetObject(const TDF_Label&, CORBA::ORB_ptr); - - // To convert CORBA::Object to PortableServer::ServantBase - PortableServer::ServantBase_var - GetServant(CORBA::Object_ptr, PortableServer::POA_ptr); - -} + /* CORBA::Object_var GetObject(const TDF_Label&, CORBA::ORB_ptr); */ + // To convert CORBA::Object to PortableServer::ServantBase + PortableServer::ServantBase_var GetServant(CORBA::Object_ptr, PortableServer::POA_ptr); -class SALOMEDS_StudyManager_i: - public virtual POA_SALOMEDS::StudyManager, - public virtual PortableServer::RefCountServantBase -{ - SALOMEDS_StudyManager_i(); // Not implemented - void operator=(const SALOMEDS_StudyManager_i&); // Not implemented +} +class Standard_EXPORT SALOMEDS_StudyManager_i: public POA_SALOMEDS::StudyManager, + public PortableServer::RefCountServantBase { private: - CORBA::ORB_var _orb; - PortableServer::POA_var _poa; - SALOME_NamingService _name_service; - Handle (SALOMEDS_OCAFApplication) _OCAFApp; - Handle(TDocStd_Document) _clipboard; - int _IDcounter; - - // _SaveAs private function called by Save and SaveAs - virtual void _SaveAs(const char* aUrl, - SALOMEDS::Study_ptr aStudy, - CORBA::Boolean theMultiFile, - CORBA::Boolean theASCII); - // _SaveObject private function called by _SaveAs - void _SaveObject(SALOMEDS_Study_i* theStudy, - SALOMEDS::SObject_ptr SC, - HDFgroup *hdf_group_datatype); - // _SubstituteSlash function called by Open and GetStudyByName - virtual std::string _SubstituteSlash(const char *aUrl); - - void _SaveProperties(SALOMEDS_Study_i* theStudy, HDFgroup *hdf_group); + + CORBA::ORB_ptr _orb; + PortableServer::POA_var _poa; + Handle(SALOMEDSImpl_StudyManager) _impl; + SALOME_NamingService* _name_service; + SALOMEDS_DriverFactory_i* _factory; public: + //! standard constructor - SALOMEDS_StudyManager_i(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA); + SALOMEDS_StudyManager_i(CORBA::ORB_ptr orb, PortableServer::POA_ptr thePOA); //! standard destructor virtual ~SALOMEDS_StudyManager_i(); - CORBA::ORB_var GetORB() const { return _orb; } - - PortableServer::POA_var GetPOA() const { return _poa; } - - SALOMEDS_Study_i* DownCast(SALOMEDS::Study_ptr theStudy) const; - //! method to Register study Manager in the naming service /*! \param char* arguments, the context to register the study manager in the NS @@ -170,26 +112,20 @@ public: \return Study_ptr arguments */ virtual SALOMEDS::Study_ptr GetStudyByID(CORBA::Short aStudyID) ; - - void CopyLabel(SALOMEDS_Study_i* theSourceStudy, - const SALOMEDS::Driver_ptr theEngine, - const Standard_Integer theSourceStartDepth, - const TDF_Label& theSource, - const TDF_Label& theDestinationMain); - - TDF_Label PasteLabel(SALOMEDS_Study_i* theDestinationStudy, - const SALOMEDS::Driver_ptr theEngine, - const TDF_Label& theSource, - const TDF_Label& theDestinationStart, - const int theCopiedStudyID, - const bool isFirstElement); virtual CORBA::Boolean CanCopy(SALOMEDS::SObject_ptr theObject); virtual CORBA::Boolean Copy(SALOMEDS::SObject_ptr theObject); virtual CORBA::Boolean CanPaste(SALOMEDS::SObject_ptr theObject); virtual SALOMEDS::SObject_ptr Paste(SALOMEDS::SObject_ptr theObject) throw(SALOMEDS::StudyBuilder::LockProtection); + + virtual char* ConvertObjectToIOR(CORBA::Object_ptr theObject) {return _orb->object_to_string(theObject); } + virtual CORBA::Object_ptr ConvertIORToObject(const char* theIOR) { return _orb->string_to_object(theIOR); }; void ping(){}; + + virtual long GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal); + + static PortableServer::POA_ptr GetPOA(const SALOMEDS::Study_ptr theStudy); }; #endif diff --git a/src/SALOMEDS/SALOMEDS_Study_i.cxx b/src/SALOMEDS/SALOMEDS_Study_i.cxx index 1f8e0aa75..32e0cfc9b 100644 --- a/src/SALOMEDS/SALOMEDS_Study_i.cxx +++ b/src/SALOMEDS/SALOMEDS_Study_i.cxx @@ -1,142 +1,55 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_Study_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include +#include "utilities.h" #include "SALOMEDS_Study_i.hxx" - -#include "SALOMEDS_StudyManager_i.hxx" -#include "SALOMEDS_Callback_i.hxx" - -#include "SALOMEDS_SComponent_i.hxx" -#include "SALOMEDS_SObject_i.hxx" - -#include "SALOMEDS_StudyBuilder_i.hxx" +#include "SALOMEDS_UseCaseIterator_i.hxx" +#include "SALOMEDS_GenericAttribute_i.hxx" +#include "SALOMEDS_AttributeStudyProperties_i.hxx" #include "SALOMEDS_ChildIterator_i.hxx" +#include "SALOMEDS_Driver_i.hxx" +#include "SALOMEDS.hxx" -#include "SALOMEDS_UseCaseBuilder_i.hxx" -#include "SALOMEDS_SComponentIterator_i.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_UseCaseBuilder.hxx" +#include "SALOMEDSImpl_AttributeStudyProperties.hxx" +#include "SALOMEDSImpl_ChildIterator.hxx" -#include "SALOME_GenericObj_i.hh" -#include "SALOMEDS_LocalIDAttribute.hxx" -#include "SALOMEDS_PersRefAttribute.hxx" +#include +#include +#include +#include +#include -#include "SALOMEDS_StudyPropertiesAttribute.hxx" -#include "SALOMEDS_DataMapIteratorOfDataMapStringLabel.hxx" +#include +#include -#include "utilities.h" +#ifdef WIN32 +#include +#else +#include +#include +#endif -#define DIRECTORYID 16661 -#define FILEID "FILE: " -#define FILELOCALID 26662 +#include "OpUtil.hxx" using namespace std; -bool operator<(const TDF_Label& theLeft, const TDF_Label& theRight) -{ - TColStd_ListOfInteger aTagLeftList; - TDF_Tool::TagList(theLeft,aTagLeftList); - TColStd_ListIteratorOfListOfInteger anLeftIter(aTagLeftList); - - TColStd_ListOfInteger aTagRightList; - TDF_Tool::TagList(theRight,aTagRightList); - TColStd_ListIteratorOfListOfInteger anRightIter(aTagRightList); - - for(;;){ - Standard_Boolean aLeftMore = anLeftIter.More(); - Standard_Boolean aRightMore = anRightIter.More(); - - if(!aLeftMore && !aRightMore) - return Standard_False; - - if(!aLeftMore) - return Standard_True; - - if(!aRightMore) - return Standard_False; - - Standard_Integer aLeftTag = anLeftIter.Value(); - anLeftIter.Next(); - - Standard_Integer aRightTag = anRightIter.Value(); - anRightIter.Next(); - - if(aLeftTag == aRightTag) - continue; - - return aLeftTag < aRightTag; - } - - return Standard_False; -} - - //============================================================================ /*! Function : SALOMEDS_Study_i * Purpose : SALOMEDS_Study_i constructor */ //============================================================================ -SALOMEDS_Study_i::SALOMEDS_Study_i(SALOMEDS_StudyManager_i* theStudyManager, - const Handle(TDocStd_Document)& theDoc, - const char* theStudyName): - _StudyManager(theStudyManager), - _doc(theDoc), - _isSaved(false), - _URL(NULL), - _StudyId(-1), - _autoFill(true), - myNbUndos(0) +SALOMEDS_Study_i::SALOMEDS_Study_i(const Handle(SALOMEDSImpl_Study) theImpl, + CORBA::ORB_ptr orb) { - _UseCaseBuilder = new SALOMEDS_UseCaseBuilder_i(this,_doc); - SALOMEDS::UseCaseBuilder_var aUseCaseBuilder = _UseCaseBuilder->_this(); - - _Builder = new SALOMEDS_StudyBuilder_i(this,_doc); - SALOMEDS::StudyBuilder_var aStudyBuilder = _Builder->_this(); - - SALOMEDS_Callback_i* aCallBackServant = new SALOMEDS_Callback_i(aUseCaseBuilder); - _callbackOnAdd = aCallBackServant->_this(); - _callbackOnRemove = _callbackOnAdd; + _orb = CORBA::ORB::_duplicate(orb); + _impl = theImpl; - _name = new char[strlen(theStudyName) +1]; - strcpy(_name,theStudyName); - myNbPostponed.Append(0); + _builder = new SALOMEDS_StudyBuilder_i(_impl->NewBuilder(), _orb); } //============================================================================ @@ -146,100 +59,8 @@ SALOMEDS_Study_i::SALOMEDS_Study_i(SALOMEDS_StudyManager_i* theStudyManager, //============================================================================ SALOMEDS_Study_i::~SALOMEDS_Study_i() { - delete [] _name ; - delete [] _URL ; } -//============================================================================ -CORBA::ORB_var SALOMEDS_Study_i::GetORB() const -{ - return _StudyManager->GetORB(); -} - -//============================================================================ -PortableServer::POA_var SALOMEDS_Study_i::GetPOA() const -{ - return _StudyManager->GetPOA(); -} - - -SALOMEDS_SObject_i* -SALOMEDS_Study_i::DownCast(SALOMEDS::SObject_ptr theSObject) const -{ - if(!CORBA::is_nil(theSObject)){ - PortableServer::POA_var aPOA = GetPOA(); - PortableServer::ServantBase_var aServant = SALOMEDS::GetServant(theSObject,aPOA); - if(aServant.in()) - return dynamic_cast(aServant.in()); - } - return NULL; -} - -//============================================================================ -/*! Function : SetOnAddSObject - * Purpose : - */ -//============================================================================ -SALOMEDS::Callback_ptr SALOMEDS_Study_i::SetOnAddSObject(SALOMEDS::Callback_ptr theCallback) -{ - SALOMEDS::Callback_var aRet = _callbackOnAdd; - _callbackOnAdd = SALOMEDS::Callback::_duplicate(theCallback); - return aRet._retn(); -} - -//============================================================================ -/*! Function : SetOnNewSObject - * Purpose : - */ -//============================================================================ -SALOMEDS::Callback_ptr SALOMEDS_Study_i::SetOnRemoveSObject(SALOMEDS::Callback_ptr theCallback) -{ - SALOMEDS::Callback_var aRet = _callbackOnRemove; - _callbackOnAdd = SALOMEDS::Callback::_duplicate(theCallback); - return aRet._retn(); -} - -//============================================================================ -void SALOMEDS_Study_i::OnAddSObject(SALOMEDS::SObject_ptr theObject) -{ - if(!CORBA::is_nil(_callbackOnAdd.in())) - _callbackOnAdd->OnAddSObject(theObject); -} - -//============================================================================ -void SALOMEDS_Study_i::OnRemoveSObject(SALOMEDS::SObject_ptr theObject) -{ - if(!CORBA::is_nil(_callbackOnRemove.in())) - _callbackOnRemove->OnRemoveSObject(theObject); -} - -//============================================================================ -void SALOMEDS_Study_i::CheckLocked() -{ - if(_doc->HasOpenCommand()) - return; - - Handle(SALOMEDS_StudyPropertiesAttribute) anAttr; - if(_doc->Main().FindAttribute(SALOMEDS_StudyPropertiesAttribute::GetID(),anAttr)) - if(anAttr->IsLocked()) - throw SALOMEDS::StudyBuilder::LockProtection(); -} - - -//============================================================================ -char* SALOMEDS_Study_i::ConvertObjectToIOR(CORBA::Object_ptr theObject) -{ - return GetORB()->object_to_string(theObject); -} - - -//============================================================================ -CORBA::Object_ptr SALOMEDS_Study_i::ConvertIORToObject(const char* theIOR) -{ - return GetORB()->string_to_object(theIOR); -} - - //============================================================================ /*! Function : GetPersistentReference * Purpose : Get persistent reference of study (idem URL()) @@ -247,7 +68,8 @@ CORBA::Object_ptr SALOMEDS_Study_i::ConvertIORToObject(const char* theIOR) //============================================================================ char* SALOMEDS_Study_i::GetPersistentReference() { - return URL(); + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->GetPersistentReference().ToCString()); } //============================================================================ /*! Function : GetTransientReference @@ -256,18 +78,8 @@ char* SALOMEDS_Study_i::GetPersistentReference() //============================================================================ char* SALOMEDS_Study_i::GetTransientReference() { - CORBA::String_var IOR; - - Handle(SALOMEDS_IORAttribute) Att; - TDF_Label _lab = _doc->GetData()->Root(); - if (!_lab.FindAttribute(SALOMEDS_IORAttribute::GetID(),Att)){ - - TCollection_AsciiString ch(Att->Get()); - IOR = CORBA::string_dup(ch.ToCString()); - } - else IOR = CORBA::string_dup(""); // NULL ? - - return CORBA::string_dup(IOR); + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->GetTransientReference().ToCString()); } //============================================================================ @@ -277,8 +89,8 @@ char* SALOMEDS_Study_i::GetTransientReference() //============================================================================ CORBA::Boolean SALOMEDS_Study_i::IsEmpty() { - if (_doc.IsNull()) return true; - return _doc->IsEmpty(); + SALOMEDS::Locker lock; + return _impl->IsEmpty(); } //============================================================================ @@ -286,21 +98,15 @@ CORBA::Boolean SALOMEDS_Study_i::IsEmpty() * Purpose : Find a Component with ComponentDataType = aComponentName */ //============================================================================ -SALOMEDS::SComponent_ptr -SALOMEDS_Study_i::FindComponent(const char* theComponentName) +SALOMEDS::SComponent_ptr SALOMEDS_Study_i::FindComponent (const char* aComponentName) { - bool anIsFound = false; - SALOMEDS::SComponent_var aSComponent; - SALOMEDS_SComponentIterator_i aComponentIter(this,_doc); - for(; aComponentIter.More() && !anIsFound; aComponentIter.Next()){ - SALOMEDS::SComponent_var aSComp = aComponentIter.Value(); - CORBA::String_var aName = aSComp->ComponentDataType(); - if(strcmp(theComponentName,aName.in()) == 0){ - aSComponent = aSComp; - anIsFound = true; - } - } - return aSComponent._retn(); + SALOMEDS::Locker lock; + + Handle(SALOMEDSImpl_SComponent) aCompImpl = _impl->FindComponent(TCollection_AsciiString((char*)aComponentName)); + if(aCompImpl.IsNull()) return SALOMEDS::SComponent::_nil(); + + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aCompImpl, _orb); + return sco._retn(); } //============================================================================ @@ -310,28 +116,13 @@ SALOMEDS_Study_i::FindComponent(const char* theComponentName) //============================================================================ SALOMEDS::SComponent_ptr SALOMEDS_Study_i::FindComponentID(const char* aComponentID) { - // Iterate on each components defined in the study - // Get the component ID and compare with aComponentID - bool _find = false; - char *ID; - SALOMEDS::SComponent_ptr compo; - - SALOMEDS_SComponentIterator_i itcomp(this,_doc); - for (; itcomp.More(); itcomp.Next()) { - SALOMEDS::SComponent_var SC = itcomp.Value(); - ID = SC->GetID(); - if(strcmp(aComponentID,ID)==0) - { - // ComponentID found - _find = true; - compo = SALOMEDS::SComponent::_narrow(SC); - } - } - if(!_find) - { - compo = SALOMEDS::SComponent::_nil(); - } - return compo; + SALOMEDS::Locker lock; + + Handle(SALOMEDSImpl_SComponent) aCompImpl = _impl->FindComponentID(TCollection_AsciiString((char*)aComponentID)); + if(aCompImpl.IsNull()) return SALOMEDS::SComponent::_nil(); + + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aCompImpl, _orb); + return sco._retn(); } //============================================================================ @@ -339,29 +130,22 @@ SALOMEDS::SComponent_ptr SALOMEDS_Study_i::FindComponentID(const char* aComponen * Purpose : Find an Object with SALOMEDS::Name = anObjectName */ //============================================================================ -SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObject(const char* theObjectName) +SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObject(const char* anObjectName) { - // Iterate to all components defined in the study - // After testing the component name, iterate in all objects defined under - // components (function _FindObject) - bool aIsFound = false; - SALOMEDS::SObject_var aRefSO; - SALOMEDS_SComponentIterator_i aComponentIter(this,_doc); - for(; aComponentIter.More() && !aIsFound; aComponentIter.Next()){ - TDF_Label aLab = aComponentIter.GetValue(); - Handle(TDataStd_Name) anAttr; - if(aLab.FindAttribute(TDataStd_Name::GetID(),anAttr)){ - TCollection_AsciiString aString(anAttr->Get()); - if(strcmp(aString.ToCString(),theObjectName) == 0){ - aRefSO = SALOMEDS_SComponent_i::NewRef(this,aLab)._retn(); - aIsFound = true; - } - } - if(!aIsFound) - aRefSO = _FindObject(aLab,theObjectName,aIsFound); - } + SALOMEDS::Locker lock; - return aRefSO._retn(); + Handle(SALOMEDSImpl_SObject) aSO = _impl->FindObject(TCollection_AsciiString((char*)anObjectName)); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); + + if(aSO->DynamicType() == STANDARD_TYPE(SALOMEDSImpl_SComponent)) { + Handle(SALOMEDSImpl_SComponent) aSCO = Handle(SALOMEDSImpl_SComponent)::DownCast(aSO); + SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aSCO, _orb); + return sco._retn(); + } + + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + + return so._retn(); } //============================================================================ @@ -371,15 +155,12 @@ SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObject(const char* theObjectName) //============================================================================ SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectID(const char* anObjectID) { - // Convert aSO->GetID in TDF_Label. - TDF_Label Lab; - TDF_Tool::Label(_doc->GetData(), (char*)anObjectID, Lab); - - if (Lab.IsNull()) - return SALOMEDS::SObject::_nil(); - - return SALOMEDS_SObject_i::NewRef(this,Lab)._retn(); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_SObject) aSO = _impl->FindObjectID(TCollection_AsciiString((char*)anObjectID)); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } //============================================================================ @@ -389,14 +170,13 @@ SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectID(const char* anObjectID) //============================================================================ SALOMEDS::SObject_ptr SALOMEDS_Study_i::CreateObjectID(const char* anObjectID) { - // Convert aSO->GetID in TDF_Label. - TDF_Label Lab; - TDF_Tool::Label(_doc->GetData(), (char*)anObjectID, Lab, Standard_True); - - if (Lab.IsNull()) - return SALOMEDS::SObject::_nil(); + SALOMEDS::Locker lock; - return SALOMEDS_SObject_i::NewRef(this,Lab)._retn(); + Handle(SALOMEDSImpl_SObject) aSO = _impl->CreateObjectID((char*)anObjectID); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); + + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } //============================================================================ @@ -405,95 +185,38 @@ SALOMEDS::SObject_ptr SALOMEDS_Study_i::CreateObjectID(const char* anObjectID) * : with ComponentDataType = aComponentName */ //============================================================================ -SALOMEDS::Study::ListOfSObject* -SALOMEDS_Study_i::FindObjectByName(const char* theObjectName, - const char* theComponentName) +SALOMEDS::Study::ListOfSObject* SALOMEDS_Study_i::FindObjectByName( const char* anObjectName, + const char* aComponentName ) { - SALOMEDS::Study::ListOfSObject_var aListOfSObj = new SALOMEDS::Study::ListOfSObject ; - aListOfSObj->length(0); - - SALOMEDS::SComponent_ptr aSComponent = FindComponent(theComponentName) ; - if(aSComponent->_is_nil()){ - MESSAGE ("In FindObjectByName() : Component named " << theComponentName << " not found "); - return aListOfSObj._retn(); - } + SALOMEDS::Locker lock; - // Iterate on each object and subobject of the component - // If objectName is found add it to the list of SObjects - TDF_Label aLabel; - CORBA::String_var anEntry = aSComponent->GetID(); - TDF_Tool::Label(_doc->GetData(),const_cast(anEntry.in()),aLabel); - - int aLength = 0 ; - SALOMEDS::SObject_var aRefSO; - TDF_ChildIterator aChildIter(aLabel,true); - for(; aChildIter.More(); aChildIter.Next()){ - TDF_Label aLab = aChildIter.Value(); - Handle(TDataStd_Name) anAttr; - if(aLab.FindAttribute(TDataStd_Name::GetID(),anAttr)){ - TCollection_AsciiString aString(anAttr->Get()); - if(strcmp(aString.ToCString(),theObjectName) == 0){ - aRefSO = SALOMEDS_SObject_i::NewRef(this,aLab)._retn(); - /* add to list */ - aLength++ ; - aListOfSObj->length(aLength); - aListOfSObj[aLength-1] = aRefSO; - } - } + Handle(TColStd_HSequenceOfTransient) aSeq = _impl->FindObjectByName(TCollection_AsciiString((char*)anObjectName), + TCollection_AsciiString((char*)aComponentName)); + int aLength = aSeq->Length(); + SALOMEDS::Study::ListOfSObject_var listSO = new SALOMEDS::Study::ListOfSObject ; + listSO->length(aLength); + for(int i = 1; i<=aLength; i++) { + Handle(SALOMEDSImpl_SObject) aSO = Handle(SALOMEDSImpl_SObject)::DownCast(aSeq->Value(i)); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + listSO[i-1] = so ; } - - return aListOfSObj._retn() ; + return listSO._retn() ; } - - //============================================================================ /*! Function : FindObjectIOR * Purpose : Find an Object with IOR = anObjectIOR */ //============================================================================ -SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectIOR(const char* theObjectIOR) +SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectIOR(const char* anObjectIOR) { - // firstly searching in the datamap for optimization - char* anIOR = const_cast(theObjectIOR); - if(myIORLabels.IsBound(anIOR)){ - TDF_Label aLabel = myIORLabels.Find(anIOR); - TSObjectHolder aSObjectHolder = SALOMEDS_SObject_i::New(this,aLabel); - SALOMEDS_SObject_i* aSObjectPtr = aSObjectHolder.first; - SALOMEDS::SObject_var aSObject = aSObjectHolder.second; - // 11 oct 2002: forbidden attributes must be checked here - SALOMEDS::GenericAttribute_var anAttr; - if(!aSObjectPtr->FindAttribute(anAttr,"AttributeIOR")){ - myIORLabels.UnBind(anIOR); - }else{ - return aSObject._retn(); - } - } + SALOMEDS::Locker lock; - // Iterate to all components defined in the study - // After testing the component name, iterate in all objects defined under - // components (function _FindObject) - bool aIsFound = false; - SALOMEDS::SObject_var aRefSO; - SALOMEDS_SComponentIterator_i aComponentIter(this,_doc); - for(; aComponentIter.More() && !aIsFound; aComponentIter.Next()){ - TDF_Label aLab = aComponentIter.GetValue(); - Handle(SALOMEDS_IORAttribute) anAttr; - if(aLab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)){ - TCollection_AsciiString aString(anAttr->Get()); - if(strcmp(aString.ToCString(),theObjectIOR) == 0){ - aRefSO = SALOMEDS_SComponent_i::NewRef(this,aLab); - aIsFound = true; - } - } - if(!aIsFound) - aRefSO = _FindObjectIOR(aLab,theObjectIOR,aIsFound); - } - - if(!aRefSO->_is_nil()) - MESSAGE("SALOMEDS_Study_i::FindObjectIOR: found label with old methods"); + Handle(SALOMEDSImpl_SObject) aSO = _impl->FindObjectIOR(TCollection_AsciiString((char*)anObjectIOR)); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); - return aRefSO._retn(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } //============================================================================ @@ -503,57 +226,13 @@ SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectIOR(const char* theObjectIOR) //============================================================================ SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectByPath(const char* thePath) { - TCollection_AsciiString aPath(CORBA::string_dup(thePath)), aToken; - SALOMEDS::SObject_var aSO = SALOMEDS::SObject::_nil(); - int i = 1, aLength = aPath.Length(); - bool isRelative = false; - - if(aLength == 0) { //Empty path - return the current context - return SALOMEDS_SObject_i::NewRef(this,_current)._retn(); - } - - if(aPath.Value(1) != '/') //Relative path - isRelative = true; - - TDF_ChildIterator anIterator; - TDF_Label aLabel; - Handle(TDataStd_Name) anAttr; - - if(isRelative) { - if(_current.IsNull()) throw SALOMEDS::Study::StudyInvalidContext(); - anIterator.Initialize(_current, Standard_False); - } - else { - if(aPath.Length() == 1 && aPath.Value(1) == '/') { //Root - return SALOMEDS_SObject_i::NewRef(this,_doc->Main())._retn(); - } - anIterator.Initialize(_doc->Main(), Standard_False); - } - - while(i <= aLength) { + SALOMEDS::Locker lock; - aToken = aPath.Token("/", i); - if(aToken.Length() == 0) break; + Handle(SALOMEDSImpl_SObject) aSO = _impl->FindObjectByPath(TCollection_AsciiString((char*)thePath)); + if(aSO.IsNull()) return SALOMEDS::SObject::_nil(); - for ( ; anIterator.More(); anIterator.Next() ) { - aLabel = anIterator.Value(); - if(aLabel.FindAttribute(TDataStd_Name::GetID(), anAttr)) { - if(anAttr->Get() == aToken) { - aToken = aPath.Token("/", i+1); //Check if it was the last part of the path - if(aToken.Length() == 0) { //The searched label is found (no part of the path is left) - return SALOMEDS_SObject_i::NewRef(this,aLabel)._retn(); - } - - anIterator.Initialize(aLabel, Standard_False); - break; - } - } - } - - i++; - } - - return aSO._retn(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } //============================================================================ @@ -563,39 +242,23 @@ SALOMEDS::SObject_ptr SALOMEDS_Study_i::FindObjectByPath(const char* thePath) //============================================================================ char* SALOMEDS_Study_i::GetObjectPath(CORBA::Object_ptr theObject) { + SALOMEDS::Locker lock; + TCollection_AsciiString aPath(""); - if(CORBA::is_nil(theObject)) - return CORBA::string_dup(aPath.ToCString()); - - SALOMEDS::SObject_var anObject = SALOMEDS::SObject::_narrow(theObject); - if(anObject->_is_nil()) { - CORBA::String_var anIOR = GetORB()->object_to_string(theObject); - anObject = FindObjectIOR(anIOR); - if(anObject->_is_nil()) - return CORBA::string_dup(aPath.ToCString()); - } + if(CORBA::is_nil(theObject)) return CORBA::string_dup(aPath.ToCString()); + Handle(SALOMEDSImpl_SObject) aSO; + SALOMEDS::SObject_var aSObj = SALOMEDS::SObject::_narrow(theObject); - SALOMEDS::GenericAttribute_var anAttr; - if(anObject->FindAttribute(anAttr, "AttributeName")) { - SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr); - if(anAttr->_is_nil()) - return CORBA::string_dup(aPath.ToCString()); - TCollection_AsciiString aValue(aName->Value()); - aValue.Prepend("/"); - aValue += aPath; - aPath = aValue; - SALOMEDS::SObject_ptr aFather = anObject->GetFather(); - if(!aFather->_is_nil()) { - TDF_Label aLabel; - Handle(TDataStd_Name) aNameAttrib; - TDF_Tool::Label(_doc->GetData(), aFather->GetID(), aLabel); - if(aLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttrib)) { - aValue = GetObjectPath(aFather); - aPath = aValue + aPath; - } - } + if(!CORBA::is_nil(aSObj)) { + aSO = _impl->FindObjectID(aSObj->GetID()); } - + else { + aSO = _impl->FindObjectIOR(_orb->object_to_string(theObject)); + } + + if(aSO.IsNull()) return CORBA::string_dup(aPath.ToCString()); + + aPath = _impl->GetObjectPath(aSO); return CORBA::string_dup(aPath.ToCString()); } @@ -607,34 +270,11 @@ char* SALOMEDS_Study_i::GetObjectPath(CORBA::Object_ptr theObject) //============================================================================ void SALOMEDS_Study_i::SetContext(const char* thePath) { - if(thePath == NULL || strlen(thePath) == 0) throw SALOMEDS::Study::StudyInvalidDirectory(); - TCollection_AsciiString aPath(CORBA::string_dup(thePath)), aContext(""); - bool isInvalid = false; - SALOMEDS::SObject_var aSO; - - if(aPath.Value(1) != '/') { //Relative path - aContext = TCollection_AsciiString(GetContext()); - aContext += '/'; - aContext += aPath; - } - else - aContext = aPath; - - try { - aSO = FindObjectByPath(aContext.ToCString()); - } - catch( ... ) { - isInvalid = true; - } + SALOMEDS::Locker lock; - if(isInvalid || aSO->_is_nil()) throw SALOMEDS::Study::StudyInvalidContext(); - - TDF_Label aLabel; - TDF_Tool::Label(_doc->GetData(), aSO->GetID(), aLabel); - if(aLabel.IsNull()) throw SALOMEDS::Study::StudyInvalidContext(); - else - _current = aLabel; //Set the current context - + _impl->SetContext(TCollection_AsciiString((char*)thePath)); + if(_impl->IsError() && _impl->GetErrorCode() == "InvalidContext") + throw SALOMEDS::Study::StudyInvalidContext(); } //============================================================================ @@ -644,11 +284,10 @@ void SALOMEDS_Study_i::SetContext(const char* thePath) //============================================================================ char* SALOMEDS_Study_i::GetContext() { - if(_current.IsNull()) - throw SALOMEDS::Study::StudyInvalidContext(); + SALOMEDS::Locker lock; - SALOMEDS::SObject_var aSObject = SALOMEDS_SObject_i::NewRef(this,_current); - return GetObjectPath(aSObject); + if(!_impl->HasCurrentContext()) throw SALOMEDS::Study::StudyInvalidContext(); + return CORBA::string_dup(_impl->GetContext().ToCString()); } //============================================================================ @@ -656,34 +295,17 @@ char* SALOMEDS_Study_i::GetContext() * Purpose : method to get all object names in the given context (or in the current context, if 'theContext' is empty) */ //============================================================================ -SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetObjectNames(const char* theContext) { - TColStd_SequenceOfExtendedString aResultSeq; +SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetObjectNames(const char* theContext) +{ + SALOMEDS::Locker lock; + SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings; - TDF_Label aLabel; - if (strlen(theContext) == 0) { - if(_current.IsNull()) throw SALOMEDS::Study::StudyInvalidContext(); - aLabel = _current; - } else { - TDF_Label aTmp = _current; - SetContext(theContext); - aLabel = _current; - _current = aTmp; - } - TDF_ChildIterator anIter(aLabel, Standard_False); // iterate all subchildren at all sublevels - for(; anIter.More(); anIter.Next()) { - TDF_Label aLabel = anIter.Value(); -// Handle(TDF_Attribute) anAttribute; -// if (aLabel.FindAttribute(SALOMEDS_IORAttribute::GetID(), anAttribute) || -// aLabel.FindAttribute(SALOMEDS_LocalIDAttribute::GetID(), anAttribute)) { - Handle(TDataStd_Name) aName; - if (aLabel.FindAttribute(TDataStd_Name::GetID(), aName)) aResultSeq.Append(aName->Get()); -// } - } - // fill the result table - int anIndex, aLength = aResultSeq.Length(); + if (strlen(theContext) == 0 && !_impl->HasCurrentContext()) throw SALOMEDS::Study::StudyInvalidContext(); + Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->GetObjectNames(TCollection_AsciiString((char*)theContext)); + int aLength = aSeq->Length(); aResult->length(aLength); - for(anIndex = 0; anIndex < aLength; anIndex++) { - aResult[anIndex] = CORBA::string_dup(TCollection_AsciiString(aResultSeq.Value(anIndex + 1)).ToCString()); + for(int anIndex = 1; anIndex <= aLength; anIndex++) { + aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString()); } return aResult._retn(); } @@ -693,37 +315,17 @@ SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetObjectNames(const char* theContext * Purpose : method to get all directory names in the given context (or in the current context, if 'theContext' is empty) */ //============================================================================ -SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetDirectoryNames(const char* theContext) { - TColStd_SequenceOfExtendedString aResultSeq; +SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetDirectoryNames(const char* theContext) +{ + SALOMEDS::Locker lock; + SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings; - TDF_Label aLabel; - if (strlen(theContext) == 0) { - if(_current.IsNull()) throw SALOMEDS::Study::StudyInvalidContext(); - aLabel = _current; - } else { - TDF_Label aTmp = _current; - SetContext(theContext); - aLabel = _current; - _current = aTmp; - } - TDF_ChildIterator anIter(aLabel, Standard_False); // iterate first-level children at all sublevels - for(; anIter.More(); anIter.Next()) { - TDF_Label aLabel = anIter.Value(); - Handle(SALOMEDS_LocalIDAttribute) anID; - if (aLabel.FindAttribute(SALOMEDS_LocalIDAttribute::GetID(), anID)) { - if (anID->Get() == DIRECTORYID) { - Handle(TDataStd_Name) aName; - if (aLabel.FindAttribute(TDataStd_Name::GetID(), aName)) { - aResultSeq.Append(aName->Get()); - } - } - } - } - // fill the result table - int anIndex, aLength = aResultSeq.Length(); + if (strlen(theContext) == 0 && !_impl->HasCurrentContext()) throw SALOMEDS::Study::StudyInvalidContext(); + Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->GetDirectoryNames(TCollection_AsciiString((char*)theContext)); + int aLength = aSeq->Length(); aResult->length(aLength); - for(anIndex = 0; anIndex < aLength; anIndex++) { - aResult[anIndex] = CORBA::string_dup(TCollection_AsciiString(aResultSeq.Value(anIndex + 1)).ToCString()); + for(int anIndex = 1; anIndex <= aLength; anIndex++) { + aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString()); } return aResult._retn(); } @@ -733,40 +335,17 @@ SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetDirectoryNames(const char* theCont * Purpose : method to get all file names in the given context (or in the current context, if 'theContext' is empty) */ //============================================================================ -SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetFileNames(const char* theContext) { - TColStd_SequenceOfExtendedString aResultSeq; +SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetFileNames(const char* theContext) +{ + SALOMEDS::Locker lock; + SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings; - TDF_Label aLabel; - if (strlen(theContext) == 0) { - if(_current.IsNull()) throw SALOMEDS::Study::StudyInvalidContext(); - aLabel = _current; - } else { - TDF_Label aTmp = _current; - SetContext(theContext); - aLabel = _current; - _current = aTmp; - } - TDF_ChildIterator anIter(aLabel, Standard_False); // iterate all subchildren at all sublevels - for(; anIter.More(); anIter.Next()) { - TDF_Label aLabel = anIter.Value(); - Handle(SALOMEDS_LocalIDAttribute) anID; - if (aLabel.FindAttribute(SALOMEDS_LocalIDAttribute::GetID(), anID)) { - if (anID->Get() == FILELOCALID) { - Handle(SALOMEDS_PersRefAttribute) aName; - if(aLabel.FindAttribute(SALOMEDS_PersRefAttribute::GetID(), aName)) { - TCollection_ExtendedString aFileName = aName->Get(); - if(aFileName.Length() > 0) - aResultSeq.Append(aFileName.Split(strlen(FILEID))); - } - } - } -// } - } - // fill the result table - int anIndex, aLength = aResultSeq.Length(); + if (strlen(theContext) == 0 && !_impl->HasCurrentContext()) throw SALOMEDS::Study::StudyInvalidContext(); + Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->GetFileNames(TCollection_AsciiString((char*)theContext)); + int aLength = aSeq->Length(); aResult->length(aLength); - for(anIndex = 0; anIndex < aLength; anIndex++) { - aResult[anIndex] = CORBA::string_dup(TCollection_AsciiString(aResultSeq.Value(anIndex + 1)).ToCString()); + for(int anIndex = 1; anIndex <= aLength; anIndex++) { + aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString()); } return aResult._retn(); } @@ -776,20 +355,17 @@ SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetFileNames(const char* theContext) * Purpose : method to get all components names */ //============================================================================ -SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetComponentNames(const char* theContext) { - TColStd_SequenceOfExtendedString aResultSeq; +SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetComponentNames(const char* theContext) +{ + SALOMEDS::Locker lock; + SALOMEDS::ListOfStrings_var aResult = new SALOMEDS::ListOfStrings; - TDF_ChildIterator anIter(_doc->Main(), Standard_False); // iterate all subchildren at first level - for(; anIter.More(); anIter.Next()) { - TDF_Label aLabel = anIter.Value(); - Handle(TDataStd_Name) aName; - if (aLabel.FindAttribute(TDataStd_Name::GetID(), aName)) aResultSeq.Append(aName->Get()); - } - // fill the result table - int anIndex, aLength = aResultSeq.Length(); + if (strlen(theContext) == 0 && !_impl->HasCurrentContext()) throw SALOMEDS::Study::StudyInvalidContext(); + Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->GetComponentNames(TCollection_AsciiString((char*)theContext)); + int aLength = aSeq->Length(); aResult->length(aLength); - for(anIndex = 0; anIndex < aLength; anIndex++) { - aResult[anIndex] = CORBA::string_dup(TCollection_AsciiString(aResultSeq.Value(anIndex + 1)).ToCString()); + for(int anIndex = 1; anIndex <= aLength; anIndex++) { + aResult[anIndex-1] = CORBA::string_dup(TCollection_AsciiString(aSeq->Value(anIndex)).ToCString()); } return aResult._retn(); } @@ -799,66 +375,44 @@ SALOMEDS::ListOfStrings* SALOMEDS_Study_i::GetComponentNames(const char* theCont * Purpose : Create a ChildIterator from an SObject */ //============================================================================ -SALOMEDS::ChildIterator_ptr -SALOMEDS_Study_i::NewChildIterator(SALOMEDS::SObject_ptr theSObject) +SALOMEDS::ChildIterator_ptr SALOMEDS_Study_i::NewChildIterator(SALOMEDS::SObject_ptr theSO) { - SALOMEDS_ChildIterator_i* aServant = - new SALOMEDS_ChildIterator_i(GetChildIterator(theSObject)); + SALOMEDS::Locker lock; - return aServant->_this(); -} + Handle(SALOMEDSImpl_SObject) aSO = _impl->GetSObject(theSO->GetID()); + Handle(SALOMEDSImpl_ChildIterator) anItr = new SALOMEDSImpl_ChildIterator(aSO); -SALOMEDS_ChildIterator_i -SALOMEDS_Study_i::GetChildIterator(SALOMEDS::SObject_ptr theSObject) -{ - TDF_Label aLab; - TDF_Tool::Label(_doc->GetData(),theSObject->GetID(),aLab); - return SALOMEDS_ChildIterator_i(this,aLab); + //Create iterator + SALOMEDS_ChildIterator_i* it_servant = new SALOMEDS_ChildIterator_i(anItr, _orb); + SALOMEDS::ChildIterator_var it = SALOMEDS::ChildIterator::_narrow(it_servant->_this()); + + return it; } + //============================================================================ /*! Function : NewComponentIterator * Purpose : Create a SComponentIterator */ //============================================================================ -SALOMEDS::SComponentIterator_ptr -SALOMEDS_Study_i::NewComponentIterator() +SALOMEDS::SComponentIterator_ptr SALOMEDS_Study_i::NewComponentIterator() { - SALOMEDS_SComponentIterator_i* aServant = - new SALOMEDS_SComponentIterator_i(GetComponentIterator()); - - return aServant->_this(); + SALOMEDS::Locker lock; + SALOMEDS_SComponentIterator_i* _it = new SALOMEDS_SComponentIterator_i(_impl->NewComponentIterator(), _orb); + _it->Init(); + return _it->_this(); } -SALOMEDS_SComponentIterator_i -SALOMEDS_Study_i::GetComponentIterator() -{ - return SALOMEDS_SComponentIterator_i(this,_doc); -} - -//============================================================================ -/*! Function : GetUseCaseBuilder - * Purpose : Returns a UseCase builder - */ -//============================================================================ -SALOMEDS::UseCaseBuilder_ptr SALOMEDS_Study_i::GetUseCaseBuilder() -{ - return _UseCaseBuilder->_this(); -} //============================================================================ /*! Function : NewBuilder * Purpose : Create a StudyBuilder */ //============================================================================ -SALOMEDS_StudyBuilder_i* SALOMEDS_Study_i::GetBuilder() -{ - return _Builder; -} - SALOMEDS::StudyBuilder_ptr SALOMEDS_Study_i::NewBuilder() { - return GetBuilder()->_this(); + SALOMEDS::Locker lock; + return _builder->_this(); } //============================================================================ @@ -868,7 +422,8 @@ SALOMEDS::StudyBuilder_ptr SALOMEDS_Study_i::NewBuilder() //============================================================================ char* SALOMEDS_Study_i::Name() { - return CORBA::string_dup(_name); + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->Name().ToCString()); } //============================================================================ @@ -878,8 +433,8 @@ char* SALOMEDS_Study_i::Name() //============================================================================ void SALOMEDS_Study_i::Name(const char* name) { - _name = new char[strlen(name) +1]; - strcpy(_name,name); + SALOMEDS::Locker lock; + _impl->Name(TCollection_AsciiString((char*)name)); } //============================================================================ @@ -889,7 +444,8 @@ void SALOMEDS_Study_i::Name(const char* name) //============================================================================ CORBA::Boolean SALOMEDS_Study_i::IsSaved() { - return _isSaved; + SALOMEDS::Locker lock; + return _impl->IsSaved(); } //============================================================================ @@ -899,7 +455,8 @@ CORBA::Boolean SALOMEDS_Study_i::IsSaved() //============================================================================ void SALOMEDS_Study_i::IsSaved(CORBA::Boolean save) { - _isSaved = save; + SALOMEDS::Locker lock; + _impl->IsSaved(save); } //============================================================================ @@ -909,11 +466,8 @@ void SALOMEDS_Study_i::IsSaved(CORBA::Boolean save) //============================================================================ CORBA::Boolean SALOMEDS_Study_i::IsModified() { - // True if is modified and not saved - if (_doc->IsModified()) - if (!_isSaved) return true; - else return false; - else return false; + SALOMEDS::Locker lock; + return _impl->IsModified(); } //============================================================================ @@ -923,11 +477,8 @@ CORBA::Boolean SALOMEDS_Study_i::IsModified() //============================================================================ char* SALOMEDS_Study_i::URL() { - if(!_URL) { - _URL = new char[1]; - _URL[0] = (char)0; - } - return CORBA::string_dup(_URL); + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->URL().ToCString()); } //============================================================================ @@ -937,107 +488,56 @@ char* SALOMEDS_Study_i::URL() //============================================================================ void SALOMEDS_Study_i::URL(const char* url) { - if (_URL) delete [] _URL; - _URL = new char[strlen(url) +1]; - strcpy(_URL,url); - SCRUTE(_URL); - - char *aName = _URL; - char *adr = strtok(aName, "/"); - while (adr) - { - aName = adr; - adr = strtok(NULL, "/"); - } - strcpy(_URL,url); - Name(aName); + SALOMEDS::Locker lock; + _impl->URL(TCollection_AsciiString((char*)url)); } -//============================================================================ -/*! Function : _FindObject - * Purpose : Find an Object with SALOMEDS::Name = anObjectName - */ -//============================================================================ -SALOMEDS::SObject_ptr -SALOMEDS_Study_i::_FindObject(TDF_Label theLabel, - const char* theObjectName, - bool& theIsFound) +CORBA::Short SALOMEDS_Study_i::StudyId() { - theIsFound = false; - // Iterate on each objects and subobjects of the component - // If objectName find, stop the loop and get the object reference - SALOMEDS::SObject_var aRefSO; - TDF_ChildIterator aChildIter(theLabel,true); - for(; aChildIter.More() && !theIsFound; aChildIter.Next()){ - TDF_Label aLab = aChildIter.Value(); - Handle(TDataStd_Name) anAttr; - if(aLab.FindAttribute(TDataStd_Name::GetID(),anAttr)){ - TCollection_AsciiString aString(anAttr->Get()); - if(strcmp(aString.ToCString(),theObjectName) == 0){ - aRefSO = SALOMEDS_SObject_i::NewRef(this,aLab); - theIsFound = true; - } - } - } - return aRefSO._retn(); + SALOMEDS::Locker lock; + return _impl->StudyId(); } -//============================================================================ -/*! Function : _FindObject - * Purpose : Find an Object with SALOMEDS::IOR = anObjectIOR - */ -//============================================================================ -SALOMEDS::SObject_ptr -SALOMEDS_Study_i::_FindObjectIOR(TDF_Label theLabel, - const char* theObjectIOR, - bool& theIsFound) -{ - // Iterate on each objects and subobjects of the component - // If objectName find, stop the loop and get the object reference - SALOMEDS::SObject_var aRefSO; - TDF_ChildIterator aChildIter(theLabel,true); - for(; aChildIter.More() && !theIsFound; aChildIter.Next()){ - TDF_Label aLab = aChildIter.Value(); - Handle(SALOMEDS_IORAttribute) anAttr; - if(aLab.FindAttribute(SALOMEDS_IORAttribute::GetID(),anAttr)){ - TCollection_AsciiString aString(anAttr->Get()); - if(strcmp(aString.ToCString(),theObjectIOR) == 0){ - aRefSO = SALOMEDS_SObject_i::NewRef(this,aLab); - theIsFound = true; - } - } - } - return aRefSO._retn(); +void SALOMEDS_Study_i::StudyId(CORBA::Short id) +{ + SALOMEDS::Locker lock; + _impl->StudyId(id); } -CORBA::Short SALOMEDS_Study_i::StudyId() +void SALOMEDS_Study_i::UpdateIORLabelMap(const char* anIOR,const char* anEntry) { - return _StudyId; + SALOMEDS::Locker lock; + _impl->UpdateIORLabelMap(TCollection_AsciiString((char*)anIOR), TCollection_AsciiString((char*)anEntry)); } -void SALOMEDS_Study_i::StudyId(CORBA::Short id) +SALOMEDS::Study_ptr SALOMEDS_Study_i::GetStudy(const TDF_Label theLabel, CORBA::ORB_ptr orb) { - _StudyId = id; -} + SALOMEDS::Locker lock; -void SALOMEDS_Study_i::UpdateIORLabelMap(const char* anIOR,const char* anEntry) { - TDF_Label aLabel; - CORBA::String_var anEn = CORBA::string_dup(anEntry); - CORBA::String_var IOR = CORBA::string_dup(anIOR); - TDF_Tool::Label(_doc->GetData(),anEn,aLabel, Standard_True); - if (myIORLabels.IsBound(TCollection_ExtendedString(IOR))) myIORLabels.UnBind(TCollection_ExtendedString(IOR)); - myIORLabels.Bind(TCollection_ExtendedString(IOR), aLabel); + Handle(SALOMEDSImpl_AttributeIOR) Att; + if (theLabel.Root().FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(),Att)){ + char* IOR = CORBA::string_dup(TCollection_AsciiString(Att->Value()).ToCString()); + CORBA::Object_var obj = orb->string_to_object(IOR); + SALOMEDS::Study_ptr aStudy = SALOMEDS::Study::_narrow(obj) ; + ASSERT(!CORBA::is_nil(aStudy)); + return SALOMEDS::Study::_duplicate(aStudy); + } else { + MESSAGE("GetStudy: Problem to get study"); + } + return SALOMEDS::Study::_nil(); } -void SALOMEDS_Study_i::IORUpdated(const Handle(SALOMEDS_IORAttribute) theAttribute) { - TCollection_AsciiString aString; - TDF_Tool::Entry(theAttribute->Label(),aString); - TCollection_AsciiString aValue(theAttribute->Get()); - UpdateIORLabelMap(aValue.ToCString(),aString.ToCString()); +void SALOMEDS_Study_i::IORUpdated(const Handle(SALOMEDSImpl_AttributeIOR) theAttribute) +{ + SALOMEDS::Locker lock; + SALOMEDSImpl_Study::IORUpdated(theAttribute); } -SALOMEDS::Study::ListOfSObject* SALOMEDS_Study_i::FindDependances(SALOMEDS::SObject_ptr anObject) { +SALOMEDS::Study::ListOfSObject* SALOMEDS_Study_i::FindDependances(SALOMEDS::SObject_ptr anObject) +{ + SALOMEDS::Locker lock; + SALOMEDS::GenericAttribute_ptr aTarget; if (anObject->FindAttribute(aTarget,"AttributeTarget")) { return SALOMEDS::AttributeTarget::_narrow(aTarget)->Get(); @@ -1048,49 +548,51 @@ SALOMEDS::Study::ListOfSObject* SALOMEDS_Study_i::FindDependances(SALOMEDS::SObj } -SALOMEDS::AttributeStudyProperties_ptr SALOMEDS_Study_i::GetProperties(){ - SALOMEDS::SObject_var aSObject = FindObjectID("0:1"); - - SALOMEDS::GenericAttribute_var anAttr = - GetBuilder()->FindOrCreateAttribute(aSObject,"AttributeStudyProperties"); - - return SALOMEDS::AttributeStudyProperties::_narrow(anAttr); +SALOMEDS::AttributeStudyProperties_ptr SALOMEDS_Study_i::GetProperties() +{ + SALOMEDS::Locker lock; + + Handle(SALOMEDSImpl_AttributeStudyProperties) anAttr = _impl->GetProperties(); + SALOMEDS_AttributeStudyProperties_i* SP = new SALOMEDS_AttributeStudyProperties_i(anAttr, _orb); + return SP->AttributeStudyProperties::_this(); } -char* SALOMEDS_Study_i::GetLastModificationDate() { - SALOMEDS::AttributeStudyProperties_var aProp = GetProperties(); - SALOMEDS::StringSeq_var aNames; - SALOMEDS::LongSeq_var aMinutes, aHours, aDays, aMonths, aYears; - aProp->GetModificationsList(aNames , aMinutes ,aHours, aDays, aMonths, aYears, true); - int aLastIndex = aNames->length() - 1; - char aResult[20]; - sprintf(aResult, "%2.2d/%2.2d/%4.4d %2.2d:%2.2d", (int)(aDays[aLastIndex]),(int)(aMonths[aLastIndex]), - (int)(aYears[aLastIndex]), (int)(aHours[aLastIndex]), (int)(aMinutes[aLastIndex])); - CORBA::String_var aResStr = CORBA::string_dup(aResult); - return aResStr._retn(); +char* SALOMEDS_Study_i::GetLastModificationDate() +{ + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->GetLastModificationDate().ToCString()); } -SALOMEDS::ListOfDates* SALOMEDS_Study_i::GetModificationsDate() { - SALOMEDS::AttributeStudyProperties_var aProp = GetProperties(); - SALOMEDS::StringSeq_var aNames; - SALOMEDS::LongSeq_var aMinutes, aHours, aDays, aMonths, aYears; - aProp->GetModificationsList(aNames , aMinutes ,aHours, aDays, aMonths, aYears, false); - - int anIndex, aLength = aNames->length(); +SALOMEDS::ListOfDates* SALOMEDS_Study_i::GetModificationsDate() +{ + SALOMEDS::Locker lock; + + Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->GetModificationsDate(); + int aLength = aSeq->Length(); SALOMEDS::ListOfDates_var aDates = new SALOMEDS::ListOfDates; aDates->length(aLength); - for(anIndex = 0; anIndex < aLength; anIndex++) { - char aDate[20]; - sprintf(aDate, "%2.2d/%2.2d/%4.4d %2.2d:%2.2d", (int)(aDays[anIndex]), (int)(aMonths[anIndex]), - (int)(aYears[anIndex]), (int)(aHours[anIndex]), (int)(aMinutes[anIndex])); - aDates[anIndex] = CORBA::string_dup(aDate); + for(int anIndex = 1; anIndex <= aLength; anIndex++) { + aDates[anIndex-1] = CORBA::string_dup(aSeq->Value(anIndex).ToCString()); } return aDates._retn(); } +//============================================================================ +/*! Function : GetUseCaseBuilder + * Purpose : Returns a UseCase builder + */ +//============================================================================ +SALOMEDS::UseCaseBuilder_ptr SALOMEDS_Study_i::GetUseCaseBuilder() +{ + SALOMEDS::Locker lock; + SALOMEDS_UseCaseBuilder_i* UCBuilder = new SALOMEDS_UseCaseBuilder_i(_impl->GetUseCaseBuilder(), _orb); + return UCBuilder->_this(); +} + + //============================================================================ /*! Function : Close * Purpose : @@ -1098,11 +600,14 @@ SALOMEDS::ListOfDates* SALOMEDS_Study_i::GetModificationsDate() { //============================================================================ void SALOMEDS_Study_i::Close() { - SALOMEDS_SComponentIterator_i itcomponent(this,_doc); + SALOMEDS::Locker lock; + + RemovePostponed(-1); + + SALOMEDS::SComponentIterator_var itcomponent = NewComponentIterator(); - const CORBA::ORB_var& anORB = GetORB(); - for (; itcomponent.More(); itcomponent.Next()) { - SALOMEDS::SComponent_var sco = itcomponent.Value(); + for (; itcomponent->More(); itcomponent->Next()) { + SALOMEDS::SComponent_var sco = itcomponent->Value(); MESSAGE ( "Look for an engine for data type :"<< sco->ComponentDataType()); // if there is an associated Engine call its method for closing @@ -1110,24 +615,19 @@ void SALOMEDS_Study_i::Close() if (sco->ComponentIOR(IOREngine)) { // we have found the associated engine to write the data MESSAGE ( "We have found an engine for data type :"<< sco->ComponentDataType()); - CORBA::Object_var obj = anORB->string_to_object(IOREngine); + CORBA::Object_var obj = _orb->string_to_object(IOREngine); if (!CORBA::is_nil(obj)) { SALOMEDS::Driver_var anEngine = SALOMEDS::Driver::_narrow(obj) ; - - if (!anEngine->_is_nil()) + + if (!anEngine->_is_nil()) { + SALOMEDS::unlock(); anEngine->Close(sco); + SALOMEDS::lock(); + } } } } - - Handle(TDocStd_Application) anApp = Handle(TDocStd_Application)::DownCast(_doc->Application()); -// Handle(TDocStd_Owner) anOwner; -// if (_doc->Main().Root().FindAttribute(TDocStd_Owner::GetID(), anOwner)) { -// Handle(TDocStd_Document) anEmptyDoc; -// anOwner->SetDocument(anEmptyDoc); -// } - if(!anApp.IsNull()) anApp->Close(_doc); - _doc.Nullify(); + _impl->Close(); } //============================================================================ @@ -1135,36 +635,26 @@ void SALOMEDS_Study_i::Close() * Purpose : */ //============================================================================ -void SALOMEDS_Study_i::AddPostponed(const char* theIOR) { - if (!GetBuilder()->HasOpenCommand()) return; - try { - CORBA::Object_var obj = GetORB()->string_to_object(theIOR); - if (!CORBA::is_nil(obj)) { - SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj) ; - if (!CORBA::is_nil(aGeneric)) { - TCollection_AsciiString anIOR(const_cast(theIOR)); - anIOR.Prepend("d"); - myPostponedIORs.Append(anIOR); // add prefix: deleted - myNbPostponed.SetValue(myNbPostponed.Length(), myNbPostponed.Last() + 1); - } - } - } catch(...) {} +void SALOMEDS_Study_i::AddPostponed(const char* theIOR) +{ + SALOMEDS::Locker lock; + + CORBA::Object_var obj = _orb->string_to_object(theIOR); + if (!CORBA::is_nil(obj)) { + SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj) ; + if (!CORBA::is_nil(aGeneric)) _impl->AddPostponed((char*)theIOR); + } } -void SALOMEDS_Study_i::AddCreatedPostponed(const char* theIOR) { - if (!GetBuilder()->HasOpenCommand()) return; - try { - CORBA::Object_var obj = GetORB()->string_to_object(theIOR); - if (!CORBA::is_nil(obj)) { - SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj) ; - if (!CORBA::is_nil(aGeneric)) { - TCollection_AsciiString anIOR(const_cast(theIOR)); - anIOR.Prepend("c"); - myPostponedIORs.Append(anIOR); // add prefix: created - myNbPostponed.SetValue(myNbPostponed.Length(), myNbPostponed.Last() + 1); - } - } - } catch(...) {} +void SALOMEDS_Study_i::AddCreatedPostponed(const char* theIOR) +{ + SALOMEDS::Locker lock; + + CORBA::Object_var obj = _orb->string_to_object(theIOR); + if (!CORBA::is_nil(obj)) { + SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj) ; + if (!CORBA::is_nil(aGeneric)) _impl->AddCreatedPostponed((char*)theIOR); + } } //============================================================================ @@ -1172,62 +662,38 @@ void SALOMEDS_Study_i::AddCreatedPostponed(const char* theIOR) { * Purpose : */ //============================================================================ -void SALOMEDS_Study_i::RemovePostponed(const CORBA::Long theUndoLimit) { - int anIndex; - int anOld; - - int aUndoLimit = theUndoLimit; - if (theUndoLimit < 0) aUndoLimit = 0; - - const CORBA::ORB_var& anORB = GetORB(); - if (myNbUndos > 0) { // remove undone - anOld = 0; - for(anIndex = 1; anIndex < myNbPostponed.Length() - myNbUndos; anIndex++) - anOld += myNbPostponed(anIndex); - int aNew = myPostponedIORs.Length() - myNbPostponed.Last(); - - for(anIndex = anOld + 1; anIndex <= aNew; anIndex++) { - TCollection_AsciiString anIOR = myPostponedIORs(anIndex); - if (anIOR.Value(1) == 'c') { - CORBA::Object_var obj = anORB->string_to_object(anIOR.Split(1).ToCString()); - SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj); - if (!CORBA::is_nil(aGeneric)) aGeneric->Destroy(); - } +#ifndef WNT +void SALOMEDS_Study_i::RemovePostponed(const CORBA::Long theUndoLimit) +#else +void SALOMEDS_Study_i::RemovePostponed(CORBA::Long theUndoLimit) +#endif +{ + SALOMEDS::Locker lock; + + Handle(TColStd_HSequenceOfAsciiString) aSeq = _impl->RemovePostponed(theUndoLimit); + int aLegth = aSeq->Length(); + for(int i = 1; i <= aLegth; i++) { + TCollection_AsciiString anIOR = aSeq->Value(i); + //mkr : fix for bug IPAL9408 : check the length of anIOR + // before take value from it + if ( !anIOR.IsEmpty() && anIOR.Value(1) == 'c') { + CORBA::Object_var obj = _orb->string_to_object(anIOR.Split(1).ToCString()); + SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj); + if (!CORBA::is_nil(aGeneric)) aGeneric->Destroy(); } - if (anOld < aNew) myPostponedIORs.Remove(anOld + 1, aNew); - if (myNbPostponed.Length() > 0) myNbPostponed.Remove(myNbPostponed.Length() - myNbUndos, myNbPostponed.Length() - 1); - - myNbUndos = 0; - } - - if (myNbPostponed.Length() > aUndoLimit) { // remove objects, that can not be undone - anOld = 0; - for(anIndex = myNbPostponed.Length() - aUndoLimit; anIndex >= 1; anIndex--) - anOld += myNbPostponed(anIndex); - for(anIndex = 1; anIndex <= anOld; anIndex++) { - TCollection_AsciiString anIOR = myPostponedIORs(anIndex); - if (anIOR.Value(1) == 'd') { - CORBA::Object_var obj = anORB->string_to_object(anIOR.Split(1).ToCString()); - SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj); - if (!CORBA::is_nil(aGeneric)) aGeneric->Destroy(); - } + else if ( !anIOR.IsEmpty() && anIOR.Value(1) == 'd') { + CORBA::Object_var obj = _orb->string_to_object(anIOR.Split(1).ToCString()); + SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj); + if (!CORBA::is_nil(aGeneric)) aGeneric->Destroy(); } - if (anOld > 0) myPostponedIORs.Remove(1, anOld); - myNbPostponed.Remove(1, myNbPostponed.Length() - aUndoLimit); - } - - if (theUndoLimit == -1) { // remove all IORs from the study on the study close - TDF_ChildIDIterator anIter(_doc->GetData()->Root(), SALOMEDS_IORAttribute::GetID(), Standard_True); - for(; anIter.More(); anIter.Next()) { - Handle(SALOMEDS_IORAttribute) anAttr = Handle(SALOMEDS_IORAttribute)::DownCast(anIter.Value()); - CORBA::String_var anIOR = CORBA::string_dup(TCollection_AsciiString(anAttr->Get()).ToCString()); + else { try { - CORBA::Object_var obj = anORB->string_to_object(anIOR); + CORBA::Object_var obj = _orb->string_to_object(anIOR.ToCString()); SALOME::GenericObj_var aGeneric = SALOME::GenericObj::_narrow(obj); if (!CORBA::is_nil(aGeneric)) aGeneric->Destroy(); } catch (...) {} } - } else myNbPostponed.Append(0); + } } //============================================================================ @@ -1235,10 +701,45 @@ void SALOMEDS_Study_i::RemovePostponed(const CORBA::Long theUndoLimit) { * Purpose : */ //============================================================================ -void SALOMEDS_Study_i::UndoPostponed(const CORBA::Long theWay) { - myNbUndos += theWay; - // remove current postponed - if (myNbPostponed.Last() > 0) - myPostponedIORs.Remove(myPostponedIORs.Length() - myNbPostponed.Last() + 1, myPostponedIORs.Length()); - myNbPostponed(myNbPostponed.Length()) = 0; +#ifndef WNT +void SALOMEDS_Study_i::UndoPostponed(const CORBA::Long theWay) +#else +void SALOMEDS_Study_i::UndoPostponed(CORBA::Long theWay) +#endif +{ + SALOMEDS::Locker lock; + + _impl->UndoPostponed(theWay); +} + + +//============================================================================ +/*! Function : DumpStudy + * Purpose : + */ +//============================================================================ +CORBA::Boolean SALOMEDS_Study_i::DumpStudy(const char* thePath, const char* theBaseName, CORBA::Boolean isPublished) +{ + SALOMEDS::Locker lock; + + TCollection_AsciiString aPath((char*)thePath), aBaseName((char*)theBaseName); + SALOMEDS_DriverFactory_i* factory = new SALOMEDS_DriverFactory_i(_orb); + CORBA::Boolean ret = _impl->DumpStudy(aPath, aBaseName, isPublished, factory); + delete factory; + return ret; +} + +//=========================================================================== +// PRIVATE FUNCTIONS +//=========================================================================== +long SALOMEDS_Study_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal) +{ +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + isLocal = (strcmp(theHostname, GetHostname().c_str()) == 0 && pid == thePID)?1:0; + SALOMEDSImpl_Study* local_impl = _impl.operator->(); + return ((long)local_impl); } diff --git a/src/SALOMEDS/SALOMEDS_Study_i.hxx b/src/SALOMEDS/SALOMEDS_Study_i.hxx index 18b9ef8fb..3cb495423 100644 --- a/src/SALOMEDS/SALOMEDS_Study_i.hxx +++ b/src/SALOMEDS/SALOMEDS_Study_i.hxx @@ -1,108 +1,45 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library 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 -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// // File : SALOMEDS_Study_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -// $Header$ #ifndef __SALOMEDS_STUDY_I_H__ #define __SALOMEDS_STUDY_I_H__ // std C++ headers -#include -#include +#include // IDL headers #include +#include CORBA_SERVER_HEADER(SALOME_GenericObj) #include CORBA_SERVER_HEADER(SALOMEDS) -// Cascade headers -#include -#include -#include -#include -#include -#include +#include //SALOMEDS headers -#include "SALOMEDS_DataMapStringLabel.hxx" -#include "SALOMEDS_IORAttribute.hxx" - #include "SALOMEDS_SComponentIterator_i.hxx" -#include "SALOMEDS_ChildIterator_i.hxx" - -class SALOMEDS_StudyManager_i; -class SALOMEDS_UseCaseBuilder_i; -class SALOMEDS_StudyBuilder_i; -class SALOMEDS_SObject_i; - +#include "SALOMEDS_StudyBuilder_i.hxx" +#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDS_UseCaseBuilder_i.hxx" -bool operator<(const TDF_Label& theLeft, const TDF_Label& theRight); +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" - -class SALOMEDS_Study_i: public virtual POA_SALOMEDS::Study, - public virtual PortableServer::RefCountServantBase +class Standard_EXPORT SALOMEDS_Study_i: public POA_SALOMEDS::Study, + public PortableServer::RefCountServantBase { +private: + CORBA::ORB_ptr _orb; + Handle(SALOMEDSImpl_Study) _impl; + SALOMEDS_StudyBuilder_i* _builder; + public: - typedef TDF_Label TSObjectID; - typedef std::pair TSObjectHolder; - typedef std::map TSObjectMap; - SALOMEDS_Study_i(SALOMEDS_StudyManager_i* theStudyManager, - const Handle(TDocStd_Document)& theDoc, - const char* theStudyName); + //! standard constructor + SALOMEDS_Study_i(const Handle(SALOMEDSImpl_Study), CORBA::ORB_ptr); + //! standard destructor virtual ~SALOMEDS_Study_i(); - - SALOMEDS_StudyManager_i* GetStudyManager(){ return _StudyManager; } - - Handle(TDocStd_Document) GetDocument(){ return _doc; } - - TSObjectMap& GetSObjectMap(){ return mySObjectMap;} - - CORBA::ORB_var GetORB() const; - - PortableServer::POA_var GetPOA() const; - - SALOMEDS_SObject_i* DownCast(SALOMEDS::SObject_ptr theSObject) const; - - SALOMEDS::Callback_ptr SetOnAddSObject(SALOMEDS::Callback_ptr theCallback); - - SALOMEDS::Callback_ptr SetOnRemoveSObject(SALOMEDS::Callback_ptr theCallback); - - void OnAddSObject(SALOMEDS::SObject_ptr theObject); - - void OnRemoveSObject(SALOMEDS::SObject_ptr theObject); - - void CheckLocked(); - - - virtual char* ConvertObjectToIOR(CORBA::Object_ptr theObject); - - virtual CORBA::Object_ptr ConvertIORToObject(const char* theIOR); - //! method to Get persistent reference of study (idem URL()) /*! \sa URL() @@ -225,20 +162,17 @@ public: \return ChildIterator_ptr arguments, the created ChildIterator */ virtual SALOMEDS::ChildIterator_ptr NewChildIterator(SALOMEDS::SObject_ptr aSO); - SALOMEDS_ChildIterator_i GetChildIterator(SALOMEDS::SObject_ptr theSObject); //! method to Create a SComponentIterator /*! \return SComponentIterator_ptr arguments, the created SComponentIterator */ virtual SALOMEDS::SComponentIterator_ptr NewComponentIterator(); - SALOMEDS_SComponentIterator_i GetComponentIterator(); //! method to Create a StudyBuilder /*! \return StudyBuilder_ptr arguments, the created StudyBuilder */ - SALOMEDS_StudyBuilder_i* GetBuilder(); virtual SALOMEDS::StudyBuilder_ptr NewBuilder(); //! method to get study name @@ -286,7 +220,9 @@ public: virtual CORBA::Short StudyId(); virtual void StudyId(CORBA::Short id); - void IORUpdated(const Handle(SALOMEDS_IORAttribute) theAttribute); + static SALOMEDS::Study_ptr GetStudy(const TDF_Label theLabel, CORBA::ORB_ptr orb); + + static void IORUpdated(const Handle(SALOMEDSImpl_AttributeIOR) theAttribute); virtual void UpdateIORLabelMap(const char* anIOR, const char* aLabel); @@ -298,61 +234,36 @@ public: virtual SALOMEDS::ListOfDates* GetModificationsDate(); + virtual char* ConvertObjectToIOR(CORBA::Object_ptr theObject) {return _orb->object_to_string(theObject); } + virtual CORBA::Object_ptr ConvertIORToObject(const char* theIOR) { return _orb->string_to_object(theIOR); }; + virtual SALOMEDS::UseCaseBuilder_ptr GetUseCaseBuilder(); virtual void Close(); - void EnableUseCaseAutoFilling(CORBA::Boolean isEnabled) { _autoFill = isEnabled; } + void EnableUseCaseAutoFilling(CORBA::Boolean isEnabled) { _impl->EnableUseCaseAutoFilling(isEnabled); } // postponed destroying of CORBA object functionality virtual void AddPostponed(const char* theIOR); virtual void AddCreatedPostponed(const char* theIOR); +#ifndef WNT virtual void RemovePostponed(const CORBA::Long theUndoLimit); // removes postponed IORs of old transaction // if theUndoLimit==0, removes all virtual void UndoPostponed(const CORBA::Long theWay); // theWay = 1: resurrect objects, // theWay = -1: get back to the list of postponed -private: - friend class SALOMEDS_StudyBuilder_i; - friend class SALOMEDS_SObject_i; - - SALOMEDS_StudyManager_i* _StudyManager; - - TSObjectMap mySObjectMap; - - SALOMEDS_UseCaseBuilder_i* _UseCaseBuilder; - SALOMEDS_StudyBuilder_i* _Builder; - SALOMEDS::Callback_var _callbackOnAdd; - SALOMEDS::Callback_var _callbackOnRemove; - - char* _name; - Handle(TDocStd_Document) _doc; // OCAF Document - CORBA::Boolean _isSaved; // True if the Study is saved - char* _URL; //URL of the persistent reference of the study - CORBA::Short _StudyId; - - SALOMEDS_DataMapStringLabel myIORLabels; - - // data structures for postponed destroying of CORBA object functionality - TColStd_SequenceOfAsciiString myPostponedIORs; // ordered set of IORs - TColStd_SequenceOfInteger myNbPostponed; // number of IOR in the each transaction - int myNbUndos; // number of current Undos, made by user - - TDF_Label _current; - bool _autoFill; +#else + virtual void RemovePostponed(CORBA::Long theUndoLimit); // removes postponed IORs of old transaction + // if theUndoLimit==0, removes all + virtual void UndoPostponed(CORBA::Long theWay); // theWay = 1: resurrect objects, + // theWay = -1: get back to the list of postponed +#endif - SALOMEDS::SObject_ptr _FindObject(TDF_Label theLabel, - const char* theObjectIOR, - bool& theIsFound); - SALOMEDS::SObject_ptr _FindObjectIOR(TDF_Label theLabel, - const char* theObjectIOR, - bool& theIsFound); + virtual CORBA::Boolean DumpStudy(const char* thePath, const char* theBaseName, CORBA::Boolean isPublished); - SALOMEDS_Study_i(); // Not implemented - void operator=(const SALOMEDS_Study_i&); // Not implemented + virtual Handle(SALOMEDSImpl_Study) GetImpl() { return _impl; } + virtual long GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal); }; - - #endif diff --git a/src/SALOMEDS/SALOMEDS_UseCaseBuilder.cxx b/src/SALOMEDS/SALOMEDS_UseCaseBuilder.cxx new file mode 100644 index 000000000..b31f5c402 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_UseCaseBuilder.cxx @@ -0,0 +1,149 @@ +// File : SALOMEDS_UseCaseBuilder.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include "SALOMEDS_UseCaseBuilder.hxx" + +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDS_SObject.hxx" +#include "SALOMEDSImpl_UseCaseIterator.hxx" +#include "SALOMEDS_UseCaseIterator.hxx" +#include +#include + +using namespace std; + +SALOMEDS_UseCaseBuilder::SALOMEDS_UseCaseBuilder(const Handle(SALOMEDSImpl_UseCaseBuilder)& theBuilder) +{ + _isLocal = true; + _local_impl = theBuilder; + _corba_impl = SALOMEDS::UseCaseBuilder::_nil(); +} + +SALOMEDS_UseCaseBuilder::SALOMEDS_UseCaseBuilder(SALOMEDS::UseCaseBuilder_ptr theBuilder) +{ + _isLocal = false; + _local_impl = NULL; + _corba_impl = SALOMEDS::UseCaseBuilder::_duplicate(theBuilder); +} + +SALOMEDS_UseCaseBuilder::~SALOMEDS_UseCaseBuilder() +{ + if(!_isLocal) _corba_impl->Destroy(); +} + +bool SALOMEDS_UseCaseBuilder::Append(const _PTR(SObject)& theObject) +{ + bool ret; + SALOMEDS_SObject* obj = dynamic_cast(theObject.get()); + if(_isLocal) ret = _local_impl->Append(obj->GetLocalImpl()); + else ret = _corba_impl->Append(obj->GetCORBAImpl()); + return ret; +} + +bool SALOMEDS_UseCaseBuilder::Remove(const _PTR(SObject)& theObject) +{ + bool ret; + SALOMEDS_SObject* obj = dynamic_cast(theObject.get()); + if(_isLocal) ret = _local_impl->Remove(obj->GetLocalImpl()); + else ret = _corba_impl->Remove(obj->GetCORBAImpl()); + return ret; +} + +bool SALOMEDS_UseCaseBuilder::AppendTo(const _PTR(SObject)& theFather, _PTR(SObject) theObject) +{ + bool ret; + SALOMEDS_SObject* father = dynamic_cast(theFather.get()); + SALOMEDS_SObject* obj = dynamic_cast(theObject.get()); + if(_isLocal) ret = _local_impl->AppendTo(father->GetLocalImpl(), obj->GetLocalImpl()); + else ret = _corba_impl->AppendTo(father->GetCORBAImpl(), obj->GetCORBAImpl()); + return ret; +} + +bool SALOMEDS_UseCaseBuilder::InsertBefore(const _PTR(SObject)& theFirst, _PTR(SObject) theNext) +{ + bool ret; + SALOMEDS_SObject* first = dynamic_cast(theFirst.get()); + SALOMEDS_SObject* next = dynamic_cast(theNext.get()); + if(_isLocal) ret = _local_impl->InsertBefore(first->GetLocalImpl(), next->GetLocalImpl()); + else ret = _corba_impl->InsertBefore(first->GetCORBAImpl(), next->GetCORBAImpl()); + return ret; +} + +bool SALOMEDS_UseCaseBuilder::SetCurrentObject(const _PTR(SObject)& theObject) +{ + bool ret; + SALOMEDS_SObject* obj = dynamic_cast(theObject.get()); + if(_isLocal) ret = _local_impl->SetCurrentObject(obj->GetLocalImpl()); + else ret = _corba_impl->SetCurrentObject(obj->GetCORBAImpl()); + return ret; +} + +bool SALOMEDS_UseCaseBuilder::SetRootCurrent() +{ + bool ret; + if(_isLocal) ret = _local_impl->SetRootCurrent(); + else ret = _corba_impl->SetRootCurrent(); + return ret; +} + +bool SALOMEDS_UseCaseBuilder::HasChildren(const _PTR(SObject)& theObject) +{ + bool ret; + SALOMEDS_SObject* obj = dynamic_cast(theObject.get()); + if(_isLocal) ret = _local_impl->HasChildren(obj->GetLocalImpl()); + else ret = _corba_impl->HasChildren(obj->GetCORBAImpl()); + return ret; +} + +bool SALOMEDS_UseCaseBuilder::IsUseCase(const _PTR(SObject)& theObject) +{ + bool ret; + SALOMEDS_SObject* obj = dynamic_cast(theObject.get()); + if(_isLocal) ret = _local_impl->IsUseCase(obj->GetLocalImpl()); + else ret = _corba_impl->IsUseCase(obj->GetCORBAImpl()); + return ret; +} + +bool SALOMEDS_UseCaseBuilder::SetName(const std::string& theName) +{ + bool ret; + if(_isLocal) ret = _local_impl->SetName((char*)theName.c_str()); + else ret = _corba_impl->SetName((char*)theName.c_str()); + return ret; +} + +_PTR(SObject) SALOMEDS_UseCaseBuilder::GetCurrentObject() +{ + SALOMEDS_SObject* obj = NULL; + if(_isLocal) obj = new SALOMEDS_SObject(_local_impl->GetCurrentObject()); + else obj = new SALOMEDS_SObject(_corba_impl->GetCurrentObject()); + return _PTR(SObject)(obj); +} + +std::string SALOMEDS_UseCaseBuilder::GetName() +{ + std::string aName; + if(_isLocal) aName = _local_impl->GetName().ToCString(); + else aName = _corba_impl->GetName(); + return aName; +} + +_PTR(SObject) SALOMEDS_UseCaseBuilder::AddUseCase(const std::string& theName) +{ + SALOMEDS_SObject* obj = NULL; + if(_isLocal) obj = new SALOMEDS_SObject(_local_impl->AddUseCase((char*)theName.c_str())); + else obj = new SALOMEDS_SObject(_corba_impl->AddUseCase((char*)theName.c_str())); + return _PTR(SObject)(obj); +} + +_PTR(UseCaseIterator) SALOMEDS_UseCaseBuilder::GetUseCaseIterator(const _PTR(SObject)& theObject) +{ + SALOMEDS_UseCaseIterator* it = NULL; + SALOMEDS_SObject* obj = dynamic_cast(theObject.get()); + if(_isLocal) it = new SALOMEDS_UseCaseIterator(_local_impl->GetUseCaseIterator(obj->GetLocalImpl())); + else it = new SALOMEDS_UseCaseIterator(_corba_impl->GetUseCaseIterator(obj->GetCORBAImpl())); + return _PTR(UseCaseIterator)(it); +} diff --git a/src/SALOMEDS/SALOMEDS_UseCaseBuilder.hxx b/src/SALOMEDS/SALOMEDS_UseCaseBuilder.hxx new file mode 100644 index 000000000..2907267a6 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_UseCaseBuilder.hxx @@ -0,0 +1,44 @@ +// File : SALOMEDS_UseCaseBuilder.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_USECaseBuilder_H__ +#define __SALOMEDS_USECaseBuilder_H__ + +#include "SALOMEDSClient.hxx" +#include "SALOMEDSImpl_UseCaseBuilder.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +class SALOMEDS_UseCaseBuilder: public SALOMEDSClient_UseCaseBuilder +{ + +private: + bool _isLocal; + Handle(SALOMEDSImpl_UseCaseBuilder) _local_impl; + SALOMEDS::UseCaseBuilder_var _corba_impl; + +public: + + SALOMEDS_UseCaseBuilder(const Handle(SALOMEDSImpl_UseCaseBuilder)& theBuilder); + SALOMEDS_UseCaseBuilder(SALOMEDS::UseCaseBuilder_ptr theBuilder); + ~SALOMEDS_UseCaseBuilder(); + + virtual bool Append(const _PTR(SObject)& theObject); + virtual bool Remove(const _PTR(SObject)& theObject); + virtual bool AppendTo(const _PTR(SObject)& theFather, _PTR(SObject) theObject); + virtual bool InsertBefore(const _PTR(SObject)& theFirst, _PTR(SObject) theNext); + virtual bool SetCurrentObject(const _PTR(SObject)& theObject); + virtual bool SetRootCurrent(); + virtual bool HasChildren(const _PTR(SObject)& theObject); + virtual bool IsUseCase(const _PTR(SObject)& theObject); + virtual bool SetName(const std::string& theName); + virtual _PTR(SObject) GetCurrentObject(); + virtual std::string GetName(); + virtual _PTR(SObject) AddUseCase(const std::string& theName); + virtual _PTR(UseCaseIterator) GetUseCaseIterator(const _PTR(SObject)& anObject); + +}; +#endif diff --git a/src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.cxx b/src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.cxx index c35e2f560..543b81304 100644 --- a/src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.cxx +++ b/src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.cxx @@ -1,34 +1,12 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_UseCaseBuilder_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME + #include "SALOMEDS_UseCaseBuilder_i.hxx" -#include "SALOMEDS_Study_i.hxx" -#include "SALOMEDS_SObject_i.hxx" #include "SALOMEDS_UseCaseIterator_i.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#define USE_CASE_LABEL_TAG 2 -#define USE_CASE_GUID "AA43BB12-D9CD-11d6-945D-0050DA506788" +#include "SALOMEDS_SObject_i.hxx" +#include "SALOMEDS.hxx" #include "utilities.h" @@ -39,28 +17,11 @@ using namespace std; * Purpose : */ //============================================================================ -SALOMEDS_UseCaseBuilder_i::SALOMEDS_UseCaseBuilder_i(SALOMEDS_Study_i* theStudy, - const Handle(TDocStd_Document)& theDocument): - _doc(theDocument), - _study(theStudy) +SALOMEDS_UseCaseBuilder_i::SALOMEDS_UseCaseBuilder_i(const Handle(SALOMEDSImpl_UseCaseBuilder)& theImpl, + CORBA::ORB_ptr orb) { - if(_doc.IsNull()) return; - - TDF_Label aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); //Iterate all use cases - if(!aLabel.FindAttribute(Standard_GUID(USE_CASE_GUID), _root)) { - _root = TDataStd_TreeNode::Set(aLabel, Standard_GUID(USE_CASE_GUID)); - } - - Handle(TDF_Reference) aRef; - if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) { - aRef = TDF_Reference::Set(_root->Label(), _root->Label()); - } - - Handle(TDataStd_Name) aNameAttr; - if(!aLabel.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) { - aNameAttr = TDataStd_Name::Set(aLabel, "Use cases"); - } - + _orb = CORBA::ORB::_duplicate(orb); + _impl = theImpl; } //============================================================================ @@ -73,21 +34,6 @@ SALOMEDS_UseCaseBuilder_i::~SALOMEDS_UseCaseBuilder_i() } -//============================================================================ -CORBA::ORB_var SALOMEDS_UseCaseBuilder_i::GetORB() const -{ - return _study->GetORB(); -} - - -//============================================================================ -PortableServer::POA_var SALOMEDS_UseCaseBuilder_i::GetPOA() const -{ - return _study->GetPOA(); -} - - -//============================================================================ //============================================================================ /*! Function : Append * Purpose : @@ -95,27 +41,9 @@ PortableServer::POA_var SALOMEDS_UseCaseBuilder_i::GetPOA() const //============================================================================ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::Append(SALOMEDS::SObject_ptr theObject) { - if(_root.IsNull() || theObject->_is_nil()) return 0; - - TDF_Label aLabel; - - TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel); - if(aLabel.IsNull()) return 0; - - Handle(TDataStd_TreeNode) aNode, aCurrentNode; - aNode = TDataStd_TreeNode::Set(aLabel, _root->ID()); - aNode->Remove(); - - Handle(TDF_Reference) aRef; - if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) { - aRef = TDF_Reference::Set(_root->Label(), _root->Label()); - } - TDF_Label aCurrent = aRef->Get(); - - if(aCurrent.IsNull() || !aCurrent.FindAttribute(_root->ID(), aCurrentNode)) - aCurrentNode = _root; - - return aCurrentNode->Append(aNode); + SALOMEDS::Locker lock; + if(_impl.IsNull() || theObject->_is_nil()) return 0; + return _impl->Append(_impl->GetSObject(theObject->GetID())); } //============================================================================ @@ -125,39 +53,9 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::Append(SALOMEDS::SObject_ptr theObject //============================================================================ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::Remove(SALOMEDS::SObject_ptr theObject) { - if(_root.IsNull() || theObject->_is_nil()) return 0; - - TDF_Label aLabel; - TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel); - if(aLabel.IsNull()) return 0; - - Handle(TDataStd_TreeNode) aNode; - if(!aLabel.FindAttribute(_root->ID(), aNode)) return 0; - - aNode->Remove(); - - TDF_AttributeList aList; - aList.Append(aNode); - - Handle(TDF_Reference) aRef; - if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) { - aRef = TDF_Reference::Set(_root->Label(), _root->Label()); - } - TDF_Label aCurrent = aRef->Get(); - - TDataStd_ChildNodeIterator aChildItr(aNode, Standard_True); - for(; aChildItr.More(); aChildItr.Next()) - aList.Append(aChildItr.Value()); - - TDF_ListIteratorOfAttributeList anIterator(aList); - for(; anIterator.More(); anIterator.Next()) { - if(anIterator.Value()->Label() == aCurrent) { //The current node is removed - aRef->Set(_root->Label()); //Reset the current node to the root - } - anIterator.Value()->Label().ForgetAttribute(_root->ID()); - } - - return 1; + SALOMEDS::Locker lock; + if(_impl.IsNull() || theObject->_is_nil()) return 0; + return _impl->Remove(_impl->GetSObject(theObject->GetID())); } @@ -169,24 +67,9 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::Remove(SALOMEDS::SObject_ptr theObject CORBA::Boolean SALOMEDS_UseCaseBuilder_i::AppendTo(SALOMEDS::SObject_ptr theFather, SALOMEDS::SObject_ptr theObject) { - if(_root.IsNull() || theFather->_is_nil() || theObject->_is_nil()) return 0; - - TDF_Label aFatherLabel, aLabel; - Handle(TDataStd_TreeNode) aFather, aNode; - - TDF_Tool::Label(_root->Label().Data(), theFather->GetID(), aFatherLabel); - if(aFatherLabel.IsNull()) return 0; - if(!aFatherLabel.FindAttribute(_root->ID(), aFather)) return 0; - - TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel); - if(aLabel.IsNull()) return 0; - if(!aLabel.FindAttribute(_root->ID(), aNode)) { - aNode = TDataStd_TreeNode::Set(aLabel, _root->ID()); - } - else - aNode->Remove(); - - return aFather->Append(aNode); + SALOMEDS::Locker lock; + if(_impl.IsNull() || theFather->_is_nil() || theObject->_is_nil()) return 0; + return _impl->AppendTo(_impl->GetSObject(theFather->GetID()), _impl->GetSObject(theObject->GetID())); } //============================================================================ @@ -197,26 +80,9 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::AppendTo(SALOMEDS::SObject_ptr theFath CORBA::Boolean SALOMEDS_UseCaseBuilder_i::InsertBefore(SALOMEDS::SObject_ptr theFirst, SALOMEDS::SObject_ptr theNext) { - if(_root.IsNull() || theFirst->_is_nil() || theNext->_is_nil()) return 0; - - TDF_Label aFirstLabel, aLabel; - Handle(TDataStd_TreeNode) aFirstNode, aNode; - - TDF_Tool::Label(_root->Label().Data(), theFirst->GetID(), aFirstLabel); - if(aFirstLabel.IsNull()) return 0; - if(aFirstLabel.FindAttribute(_root->ID(), aFirstNode)) { - aFirstNode->Remove(); - aFirstLabel.ForgetAttribute(aFirstNode->ID()); - } - - aFirstNode = TDataStd_TreeNode::Set(aFirstLabel, _root->ID()); - - - TDF_Tool::Label(_root->Label().Data(), theNext->GetID(), aLabel); - if(aLabel.IsNull()) return 0; - if(!aLabel.FindAttribute(_root->ID(), aNode)) return 0; - - return aNode->InsertBefore(aFirstNode); + SALOMEDS::Locker lock; + if(_impl.IsNull() || theFirst->_is_nil() || theNext->_is_nil()) return 0; + return _impl->AppendTo(_impl->GetSObject(theFirst->GetID()), _impl->GetSObject(theNext->GetID())); } @@ -227,23 +93,9 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::InsertBefore(SALOMEDS::SObject_ptr the //============================================================================ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetCurrentObject(SALOMEDS::SObject_ptr theObject) { - if(_root.IsNull() || theObject->_is_nil()) return 0; - - TDF_Label aLabel; - Handle(TDataStd_TreeNode) aNode; - TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel); - if(aLabel.IsNull()) return 0; - if(!aLabel.FindAttribute(_root->ID(), aNode)) return 0; - - - Handle(TDF_Reference) aRef; - if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) { - aRef = TDF_Reference::Set(_root->Label(), aNode->Label()); - } - - aRef->Set(aNode->Label()); - - return 1; + SALOMEDS::Locker lock; + if(_impl.IsNull() || theObject->_is_nil()) return 0; + return _impl->SetCurrentObject(_impl->GetSObject(theObject->GetID())); } //============================================================================ @@ -253,14 +105,9 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetCurrentObject(SALOMEDS::SObject_ptr //============================================================================ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetRootCurrent() { - if(_root.IsNull()) return 0; - - Handle(TDF_Reference) aRef; - if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) - aRef = TDF_Reference::Set(_root->Label(), _root->Label()); - - aRef->Set(_root->Label()); - return 1; + SALOMEDS::Locker lock; + if(_impl.IsNull()) return 0; + return _impl->SetRootCurrent(); } //============================================================================ @@ -270,17 +117,9 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetRootCurrent() //============================================================================ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::HasChildren(SALOMEDS::SObject_ptr theObject) { - if(_root.IsNull()) return 0; - - TDF_Label aLabel; - if (theObject->_is_nil()) aLabel = _root->Label(); - else TDF_Tool::Label(_root->Label().Data(), theObject->GetID(), aLabel); - if(aLabel.IsNull()) return 0; - - Handle(TDataStd_TreeNode) aNode; - if(!aLabel.FindAttribute(_root->ID(), aNode)) return 0; - - return !(aNode->First().IsNull()); + SALOMEDS::Locker lock; + if(_impl.IsNull()) return 0; + return _impl->HasChildren(_impl->GetSObject(theObject->GetID())); } //============================================================================ @@ -288,18 +127,11 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::HasChildren(SALOMEDS::SObject_ptr theO * Purpose : */ //============================================================================ -CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetName(const char* theName) { - if(_root.IsNull()) return 0; - - Handle(TDataStd_Name) aNameAttrib; - TCollection_ExtendedString aName(const_cast(theName)); - - if (!_root->FindAttribute(TDataStd_Name::GetID(), aNameAttrib)) - aNameAttrib = TDataStd_Name::Set(_root->Label(), aName); - else - aNameAttrib->Set(aName); - - return 1; +CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetName(const char* theName) +{ + SALOMEDS::Locker lock; + if(_impl.IsNull()) return 0; + return _impl->SetName((char*)theName); } @@ -310,16 +142,12 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::SetName(const char* theName) { //============================================================================ SALOMEDS::SObject_ptr SALOMEDS_UseCaseBuilder_i::GetCurrentObject() { - if(_root.IsNull()) return NULL; - - Handle(TDF_Reference) aRef; - if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) { - aRef = TDF_Reference::Set(_root->Label(), _root->Label()); - } - TDF_Label aCurrent = aRef->Get(); - if(aCurrent.IsNull()) return NULL; - - return SALOMEDS_SObject_i::NewRef(_study,aCurrent)._retn(); + SALOMEDS::Locker lock; + + if(_impl.IsNull()) return NULL; + Handle(SALOMEDSImpl_SObject) aSO = _impl->GetCurrentObject(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } //============================================================================ @@ -327,14 +155,10 @@ SALOMEDS::SObject_ptr SALOMEDS_UseCaseBuilder_i::GetCurrentObject() * Purpose : */ //============================================================================ -char* SALOMEDS_UseCaseBuilder_i::GetName() { - CORBA::String_var aString; - if(_root.IsNull()) return aString._retn(); - - Handle(TDataStd_Name) aName; - if (!_root->FindAttribute(TDataStd_Name::GetID(), aName)) return aString._retn(); - aString = CORBA::string_dup(TCollection_AsciiString(aName->Get()).ToCString()); - return aString._retn(); +char* SALOMEDS_UseCaseBuilder_i::GetName() +{ + SALOMEDS::Locker lock; + return CORBA::string_dup(_impl->GetName().ToCString()); } //============================================================================ @@ -344,12 +168,10 @@ char* SALOMEDS_UseCaseBuilder_i::GetName() { //============================================================================ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::IsUseCase(SALOMEDS::SObject_ptr theObject) { - if(theObject->_is_nil()) return false; - TDF_Label aFather, aLabel; - TDF_Tool::Label(_doc->GetData(), theObject->GetID(), aLabel); - aFather = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); - if(aLabel.Father() == aFather) return true; - return false; + SALOMEDS::Locker lock; + + if(_impl.IsNull() || theObject->_is_nil()) return false; + return _impl->IsUseCase(_impl->GetSObject(theObject->GetID())); } //============================================================================ @@ -359,36 +181,12 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::IsUseCase(SALOMEDS::SObject_ptr theObj //============================================================================ SALOMEDS::SObject_ptr SALOMEDS_UseCaseBuilder_i::AddUseCase(const char* theName) { - Standard_GUID aBasicGUID(USE_CASE_GUID); - - //Create a use cases structure if it not exists - - Handle(TDataStd_TreeNode) aFatherNode, aNode; - Handle(TDataStd_Integer) anInteger; - Handle(TDF_Reference) aRef; - - TDF_Label aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); - - if(!_root->FindAttribute(TDF_Reference::GetID(), aRef)) { - aRef = TDF_Reference::Set(aLabel, aLabel); - } - - if(!aRef->Get().FindAttribute(aBasicGUID, aFatherNode)) { - aFatherNode = TDataStd_TreeNode::Set(aRef->Get()); - } - - if(!_root->FindAttribute(TDataStd_Integer::GetID(), anInteger)) { - anInteger = TDataStd_Integer::Set(aLabel, 0); - } - - //Create a new use case - anInteger->Set(anInteger->Get()+1); - TDF_Label aChild = aLabel.FindChild(anInteger->Get()); - aNode = TDataStd_TreeNode::Set(aChild, aBasicGUID); - aFatherNode->Append(aNode); - TDataStd_Name::Set(aChild, TCollection_ExtendedString(const_cast(theName))); - - return SALOMEDS_SObject_i::NewRef(_study,aChild)._retn(); + SALOMEDS::Locker lock; + + if(_impl.IsNull()) return SALOMEDS::SObject::_nil(); + Handle(SALOMEDSImpl_SObject) aSO = _impl->AddUseCase((char*)theName); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } //============================================================================ @@ -396,17 +194,13 @@ SALOMEDS::SObject_ptr SALOMEDS_UseCaseBuilder_i::AddUseCase(const char* theName) * Purpose : Creates a new UseCase iterator, if anObject is null all use cases are iterated */ //============================================================================ -SALOMEDS::UseCaseIterator_ptr SALOMEDS_UseCaseBuilder_i::GetUseCaseIterator(SALOMEDS::SObject_ptr anObject) +SALOMEDS::UseCaseIterator_ptr SALOMEDS_UseCaseBuilder_i::GetUseCaseIterator(SALOMEDS::SObject_ptr theObject) { - TDF_Label aLabel; - - if(!anObject->_is_nil()) { - TDF_Tool::Label(_doc->GetData(), anObject->GetID(), aLabel); //Iterate only sub tree in the use case - } - else { - aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); //Iterate all use cases - } - - SALOMEDS_UseCaseIterator_i* aServant = new SALOMEDS_UseCaseIterator_i(_study,aLabel,USE_CASE_GUID,Standard_False); - return aServant->_this(); + SALOMEDS::Locker lock; + + if(_impl.IsNull()) return SALOMEDS::UseCaseIterator::_nil(); + Handle(SALOMEDSImpl_UseCaseIterator) anItr = _impl->GetUseCaseIterator(_impl->GetSObject(theObject->GetID())); + SALOMEDS_UseCaseIterator_i* aServant = new SALOMEDS_UseCaseIterator_i(anItr, _orb); + SALOMEDS::UseCaseIterator_var anIterator = SALOMEDS::UseCaseIterator::_narrow(aServant->_this()); + return anIterator._retn(); } diff --git a/src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.hxx b/src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.hxx index 796c80379..6b2ab147e 100644 --- a/src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.hxx +++ b/src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.hxx @@ -1,47 +1,44 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_UseCaseBuilder_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME #ifndef __SALOMEDS_USECaseBuilder_I_H__ #define __SALOMEDS_USECaseBuilder_I_H__ +// std C++ headers +#include + // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS) #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) +#include // Cascade headers -#include -#include +#include +#include -class SALOMEDS_Study_i; +#include "SALOMEDSImpl_UseCaseIterator.hxx" +#include "SALOMEDSImpl_UseCaseBuilder.hxx" -class SALOMEDS_UseCaseBuilder_i: public POA_SALOMEDS::UseCaseBuilder, - public PortableServer::RefCountServantBase +class SALOMEDS_UseCaseBuilder_i: public virtual POA_SALOMEDS::UseCaseBuilder, + public virtual PortableServer::RefCountServantBase, + public virtual SALOME::GenericObj_i { - SALOMEDS_UseCaseBuilder_i(); // Not implemented - void operator=(const SALOMEDS_UseCaseBuilder_i&); // Not implemented - private: - Handle(TDataStd_TreeNode) _root; - Handle(TDocStd_Document) _doc; - SALOMEDS_Study_i* _study; + + CORBA::ORB_ptr _orb; + Handle(SALOMEDSImpl_UseCaseBuilder) _impl; public: - SALOMEDS_UseCaseBuilder_i(SALOMEDS_Study_i* theStudy, - const Handle(TDocStd_Document)& theDocument); + + //! standard constructor + SALOMEDS_UseCaseBuilder_i(const Handle(SALOMEDSImpl_UseCaseBuilder)& theDocument, + CORBA::ORB_ptr); + //! standard destructor ~SALOMEDS_UseCaseBuilder_i(); - CORBA::ORB_var GetORB() const; - PortableServer::POA_var GetPOA() const; - virtual CORBA::Boolean Append(SALOMEDS::SObject_ptr theObject); virtual CORBA::Boolean Remove(SALOMEDS::SObject_ptr theObject); diff --git a/src/SALOMEDS/SALOMEDS_UseCaseIterator.cxx b/src/SALOMEDS/SALOMEDS_UseCaseIterator.cxx new file mode 100644 index 000000000..36bbb0cf3 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_UseCaseIterator.cxx @@ -0,0 +1,57 @@ +// File : SALOMEDS_UseCaseIterator.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include "SALOMEDS_UseCaseIterator.hxx" +#include "SALOMEDS_SObject.hxx" + +using namespace std; + +SALOMEDS_UseCaseIterator::SALOMEDS_UseCaseIterator(const Handle(SALOMEDSImpl_UseCaseIterator)& theIterator) +{ + _isLocal = true; + _local_impl = theIterator; + _corba_impl = SALOMEDS::UseCaseIterator::_nil(); +} + +SALOMEDS_UseCaseIterator::SALOMEDS_UseCaseIterator(SALOMEDS::UseCaseIterator_ptr theIterator) +{ + _isLocal = false; + _local_impl = NULL; + _corba_impl = SALOMEDS::UseCaseIterator::_duplicate(theIterator); +} + +SALOMEDS_UseCaseIterator::~SALOMEDS_UseCaseIterator() +{ + if(!_isLocal) _corba_impl->Destroy(); +} + +void SALOMEDS_UseCaseIterator::Init(bool theAllLevels) +{ + if(_isLocal) _local_impl->Init(theAllLevels); + else _corba_impl->Init(theAllLevels); +} + +bool SALOMEDS_UseCaseIterator::More() +{ + bool ret; + if(_isLocal) ret = _local_impl->More(); + else ret = _corba_impl->More(); + return ret; +} + +void SALOMEDS_UseCaseIterator::Next() +{ + if(_isLocal) _local_impl->Next(); + else _corba_impl->Next(); +} + +_PTR(SObject) SALOMEDS_UseCaseIterator::Value() +{ + SALOMEDS_SObject* aSO; + if(_isLocal) aSO = new SALOMEDS_SObject(_local_impl->Value()); + else aSO = new SALOMEDS_SObject(_corba_impl->Value()); + return _PTR(SObject)(aSO); +} diff --git a/src/SALOMEDS/SALOMEDS_UseCaseIterator.hxx b/src/SALOMEDS/SALOMEDS_UseCaseIterator.hxx new file mode 100644 index 000000000..687ba85fb --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_UseCaseIterator.hxx @@ -0,0 +1,35 @@ +// File : SALOMEDS_UseCaseIterator.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDS_USECASEITERATOR_H__ +#define __SALOMEDS_USECASEITERATOR_H__ + +#include "SALOMEDSClient_UseCaseIterator.hxx" +#include "SALOMEDSClient_SObject.hxx" +#include "SALOMEDSImpl_UseCaseIterator.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +class SALOMEDS_UseCaseIterator: public SALOMEDSClient_UseCaseIterator +{ +private: + bool _isLocal; + Handle(SALOMEDSImpl_UseCaseIterator) _local_impl; + SALOMEDS::UseCaseIterator_var _corba_impl; + +public: + + SALOMEDS_UseCaseIterator(const Handle(SALOMEDSImpl_UseCaseIterator)& theIterator); + SALOMEDS_UseCaseIterator(SALOMEDS::UseCaseIterator_ptr theIterator); + ~SALOMEDS_UseCaseIterator(); + + virtual void Init(bool theAllLevels); + virtual bool More(); + virtual void Next(); + virtual _PTR(SObject) Value(); +}; + +#endif diff --git a/src/SALOMEDS/SALOMEDS_UseCaseIterator_i.cxx b/src/SALOMEDS/SALOMEDS_UseCaseIterator_i.cxx index 38dbd0568..4a89352ce 100644 --- a/src/SALOMEDS/SALOMEDS_UseCaseIterator_i.cxx +++ b/src/SALOMEDS/SALOMEDS_UseCaseIterator_i.cxx @@ -1,36 +1,27 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_UseCaseIterator_i.cxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME -using namespace std; + #include "SALOMEDS_UseCaseIterator_i.hxx" #include "SALOMEDS_SObject_i.hxx" -#include "utilities.h" +#include "SALOMEDS.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "utilities.h" +using namespace std; //============================================================================ /*! Function : constructor * Purpose : */ //============================================================================ -SALOMEDS_UseCaseIterator_i::SALOMEDS_UseCaseIterator_i(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel, - const Standard_GUID& theGUID, - const Standard_Boolean theIsAllLevels): - _guid(theGUID), - _levels(theIsAllLevels), - _study(theStudy) +SALOMEDS_UseCaseIterator_i::SALOMEDS_UseCaseIterator_i(const Handle(SALOMEDSImpl_UseCaseIterator)& theImpl, + CORBA::ORB_ptr orb) { - if(theLabel.FindAttribute(_guid, _node)) { - _it.Initialize (_node, _levels); - } + _orb = CORBA::ORB::_duplicate(orb); + _impl = theImpl; } //============================================================================ @@ -49,7 +40,8 @@ SALOMEDS_UseCaseIterator_i::~SALOMEDS_UseCaseIterator_i() //============================================================================ void SALOMEDS_UseCaseIterator_i::Init(CORBA::Boolean allLevels) { - _it.Initialize (_node, allLevels); + SALOMEDS::Locker lock; + _impl->Init(allLevels); } //============================================================================ @@ -59,17 +51,19 @@ void SALOMEDS_UseCaseIterator_i::Init(CORBA::Boolean allLevels) //============================================================================ CORBA::Boolean SALOMEDS_UseCaseIterator_i::More() { - return _it.More(); + SALOMEDS::Locker lock; + return _impl->More(); } - //============================================================================ +//============================================================================ /*! Function : Next * */ //============================================================================ void SALOMEDS_UseCaseIterator_i::Next() { - _it.Next(); + SALOMEDS::Locker lock; + _impl->Next(); } @@ -78,10 +72,11 @@ void SALOMEDS_UseCaseIterator_i::Next() * Purpose : */ //============================================================================ - SALOMEDS::SObject_ptr SALOMEDS_UseCaseIterator_i::Value() { - TDF_Label L = _it.Value()->Label(); - return SALOMEDS_SObject_i::NewRef(_study,L)._retn(); + SALOMEDS::Locker lock; + Handle(SALOMEDSImpl_SObject) aSO = _impl->Value(); + SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb); + return so._retn(); } diff --git a/src/SALOMEDS/SALOMEDS_UseCaseIterator_i.hxx b/src/SALOMEDS/SALOMEDS_UseCaseIterator_i.hxx index 3e1777207..94ccf379d 100644 --- a/src/SALOMEDS/SALOMEDS_UseCaseIterator_i.hxx +++ b/src/SALOMEDS/SALOMEDS_UseCaseIterator_i.hxx @@ -1,46 +1,33 @@ -// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server -// -// Copyright (C) 2003 CEA/DEN, EDF R&D -// -// -// // File : SALOMEDS_UseCaseIterator_i.hxx -// Author : Yves FRICAUD +// Author : Sergey RUIN // Module : SALOME #ifndef __SALOMEDS_USECASEITERATOR_I_H__ #define __SALOMEDS_USECASEITERATOR_I_H__ +// std C++ headers +#include + // IDL headers #include #include CORBA_SERVER_HEADER(SALOMEDS) +#include -// Cascade headers -#include -#include -#include - -class SALOMEDS_Study_i; +#include "SALOMEDSImpl_UseCaseIterator.hxx" -class SALOMEDS_UseCaseIterator_i: public POA_SALOMEDS::UseCaseIterator, - public PortableServer::RefCountServantBase +class SALOMEDS_UseCaseIterator_i: public virtual POA_SALOMEDS::UseCaseIterator, + public virtual PortableServer::RefCountServantBase, + public virtual SALOME::GenericObj_i { - SALOMEDS_UseCaseIterator_i(); // Not implemented - void operator=(const SALOMEDS_UseCaseIterator_i&); // Not implemented - private: - Standard_GUID _guid; - Standard_Boolean _levels; - Handle(TDataStd_TreeNode) _node; - TDataStd_ChildNodeIterator _it; - SALOMEDS_Study_i* _study; + CORBA::ORB_ptr _orb; + Handle(SALOMEDSImpl_UseCaseIterator) _impl; public: + //! standard constructor - SALOMEDS_UseCaseIterator_i(SALOMEDS_Study_i* theStudy, - const TDF_Label& theLabel, - const Standard_GUID& theGUID, - const Standard_Boolean theIsAllLevels); + SALOMEDS_UseCaseIterator_i(const Handle(SALOMEDSImpl_UseCaseIterator)& theImpl, + CORBA::ORB_ptr); //! standard destructor ~SALOMEDS_UseCaseIterator_i(); @@ -50,6 +37,4 @@ public: virtual void Next(); virtual SALOMEDS::SObject_ptr Value(); }; - - #endif diff --git a/src/SALOMEDS/SALOME_DriverPy.py b/src/SALOMEDS/SALOME_DriverPy.py new file mode 100644 index 000000000..8728ffae8 --- /dev/null +++ b/src/SALOMEDS/SALOME_DriverPy.py @@ -0,0 +1,44 @@ +import SALOMEDS__POA + +class SALOME_DriverPy_i(SALOMEDS__POA.Driver): + """ + """ + _ComponentDataType = None + + def __init__ (self, componentDataType): + print "SALOME_DriverPy.__init__: ",componentDataType + _ComponentDataType = componentDataType + + def IORToLocalPersistentID(self, theSObject, IORString, isMultiFile, isASCII): + return theSObject.GetID() + + def LocalPersistentIDToIOR(self, theSObject, PersistentID, isMultiFile, isASCII): + return "" + + def ComponentDataType(self): + return _ComponentDataType + + def Save(self, theComponent, theURL, isMultiFile): + return NULL + + def SaveASCII(self, theComponent, theURL, isMultiFile): + return self.Save(theComponent, theURL, isMultiFile) + + def Load(self, theComponent, theStream, theURL, isMultiFile): + return 1 + + def LoadASCII(self, theComponent, theStream, theURL, isMultiFile): + return self.Load(theComponent, theStream, theURL, isMultiFile) + + def Close(self, theComponent): + pass + + def CanPublishInStudy(self, theIOR): + return 1 + + def PublishInStudy(self, theStudy, theSObject, theObject, theName): + return NULL + + def CanCopy(self, theObject): + return 0 + diff --git a/src/SALOMEDSClient/Makefile.in b/src/SALOMEDSClient/Makefile.in new file mode 100644 index 000000000..c3c92b5e2 --- /dev/null +++ b/src/SALOMEDSClient/Makefile.in @@ -0,0 +1,55 @@ +# File : Makefile.in +# Author : Sergey RUIN +# Module : SALOME + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_srcdir)/idl + + +@COMMENCE@ + +EXPORT_HEADERS= SALOMEDSClient_definitions.hxx \ + SALOMEDSClient_AttributeComment.hxx \ + SALOMEDSClient_AttributeDrawable.hxx \ + SALOMEDSClient_AttributeExpandable.hxx \ + SALOMEDSClient_AttributeExternalFileDef.hxx \ + SALOMEDSClient_AttributeFileType.hxx \ + SALOMEDSClient_AttributeFlags.hxx \ + SALOMEDSClient_AttributeGraphic.hxx \ + SALOMEDSClient_AttributeIOR.hxx \ + SALOMEDSClient_AttributeInteger.hxx \ + SALOMEDSClient_AttributeLocalID.hxx \ + SALOMEDSClient_AttributeName.hxx \ + SALOMEDSClient_AttributeOpened.hxx \ + SALOMEDSClient_AttributePersistentRef.hxx \ + SALOMEDSClient_AttributePixMap.hxx \ + SALOMEDSClient_AttributePythonObject.hxx \ + SALOMEDSClient_AttributeReal.hxx \ + SALOMEDSClient_AttributeSelectable.hxx \ + SALOMEDSClient_AttributeSequenceOfInteger.hxx \ + SALOMEDSClient_AttributeSequenceOfReal.hxx \ + SALOMEDSClient_AttributeStudyProperties.hxx \ + SALOMEDSClient_AttributeTableOfInteger.hxx \ + SALOMEDSClient_AttributeTableOfReal.hxx \ + SALOMEDSClient_AttributeTableOfString.hxx \ + SALOMEDSClient_AttributeTarget.hxx \ + SALOMEDSClient_AttributeTextColor.hxx \ + SALOMEDSClient_AttributeTextHighlightColor.hxx \ + SALOMEDSClient_AttributeTreeNode.hxx \ + SALOMEDSClient_AttributeUserID.hxx \ + SALOMEDSClient_ChildIterator.hxx \ + SALOMEDSClient_GenericAttribute.hxx \ + SALOMEDSClient_SComponent.hxx \ + SALOMEDSClient_SComponentIterator.hxx \ + SALOMEDSClient_SObject.hxx \ + SALOMEDSClient_Study.hxx \ + SALOMEDSClient_StudyBuilder.hxx \ + SALOMEDSClient_StudyManager.hxx \ + SALOMEDSClient_UseCaseBuilder.hxx \ + SALOMEDSClient_UseCaseIterator.hxx \ + SALOMEDSClient.hxx + +@CONCLUDE@ + diff --git a/src/SALOMEDSClient/SALOMEDSClient.hxx b/src/SALOMEDSClient/SALOMEDSClient.hxx new file mode 100644 index 000000000..e64da148c --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient.hxx @@ -0,0 +1,44 @@ +#ifndef SALOMEDSCLIENT_HXX +#define SALOMEDSCLIENT_HXX + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_AttributeComment.hxx" +#include "SALOMEDSClient_AttributeDrawable.hxx" +#include "SALOMEDSClient_AttributeExpandable.hxx" +#include "SALOMEDSClient_AttributeExternalFileDef.hxx" +#include "SALOMEDSClient_AttributeFileType.hxx" +#include "SALOMEDSClient_AttributeFlags.hxx" +#include "SALOMEDSClient_AttributeGraphic.hxx" +#include "SALOMEDSClient_AttributeIOR.hxx" +#include "SALOMEDSClient_AttributeInteger.hxx" +#include "SALOMEDSClient_AttributeLocalID.hxx" +#include "SALOMEDSClient_AttributeName.hxx" +#include "SALOMEDSClient_AttributeOpened.hxx" +#include "SALOMEDSClient_AttributePersistentRef.hxx" +#include "SALOMEDSClient_AttributePixMap.hxx" +#include "SALOMEDSClient_AttributePythonObject.hxx" +#include "SALOMEDSClient_AttributeReal.hxx" +#include "SALOMEDSClient_AttributeSelectable.hxx" +#include "SALOMEDSClient_AttributeSequenceOfInteger.hxx" +#include "SALOMEDSClient_AttributeSequenceOfReal.hxx" +#include "SALOMEDSClient_AttributeStudyProperties.hxx" +#include "SALOMEDSClient_AttributeTableOfInteger.hxx" +#include "SALOMEDSClient_AttributeTableOfReal.hxx" +#include "SALOMEDSClient_AttributeTableOfString.hxx" +#include "SALOMEDSClient_AttributeTarget.hxx" +#include "SALOMEDSClient_AttributeTextColor.hxx" +#include "SALOMEDSClient_AttributeTextHighlightColor.hxx" +#include "SALOMEDSClient_AttributeTreeNode.hxx" +#include "SALOMEDSClient_AttributeUserID.hxx" +#include "SALOMEDSClient_ChildIterator.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include "SALOMEDSClient_SComponent.hxx" +#include "SALOMEDSClient_SComponentIterator.hxx" +#include "SALOMEDSClient_SObject.hxx" +#include "SALOMEDSClient_Study.hxx" +#include "SALOMEDSClient_StudyBuilder.hxx" +#include "SALOMEDSClient_StudyManager.hxx" +#include "SALOMEDSClient_UseCaseBuilder.hxx" +#include "SALOMEDSClient_UseCaseIterator.hxx" + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeComment.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeComment.hxx new file mode 100644 index 000000000..2f01b00c7 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeComment.hxx @@ -0,0 +1,19 @@ +// File : SALOMEDSClient_AttributeComment.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeComment_HeaderFile +#define SALOMEDSClient_AttributeComment_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributeComment: public virtual SALOMEDSClient_GenericAttribute +{ +public: + virtual std::string Value() = 0; + virtual void SetValue(const std::string& value) = 0; +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeDrawable.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeDrawable.hxx new file mode 100644 index 000000000..b5d424af8 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeDrawable.hxx @@ -0,0 +1,18 @@ +// File : SALOMEDSClient_AttributeDrawable.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeDrawable_HeaderFile +#define SALOMEDSClient_AttributeDrawable_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeDrawable: public virtual SALOMEDSClient_GenericAttribute +{ +public: + virtual bool IsDrawable() = 0; + virtual void SetDrawable(bool value) = 0; +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeExpandable.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeExpandable.hxx new file mode 100644 index 000000000..e16aa10cd --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeExpandable.hxx @@ -0,0 +1,21 @@ +// File : SALOMEDSClient_AttributeExpandable.hxx +// Author : Sergey RUIN +// Module : SALOME +// $Header: + +#ifndef SALOMEDSClient_AttributeExpandable_HeaderFile +#define SALOMEDSClient_AttributeExpandable_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeExpandable: public virtual SALOMEDSClient_GenericAttribute +{ +public: + virtual bool IsExpandable() = 0; + virtual void SetExpandable(bool value) = 0; +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeExternalFileDef.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeExternalFileDef.hxx new file mode 100644 index 000000000..c2b6bba76 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeExternalFileDef.hxx @@ -0,0 +1,21 @@ +// File : SALOMEDSClient_AttributeExternalFileDef.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeExternalFileDef_HeaderFile +#define SALOMEDSClient_AttributeExternalFileDef_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributeExternalFileDef: public virtual SALOMEDSClient_GenericAttribute +{ +public: + virtual std::string Value() = 0; + virtual void SetValue(const std::string& value) = 0; +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeFileType.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeFileType.hxx new file mode 100644 index 000000000..cc2077398 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeFileType.hxx @@ -0,0 +1,22 @@ +// File : SALOMEDSClient_AttributeFileType.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeFileType_HeaderFile +#define SALOMEDSClient_AttributeFileType_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributeFileType: public virtual SALOMEDSClient_GenericAttribute +{ +public: + virtual std::string Value() = 0; + virtual void SetValue(const std::string& value) = 0; + +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeFlags.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeFlags.hxx new file mode 100644 index 000000000..712fd2f0d --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeFlags.hxx @@ -0,0 +1,24 @@ +// File : SALOMEDSClient_AttributeFlags.hxx +// Author : Sergey RUIN +// Module : SALOME +// $Header: + +#ifndef SALOMEDSClient_AttributeFlags_HeaderFile +#define SALOMEDSClient_AttributeFlags_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeFlags: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual int GetFlags() = 0; + virtual void SetFlags(int theFlags) = 0; + + virtual bool Get(int theFlag) = 0; + virtual void Set(int theFlag, bool theValue) = 0; + +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeGraphic.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeGraphic.hxx new file mode 100644 index 000000000..3de00de92 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeGraphic.hxx @@ -0,0 +1,21 @@ +// File : SALOMEDSClient_AttributeFlags.hxx +// Author : Sergey RUIN +// Module : SALOME +// $Header: + +#ifndef SALOMEDSClient_AttributeGraphic_HeaderFile +#define SALOMEDSClient_AttributeGraphic_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeGraphic: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual void SetVisibility(int theViewId, bool theValue) = 0; + virtual bool GetVisibility(int theViewId) = 0; + +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeIOR.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeIOR.hxx new file mode 100644 index 000000000..920f97f30 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeIOR.hxx @@ -0,0 +1,22 @@ +// File : SALOMEDSClient_AttributeIOR.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeIOR_HeaderFile +#define SALOMEDSClient_AttributeIOR_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributeIOR: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual std::string Value() = 0; + virtual void SetValue(const std::string& value) = 0; + +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeInteger.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeInteger.hxx new file mode 100644 index 000000000..1b177df19 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeInteger.hxx @@ -0,0 +1,21 @@ +// File : SALOMEDSClient_AttributeInteger.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeInteger_HeaderFile +#define SALOMEDSClient_AttributeInteger_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeInteger: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual int Value() = 0; + virtual void SetValue(int value) = 0; +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeLocalID.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeLocalID.hxx new file mode 100644 index 000000000..705b490c7 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeLocalID.hxx @@ -0,0 +1,22 @@ +// File : SALOMEDSClient_AttributeLocalID.hxx +// Author : Sergey RUIN +// Module : SALOME +// $Header: + +#ifndef SALOMEDSClient_AttributeLocalID_HeaderFile +#define SALOMEDSClient_AttributeLocalID_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeLocalID: public virtual SALOMEDSClient_GenericAttribute +{ +public: + virtual int Value() = 0; + virtual void SetValue(int value) = 0; + +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeName.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeName.hxx new file mode 100644 index 000000000..1d19e84c5 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeName.hxx @@ -0,0 +1,25 @@ +// File : SALOMEDSClient_AttributeName.hxx +// Author : Sergey RUIN +// Module : SALOME +// $Header: + +#ifndef SALOMEDSClient_AttributeName_HeaderFile +#define SALOMEDSClient_AttributeName_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributeName: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual std::string Value() = 0; + virtual void SetValue(const std::string& value) = 0; + +}; + + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeOpened.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeOpened.hxx new file mode 100644 index 000000000..fb9266d99 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeOpened.hxx @@ -0,0 +1,22 @@ +// File : SALOMEDSClient_AttributeOpened.hxx +// Author : Sergey RUIN +// Module : SALOME +// $Header: + +#ifndef SALOMEDSClient_AttributeOpened_HeaderFile +#define SALOMEDSClient_AttributeOpened_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeOpened: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual bool IsOpened() = 0; + virtual void SetOpened(bool value) = 0; +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributePersistentRef.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributePersistentRef.hxx new file mode 100644 index 000000000..6efa09cdc --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributePersistentRef.hxx @@ -0,0 +1,23 @@ +// File : SALOMEDSClient_AttributePersistentRef.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributePersistentRef_HeaderFile +#define SALOMEDSClient_AttributePersistentRef_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributePersistentRef: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual std::string Value() = 0; + virtual void SetValue(const std::string& value) = 0; + +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributePixMap.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributePixMap.hxx new file mode 100644 index 000000000..530380ea2 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributePixMap.hxx @@ -0,0 +1,23 @@ +// File : SALOMEDSClient_AttributePixMap.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributePixMap_HeaderFile +#define SALOMEDSClient_AttributePixMap_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributePixMap: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual bool HasPixMap() = 0; + virtual std::string GetPixMap() = 0; + virtual void SetPixMap(const std::string& value) = 0; + +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributePythonObject.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributePythonObject.hxx new file mode 100644 index 000000000..ee0318bcd --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributePythonObject.hxx @@ -0,0 +1,25 @@ +// File : SALOMEDSClient_AttributePythonObject.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributePythonObject_HeaderFile +#define SALOMEDSClient_AttributePythonObject_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributePythonObject: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual void SetObject(const std::string& theSequence, bool IsScript) = 0; + virtual std::string GetObject() = 0; + virtual bool IsScript() = 0; + +}; + + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeReal.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeReal.hxx new file mode 100644 index 000000000..e5360aa2b --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeReal.hxx @@ -0,0 +1,20 @@ +// File : SALOMEDSClient_AttributeReal.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeReal_HeaderFile +#define SALOMEDSClient_AttributeReal_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeReal: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual double Value() = 0; + virtual void SetValue(double value) = 0; +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeSelectable.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeSelectable.hxx new file mode 100644 index 000000000..257860e51 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeSelectable.hxx @@ -0,0 +1,22 @@ +// File : SALOMEDSClient_AttributeSelectable.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeSelectable_HeaderFile +#define SALOMEDSClient_AttributeSelectable_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeSelectable: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual bool IsSelectable() = 0; + virtual void SetSelectable(bool value) = 0; + +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeSequenceOfInteger.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeSequenceOfInteger.hxx new file mode 100644 index 000000000..4fbd4587d --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeSequenceOfInteger.hxx @@ -0,0 +1,26 @@ +// File : SALOMEDSClient_AttributeSequenceOfInteger.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeSequenceOfInteger_HeaderFile +#define SALOMEDSClient_AttributeSequenceOfInteger_HeaderFile + +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeSequenceOfInteger: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual void Assign(const std::vector& other) = 0; + virtual std::vector CorbaSequence() = 0; + virtual void Add(int value) = 0; + virtual void Remove(int index) = 0; + virtual void ChangeValue(int index, int value) = 0; + virtual int Value(int index) = 0; + virtual int Length() = 0; + +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeSequenceOfReal.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeSequenceOfReal.hxx new file mode 100644 index 000000000..e30df3bde --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeSequenceOfReal.hxx @@ -0,0 +1,28 @@ +// File : SALOMEDSClient_AttributeSequenceOfSequenceOfReal.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeSequenceOfSequenceOfReal_HeaderFile +#define SALOMEDSClient_AttributeSequenceOfSequenceOfReal_HeaderFile + +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeSequenceOfReal: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual void Assign(const std::vector& other) = 0; + virtual std::vector CorbaSequence() = 0; + virtual void Add(double value) = 0; + virtual void Remove(int index) = 0; + virtual void ChangeValue(int index, double value) = 0; + virtual double Value(int index) = 0; + virtual int Length() = 0; + +}; + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeStudyProperties.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeStudyProperties.hxx new file mode 100644 index 000000000..db7c35d36 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeStudyProperties.hxx @@ -0,0 +1,45 @@ +// File : SALOMEDSClient_AttributeStudyProperties.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeStudyProperties_HeaderFile +#define SALOMEDSClient_AttributeStudyProperties_HeaderFile + +#include +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeStudyProperties: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual void SetUserName(const std::string& theName) = 0; + virtual std::string GetUserName() = 0; + virtual void SetCreationDate(int theMinute, int theHour, int theDay, int theMonth, int theYear) = 0; + virtual bool GetCreationDate(int& theMinute, int& theHour, int& theDay, int& theMonth, int& theYear) = 0; + virtual void SetCreationMode(const std::string& theMode) = 0; + virtual std::string GetCreationMode() = 0; + virtual void SetModified(int theModified) = 0; + virtual bool IsModified() = 0; + virtual int GetModified() = 0; + virtual void SetLocked(bool theLocked) = 0; + virtual bool IsLocked() = 0; + virtual void SetModification(const std::string& theName, + int theMinute, + int theHour, + int theDay, + int theMonth, + int theYear) = 0; + virtual void GetModificationsList(std::vector& theNames, + std::vector& theMinutes, + std::vector& theHours, + std::vector& theDays, + std::vector& theMonths, + std::vector& theYears, + bool theWithCreator) = 0; + +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfInteger.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfInteger.hxx new file mode 100644 index 000000000..2bdeb301c --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfInteger.hxx @@ -0,0 +1,48 @@ +// File : SALOMEDSClient_AttributeTableOfInteger.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeTableOfInteger_HeaderFile +#define SALOMEDSClient_AttributeTableOfInteger_HeaderFile + +#include +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeTableOfInteger: public virtual SALOMEDSClient_GenericAttribute +{ + +public: + + virtual void SetTitle(const std::string& theTitle) = 0; + virtual std::string GetTitle() = 0; + virtual void SetRowTitle(int theIndex, const std::string& theTitle) = 0; + virtual void SetRowTitles(const std::vector& theTitles) = 0; + virtual std::vector GetRowTitles() = 0; + virtual void SetColumnTitle(int theIndex, const std::string& theTitle) = 0; + virtual void SetColumnTitles(const std::vector& theTitles) = 0; + virtual std::vector GetColumnTitles() = 0; + + virtual void SetRowUnit(int theIndex, const std::string& theUnit) = 0; + virtual void SetRowUnits(const std::vector& theUnits) = 0; + virtual std::vector GetRowUnits() = 0; + + virtual int GetNbRows() = 0; + virtual int GetNbColumns() = 0; + virtual void AddRow(const std::vector& theData) = 0; + virtual void SetRow(int theRow, const std::vector& theData) = 0; + virtual std::vector GetRow(int theRow) = 0; + virtual void AddColumn(const std::vector& theData) = 0; + virtual void SetColumn(int theColumn, const std::vector& theData) = 0; + virtual std::vector GetColumn(int theColumn) = 0; + virtual void PutValue(int theValue, int theRow, int theColumn) = 0; + virtual bool HasValue(int theRow, int theColumn) = 0; + virtual int GetValue(int theRow, int theColumn) = 0; + + virtual std::vector GetRowSetIndices(int theRow) = 0; + virtual void SetNbColumns(int theNbColumns) = 0; + +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfReal.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfReal.hxx new file mode 100644 index 000000000..22df706c4 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfReal.hxx @@ -0,0 +1,47 @@ +// File : SALOMEDSClient_AttributeTableOfReal.hxx +// Author : Michael Ponikarov +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeTableOfReal_HeaderFile +#define SALOMEDSClient_AttributeTableOfReal_HeaderFile + +#include +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeTableOfReal: public virtual SALOMEDSClient_GenericAttribute +{ + +public: + + virtual void SetTitle(const std::string& theTitle) = 0; + virtual std::string GetTitle() = 0; + virtual void SetRowTitle(int theIndex, const std::string& theTitle) = 0; + virtual void SetRowTitles(const std::vector& theTitles) = 0; + virtual std::vector GetRowTitles() = 0; + virtual void SetColumnTitle(int theIndex, const std::string& theTitle) = 0; + virtual void SetColumnTitles(const std::vector& theTitles) = 0; + virtual std::vector GetColumnTitles() = 0; + virtual void SetRowUnit(int theIndex, const std::string& theUnit) = 0; + virtual void SetRowUnits(const std::vector& theUnits) = 0; + virtual std::vector GetRowUnits() = 0; + + virtual int GetNbRows() = 0; + virtual int GetNbColumns() = 0; + virtual void AddRow(const std::vector& theData) = 0; + virtual void SetRow(int theRow, const std::vector& theData) = 0; + virtual std::vector GetRow(int theRow) = 0; + virtual void AddColumn(const std::vector& theData) = 0; + virtual void SetColumn(int theColumn, const std::vector& theData) = 0; + virtual std::vector GetColumn(int theColumn) = 0; + virtual void PutValue(double theValue, int theRow, int theColumn) = 0; + virtual bool HasValue(int theRow, int theColumn) = 0; + virtual double GetValue(int theRow, int theColumn) = 0; + + virtual std::vector GetRowSetIndices(int theRow) = 0; + virtual void SetNbColumns(int theNbColumns) = 0; + +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfString.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfString.hxx new file mode 100644 index 000000000..ddb7b69da --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeTableOfString.hxx @@ -0,0 +1,47 @@ +// File : SALOMEDSClient_AttributeTableOfString.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeTableOfString_HeaderFile +#define SALOMEDSClient_AttributeTableOfString_HeaderFile + +#include +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeTableOfString: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual void SetTitle(const std::string& theTitle) = 0; + virtual std::string GetTitle() = 0; + virtual void SetRowTitle(int theIndex, const std::string& theTitle) = 0; + virtual void SetRowTitles(const std::vector& theTitles) = 0; + virtual std::vector GetRowTitles() = 0; + virtual void SetColumnTitle(int theIndex, const std::string& theTitle) = 0; + virtual void SetColumnTitles(const std::vector& theTitles) = 0; + virtual std::vector GetColumnTitles() = 0; + + virtual void SetRowUnit(int theIndex, const std::string& theUnit) = 0; + virtual void SetRowUnits(const std::vector& theUnits) = 0; + virtual std::vector GetRowUnits() = 0; + + virtual int GetNbRows() = 0; + virtual int GetNbColumns() = 0; + virtual void AddRow(const std::vector& theData) = 0; + virtual void SetRow(int theRow, const std::vector& theData) = 0; + virtual std::vector GetRow(int theRow) = 0; + virtual void AddColumn(const std::vector& theData) = 0; + virtual void SetColumn(int theColumn, const std::vector& theData) = 0; + virtual std::vector GetColumn(int theColumn) = 0; + virtual void PutValue(const std::string& theValue, int theRow, int theColumn) = 0; + virtual bool HasValue(int theRow, int theColumn) = 0; + virtual std::string GetValue(int theRow, int theColumn) = 0; + + virtual std::vector GetRowSetIndices(int theRow) = 0; + virtual void SetNbColumns(int theNbColumns) = 0; + +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeTarget.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeTarget.hxx new file mode 100644 index 000000000..bb221ed5c --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeTarget.hxx @@ -0,0 +1,21 @@ +// File : SALOMEDSClient_AttributeTarget.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeTarget_HeaderFile +#define SALOMEDSClient_AttributeTarget_HeaderFile + +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_SObject.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeTarget: public virtual SALOMEDSClient_GenericAttribute +{ +public: + virtual void Add(const _PTR(SObject)& theObject) = 0; + virtual std::vector<_PTR(SObject)> Get() = 0; + virtual void Remove(const _PTR(SObject)& theObject) = 0; +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeTextColor.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeTextColor.hxx new file mode 100644 index 000000000..84f722cc0 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeTextColor.hxx @@ -0,0 +1,23 @@ +// File : SALOMEDSClient_AttributeTextColor.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeTextColor_HeaderFile +#define SALOMEDSClient_AttributeTextColor_HeaderFile + +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include "SALOMEDSClient_definitions.hxx" + +class SALOMEDSClient_AttributeTextColor: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual STextColor TextColor() = 0; + virtual void SetTextColor(STextColor value) = 0; + +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeTextHighlightColor.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeTextHighlightColor.hxx new file mode 100644 index 000000000..ecc03a7ab --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeTextHighlightColor.hxx @@ -0,0 +1,21 @@ +// File : SALOMEDSClient_AttributeTextHighlightColor.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeTextHighlightColor_HeaderFile +#define SALOMEDSClient_AttributeTextHighlightColor_HeaderFile + +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include "SALOMEDSClient_definitions.hxx" + +class SALOMEDSClient_AttributeTextHighlightColor: public virtual SALOMEDSClient_GenericAttribute +{ +public: + virtual STextColor TextHighlightColor() = 0; + virtual void SetTextHighlightColor(STextColor value) = 0; +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeTreeNode.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeTreeNode.hxx new file mode 100644 index 000000000..8cfe7715b --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeTreeNode.hxx @@ -0,0 +1,43 @@ +// File : SALOMEDSClient_AttributeTreeNode.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeTreeNode_HeaderFile +#define SALOMEDSClient_AttributeTreeNode_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" + +class SALOMEDSClient_AttributeTreeNode +{ +public: + + virtual void SetFather(const _PTR(AttributeTreeNode)& value) = 0; + virtual bool HasFather() = 0; + virtual _PTR(AttributeTreeNode) GetFather() = 0; + virtual void SetPrevious(const _PTR(AttributeTreeNode)& value) = 0; + virtual bool HasPrevious() = 0; + virtual _PTR(AttributeTreeNode) GetPrevious() = 0; + virtual void SetNext(const _PTR(AttributeTreeNode)& value) = 0; + virtual bool HasNext() = 0; + virtual _PTR(AttributeTreeNode) GetNext() = 0; + virtual void SetFirst(const _PTR(AttributeTreeNode)& value) = 0; + virtual bool HasFirst() = 0; + virtual _PTR(AttributeTreeNode) GetFirst() = 0; + virtual void SetTreeID(const std::string& value) = 0; + virtual std::string GetTreeID() = 0; + virtual void Append(const _PTR(AttributeTreeNode)& value) = 0; + virtual void Prepend(const _PTR(AttributeTreeNode)& value) = 0; + virtual void InsertBefore(const _PTR(AttributeTreeNode)& value) = 0; + virtual void InsertAfter(const _PTR(AttributeTreeNode)& value) = 0; + virtual void Remove() = 0; + virtual int Depth() = 0; + virtual bool IsRoot() = 0; + virtual bool IsDescendant(const _PTR(AttributeTreeNode)& value) = 0; + virtual bool IsFather(const _PTR(AttributeTreeNode)& value) = 0; + virtual bool IsChild(const _PTR(AttributeTreeNode)& value) = 0; + virtual std::string Label() = 0; + +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_AttributeUserID.hxx b/src/SALOMEDSClient/SALOMEDSClient_AttributeUserID.hxx new file mode 100644 index 000000000..6e9007065 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_AttributeUserID.hxx @@ -0,0 +1,24 @@ +// File : SALOMEDSClient_AttributeUserID.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSClient_AttributeUserID_HeaderFile +#define SALOMEDSClient_AttributeUserID_HeaderFile + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_AttributeUserID: public virtual SALOMEDSClient_GenericAttribute +{ +public: + + virtual std::string Value() = 0; + virtual void SetValue(const std::string& value) = 0; + +}; + + + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_ChildIterator.hxx b/src/SALOMEDSClient/SALOMEDSClient_ChildIterator.hxx new file mode 100644 index 000000000..6fa372013 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_ChildIterator.hxx @@ -0,0 +1,22 @@ +// File : SALOMEDSClient_ChildIterator.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSClient_CHILDITERATOR_H__ +#define __SALOMEDSClient_CHILDITERATOR_H__ + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_SObject.hxx" + +class SALOMEDSClient_ChildIterator +{ +public: + virtual ~SALOMEDSClient_ChildIterator() {} + + virtual void Init() = 0; + virtual void InitEx(bool) = 0; + virtual bool More() = 0; + virtual void Next() = 0; + virtual _PTR(SObject) Value() = 0; +}; +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_GenericAttribute.hxx b/src/SALOMEDSClient/SALOMEDSClient_GenericAttribute.hxx new file mode 100644 index 000000000..4d1f23482 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_GenericAttribute.hxx @@ -0,0 +1,23 @@ +// File : SALOMEDSClient__GenericAttribute.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _GENERICCLIENT_ATTRIBUTE_HXX_ +#define _GENERICCLIENT_ATTRIBUTE_HXX_ + +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_SObject.hxx" + +class SALOMEDSClient_GenericAttribute +{ +public: + virtual ~SALOMEDSClient_GenericAttribute() {} + + virtual void CheckLocked() = 0; + virtual std::string Type() = 0; + virtual std::string GetClassType() = 0; + virtual _PTR(SObject) GetSObject() = 0; +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_SComponent.hxx b/src/SALOMEDSClient/SALOMEDSClient_SComponent.hxx new file mode 100644 index 000000000..dc2a5c054 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_SComponent.hxx @@ -0,0 +1,21 @@ +// File : SALOMEDSClient_SComponent.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSCLIENT_SCOMPONENT_H__ +#define __SALOMEDSCLIENT_SCOMPONENT_H__ + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_SObject.hxx" +#include + +class SALOMEDSClient_SComponent: public virtual SALOMEDSClient_SObject +{ +public: + virtual ~SALOMEDSClient_SComponent() {} + + virtual std::string ComponentDataType() = 0; + virtual bool ComponentIOR(std::string& theID) = 0; + +}; +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_SComponentIterator.hxx b/src/SALOMEDSClient/SALOMEDSClient_SComponentIterator.hxx new file mode 100644 index 000000000..40cd3cec6 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_SComponentIterator.hxx @@ -0,0 +1,22 @@ +// File : SALOMEDSClient_SComponentIterator.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSClient_SCOMPONENTITERATOR_H__ +#define __SALOMEDSClient_SCOMPONENTITERATOR_H__ + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_SComponent.hxx" + +class SALOMEDSClient_SComponentIterator +{ +public: + virtual ~SALOMEDSClient_SComponentIterator() {} + + virtual void Init() = 0; + virtual bool More() = 0; + virtual void Next() = 0; + virtual _PTR(SComponent) Value() = 0; +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_SObject.hxx b/src/SALOMEDSClient/SALOMEDSClient_SObject.hxx new file mode 100644 index 000000000..7bc4e7af6 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_SObject.hxx @@ -0,0 +1,40 @@ +// File : SALOMEDSClient_SObject.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSCLIENT_SOBJECT_H__ +#define __SALOMEDSCLIENT_SOBJECT_H__ + +// std C++ headers +#include +#include + +#include "SALOMEDSClient_definitions.hxx" + +class SALOMEDSClient_Study; +class SALOMEDSClient_SComponent; +class SALOMEDSClient_GenericAttribute; + +class SALOMEDSClient_SObject +{ +public: + virtual ~SALOMEDSClient_SObject() {} + + virtual std::string GetID() = 0; + virtual _PTR(SComponent) GetFatherComponent() = 0; + virtual _PTR(SObject) GetFather() = 0; + virtual bool FindAttribute(_PTR(GenericAttribute)& anAttribute, const std::string& aTypeOfAttribute) = 0; + virtual bool ReferencedObject(_PTR(SObject)& theObject) = 0; + virtual bool FindSubObject(int theTag, _PTR(SObject)& theObject) = 0; + virtual _PTR(Study) GetStudy() = 0; + virtual std::string Name() = 0; + virtual void Name(const std::string& theName) = 0; + virtual std::vector<_PTR(GenericAttribute)> GetAllAttributes() = 0; + virtual std::string GetName() = 0; + virtual std::string GetComment() = 0; + virtual std::string GetIOR() = 0; + virtual int Tag() = 0; + virtual int Depth() = 0; +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_Study.hxx b/src/SALOMEDSClient/SALOMEDSClient_Study.hxx new file mode 100644 index 000000000..2140d3322 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_Study.hxx @@ -0,0 +1,67 @@ +// File : SALOMEDSClient_Study.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSClient_STUDY_H__ +#define __SALOMEDSClient_STUDY_H__ + +#include +#include + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_SComponentIterator.hxx" +#include "SALOMEDSClient_StudyBuilder.hxx" +#include "SALOMEDSClient_SObject.hxx" +#include "SALOMEDSClient_SComponent.hxx" +#include "SALOMEDSClient_UseCaseBuilder.hxx" +#include "SALOMEDSClient_AttributeStudyProperties.hxx" +#include "SALOMEDSClient_ChildIterator.hxx" + +class SALOMEDSClient_Study +{ + +public: + virtual ~SALOMEDSClient_Study() {} + + virtual std::string GetPersistentReference() = 0; + virtual std::string GetTransientReference() = 0; + virtual bool IsEmpty() = 0; + virtual _PTR(SComponent) FindComponent (const std::string& aComponentName) = 0; + virtual _PTR(SComponent) FindComponentID(const std::string& aComponentID) = 0; + virtual _PTR(SObject) FindObject(const std::string& anObjectName) = 0; + virtual std::vector<_PTR(SObject)> FindObjectByName( const std::string& anObjectName, const std::string& aComponentName ) = 0; + virtual _PTR(SObject) FindObjectID(const std::string& anObjectID) = 0; + virtual _PTR(SObject) CreateObjectID(const std::string& anObjectID) = 0; + virtual _PTR(SObject) FindObjectIOR(const std::string& anObjectIOR) = 0; + virtual _PTR(SObject) FindObjectByPath(const std::string& thePath) = 0; + virtual std::string GetObjectPath(const _PTR(SObject)& theSO) = 0; + virtual void SetContext(const std::string& thePath) = 0; + virtual std::string GetContext() = 0; + virtual std::vector GetObjectNames(const std::string& theContext) = 0; + virtual std::vector GetDirectoryNames(const std::string& theContext) = 0; + virtual std::vector GetFileNames(const std::string& theContext) = 0; + virtual std::vector GetComponentNames(const std::string& theContext) = 0; + virtual _PTR(ChildIterator) NewChildIterator(const _PTR(SObject)& theSO) = 0; + virtual _PTR(SComponentIterator) NewComponentIterator() = 0; + virtual _PTR(StudyBuilder) NewBuilder() = 0; + virtual std::string Name() = 0; + virtual void Name(const std::string& name) = 0; + virtual bool IsSaved() = 0; + virtual void IsSaved(bool save) = 0; + virtual bool IsModified() = 0; + virtual std::string URL() = 0; + virtual void URL(const std::string& url) = 0; + virtual int StudyId() = 0; + virtual void StudyId(int id) = 0; + virtual std::vector<_PTR(SObject)> FindDependances(const _PTR(SObject)& theSO) = 0; + virtual _PTR(AttributeStudyProperties) GetProperties() = 0; + virtual std::string GetLastModificationDate() = 0; + virtual std::vector GetModificationsDate() = 0; + virtual _PTR(UseCaseBuilder) GetUseCaseBuilder() = 0; + virtual void Close() = 0; + virtual void EnableUseCaseAutoFilling(bool isEnabled) = 0; + virtual bool DumpStudy(const std::string& thePath, const std::string& theBaseName, bool isPublished) = 0; +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_StudyBuilder.hxx b/src/SALOMEDSClient/SALOMEDSClient_StudyBuilder.hxx new file mode 100644 index 000000000..9066fb451 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_StudyBuilder.hxx @@ -0,0 +1,53 @@ +// File : SALOMEDSClient_StudyBuilder.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSClient_STUDYBUILDER_H__ +#define __SALOMEDSClient_STUDYBUILDER_H__ + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_SObject.hxx" +#include "SALOMEDSClient_SComponent.hxx" +#include "SALOMEDSClient_GenericAttribute.hxx" +#include + +class SALOMEDSClient_StudyBuilder +{ +public: + virtual ~SALOMEDSClient_StudyBuilder() {} + + virtual _PTR(SComponent) NewComponent(const std::string& ComponentDataType) = 0; + virtual void DefineComponentInstance (const _PTR(SComponent)&, const std::string& ComponentIOR) = 0; + virtual void RemoveComponent(const _PTR(SComponent)& theSCO) = 0; + virtual _PTR(SObject) NewObject(const _PTR(SObject)& theFatherObject) = 0; + virtual _PTR(SObject) NewObjectToTag(const _PTR(SObject)& theFatherObject, int theTag) = 0; + virtual void AddDirectory(const std::string& thePath) = 0; + virtual void LoadWith(const _PTR(SComponent)& theSCO, const std::string& theIOR) = 0; + virtual void Load(const _PTR(SObject)& theSCO) = 0; + virtual void RemoveObject(const _PTR(SObject)& theSO) = 0; + virtual void RemoveObjectWithChildren(const _PTR(SObject)& theSO) = 0; + virtual _PTR(GenericAttribute) FindOrCreateAttribute(const _PTR(SObject)& theSO, const std::string& aTypeOfAttribute) = 0; + virtual bool FindAttribute(const _PTR(SObject)& theSO, + _PTR(GenericAttribute)& theAttribute, + const std::string& aTypeOfAttribute) = 0; + virtual void RemoveAttribute(const _PTR(SObject)& theSO, const std::string& aTypeOfAttribute) = 0; + virtual void Addreference(const _PTR(SObject)& me, const _PTR(SObject)& thereferencedObject) = 0; + virtual void RemoveReference(const _PTR(SObject)& me) = 0; + virtual void SetGUID(const _PTR(SObject)& theSO, const std::string& theGUID) = 0; + virtual bool IsGUID(const _PTR(SObject)& theSO, const std::string& theGUID) = 0; + virtual void NewCommand() = 0; + virtual void CommitCommand()= 0; + virtual bool HasOpenCommand() = 0; + virtual void AbortCommand() = 0; + virtual void Undo() = 0; + virtual void Redo() = 0; + virtual bool GetAvailableUndos() = 0; + virtual bool GetAvailableRedos() = 0; + virtual int UndoLimit() = 0; + virtual void UndoLimit(int theLimit) = 0; + virtual void SetName(const _PTR(SObject)& theSO, const std::string& theValue) = 0; + virtual void SetComment(const _PTR(SObject)& theSO, const std::string& theValue) = 0; + virtual void SetIOR(const _PTR(SObject)& theSO, const std::string& theValue) = 0; +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_StudyManager.hxx b/src/SALOMEDSClient/SALOMEDSClient_StudyManager.hxx new file mode 100644 index 000000000..9e50d0a87 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_StudyManager.hxx @@ -0,0 +1,36 @@ +// File : SALOMEDSClient_StudyManager.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSClient_STUDYMANAGER_H__ +#define __SALOMEDSClient_STUDYMANAGER_H__ + +#include +#include + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_Study.hxx" + +class SALOMEDSClient_StudyManager +{ +public: + virtual ~SALOMEDSClient_StudyManager() {} + + virtual _PTR(Study) NewStudy(const std::string& study_name) = 0; + virtual _PTR(Study) Open(const std::string& theStudyUrl) = 0; + virtual void Close(const _PTR(Study)& theStudy) = 0; + virtual void Save(const _PTR(Study)& theStudy, bool theMultiFile) = 0; + virtual void SaveASCII(const _PTR(Study)& theStudy, bool theMultiFile) = 0; + virtual void SaveAs(const std::string& theUrl, const _PTR(Study)& theStudy, bool theMultiFile) = 0; + virtual void SaveAsASCII(const std::string& theUrl, const _PTR(Study)& theStudy, bool theMultiFile) = 0; + virtual std::vector GetOpenStudies() = 0; + virtual _PTR(Study) GetStudyByName(const std::string& theStudyName) = 0; + virtual _PTR(Study) GetStudyByID(int theStudyID) = 0; + virtual bool CanCopy(const _PTR(SObject)& theSO) = 0; + virtual bool Copy(const _PTR(SObject)& theSO) = 0; + virtual bool CanPaste(const _PTR(SObject)& theSO) = 0; + virtual _PTR(SObject) Paste(const _PTR(SObject)& theSO) = 0; + +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_UseCaseBuilder.hxx b/src/SALOMEDSClient/SALOMEDSClient_UseCaseBuilder.hxx new file mode 100644 index 000000000..e535f06cb --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_UseCaseBuilder.hxx @@ -0,0 +1,35 @@ +// File : SALOMEDSClient_UseCaseBuilder.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSClient_USECaseBuilder_H__ +#define __SALOMEDSClient_USECaseBuilder_H__ + +#include +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_UseCaseIterator.hxx" +#include "SALOMEDSClient_SObject.hxx" + +class SALOMEDSClient_UseCaseBuilder +{ +public: + virtual ~SALOMEDSClient_UseCaseBuilder() {} + + virtual bool Append(const _PTR(SObject)& theObject) = 0; + virtual bool Remove(const _PTR(SObject)& theObject) = 0; + virtual bool AppendTo(const _PTR(SObject)& theFather, _PTR(SObject) theObject) = 0; + virtual bool InsertBefore(const _PTR(SObject)& theFirst, _PTR(SObject) theNext) = 0; + virtual bool SetCurrentObject(const _PTR(SObject)& theObject) = 0; + virtual bool SetRootCurrent() = 0; + virtual bool HasChildren(const _PTR(SObject)& theObject) = 0; + virtual bool IsUseCase(const _PTR(SObject)& theObject) = 0; + virtual bool SetName(const std::string& theName) = 0; + virtual _PTR(SObject) GetCurrentObject() = 0; + virtual std::string GetName() = 0; + virtual _PTR(SObject) AddUseCase(const std::string& theName) = 0; + virtual _PTR(UseCaseIterator) GetUseCaseIterator(const _PTR(SObject)& anObject) = 0; + +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_UseCaseIterator.hxx b/src/SALOMEDSClient/SALOMEDSClient_UseCaseIterator.hxx new file mode 100644 index 000000000..41376b52b --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_UseCaseIterator.hxx @@ -0,0 +1,23 @@ +// File : SALOMEDSClient_UseCaseIterator.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSClient_USECASEITERATOR_H__ +#define __SALOMEDSClient_USECASEITERATOR_H__ + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_SObject.hxx" + +class SALOMEDSClient_UseCaseIterator +{ + +public: + virtual ~SALOMEDSClient_UseCaseIterator() {} + + virtual void Init(bool) = 0; + virtual bool More() = 0; + virtual void Next() = 0; + virtual _PTR(SObject) Value() = 0; +}; + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_definitions.hxx b/src/SALOMEDSClient/SALOMEDSClient_definitions.hxx new file mode 100644 index 000000000..2176ff1d3 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_definitions.hxx @@ -0,0 +1,50 @@ +#ifndef SALOMEDSCLIENT_DEF_HXX +#define SALOMEDSCLIENT_DEF_HXX + +#include + +template class clt_shared_ptr: public boost::shared_ptr +{ +public: + clt_shared_ptr() {} + + template + explicit clt_shared_ptr(Y * p) + { + reset(p); + } + + template + clt_shared_ptr(clt_shared_ptr const & r): + boost::shared_ptr(r,boost::detail::dynamic_cast_tag()) + {} + + template + clt_shared_ptr & operator=(clt_shared_ptr const & r) + { + clt_shared_ptr(r).swap(*this); + return *this; + } + + template clt_shared_ptr& operator()(Y * p) // Y must be complete + { + if(T* pt = dynamic_cast(p)) + boost::shared_ptr::reset(pt); + else + boost::throw_exception(std::bad_cast()); + return *this; + } + +}; + +#define _PTR(Class) clt_shared_ptr +#define _CAST(Class, shared_ptr_Obj) dynamic_cast(shared_ptr_Obj.get()) + +struct STextColor +{ + double R; + double G; + double B; +}; + +#endif diff --git a/src/SALOMEDSImpl/Makefile.in b/src/SALOMEDSImpl/Makefile.in new file mode 100644 index 000000000..de9c3e58b --- /dev/null +++ b/src/SALOMEDSImpl/Makefile.in @@ -0,0 +1,133 @@ +# File : Makefile.in +# Author : Sergey RUIN +# Module : SALOME + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_srcdir)/idl + + +@COMMENCE@ + +EXPORT_HEADERS= \ + SALOMEDSImpl_Attributes.hxx \ + SALOMEDSImpl_SObject.hxx \ + SALOMEDSImpl_SComponent.hxx \ + SALOMEDSImpl_Driver.hxx \ + SALOMEDSImpl_Callback.hxx \ + SALOMEDSImpl_ChildIterator.hxx \ + SALOMEDSImpl_GenericAttribute.hxx \ + SALOMEDSImpl_AttributeIOR.hxx \ + SALOMEDSImpl_AttributeExternalFileDef.hxx \ + SALOMEDSImpl_AttributeFileType.hxx \ + SALOMEDSImpl_AttributePersistentRef.hxx \ + SALOMEDSImpl_AttributeSequenceOfReal.hxx \ + SALOMEDSImpl_AttributeSequenceOfInteger.hxx \ + SALOMEDSImpl_AttributeDrawable.hxx \ + SALOMEDSImpl_AttributeSelectable.hxx \ + SALOMEDSImpl_AttributeExpandable.hxx \ + SALOMEDSImpl_AttributeOpened.hxx \ + SALOMEDSImpl_AttributeFlags.hxx \ + SALOMEDSImpl_AttributeGraphic.hxx \ + SALOMEDSImpl_AttributeTextColor.hxx \ + SALOMEDSImpl_AttributeTextHighlightColor.hxx \ + SALOMEDSImpl_AttributePixMap.hxx \ + SALOMEDSImpl_AttributeLocalID.hxx \ + SALOMEDSImpl_AttributeTarget.hxx \ + SALOMEDSImpl_AttributeTableOfInteger.hxx \ + SALOMEDSImpl_AttributeTableOfReal.hxx \ + SALOMEDSImpl_AttributeTableOfString.hxx \ + SALOMEDSImpl_AttributeStudyProperties.hxx \ + SALOMEDSImpl_AttributePythonObject.hxx \ + SALOMEDSImpl_AttributeReal.hxx \ + SALOMEDSImpl_AttributeInteger.hxx \ + SALOMEDSImpl_AttributeUserID.hxx \ + SALOMEDSImpl_AttributeTreeNode.hxx \ + SALOMEDSImpl_AttributeName.hxx \ + SALOMEDSImpl_AttributeComment.hxx \ + SALOMEDSImpl_AttributeReference.hxx \ + SALOMEDSImpl_UseCaseBuilder.hxx \ + SALOMEDSImpl_UseCaseIterator.hxx \ + SALOMEDSImpl_SComponentIterator.hxx \ + SALOMEDSImpl_StudyBuilder.hxx \ + SALOMEDSImpl_Study.hxx \ + SALOMEDSImpl_StudyManager.hxx \ + SALOMEDSImpl_OCAFApplication.hxx \ + SALOMEDSImpl_ChildNodeIterator.hxx \ + +LIB_CLIENT_IDL = +LIB_SERVER_IDL = + +# Executables targets +BIN = testDS +BIN_SRC = +BIN_CLIENT_IDL = +BIN_SERVER_IDL = + +# Libraries targets + +LIB = libSalomeDSImpl.la +LIB_SRC = SALOMEDSImpl_Tool.cxx \ + SALOMEDSImpl_Callback.cxx \ + SALOMEDSImpl_StudyHandle.cxx \ + SALOMEDSImpl_GenericAttribute.cxx \ + SALOMEDSImpl_SObject.cxx \ + SALOMEDSImpl_SComponent.cxx \ + SALOMEDSImpl_ChildIterator.cxx \ + SALOMEDSImpl_OCAFApplication.cxx \ + SALOMEDSImpl_AttributeIOR.cxx \ + SALOMEDSImpl_AttributeExternalFileDef.cxx \ + SALOMEDSImpl_AttributeFileType.cxx \ + SALOMEDSImpl_AttributePersistentRef.cxx \ + SALOMEDSImpl_AttributeSequenceOfReal.cxx \ + SALOMEDSImpl_AttributeSequenceOfInteger.cxx \ + SALOMEDSImpl_AttributeDrawable.cxx \ + SALOMEDSImpl_AttributeSelectable.cxx \ + SALOMEDSImpl_AttributeExpandable.cxx \ + SALOMEDSImpl_AttributeOpened.cxx \ + SALOMEDSImpl_AttributeFlags.cxx \ + SALOMEDSImpl_AttributeGraphic.cxx \ + SALOMEDSImpl_AttributeTextColor.cxx \ + SALOMEDSImpl_AttributeTextHighlightColor.cxx \ + SALOMEDSImpl_AttributePixMap.cxx \ + SALOMEDSImpl_AttributeLocalID.cxx \ + SALOMEDSImpl_AttributeTarget.cxx \ + SALOMEDSImpl_AttributeTableOfInteger.cxx \ + SALOMEDSImpl_AttributeTableOfReal.cxx \ + SALOMEDSImpl_AttributeTableOfString.cxx \ + SALOMEDSImpl_AttributeStudyProperties.cxx \ + SALOMEDSImpl_AttributePythonObject.cxx \ + SALOMEDSImpl_AttributeReal.cxx \ + SALOMEDSImpl_AttributeInteger.cxx \ + SALOMEDSImpl_AttributeUserID.cxx \ + SALOMEDSImpl_AttributeTreeNode.cxx \ + SALOMEDSImpl_AttributeName.cxx \ + SALOMEDSImpl_AttributeComment.cxx \ + SALOMEDSImpl_AttributeReference.cxx \ + SALOMEDSImpl_ChildNodeIterator.cxx \ + SALOMEDSImpl_UseCaseBuilder.cxx \ + SALOMEDSImpl_UseCaseIterator.cxx \ + SALOMEDSImpl_SComponentIterator.cxx \ + SALOMEDSImpl_StudyBuilder.cxx \ + SALOMEDSImpl_Study.cxx \ + SALOMEDSImpl_StudyManager.cxx + + + +CPPFLAGS+=$(OCC_INCLUDES) $(HDF5_INCLUDES) +CXXFLAGS+=$(OCC_CXXFLAGS) +LDFLAGS+= $(HDF5_LIBS) -lSalomeHDFPersist $(CAS_LDPATH) -lTKCAF -lTKBO -lTKLCAF -lTKMath -lTKStdSchema -lTKernel + +# _CS_gbo_090604 Ajout Spécifique Calibre 3, pour l'utilisation de la version 5.12 de la bibliothèque OCC. +# La bibliothèque OCC5.12 a été compilée sur Calibre 3 avec l'extention Xmu (impossible de compiler sans). +# On est donc obligé ici, pour permettre l'édition de lien avec les bibliothèques OCC, de spécifier le +# chemin d'accès aux bibliothèques Xmu +# +LDXMUFLAGS= -L/usr/X11R6/lib -lXmu +LDFLAGS+=$(LDXMUFLAGS) +LDFLAGSFORBIN=$(LDFLAGS) -lSalomeHDFPersist + +@CONCLUDE@ + + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeComment.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeComment.cxx new file mode 100644 index 000000000..d31c4b4fb --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeComment.cxx @@ -0,0 +1,88 @@ +// File : SALOMEDSImpl_AttributeComment.cxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef WNT +using namespace std; +#endif +#include "SALOMEDSImpl_AttributeComment.hxx" + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeComment, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeComment, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeComment::GetID () +{ + static Standard_GUID CommentID ("7AF2F7CC-1CA2-4476-BE95-8ACC996BC7B9"); + return CommentID; +} + +Handle(SALOMEDSImpl_AttributeComment) SALOMEDSImpl_AttributeComment::Set (const TDF_Label& L, + const TCollection_ExtendedString& Val) +{ + Handle(SALOMEDSImpl_AttributeComment) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeComment::GetID(), A)) { + A = new SALOMEDSImpl_AttributeComment(); + L.AddAttribute(A); + } + + A->SetValue(Val); + + return A; +} + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeComment::SetValue (const TCollection_ExtendedString& S) +{ + CheckLocked(); + + if(myString == S) return; + + Backup(); + + myString = S; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + +//======================================================================= +//function : ID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeComment::ID () const { return GetID(); } + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeComment::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeComment(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeComment::Restore(const Handle(TDF_Attribute)& with) +{ + myString = Handle(SALOMEDSImpl_AttributeComment)::DownCast (with)->Value (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeComment::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeComment)::DownCast (into)->SetValue(myString); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeComment.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeComment.hxx new file mode 100644 index 000000000..86c5aee80 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeComment.hxx @@ -0,0 +1,51 @@ +// File : SALOMEDSImpl_AttributeIOR.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeComment_HeaderFile +#define _SALOMEDSImpl_AttributeComment_HeaderFile + +#include +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeComment, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeComment : public SALOMEDSImpl_GenericAttribute +{ +private: + + TCollection_ExtendedString myString; + +public: + +Standard_EXPORT static const Standard_GUID& GetID() ; + +Standard_EXPORT SALOMEDSImpl_AttributeComment() :SALOMEDSImpl_GenericAttribute("AttributeComment") {} + +Standard_EXPORT static Handle(SALOMEDSImpl_AttributeComment) Set(const TDF_Label& L, const TCollection_ExtendedString& Val); +Standard_EXPORT void SetValue (const TCollection_ExtendedString& S); +Standard_EXPORT TCollection_ExtendedString Value() const { return myString; } + +Standard_EXPORT virtual TCollection_AsciiString Save() { return myString; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myString = theValue; } + +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; + +Standard_EXPORT ~SALOMEDSImpl_AttributeComment() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeComment ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeDrawable.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeDrawable.cxx new file mode 100644 index 000000000..e7c93508a --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeDrawable.cxx @@ -0,0 +1,105 @@ +// File : SALOMEDSImpl_AttributeDrawable.cxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef WNT +using namespace std; +#endif +#include "SALOMEDSImpl_AttributeDrawable.hxx" + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeDrawable, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeDrawable, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeDrawable::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeDrawableID ("12837184-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeDrawableID; +} + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeDrawable) SALOMEDSImpl_AttributeDrawable::Set (const TDF_Label& L, + const Standard_Integer value) +{ + Handle(SALOMEDSImpl_AttributeDrawable) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeDrawable::GetID(),A)) { + A = new SALOMEDSImpl_AttributeDrawable(); + L.AddAttribute(A); + } + + A->SetDrawable (value); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeDrawable::SALOMEDSImpl_AttributeDrawable() +:SALOMEDSImpl_GenericAttribute("AttributeDrawable") +{ + myValue = 0; +} + +//======================================================================= +//function : SetDrawable +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeDrawable::SetDrawable(const Standard_Integer theValue) +{ + CheckLocked(); + + Backup(); + + (theValue!=0)?myValue=1:myValue=0; +} + + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeDrawable::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeDrawable::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeDrawable(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeDrawable::Restore(const Handle(TDF_Attribute)& with) +{ + myValue = Handle(SALOMEDSImpl_AttributeDrawable)::DownCast (with)->IsDrawable (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeDrawable::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeDrawable)::DownCast (into)->SetDrawable (myValue); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeDrawable.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeDrawable.hxx new file mode 100644 index 000000000..4ae08511c --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeDrawable.hxx @@ -0,0 +1,48 @@ +// File : SALOMEDSImpl_AttributeDrawable.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeDrawable_HeaderFile +#define _SALOMEDSImpl_AttributeDrawable_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeDrawable, SALOMEDSImpl_GenericAttribute ) + + +class SALOMEDSImpl_AttributeDrawable : public SALOMEDSImpl_GenericAttribute +{ +private: +Standard_Integer myValue; + +public: +Standard_EXPORT virtual TCollection_AsciiString Save() { return (myValue == 0)?(char*)"0":(char*)"1"; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { (theValue == "0")?myValue=0:myValue=1; } + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeDrawable Set(const TDF_Label& label,const Standard_Integer value) ; + +Standard_EXPORT void SetDrawable(const Standard_Integer theValue); +Standard_EXPORT Standard_Integer IsDrawable() const { return myValue; } +Standard_EXPORT SALOMEDSImpl_AttributeDrawable(); +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeDrawable() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeDrawable ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExpandable.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExpandable.cxx new file mode 100644 index 000000000..7688f77ec --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExpandable.cxx @@ -0,0 +1,104 @@ +// File : SALOMEDSImpl_AttributeExpandable.cxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef WNT +using namespace std; +#endif +#include "SALOMEDSImpl_AttributeExpandable.hxx" + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeExpandable, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeExpandable, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeExpandable::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeExpandableID ("12837185-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeExpandableID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= +Handle(SALOMEDSImpl_AttributeExpandable) SALOMEDSImpl_AttributeExpandable::Set (const TDF_Label& L, + const Standard_Integer value) +{ + Handle(SALOMEDSImpl_AttributeExpandable) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeExpandable::GetID(),A)) { + A = new SALOMEDSImpl_AttributeExpandable(); + L.AddAttribute(A); + } + + A->SetExpandable(value); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeExpandable::SALOMEDSImpl_AttributeExpandable() +:SALOMEDSImpl_GenericAttribute("AttributeExpandable") +{ + myValue = 0; +} + +//======================================================================= +//function : SetExpandable +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeExpandable::SetExpandable(const Standard_Integer theValue) +{ + CheckLocked(); + + Backup(); + + (theValue!=0)?myValue=1:myValue=0; +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeExpandable::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeExpandable::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeExpandable(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeExpandable::Restore(const Handle(TDF_Attribute)& with) +{ + myValue = Handle(SALOMEDSImpl_AttributeExpandable)::DownCast (with)->IsExpandable (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeExpandable::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeExpandable)::DownCast (into)->SetExpandable (myValue); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExpandable.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExpandable.hxx new file mode 100644 index 000000000..a31cf02d5 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExpandable.hxx @@ -0,0 +1,47 @@ +// File : SALOMEDSImpl_AttributeExpandable.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeExpandable_HeaderFile +#define _SALOMEDSImpl_AttributeExpandable_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeExpandable, SALOMEDSImpl_GenericAttribute ) + + +class SALOMEDSImpl_AttributeExpandable : public SALOMEDSImpl_GenericAttribute +{ +private: +Standard_Integer myValue; + +public: + +Standard_EXPORT virtual TCollection_AsciiString Save() { return (myValue == 0)?(char*)"0":(char*)"1"; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { (theValue == "0")?myValue=0:myValue=1; } + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeExpandable Set(const TDF_Label& label,const Standard_Integer value) ; +Standard_EXPORT SALOMEDSImpl_AttributeExpandable(); +Standard_EXPORT void SetExpandable(const Standard_Integer value); +Standard_EXPORT int IsExpandable() const { return myValue; } +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeExpandable() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeExpandable ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExternalFileDef.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExternalFileDef.cxx new file mode 100644 index 000000000..68564dfd9 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExternalFileDef.cxx @@ -0,0 +1,104 @@ +// File : SALOMEDSImpl_AttributeExternalFileDef.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeExternalFileDef.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeExternalFileDef, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeExternalFileDef, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeExternalFileDef::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeExternalFileDefID ("7123AD4C-ACDB-4e3a-8FDC-70EA164D2CBE"); + return SALOMEDSImpl_AttributeExternalFileDefID; +} + +//======================================================================= +//function : Set +//purpose : +//======================================================================= +Handle(SALOMEDSImpl_AttributeExternalFileDef) +SALOMEDSImpl_AttributeExternalFileDef::Set (const TDF_Label& L, const TCollection_ExtendedString& S) +{ + + Handle(SALOMEDSImpl_AttributeExternalFileDef) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeExternalFileDef::GetID(),A)) { + A = new SALOMEDSImpl_AttributeExternalFileDef(); + L.AddAttribute(A); + } + + A->SetValue (S); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeExternalFileDef::SALOMEDSImpl_AttributeExternalFileDef() +:SALOMEDSImpl_GenericAttribute("AttributeExternalFileDef") +{ +} + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeExternalFileDef::SetValue (const TCollection_ExtendedString& S) +{ + CheckLocked(); + + if(myString == S) return; + + Backup(); + + myString = S; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + + +//======================================================================= +//function : ID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeExternalFileDef::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeExternalFileDef::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeExternalFileDef(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeExternalFileDef::Restore(const Handle(TDF_Attribute)& with) +{ + myString = Handle(SALOMEDSImpl_AttributeExternalFileDef)::DownCast (with)->Value (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeExternalFileDef::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeExternalFileDef) anAttr = Handle(SALOMEDSImpl_AttributeExternalFileDef)::DownCast(into); + anAttr->SetValue(myString); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExternalFileDef.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExternalFileDef.hxx new file mode 100644 index 000000000..6e74704ca --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeExternalFileDef.hxx @@ -0,0 +1,44 @@ + +#ifndef _SALOMEDSImpl_AttributeExternalFileDef_HeaderFile +#define _SALOMEDSImpl_AttributeExternalFileDef_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeExternalFileDef, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeExternalFileDef : public SALOMEDSImpl_GenericAttribute +{ +private: + + TCollection_ExtendedString myString; + +public: +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeExternalFileDef Set(const TDF_Label& label, + const TCollection_ExtendedString& Name); +Standard_EXPORT SALOMEDSImpl_AttributeExternalFileDef(); +Standard_EXPORT void SetValue(const TCollection_ExtendedString& value); +Standard_EXPORT TCollection_ExtendedString Value() const { return myString; } +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeExternalFileDef() {} + +Standard_EXPORT virtual TCollection_AsciiString Save() { return myString; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myString = theValue; } + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeExternalFileDef ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFileType.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFileType.cxx new file mode 100644 index 000000000..004592bb0 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFileType.cxx @@ -0,0 +1,109 @@ +// File : SALOMEDSImpl_AttributeFileType.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeFileType.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeFileType, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeFileType, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeFileType::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeFileTypeID ("0181B525-3F15-4ab2-9DE3-5E2F54B5F340"); + return SALOMEDSImpl_AttributeFileTypeID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeFileType) SALOMEDSImpl_AttributeFileType::Set (const TDF_Label& L, + const TCollection_ExtendedString& S) +{ + + Handle(SALOMEDSImpl_AttributeFileType) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeFileType::GetID(),A)) { + A = new SALOMEDSImpl_AttributeFileType(); + L.AddAttribute(A); + } + + A->SetValue (S); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeFileType::SALOMEDSImpl_AttributeFileType() +:SALOMEDSImpl_GenericAttribute("AttributeFileType") +{ +} + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeFileType::SetValue (const TCollection_ExtendedString& S) +{ + CheckLocked(); + + if(myString == S) return; + + Backup(); + + myString = S; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeFileType::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeFileType::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeFileType(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeFileType::Restore(const Handle(TDF_Attribute)& with) +{ + myString = Handle(SALOMEDSImpl_AttributeFileType)::DownCast (with)->Value (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeFileType::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeFileType)::DownCast (into)->SetValue (myString); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFileType.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFileType.hxx new file mode 100644 index 000000000..3e643b19a --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFileType.hxx @@ -0,0 +1,45 @@ + +#ifndef _SALOMEDSImpl_AttributeFileType_HeaderFile +#define _SALOMEDSImpl_AttributeFileType_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeFileType, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeFileType : public SALOMEDSImpl_GenericAttribute +{ +private: + + TCollection_ExtendedString myString; + +public: +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeFileType Set(const TDF_Label& label, + const TCollection_ExtendedString& Name) ; +Standard_EXPORT SALOMEDSImpl_AttributeFileType(); +Standard_EXPORT void SetValue(const TCollection_ExtendedString& value); +Standard_EXPORT TCollection_ExtendedString Value() const { return myString; } +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeFileType() {} + +Standard_EXPORT virtual TCollection_AsciiString Save() { return myString; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myString = theValue; } + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeFileType ) +}; + + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFlags.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFlags.cxx new file mode 100644 index 000000000..0406fef31 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFlags.cxx @@ -0,0 +1,138 @@ +// File : SALOMEDSImpl_AttributeFlags.cxx +// Author : Sergey LITONIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeFlags.hxx" +#include + +using namespace std; + + +/* + Class : SALOMEDSImpl_AttributeFlags + Description : This class is intended for storing different object attributes that + have only two states (0 and 1). +*/ + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeFlags, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeFlags, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::GetID +//purpose : Get GUID of this attribute +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeFlags::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeFlagsID( "866EEC9F-A517-4cb4-88E6-E208DB8FC96F" ); + return SALOMEDSImpl_AttributeFlagsID; +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::Set +//purpose : Set value of the attribute +//======================================================================= +Handle(SALOMEDSImpl_AttributeFlags) SALOMEDSImpl_AttributeFlags::Set(const TDF_Label& L, + const Standard_Integer value ) +{ + Handle(SALOMEDSImpl_AttributeFlags) A; + if ( !L.FindAttribute(SALOMEDSImpl_AttributeFlags::GetID(),A ) ) + { + A = new SALOMEDSImpl_AttributeFlags(); + L.AddAttribute( A ); + } + + A->Set( value ); + return A; +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::SALOMEDSImpl_AttributeFlags +//purpose : Constructor +//======================================================================= +SALOMEDSImpl_AttributeFlags::SALOMEDSImpl_AttributeFlags() +:SALOMEDSImpl_GenericAttribute("AttributeFlags") +{ + myValue = 0; +} + +SALOMEDSImpl_AttributeFlags::~SALOMEDSImpl_AttributeFlags() +{ +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::ID +//purpose : Get GUID of this attribute +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeFlags::ID () const +{ + return GetID(); +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::NewEmpty +//purpose : Create new empty attribute +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeFlags::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeFlags(); +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::Restore +//purpose : Assign given value to the attribute +//======================================================================= +void SALOMEDSImpl_AttributeFlags::Restore( const Handle(TDF_Attribute)& with ) +{ + myValue = Handle(SALOMEDSImpl_AttributeFlags)::DownCast( with )->Get(); + return; +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::Paste +//purpose : Assign internal value to the given attribute +//======================================================================= +void SALOMEDSImpl_AttributeFlags::Paste(const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT ) const +{ + Handle(SALOMEDSImpl_AttributeFlags)::DownCast( into )->Set( myValue ); +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::Set +//purpose : Set value +//======================================================================= +void SALOMEDSImpl_AttributeFlags::Set( const Standard_Integer v ) +{ + Backup(); + myValue=v; +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeFlags::Get +//purpose : GetValue +//======================================================================= +Standard_Integer SALOMEDSImpl_AttributeFlags::Get() const +{ + return myValue; +} + + + + + + + + + + + + + + + + + + + + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFlags.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFlags.hxx new file mode 100644 index 000000000..a865bb2d3 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeFlags.hxx @@ -0,0 +1,54 @@ +// File : SALOMEDSImpl_AttributeFlags.hxx +// Author : Sergey LITONIN +// Module : SALOME + +#ifndef SALOMEDSImpl_AttributeFlags_HeaderFile +#define SALOMEDSImpl_AttributeFlags_HeaderFile + +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +/* + Class : SALOMEDSImpl_AttributeFlags + Description : This class is intended for storing different object attributes that + have only two states (0 and 1). +*/ + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeFlags, SALOMEDSImpl_GenericAttribute ) + +#ifndef WNT +class Standard_EXPORT SALOMEDSImpl_AttributeFlags : public SALOMEDSImpl_GenericAttribute +#else +class SALOMEDSImpl_AttributeFlags : public SALOMEDSImpl_GenericAttribute +#endif +{ +private: +Standard_Integer myValue; + +public: +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle(SALOMEDSImpl_AttributeFlags) Set(const TDF_Label&, const Standard_Integer ); + + SALOMEDSImpl_AttributeFlags(); +Standard_EXPORT virtual ~SALOMEDSImpl_AttributeFlags(); + +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore( const Handle(TDF_Attribute)& with ); +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste( const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT ) const; +Standard_EXPORT void Set( const Standard_Integer ); +Standard_EXPORT Standard_Integer Get() const; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeFlags ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeGraphic.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeGraphic.cxx new file mode 100644 index 000000000..062a6c75b --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeGraphic.cxx @@ -0,0 +1,161 @@ +// File : SALOMEDSImpl_AttributeGraphic.cxx +// Author : Sergey LITONIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeGraphic.hxx" +#include +#include +#include + +/* + Class : SALOMEDSImpl_AttributeGraphic + Description : This class is intended for storing information about + graphic representation of objects in dirrent views +*/ + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeGraphic, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeGraphic, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : Get GUID of this attribute +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeGraphic::GetID() +{ + static Standard_GUID SALOMEDSImpl_AttributeGraphicID( "F17AE8F0-E354-4d6f-8E42-38385C36E67E" ); + return SALOMEDSImpl_AttributeGraphicID; +} + +//======================================================================= +//function : SALOMEDSImpl_AttributeGraphic +//purpose : Empty Constructor +//======================================================================= +SALOMEDSImpl_AttributeGraphic::SALOMEDSImpl_AttributeGraphic() +:SALOMEDSImpl_GenericAttribute("AttributeGraphic") +{ +} + +//======================================================================= +//function : ~SALOMEDSImpl_AttributeGraphic +//purpose : Destructor +//======================================================================= +SALOMEDSImpl_AttributeGraphic::~SALOMEDSImpl_AttributeGraphic() +{ +} + +//======================================================================= +//function : SetVisibility +//purpose : Set visibility of object in given view +//======================================================================= +void SALOMEDSImpl_AttributeGraphic::SetVisibility(const Standard_Integer theViewId, + const Standard_Boolean theValue ) +{ + if ( myVisibility.IsBound( theViewId ) && myVisibility( theViewId ) == theValue ) + return; + + Backup(); + if ( myVisibility.IsBound( theViewId ) ) + myVisibility.ChangeFind( theViewId ) = theValue ? 1 : 0; + else + myVisibility.Bind( theViewId, theValue ? 1 : 0 ); +} + + +//======================================================================= +//function : Get +//purpose : Get visibility of object in given view +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeGraphic::GetVisibility(const Standard_Integer theViewId ) const +{ + return myVisibility.IsBound( theViewId ) ? myVisibility( theViewId ) : false; +} + + +//======================================================================= +//function : ID +//purpose : Get GUID of this attribute +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeGraphic::ID () const +{ + return GetID(); +} + + +//======================================================================= +//function : NewEmpty +//purpose : Create new empty attribute +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeGraphic::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeGraphic (); +} + +//======================================================================= +//function : SetVisibility +//purpose : Set visibility of object in all views +//======================================================================= +void SALOMEDSImpl_AttributeGraphic::SetVisibility( const TColStd_DataMapOfIntegerInteger& theMap ) +{ + myVisibility = theMap; +} + +//======================================================================= +//function : SetVisibility +//purpose : Get visibility of object in all views +//======================================================================= +const TColStd_DataMapOfIntegerInteger& SALOMEDSImpl_AttributeGraphic::GetVisibility() +{ + return myVisibility; +} + +//======================================================================= +//function : Restore +//purpose : Restore value of attribute with value of theWith one +//======================================================================= +void SALOMEDSImpl_AttributeGraphic::Restore( const Handle(TDF_Attribute)& theWith ) +{ + Handle(SALOMEDSImpl_AttributeGraphic) anAttr = + Handle(SALOMEDSImpl_AttributeGraphic)::DownCast( theWith ); + + if ( !anAttr.IsNull() ) + SetVisibility( anAttr->GetVisibility() ); +} + +//======================================================================= +//function : Paste +//purpose : Paste value of current attribute to the value of entry one +//======================================================================= +void SALOMEDSImpl_AttributeGraphic::Paste( const Handle(TDF_Attribute)& theInto, + const Handle(TDF_RelocationTable)& ) const +{ + Handle(SALOMEDSImpl_AttributeGraphic) anAttr = + Handle(SALOMEDSImpl_AttributeGraphic)::DownCast( theInto ); + + if ( !anAttr.IsNull() ) + anAttr->SetVisibility( myVisibility ); +} + +//======================================================================= +//function : Dump +//purpose : Dump +//======================================================================= +Standard_OStream& SALOMEDSImpl_AttributeGraphic::Dump( Standard_OStream& anOS ) const +{ + anOS << "Visibility of object:" << endl; + TColStd_DataMapIteratorOfDataMapOfIntegerInteger anIter( myVisibility ); + for ( ; anIter.More(); anIter.Next() ) + { + char str[ 100 ]; + + if ( GetVisibility( anIter.Key() ) ) + sprintf( str, "Viewer ID = 0x%X State = VISIBLE\n", anIter.Key() ); + else + sprintf( str, "Viewer ID = 0x%X State = INVISIBLE\n", anIter.Key() ); + + anOS << str; + } + + anOS << "Integer"; + return anOS; +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeGraphic.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeGraphic.hxx new file mode 100644 index 000000000..700e0bb86 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeGraphic.hxx @@ -0,0 +1,62 @@ +// File : SALOMEDSImpl_AttributeGraphic.hxx +// Author : Sergey LITONIN +// Module : SALOME + +#ifndef SALOMEDSImpl_AttributeGraphic_HeaderFile +#define SALOMEDSImpl_AttributeGraphic_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + +/* + Class : SALOMEDSImpl_AttributeGraphic + Description : This class is intended for storing information about + graphic representation of objects in dirrent views +*/ + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeGraphic, SALOMEDSImpl_GenericAttribute) + + + +#ifndef WNT +class Standard_EXPORT SALOMEDSImpl_AttributeGraphic : public SALOMEDSImpl_GenericAttribute +#else +class SALOMEDSImpl_AttributeGraphic : public SALOMEDSImpl_GenericAttribute +#endif +{ + +public: +Standard_EXPORT SALOMEDSImpl_AttributeGraphic(); +Standard_EXPORT ~SALOMEDSImpl_AttributeGraphic(); + +Standard_EXPORT static const Standard_GUID& GetID() ; + +Standard_EXPORT void SetVisibility( const Standard_Integer, + const Standard_Boolean ); +Standard_EXPORT Standard_Boolean GetVisibility( const Standard_Integer ) const; +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore( const Handle(TDF_Attribute)& theWith ); +Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const; +Standard_EXPORT void Paste( const Handle(TDF_Attribute)& theInto, + const Handle(TDF_RelocationTable)& ) const; +Standard_EXPORT virtual Standard_OStream& Dump( Standard_OStream& anOS ) const; + +Standard_EXPORT void SetVisibility( const TColStd_DataMapOfIntegerInteger& ); + +Standard_EXPORT const TColStd_DataMapOfIntegerInteger& GetVisibility(); + +private: + TColStd_DataMapOfIntegerInteger myVisibility; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeGraphic ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx new file mode 100644 index 000000000..ab6b6f11c --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx @@ -0,0 +1,126 @@ +// File : SALOMEDSImpl_AttributeIOR.cxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef WNT +using namespace std; +#endif +#include "SALOMEDSImpl_AttributeIOR.hxx" +#include +#include "SALOMEDSImpl_Study.hxx" +#include + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeIOR, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeIOR, SALOMEDSImpl_GenericAttribute ) + + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeIOR::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeIORID ("92888E01-7074-11d5-A690-0800369C8A03"); + return SALOMEDSImpl_AttributeIORID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeIOR) SALOMEDSImpl_AttributeIOR::Set (const TDF_Label& L, + const TCollection_ExtendedString& S) +{ + Handle(SALOMEDSImpl_AttributeIOR) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(),A)) { + A = new SALOMEDSImpl_AttributeIOR(); + L.AddAttribute(A); + } + + A->SetValue(S); + SALOMEDSImpl_Study::IORUpdated(A); + return A; +} + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeIOR::SetValue(const TCollection_ExtendedString& theValue) +{ + CheckLocked(); + + Handle(SALOMEDSImpl_Study) aStudy = SALOMEDSImpl_Study::GetStudy(Label()); + aStudy->AddCreatedPostponed(theValue); + aStudy->AddPostponed(theValue); + + Backup(); + myString = theValue; + + SALOMEDSImpl_Study::IORUpdated(this); + + //SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : Value +//purpose : +//======================================================================= +TCollection_ExtendedString SALOMEDSImpl_AttributeIOR::Value() const +{ + return myString; +} + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeIOR::SALOMEDSImpl_AttributeIOR() +:SALOMEDSImpl_GenericAttribute("AttributeIOR") +{ +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeIOR::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeIOR::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeIOR(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeIOR::Restore(const Handle(TDF_Attribute)& with) +{ + myString = Handle(SALOMEDSImpl_AttributeIOR)::DownCast (with)->Value(); + return; +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeIOR::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeIOR)::DownCast (into)->SetValue(myString); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.hxx new file mode 100644 index 000000000..692701f9a --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.hxx @@ -0,0 +1,45 @@ +// File : SALOMEDSImpl_AttributeIOR.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeIOR_HeaderFile +#define _SALOMEDSImpl_AttributeIOR_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeIOR, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeIOR : public SALOMEDSImpl_GenericAttribute +{ +private: + + TCollection_ExtendedString myString; + +public: + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeIOR Set(const TDF_Label& label, + const TCollection_ExtendedString& string); +Standard_EXPORT SALOMEDSImpl_AttributeIOR(); +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void SetValue(const TCollection_ExtendedString& theValue); +Standard_EXPORT TCollection_ExtendedString Value() const ; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeIOR() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeIOR ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeInteger.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeInteger.cxx new file mode 100644 index 000000000..7b80aa4e6 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeInteger.cxx @@ -0,0 +1,83 @@ +// File : SALOMEDSImpl_AttributeInteger.cxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef WNT +using namespace std; +#endif +#include "SALOMEDSImpl_AttributeInteger.hxx" + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeInteger, SALOMEDSImpl_GenericAttribute) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeInteger, SALOMEDSImpl_GenericAttribute ) + + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeInteger::GetID () +{ + static Standard_GUID IntegerID ("8CC3E213-C9B4-47e4-8496-DD5E62E22018"); + return IntegerID; +} + +Handle(SALOMEDSImpl_AttributeInteger) SALOMEDSImpl_AttributeInteger::Set (const TDF_Label& L, Standard_Integer Val) +{ + Handle(SALOMEDSImpl_AttributeInteger) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeInteger::GetID(), A)) { + A = new SALOMEDSImpl_AttributeInteger(); + L.AddAttribute(A); + } + + A->SetValue(Val); + return A; +} + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeInteger::SetValue(const Standard_Integer v) +{ + if(myValue == v) return; + + Backup(); + myValue = v; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeInteger::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeInteger::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeInteger(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeInteger::Restore(const Handle(TDF_Attribute)& With) +{ + myValue = Handle(SALOMEDSImpl_AttributeInteger)::DownCast (With)->Value(); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeInteger::Paste (const Handle(TDF_Attribute)& Into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeInteger)::DownCast(Into)->SetValue(myValue); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeInteger.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeInteger.hxx new file mode 100644 index 000000000..c9113ba2f --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeInteger.hxx @@ -0,0 +1,48 @@ +// File : SALOMEDSImpl_AttributeInteger.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeInteger_HeaderFile +#define _SALOMEDSImpl_AttributeInteger_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeInteger, SALOMEDSImpl_GenericAttribute ) + + +class SALOMEDSImpl_AttributeInteger : public SALOMEDSImpl_GenericAttribute +{ +private: +Standard_Integer myValue; + +public: +Standard_EXPORT static const Standard_GUID& GetID() ; + +Standard_EXPORT SALOMEDSImpl_AttributeInteger():SALOMEDSImpl_GenericAttribute("AttributeInteger") {} +Standard_EXPORT static Handle(SALOMEDSImpl_AttributeInteger) Set (const TDF_Label& L, Standard_Integer Val); +Standard_EXPORT void SetValue(const Standard_Integer theVal); +Standard_EXPORT Standard_Integer Value() const { return myValue; } +Standard_EXPORT virtual TCollection_AsciiString Save() { return TCollection_AsciiString(myValue); } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myValue = theValue.IntegerValue(); } + +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeInteger() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeInteger ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeLocalID.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeLocalID.cxx new file mode 100644 index 000000000..240a95380 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeLocalID.cxx @@ -0,0 +1,110 @@ +// File : SALOMEDSImpl_AttributeLocalID.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributeLocalID.hxx" +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeLocalID, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeLocalID, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeLocalID::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeLocalID ("12837196-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeLocalID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeLocalID) SALOMEDSImpl_AttributeLocalID::Set (const TDF_Label& L, + const Standard_Integer value) +{ + Handle(SALOMEDSImpl_AttributeLocalID) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeLocalID::GetID(),A)) { + A = new SALOMEDSImpl_AttributeLocalID(); + L.AddAttribute(A); + } + + A->SetValue(value); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeLocalID::SALOMEDSImpl_AttributeLocalID() +:SALOMEDSImpl_GenericAttribute("AttributeLocalID") +{ + myValue = 0; +} + +//======================================================================= +//function : Set +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeLocalID::SetValue(const Standard_Integer theValue) +{ + CheckLocked(); + + Backup(); + + myValue = theValue; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeLocalID::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeLocalID::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeLocalID(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeLocalID::Restore(const Handle(TDF_Attribute)& with) +{ + myValue = Handle(SALOMEDSImpl_AttributeLocalID)::DownCast (with)->Value(); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeLocalID::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeLocalID)::DownCast (into)->SetValue(myValue); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeLocalID.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeLocalID.hxx new file mode 100644 index 000000000..78dadd861 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeLocalID.hxx @@ -0,0 +1,48 @@ +// File : SALOMEDSImpl_AttributeLocalID.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeLocalID_HeaderFile +#define _SALOMEDSImpl_AttributeLocalID_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeLocalID, SALOMEDSImpl_GenericAttribute ) + + + +class SALOMEDSImpl_AttributeLocalID : public SALOMEDSImpl_GenericAttribute +{ +private: +Standard_Integer myValue; + +public: + +Standard_EXPORT virtual TCollection_AsciiString Save() { return TCollection_AsciiString(myValue); } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myValue = theValue.IntegerValue(); } + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeLocalID Set(const TDF_Label& label,const Standard_Integer value) ; +Standard_EXPORT void SetValue(const Standard_Integer value); +Standard_EXPORT Standard_Integer Value() const { return myValue; } +Standard_EXPORT SALOMEDSImpl_AttributeLocalID(); +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeLocalID() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeLocalID ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeName.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeName.cxx new file mode 100644 index 000000000..55718b771 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeName.cxx @@ -0,0 +1,87 @@ +// File : SALOMEDSImpl_AttributeName.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributeName.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeName, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeName, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeName::GetID () +{ + static Standard_GUID NameID ("8650000D-63A0-4651-B621-CC95C9308598"); + return NameID; +} + +Handle(SALOMEDSImpl_AttributeName) SALOMEDSImpl_AttributeName::Set (const TDF_Label& L, + const TCollection_ExtendedString& Val) +{ + Handle(SALOMEDSImpl_AttributeName) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), A)) { + A = new SALOMEDSImpl_AttributeName(); + L.AddAttribute(A); + } + + A->SetValue(Val); + return A; +} + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeName::SetValue (const TCollection_ExtendedString& S) +{ + CheckLocked(); + + if(myString == S) return; + + Backup(); + + myString = S; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + +//======================================================================= +//function : ID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeName::ID () const { return GetID(); } + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeName::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeName(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeName::Restore(const Handle(TDF_Attribute)& with) +{ + myString = Handle(SALOMEDSImpl_AttributeName)::DownCast (with)->Value (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeName::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeName)::DownCast (into)->SetValue(myString); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeName.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeName.hxx new file mode 100644 index 000000000..299db5f92 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeName.hxx @@ -0,0 +1,52 @@ +// File : SALOMEDSImpl_AttributeIOR.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeName_HeaderFile +#define _SALOMEDSImpl_AttributeName_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeName, SALOMEDSImpl_GenericAttribute ) + + +class SALOMEDSImpl_AttributeName : public SALOMEDSImpl_GenericAttribute +{ + +private: + + TCollection_ExtendedString myString; + +public: +Standard_EXPORT static const Standard_GUID& GetID() ; + +Standard_EXPORT SALOMEDSImpl_AttributeName():SALOMEDSImpl_GenericAttribute("AttributeName") {} +Standard_EXPORT static Handle(SALOMEDSImpl_AttributeName) Set (const TDF_Label& L, const TCollection_ExtendedString& Val); +Standard_EXPORT void SetValue(const TCollection_ExtendedString& theVal); +Standard_EXPORT TCollection_ExtendedString Value() const { return myString; } + +Standard_EXPORT virtual TCollection_AsciiString Save() { return myString; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myString = theValue; } + +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; + +Standard_EXPORT ~SALOMEDSImpl_AttributeName() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeName ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeOpened.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeOpened.cxx new file mode 100644 index 000000000..2f818b455 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeOpened.cxx @@ -0,0 +1,105 @@ +// File : SALOMEDSImpl_AttributeOpened.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributeOpened.hxx" +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeOpened, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeOpened, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeOpened::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeOpenedID ("12837186-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeOpenedID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeOpened) SALOMEDSImpl_AttributeOpened::Set (const TDF_Label& L, + const Standard_Integer value) +{ + Handle(SALOMEDSImpl_AttributeOpened) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeOpened::GetID(),A)) { + A = new SALOMEDSImpl_AttributeOpened(); + L.AddAttribute(A); + } + + A->SetOpened (value); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeOpened::SALOMEDSImpl_AttributeOpened() +:SALOMEDSImpl_GenericAttribute("AttributeOpened") +{ + myValue = 0; +} + +//======================================================================= +//function : SetOpened +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeOpened::SetOpened(const Standard_Integer theValue) +{ + Backup(); + + (theValue!=0)?myValue=1:myValue=0; +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeOpened::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeOpened::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeOpened(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeOpened::Restore(const Handle(TDF_Attribute)& with) +{ + myValue = Handle(SALOMEDSImpl_AttributeOpened)::DownCast (with)->IsOpened (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeOpened::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeOpened)::DownCast (into)->SetOpened (myValue); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeOpened.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeOpened.hxx new file mode 100644 index 000000000..e72918267 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeOpened.hxx @@ -0,0 +1,46 @@ +// File : SALOMEDSImpl_AttributeOpened.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeOpened_HeaderFile +#define _SALOMEDSImpl_AttributeOpened_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeOpened, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeOpened : public SALOMEDSImpl_GenericAttribute +{ +private: +Standard_Integer myValue; + +public: + +Standard_EXPORT virtual TCollection_AsciiString Save() { return (myValue == 0)?(char*)"0":(char*)"1"; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { (theValue == "0")?myValue=0:myValue=1; } + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeOpened Set(const TDF_Label& label,const Standard_Integer value) ; +Standard_EXPORT SALOMEDSImpl_AttributeOpened(); +Standard_EXPORT void SetOpened(const Standard_Integer value); +Standard_EXPORT int IsOpened() const { return myValue; } +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeOpened() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeOpened ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributePersistentRef.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePersistentRef.cxx new file mode 100644 index 000000000..2db2b4088 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePersistentRef.cxx @@ -0,0 +1,110 @@ +// File : SALOMEDSImpl_AttributePersistentRef.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributePersistentRef.hxx" +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributePersistentRef, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributePersistentRef, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributePersistentRef::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributePersistentRefID ("92888E06-7074-11d5-A690-0800369C8A03"); + return SALOMEDSImpl_AttributePersistentRefID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributePersistentRef) SALOMEDSImpl_AttributePersistentRef::Set (const TDF_Label& L, + const TCollection_ExtendedString& S) +{ + Handle(SALOMEDSImpl_AttributePersistentRef) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID(),A)) { + A = new SALOMEDSImpl_AttributePersistentRef(); + L.AddAttribute(A); + } + + A->SetValue (S); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributePersistentRef::SALOMEDSImpl_AttributePersistentRef() +:SALOMEDSImpl_GenericAttribute("AttributePersistentRef") +{ +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributePersistentRef::ID () const { return GetID(); } + + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributePersistentRef::SetValue (const TCollection_ExtendedString& S) +{ + CheckLocked(); + + if(myString == S) return; + + Backup(); + + myString = S; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributePersistentRef::NewEmpty () const +{ + return new SALOMEDSImpl_AttributePersistentRef(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributePersistentRef::Restore(const Handle(TDF_Attribute)& with) +{ + myString = Handle(SALOMEDSImpl_AttributePersistentRef)::DownCast (with)->Value (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributePersistentRef::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributePersistentRef)::DownCast (into)->SetValue(myString); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributePersistentRef.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePersistentRef.hxx new file mode 100644 index 000000000..f660a28fd --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePersistentRef.hxx @@ -0,0 +1,48 @@ +// File : SALOMEDSImpl_AttributePersistentRef.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributePersistentRef_HeaderFile +#define _SALOMEDSImpl_AttributePersistentRef_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributePersistentRef, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributePersistentRef : public SALOMEDSImpl_GenericAttribute +{ +private: + TCollection_ExtendedString myString; + +public: + +Standard_EXPORT virtual TCollection_AsciiString Save() { return myString; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myString = theValue; } + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributePersistentRef Set(const TDF_Label& label, + const TCollection_ExtendedString& string) ; +Standard_EXPORT SALOMEDSImpl_AttributePersistentRef(); +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void SetValue(const TCollection_ExtendedString& value); +Standard_EXPORT TCollection_ExtendedString Value() const { return myString; } +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributePersistentRef() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributePersistentRef ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributePixMap.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePixMap.cxx new file mode 100644 index 000000000..6b9b3a3b8 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePixMap.cxx @@ -0,0 +1,111 @@ +// File : SALOMEDSImpl_AttributePixMap.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributePixMap.hxx" +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributePixMap, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributePixMap, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributePixMap::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributePixMapID ("12837187-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributePixMapID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributePixMap) SALOMEDSImpl_AttributePixMap::Set (const TDF_Label& L, + const TCollection_ExtendedString& S) +{ + Handle(SALOMEDSImpl_AttributePixMap) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributePixMap::GetID(),A)) { + A = new SALOMEDSImpl_AttributePixMap(); + L.AddAttribute(A); + } + + A->SetPixMap (S); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributePixMap::SALOMEDSImpl_AttributePixMap() +:SALOMEDSImpl_GenericAttribute("AttributePixMap") +{ + myString = "None"; +} + +//======================================================================= +//function : SetPixMap +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributePixMap::SetPixMap (const TCollection_ExtendedString& S) +{ + CheckLocked(); + + if(myString == S) return; + + Backup(); + + myString = S; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributePixMap::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributePixMap::NewEmpty () const +{ + return new SALOMEDSImpl_AttributePixMap(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributePixMap::Restore(const Handle(TDF_Attribute)& with) +{ + myString = Handle(SALOMEDSImpl_AttributePixMap)::DownCast (with)->GetPixMap (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributePixMap::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributePixMap)::DownCast (into)->SetPixMap (myString); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributePixMap.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePixMap.hxx new file mode 100644 index 000000000..521c79f45 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePixMap.hxx @@ -0,0 +1,51 @@ +// File : SALOMEDSImpl_AttributePixMap.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributePixMap_HeaderFile +#define _SALOMEDSImpl_AttributePixMap_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributePixMap, SALOMEDSImpl_GenericAttribute ) + + + +class SALOMEDSImpl_AttributePixMap : public SALOMEDSImpl_GenericAttribute +{ +private: + + TCollection_ExtendedString myString; +public: + +Standard_EXPORT virtual TCollection_AsciiString Save() { return myString; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myString = theValue; } + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributePixMap Set(const TDF_Label& label, + const TCollection_ExtendedString& string) ; +Standard_EXPORT SALOMEDSImpl_AttributePixMap(); +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void SetPixMap(const TCollection_ExtendedString& value); +Standard_EXPORT TCollection_ExtendedString GetPixMap() const { return myString; } +Standard_EXPORT Standard_Boolean HasPixMap() const { return (myString != "None"); } +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributePixMap() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributePixMap ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributePythonObject.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePythonObject.cxx new file mode 100644 index 000000000..a6f9db1ef --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePythonObject.cxx @@ -0,0 +1,101 @@ +// File : SALOMEDSImpl_AttributePythonObject.cxx +// Author : Michael Ponikarov +// Module : SALOME + +#include "SALOMEDSImpl_AttributePythonObject.hxx" +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributePythonObject, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributePythonObject, SALOMEDSImpl_GenericAttribute ) + +const Standard_GUID& SALOMEDSImpl_AttributePythonObject::GetID() +{ + static Standard_GUID SALOMEDSImpl_AttributePythonObjectID ("128371A3-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributePythonObjectID; +} + +Handle(SALOMEDSImpl_AttributePythonObject) SALOMEDSImpl_AttributePythonObject::Set(const TDF_Label& label) +{ + Handle(SALOMEDSImpl_AttributePythonObject) anAttr; + if (!label.FindAttribute(SALOMEDSImpl_AttributePythonObject::GetID(),anAttr)) { + anAttr = new SALOMEDSImpl_AttributePythonObject(); + label.AddAttribute(anAttr); + } + return anAttr; +} + +SALOMEDSImpl_AttributePythonObject::SALOMEDSImpl_AttributePythonObject() +:SALOMEDSImpl_GenericAttribute("AttributePythonObject") +{ +} + +void SALOMEDSImpl_AttributePythonObject::SetObject(const TCollection_AsciiString& theSequence, + const bool theScript) +{ + CheckLocked(); + Backup(); + mySequence = theSequence; + myIsScript = theScript; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +TCollection_AsciiString SALOMEDSImpl_AttributePythonObject::GetObject() const +{ + return mySequence; +} + +bool SALOMEDSImpl_AttributePythonObject::IsScript() const +{ + return myIsScript; +} + +int SALOMEDSImpl_AttributePythonObject::GetLength() const +{ + return mySequence.Length(); +} + +const Standard_GUID& SALOMEDSImpl_AttributePythonObject::ID() const +{ + return GetID(); +} + +void SALOMEDSImpl_AttributePythonObject::Restore(const Handle(TDF_Attribute)& with) +{ + Handle(SALOMEDSImpl_AttributePythonObject) anObj = Handle(SALOMEDSImpl_AttributePythonObject)::DownCast(with); + SetObject(anObj->GetObject(),anObj->IsScript()); +} + +Handle(TDF_Attribute) SALOMEDSImpl_AttributePythonObject::NewEmpty() const +{ + return new SALOMEDSImpl_AttributePythonObject(); +} + +void SALOMEDSImpl_AttributePythonObject::Paste(const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)&) const +{ + Handle(SALOMEDSImpl_AttributePythonObject) anObj = Handle(SALOMEDSImpl_AttributePythonObject)::DownCast(into); + anObj->SetObject(GetObject(),IsScript()); +} + + +TCollection_AsciiString SALOMEDSImpl_AttributePythonObject::Save() +{ + char* aString = (char*)GetObject().ToCString(); + char* aResult = new char[strlen(aString) + 2]; + aResult[0] = IsScript()?'s':'n'; + strcpy(aResult+1, aString); + TCollection_AsciiString ret(aResult); + + delete aResult; + return ret; +} + +void SALOMEDSImpl_AttributePythonObject::Load(const TCollection_AsciiString& value) +{ + char* aString = value.ToCString(); + SetObject(aString + 1, aString[0]=='s'); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributePythonObject.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePythonObject.hxx new file mode 100644 index 000000000..00d492778 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributePythonObject.hxx @@ -0,0 +1,56 @@ +// File : SALOMEDSImpl_AttributePythonObject.hxx +// Author : Michael Ponikarov +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributePythonObject_HeaderFile +#define _SALOMEDSImpl_AttributePythonObject_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributePythonObject, SALOMEDSImpl_GenericAttribute ) + +#ifdef GetObject +#undef GetObject +#endif + +class SALOMEDSImpl_AttributePythonObject : public SALOMEDSImpl_GenericAttribute +{ + +public: +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributePythonObject Set(const TDF_Label& label) ; +Standard_EXPORT SALOMEDSImpl_AttributePythonObject(); +Standard_EXPORT void SetObject(const TCollection_AsciiString& theSequence, const bool theScript) ; +Standard_EXPORT TCollection_AsciiString GetObject() const; +Standard_EXPORT bool IsScript() const; +Standard_EXPORT int GetLength() const; +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributePythonObject() {} + +private: + +TCollection_AsciiString mySequence; +bool myIsScript; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributePythonObject ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReal.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReal.cxx new file mode 100644 index 000000000..45ddd227a --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReal.cxx @@ -0,0 +1,85 @@ +// File : SALOMEDSImpl_AttributeReal.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeReal.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeReal, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeReal, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeReal::GetID () +{ + static Standard_GUID realID ("1D1992F0-56F4-46b4-8065-CDEA68061CAB"); + return realID; +} + +Handle(SALOMEDSImpl_AttributeReal) SALOMEDSImpl_AttributeReal::Set (const TDF_Label& L, const Standard_Real Val) +{ + Handle(SALOMEDSImpl_AttributeReal) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeReal::GetID(), A)) { + A = new SALOMEDSImpl_AttributeReal(); + L.AddAttribute(A); + } + + A->SetValue(Val); + return A; +} + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeReal::SetValue(const Standard_Real v) +{ + CheckLocked(); + + if( myValue == v) return; + + Backup(); + myValue = v; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeReal::ID () const +{ + return GetID(); +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeReal::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeReal(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeReal::Restore(const Handle(TDF_Attribute)& with) +{ + myValue = Handle(SALOMEDSImpl_AttributeReal)::DownCast (with)->Value (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeReal::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeReal)::DownCast (into)->SetValue(myValue); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReal.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReal.hxx new file mode 100644 index 000000000..9f1c66cf5 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReal.hxx @@ -0,0 +1,48 @@ +// File : SALOMEDSImpl_AttributeReal.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeReal_HeaderFile +#define _SALOMEDSImpl_AttributeReal_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeReal, SALOMEDSImpl_GenericAttribute ) + + +class SALOMEDSImpl_AttributeReal : public SALOMEDSImpl_GenericAttribute +{ +private: + Standard_Real myValue; +public: + +Standard_EXPORT static const Standard_GUID& GetID() ; + +Standard_EXPORT SALOMEDSImpl_AttributeReal():SALOMEDSImpl_GenericAttribute("AttributeReal") {} +Standard_EXPORT static Handle(SALOMEDSImpl_AttributeReal) Set (const TDF_Label& L, const Standard_Real Val); +Standard_EXPORT void SetValue(const Standard_Real theVal); +Standard_EXPORT Standard_Real Value() const { return myValue; } +Standard_EXPORT virtual TCollection_AsciiString Save() { return TCollection_AsciiString(myValue); } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { myValue = theValue.RealValue(); } + +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeReal() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeReal ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReference.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReference.cxx new file mode 100644 index 000000000..019835cbc --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReference.cxx @@ -0,0 +1,108 @@ +// File : SALOMEDSImpl_AttributeReference.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeReference.hxx" +#include +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeReference, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeReference, SALOMEDSImpl_GenericAttribute ) + + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeReference::GetID () +{ + static Standard_GUID refID ("D913E0B3-0A9F-4ea6-9480-18A9B72D9D86"); + return refID; +} + +Handle(SALOMEDSImpl_AttributeReference) SALOMEDSImpl_AttributeReference::Set(const TDF_Label& theLabel, + const TDF_Label& theRefLabel) +{ + Handle(SALOMEDSImpl_AttributeReference) A; + if (!theLabel.FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), A)) { + A = new SALOMEDSImpl_AttributeReference(); + theLabel.AddAttribute(A); + } + + A->Set(theRefLabel); + return A; +} + +//======================================================================= +//function : Set +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeReference::Set(const TDF_Label& Origin) +{ + CheckLocked(); + + if(myLabel == Origin) return; + + Backup(); + myLabel = Origin; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeReference::ID () const { return GetID(); } + + +TCollection_AsciiString SALOMEDSImpl_AttributeReference::Save() +{ + TCollection_AsciiString anEntry; + TDF_Tool::Entry(myLabel, anEntry); + return anEntry; +} + +void SALOMEDSImpl_AttributeReference::Load(const TCollection_AsciiString& value) +{ + TDF_Label aLabel; + TDF_Tool::Label(Label().Data(), value, aLabel); + myLabel = aLabel; +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeReference::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeReference(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeReference::Restore(const Handle(TDF_Attribute)& With) +{ + myLabel = Handle(SALOMEDSImpl_AttributeReference)::DownCast (With)->Get (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeReference::Paste (const Handle(TDF_Attribute)& Into, + const Handle(TDF_RelocationTable)& RT) const +{ + TDF_Label tLab; + if (!myLabel.IsNull()) { + if (!RT->HasRelocation(myLabel,tLab)) tLab = myLabel; + } + Handle(SALOMEDSImpl_AttributeReference)::DownCast(Into)->Set(tLab); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReference.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReference.hxx new file mode 100644 index 000000000..6468c71d9 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeReference.hxx @@ -0,0 +1,50 @@ +// File : SALOMEDSImpl_AttributeIOR.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeReference_HeaderFile +#define _SALOMEDSImpl_AttributeReference_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeReference, SALOMEDSImpl_GenericAttribute ) + + + +class SALOMEDSImpl_AttributeReference : public SALOMEDSImpl_GenericAttribute +{ +private: + TDF_Label myLabel; + +public: + +Standard_EXPORT static const Standard_GUID& GetID() ; + +Standard_EXPORT SALOMEDSImpl_AttributeReference():SALOMEDSImpl_GenericAttribute("AttributeReference") {} +Standard_EXPORT static Handle(SALOMEDSImpl_AttributeReference) Set(const TDF_Label& theLabel, const TDF_Label& theRefLabel); +Standard_EXPORT void Set(const TDF_Label& theLabel); +Standard_EXPORT TDF_Label Get() const { return myLabel; } +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue); + +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; + +Standard_EXPORT ~SALOMEDSImpl_AttributeReference() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeReference ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSelectable.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSelectable.cxx new file mode 100644 index 000000000..db93d3c2b --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSelectable.cxx @@ -0,0 +1,104 @@ +// File : SALOMEDSImpl_AttributeSelectable.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeSelectable.hxx" +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeSelectable, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeSelectable, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeSelectable::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeSelectableID ("12837188-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeSelectableID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeSelectable) SALOMEDSImpl_AttributeSelectable::Set (const TDF_Label& L, + const Standard_Integer value) +{ + Handle(SALOMEDSImpl_AttributeSelectable) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeSelectable::GetID(),A)) { + A = new SALOMEDSImpl_AttributeSelectable(); + L.AddAttribute(A); + } + + A->SetSelectable (value); + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeSelectable::SALOMEDSImpl_AttributeSelectable() +:SALOMEDSImpl_GenericAttribute("AttributeSelectable") +{ + myValue = 0; +} + +//======================================================================= +//function : SetSelectable +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeSelectable::SetSelectable(const Standard_Integer theValue) +{ + Backup(); + + (theValue!=0)?myValue=1:myValue=0; +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeSelectable::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeSelectable::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeSelectable(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeSelectable::Restore(const Handle(TDF_Attribute)& with) +{ + myValue = Handle(SALOMEDSImpl_AttributeSelectable)::DownCast (with)->IsSelectable (); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeSelectable::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeSelectable)::DownCast (into)->SetSelectable (myValue); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSelectable.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSelectable.hxx new file mode 100644 index 000000000..5f6ee4fb2 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSelectable.hxx @@ -0,0 +1,49 @@ +// File : SALOMEDSImpl_AttributeSelectable.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeSelectable_HeaderFile +#define _SALOMEDSImpl_AttributeSelectable_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeSelectable, SALOMEDSImpl_GenericAttribute ) + + + +class SALOMEDSImpl_AttributeSelectable : public SALOMEDSImpl_GenericAttribute +{ +private: +Standard_Integer myValue; + +public: + +Standard_EXPORT virtual TCollection_AsciiString Save() { return (myValue == 0)?(char*)"0":(char*)"1"; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString& theValue) { (theValue == "0")?myValue=0:myValue=1; } + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeSelectable Set(const TDF_Label& label,const Standard_Integer value) ; +Standard_EXPORT SALOMEDSImpl_AttributeSelectable(); +Standard_EXPORT void SetSelectable(const Standard_Integer value); +Standard_EXPORT Standard_Integer IsSelectable() const { return myValue; } +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeSelectable() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeDrawable ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfInteger.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfInteger.cxx new file mode 100644 index 000000000..ca1667702 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfInteger.cxx @@ -0,0 +1,179 @@ +// File : SALOMEDSImpl_AttributeSequenceOfInteger.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeSequenceOfInteger.hxx" +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeSequenceOfInteger, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeSequenceOfInteger, SALOMEDSImpl_GenericAttribute ) + + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeSequenceOfInteger::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeSequenceOfIntegerID ("12837182-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeSequenceOfIntegerID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeSequenceOfInteger) SALOMEDSImpl_AttributeSequenceOfInteger::Set (const TDF_Label& L) +{ + Handle(SALOMEDSImpl_AttributeSequenceOfInteger) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeSequenceOfInteger::GetID(),A)) { + A = new SALOMEDSImpl_AttributeSequenceOfInteger(); + L.AddAttribute(A); + } + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeSequenceOfInteger::SALOMEDSImpl_AttributeSequenceOfInteger() +:SALOMEDSImpl_GenericAttribute("AttributeSequenceOfInteger") +{ + myValue = new TColStd_HSequenceOfInteger(); +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeSequenceOfInteger::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeSequenceOfInteger::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeSequenceOfInteger(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeSequenceOfInteger::Restore(const Handle(TDF_Attribute)& with) +{ + Standard_Integer i; + Handle(SALOMEDSImpl_AttributeSequenceOfInteger) anSeq = Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast(with); + if(!anSeq->myValue.IsNull()) { + myValue = new TColStd_HSequenceOfInteger(); + Standard_Integer Len = anSeq->Length(); + for(i = 1; i<=Len; i++) Add(anSeq->Value(i)); + } + else + myValue.Nullify(); + return; +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeSequenceOfInteger::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& ) const +{ + if(!myValue.IsNull()) { + Handle(SALOMEDSImpl_AttributeSequenceOfInteger)::DownCast (into)->Assign(myValue); + } +} + +void SALOMEDSImpl_AttributeSequenceOfInteger::Assign(const Handle(TColStd_HSequenceOfInteger)& other) +{ + CheckLocked(); + Backup(); + if (myValue.IsNull()) myValue = new TColStd_HSequenceOfInteger; + myValue->ChangeSequence() = other->Sequence(); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeSequenceOfInteger::ChangeValue(const Standard_Integer Index,const Standard_Integer Value) +{ + CheckLocked(); + Backup(); + myValue->SetValue(Index, Value); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeSequenceOfInteger::Add(const Standard_Integer Value) +{ + CheckLocked(); + Backup(); + myValue->Append(Value); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeSequenceOfInteger::Remove(const Standard_Integer Index) +{ + CheckLocked(); + Backup(); + myValue->Remove(Index); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Standard_Integer SALOMEDSImpl_AttributeSequenceOfInteger::Length() +{ + return myValue->Length(); +} +Standard_Integer SALOMEDSImpl_AttributeSequenceOfInteger::Value(const Standard_Integer Index) +{ + return myValue->Value(Index); +} + + + +TCollection_AsciiString SALOMEDSImpl_AttributeSequenceOfInteger::Save() +{ + Standard_Integer aLength = Length(); + char* aResult = new char[aLength * 25]; + aResult[0] = 0; + Standard_Integer aPosition = 0; + for (int i = 1; i <= aLength; i++) { + sprintf(aResult + aPosition , "%d ", Value(i)); + aPosition += strlen(aResult + aPosition); + } + TCollection_AsciiString ret(aResult); + delete aResult; + + return ret; +} + +void SALOMEDSImpl_AttributeSequenceOfInteger::Load(const TCollection_AsciiString& value) +{ + Handle(TColStd_HSequenceOfInteger) CasCadeSeq = new TColStd_HSequenceOfInteger; + + char* aCopy = value.ToCString(); + char* adr = strtok(aCopy, " "); + while (adr) { + int l = atol(adr); + CasCadeSeq->Append(l); + adr = strtok(NULL, " "); + } + Assign(CasCadeSeq); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfInteger.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfInteger.hxx new file mode 100644 index 000000000..a24aa5646 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfInteger.hxx @@ -0,0 +1,54 @@ +// File : SALOMEDSImpl_AttributeSequenceOfInteger.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeSequenceOfInteger_HeaderFile +#define _SALOMEDSImpl_AttributeSequenceOfInteger_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeSequenceOfInteger, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeSequenceOfInteger : public SALOMEDSImpl_GenericAttribute +{ + +public: + +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeSequenceOfInteger Set(const TDF_Label& label) ; +Standard_EXPORT SALOMEDSImpl_AttributeSequenceOfInteger(); +Standard_EXPORT void Assign(const Handle(TColStd_HSequenceOfInteger)& other) ; +Standard_EXPORT void ChangeValue(const Standard_Integer Index,const Standard_Integer Value) ; +Standard_EXPORT void Add(const Standard_Integer value) ; +Standard_EXPORT Standard_Integer Value(const Standard_Integer Index) ; +Standard_EXPORT void Remove(const Standard_Integer Index) ; +Standard_EXPORT Standard_Integer Length() ; +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeSequenceOfInteger() {} + +private: + +Handle_TColStd_HSequenceOfInteger myValue; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeSequenceOfInteger ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfReal.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfReal.cxx new file mode 100644 index 000000000..fa7caff51 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfReal.cxx @@ -0,0 +1,179 @@ +// File : SALOMEDSImpl_AttributeSequenceOfReal.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_AttributeSequenceOfReal.hxx" +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeSequenceOfReal, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeSequenceOfReal, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeSequenceOfReal::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeSequenceOfRealID ("12837183-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeSequenceOfRealID; +} + + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeSequenceOfReal) SALOMEDSImpl_AttributeSequenceOfReal::Set (const TDF_Label& L) +{ + Handle(SALOMEDSImpl_AttributeSequenceOfReal) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeSequenceOfReal::GetID(),A)) { + A = new SALOMEDSImpl_AttributeSequenceOfReal(); + L.AddAttribute(A); + } + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeSequenceOfReal::SALOMEDSImpl_AttributeSequenceOfReal() +:SALOMEDSImpl_GenericAttribute("AttributeSequenceOfReal") +{ + myValue = new TColStd_HSequenceOfReal(); +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeSequenceOfReal::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeSequenceOfReal::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeSequenceOfReal(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeSequenceOfReal::Restore(const Handle(TDF_Attribute)& with) +{ + Standard_Integer i; + Handle(SALOMEDSImpl_AttributeSequenceOfReal) anSeq = Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast(with); + if(!anSeq->myValue.IsNull()) { + myValue = new TColStd_HSequenceOfReal(); + Standard_Integer Len = anSeq->Length(); + for(i = 1; i<=Len; i++) Add(anSeq->Value(i)); + } + else + myValue.Nullify(); + return; +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeSequenceOfReal::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& ) const +{ + if(!myValue.IsNull()) { + Handle(SALOMEDSImpl_AttributeSequenceOfReal)::DownCast (into)->Assign(myValue); + } +} + +void SALOMEDSImpl_AttributeSequenceOfReal::Assign(const Handle(TColStd_HSequenceOfReal)& other) +{ + CheckLocked(); + Backup(); + if (myValue.IsNull()) myValue = new TColStd_HSequenceOfReal; + myValue->ChangeSequence() = other->Sequence(); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeSequenceOfReal::ChangeValue(const Standard_Integer Index,const Standard_Real Value) +{ + CheckLocked(); + Backup(); + myValue->SetValue(Index, Value); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeSequenceOfReal::Add(const Standard_Real Value) +{ + CheckLocked(); + Backup(); + myValue->Append(Value); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeSequenceOfReal::Remove(const Standard_Integer Index) +{ + CheckLocked(); + Backup(); + myValue->Remove(Index); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Standard_Integer SALOMEDSImpl_AttributeSequenceOfReal::Length() +{ + return myValue->Length(); +} + +Standard_Real SALOMEDSImpl_AttributeSequenceOfReal::Value(const Standard_Integer Index) +{ + return myValue->Value(Index); +} + + +TCollection_AsciiString SALOMEDSImpl_AttributeSequenceOfReal::Save() +{ + Standard_Integer aLength = Length(); + char* aResult = new char[aLength * 25]; + aResult[0] = 0; + Standard_Integer aPosition = 0; + for (int i = 1; i <= aLength; i++) { + sprintf(aResult + aPosition , "%f ", Value(i)); + aPosition += strlen(aResult + aPosition); + } + TCollection_AsciiString ret(aResult); + delete aResult; + + return ret; +} + +void SALOMEDSImpl_AttributeSequenceOfReal::Load(const TCollection_AsciiString& value) +{ + Handle(TColStd_HSequenceOfReal) CasCadeSeq = new TColStd_HSequenceOfReal; + + char* aCopy = value.ToCString(); + char* adr = strtok(aCopy, " "); + char *err = NULL; + while (adr) { + Standard_Real r = strtod(adr, &err); + CasCadeSeq->Append(r); + adr = strtok(NULL, " "); + } + Assign(CasCadeSeq); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfReal.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfReal.hxx new file mode 100644 index 000000000..a7c93716f --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeSequenceOfReal.hxx @@ -0,0 +1,53 @@ +// File : SALOMEDSImpl_AttributeSequenceOfReal.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeSequenceOfReal_HeaderFile +#define _SALOMEDSImpl_AttributeSequenceOfReal_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeSequenceOfReal, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeSequenceOfReal : public SALOMEDSImpl_GenericAttribute +{ + +public: + +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); + +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeSequenceOfReal Set(const TDF_Label& label) ; +Standard_EXPORT SALOMEDSImpl_AttributeSequenceOfReal(); +Standard_EXPORT void Assign(const Handle(TColStd_HSequenceOfReal)& other) ; +Standard_EXPORT void ChangeValue(const Standard_Integer Index,const Standard_Real Value) ; +Standard_EXPORT void Add(const Standard_Real Value) ; +Standard_EXPORT Standard_Real Value(const Standard_Integer Index) ; +Standard_EXPORT void Remove(const Standard_Integer Index) ; +Standard_EXPORT Standard_Integer Length() ; +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeSequenceOfReal() {} + +private: +Handle_TColStd_HSequenceOfReal myValue; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeSequenceOfReal ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeStudyProperties.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeStudyProperties.cxx new file mode 100644 index 000000000..3093a7ae7 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeStudyProperties.cxx @@ -0,0 +1,301 @@ +// File : SALOMEDSImpl_AttributeStudyProperties.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeStudyProperties, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeStudyProperties, SALOMEDSImpl_GenericAttribute ) + +const Standard_GUID& SALOMEDSImpl_AttributeStudyProperties::GetID() +{ + static Standard_GUID SALOMEDSImpl_AttributeStudyPropertiesID ("128371A2-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeStudyPropertiesID; +} + +Handle(SALOMEDSImpl_AttributeStudyProperties) SALOMEDSImpl_AttributeStudyProperties::Set(const TDF_Label& label) +{ + Handle(SALOMEDSImpl_AttributeStudyProperties) anAttr; + if (!label.FindAttribute(SALOMEDSImpl_AttributeStudyProperties::GetID(),anAttr)) { + anAttr = new SALOMEDSImpl_AttributeStudyProperties(); + label.AddAttribute(anAttr); + } + return anAttr; +} + +SALOMEDSImpl_AttributeStudyProperties::SALOMEDSImpl_AttributeStudyProperties() +:SALOMEDSImpl_GenericAttribute("AttributeStudyProperties") +{ + myLocked = Standard_False; + myLockChanged = Standard_False; + Init(); +} + +void SALOMEDSImpl_AttributeStudyProperties::Init() +{ + myUserName = new TColStd_HSequenceOfExtendedString(); + myMinute = new TColStd_HSequenceOfInteger(); + myHour = new TColStd_HSequenceOfInteger(); + myDay = new TColStd_HSequenceOfInteger(); + myMonth = new TColStd_HSequenceOfInteger(); + myYear = new TColStd_HSequenceOfInteger(); +// myModified = 0; + myMode = 0; // none +} + +void SALOMEDSImpl_AttributeStudyProperties::SetModification(const TCollection_ExtendedString& theUserName, + const Standard_Integer theMinute, + const Standard_Integer theHour, + const Standard_Integer theDay, + const Standard_Integer theMonth, + const Standard_Integer theYear) +{ + if (theMinute<0 || theMinute>60 || theHour<0 || theHour>24 || + theDay<0 || theDay>31 || theMonth<0 || theMonth>12) + return; + + CheckLocked(); + Backup(); + + myUserName->Append(theUserName); + myMinute->Append(theMinute); + myHour->Append(theHour); + myDay->Append(theDay); + myMonth->Append(theMonth); + myYear->Append(theYear); +} + +void SALOMEDSImpl_AttributeStudyProperties::GetModifications + (Handle(TColStd_HSequenceOfExtendedString)& theUserNames, + Handle(TColStd_HSequenceOfInteger)& theMinutes, + Handle(TColStd_HSequenceOfInteger)& theHours, + Handle(TColStd_HSequenceOfInteger)& theDays, + Handle(TColStd_HSequenceOfInteger)& theMonths, + Handle(TColStd_HSequenceOfInteger)& theYears) const +{ + theUserNames = myUserName; + theMinutes = myMinute; + theHours = myHour; + theDays = myDay; + theMonths = myMonth; + theYears = myYear; +} + +TCollection_ExtendedString SALOMEDSImpl_AttributeStudyProperties::GetCreatorName() const +{ + if (myUserName->Length() == 0) + return TCollection_ExtendedString(""); + return myUserName->Value(1); +} + +Standard_Boolean SALOMEDSImpl_AttributeStudyProperties::GetCreationDate + (Standard_Integer& theMinute, + Standard_Integer& theHour, + Standard_Integer& theDay, + Standard_Integer& theMonth, + Standard_Integer& theYear) const +{ + if (myMinute->Length() != 0) { + theMinute = myMinute->Value(1); + theHour = myHour->Value(1); + theDay = myDay->Value(1); + theMonth = myMonth->Value(1); + theYear = myYear->Value(1); + return Standard_True; + } + return Standard_False; +} + +void SALOMEDSImpl_AttributeStudyProperties::ChangeCreatorName(const TCollection_ExtendedString& theName) +{ + if (myUserName->Length() > 0) { + CheckLocked(); + Backup(); + myUserName->SetValue(1, theName); + } +} + +void SALOMEDSImpl_AttributeStudyProperties::SetCreationMode(const Standard_Integer theMode) +{ + CheckLocked(); + Backup(); + myMode = theMode; +} + +Standard_Integer SALOMEDSImpl_AttributeStudyProperties::GetCreationMode() const +{ + return myMode; +} + +void SALOMEDSImpl_AttributeStudyProperties::SetModified(const Standard_Integer theModified) +{ + myModified = theModified; +} + +Standard_Boolean SALOMEDSImpl_AttributeStudyProperties::IsModified() const +{ + return (myModified != 0); +} + +Standard_Integer SALOMEDSImpl_AttributeStudyProperties::GetModified() const +{ + return myModified; +} + +void SALOMEDSImpl_AttributeStudyProperties::SetLocked(const Standard_Boolean theLocked) +{ +// Backup(); + if (myLocked != theLocked) { + myLockChanged = Standard_True; + myLocked = theLocked; + } +} + +Standard_Boolean SALOMEDSImpl_AttributeStudyProperties::IsLocked() const +{ + return myLocked; +} + +Standard_Boolean SALOMEDSImpl_AttributeStudyProperties::IsLockChanged(const Standard_Boolean theErase) { + if (!myLockChanged) return Standard_False; + if (theErase) myLockChanged = Standard_False; + return Standard_True; +} + +const Standard_GUID& SALOMEDSImpl_AttributeStudyProperties::ID() const +{ + return GetID(); +} + +void SALOMEDSImpl_AttributeStudyProperties::Restore(const Handle(TDF_Attribute)& with) +{ + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(with); + Init(); + Standard_Integer i; + Handle(TColStd_HSequenceOfExtendedString) aNames; + Handle(TColStd_HSequenceOfInteger) aMinutes, aHours, aDays, aMonths, aYears; + aProp->GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears); + for (i = aNames->Length(); i > 0; i--) { + myUserName->Prepend(aNames->Value(i)); + myMinute->Prepend(aMinutes->Value(i)); + myHour->Prepend(aHours->Value(i)); + myDay->Prepend(aDays->Value(i)); + myMonth->Prepend(aMonths->Value(i)); + myYear->Prepend(aYears->Value(i)); + } + myMode = aProp->GetCreationMode(); +// myModified = aProp->GetModified(); +// myLocked = aProp->IsLocked(); +} + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeStudyProperties::NewEmpty() const +{ + return new SALOMEDSImpl_AttributeStudyProperties(); +} + +void SALOMEDSImpl_AttributeStudyProperties::Paste(const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)&) const +{ + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = + Handle(SALOMEDSImpl_AttributeStudyProperties)::DownCast(into); + aProp->Init(); + + Standard_Integer i; + for(i = 1; i <= myUserName->Length(); i++) { + aProp->SetModification(myUserName->Value(i), + myMinute->Value(i), myHour->Value(i), + myDay->Value(i), myMonth->Value(i), myYear->Value(i)); + } + + aProp->SetCreationMode(myMode); +// aProp->SetModified(myModified); +// aProp->SetLocked(myLocked); +} + + +TCollection_AsciiString SALOMEDSImpl_AttributeStudyProperties::Save() +{ + Handle(TColStd_HSequenceOfExtendedString) aNames; + Handle(TColStd_HSequenceOfInteger) aMinutes, aHours, aDays, aMonths, aYears; + GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears); + + int aLength, anIndex; + for (aLength = 0, anIndex = aNames->Length(); anIndex > 0; anIndex--) + aLength += aNames->Value(anIndex).Length() + 1; + + char* aProperty = new char[3 + aLength + 12 * aNames->Length()]; + + char crMode = (char)GetCreationMode(); + + sprintf(aProperty,"%c%c", crMode, IsLocked()?'l':'u'); + + aLength = aNames->Length(); + int a = 2; + for (anIndex = 1; anIndex <= aLength; anIndex++) { + sprintf(&(aProperty[a]),"%2d%2d%2d%2d%4d%s", + (int)(aMinutes->Value(anIndex)), + (int)(aHours->Value(anIndex)), + (int)(aDays->Value(anIndex)), + (int)(aMonths->Value(anIndex)), + (int)(aYears->Value(anIndex)), + (char*)(TCollection_AsciiString(aNames->Value(anIndex)).ToCString())); + a = strlen(aProperty); + aProperty[a++] = 1; + } + aProperty[a] = 0; + TCollection_AsciiString prop(aProperty); + delete aProperty; + + return prop; +} + +void SALOMEDSImpl_AttributeStudyProperties::Load(const TCollection_AsciiString& value) +{ + char* aCopy = value.ToCString(); + + int crMode = (int)aCopy[0]; + SetCreationMode(crMode); + + int anIndex; + for (anIndex = 2; anIndex + 2 < value.Length() ;) { + char str[10]; + Standard_Integer aMinute, aHour, aDay, aMonth, aYear; + str[0] = aCopy[anIndex++]; + str[1] = aCopy[anIndex++]; + str[2] = 0; + aMinute = atoi(str); + str[0] = aCopy[anIndex++]; + str[1] = aCopy[anIndex++]; + aHour = atoi(str); + str[0] = aCopy[anIndex++]; + str[1] = aCopy[anIndex++]; + aDay = atoi(str); + str[0] = aCopy[anIndex++]; + str[1] = aCopy[anIndex++]; + aMonth = atoi(str); + str[0] = aCopy[anIndex++]; + str[1] = aCopy[anIndex++]; + str[2] = aCopy[anIndex++]; + str[3] = aCopy[anIndex++]; + str[4] = 0; + aYear = atoi(str); + + int aNameSize; + for(aNameSize = 0; aCopy[anIndex+aNameSize]!=1; aNameSize++); + char *aName = new char[aNameSize+1]; + strncpy(aName, &(aCopy[anIndex]), aNameSize); + aName[aNameSize] = 0; + SetModification(aName,aMinute,aHour,aDay,aMonth,aYear); + delete(aName); + anIndex += aNameSize + 1; + } + if (aCopy[1] == 'l') { + SetLocked(Standard_True); + } + SetModified(0); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeStudyProperties.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeStudyProperties.hxx new file mode 100644 index 000000000..19fc22d0e --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeStudyProperties.hxx @@ -0,0 +1,97 @@ +// File : SALOMEDSImpl_AttributeStudyProperties.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeStudyProperties_HeaderFile +#define _SALOMEDSImpl_AttributeStudyProperties_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeStudyProperties, SALOMEDSImpl_GenericAttribute ) + +#include +#include + +class SALOMEDSImpl_AttributeStudyProperties : public SALOMEDSImpl_GenericAttribute +{ +public: +Standard_EXPORT SALOMEDSImpl_AttributeStudyProperties(); +Standard_EXPORT ~SALOMEDSImpl_AttributeStudyProperties() {} + +Standard_EXPORT static const Standard_GUID& GetID(); +Standard_EXPORT const Standard_GUID& ID() const; + +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeStudyProperties Set(const TDF_Label& label); + +Standard_EXPORT void Init(); + +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); + +Standard_EXPORT void SetModification(const TCollection_ExtendedString& theUserName, + const Standard_Integer theMinute, + const Standard_Integer theHour, + const Standard_Integer theDay, + const Standard_Integer theMonth, + const Standard_Integer theYear); +Standard_EXPORT void GetModifications(Handle(TColStd_HSequenceOfExtendedString)& theUserNames, + Handle(TColStd_HSequenceOfInteger)& theMinutes, + Handle(TColStd_HSequenceOfInteger)& theHours, + Handle(TColStd_HSequenceOfInteger)& theDays, + Handle(TColStd_HSequenceOfInteger)& theMonths, + Handle(TColStd_HSequenceOfInteger)& theYears) const; + +Standard_EXPORT TCollection_ExtendedString GetCreatorName() const; +Standard_EXPORT Standard_Boolean GetCreationDate(Standard_Integer& theMinute, + Standard_Integer& theHour, + Standard_Integer& theDay, + Standard_Integer& theMonth, + Standard_Integer& theYear) const; + +Standard_EXPORT void ChangeCreatorName(const TCollection_ExtendedString& theUserName); + +Standard_EXPORT void SetCreationMode(const Standard_Integer theMode); +Standard_EXPORT Standard_Integer GetCreationMode() const; + +Standard_EXPORT void SetModified(const Standard_Integer theModified); +Standard_EXPORT Standard_Boolean IsModified() const; +Standard_EXPORT Standard_Integer GetModified() const; + +Standard_EXPORT void SetLocked(const Standard_Boolean theLocked); +Standard_EXPORT Standard_Boolean IsLocked() const; +Standard_EXPORT Standard_Boolean IsLockChanged(const Standard_Boolean theErase); + +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with); +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const; + +private: + +Handle_TColStd_HSequenceOfExtendedString myUserName; +Handle_TColStd_HSequenceOfInteger myMinute; +Handle_TColStd_HSequenceOfInteger myHour; +Handle_TColStd_HSequenceOfInteger myDay; +Handle_TColStd_HSequenceOfInteger myMonth; +Handle_TColStd_HSequenceOfInteger myYear; +Standard_Integer myMode; +Standard_Integer myModified; +Standard_Boolean myLocked; +Standard_Boolean myLockChanged; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeStudyProperties ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfInteger.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfInteger.cxx new file mode 100644 index 000000000..33c6cd971 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfInteger.cxx @@ -0,0 +1,542 @@ +// File : SALOMEDSImpl_AttributeTableOfInteger.cxx +// Author : Michael Ponikarov +// Module : SALOME + +#include +#include +#include +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeTableOfInteger, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeTableOfInteger, SALOMEDSImpl_GenericAttribute ) + +#define SEPARATOR '\1' + +static TCollection_ExtendedString getUnit(TCollection_ExtendedString theString) +{ + TCollection_ExtendedString aString(theString); + int aPos = aString.Search(SEPARATOR); + if(aPos <= 0 || aPos == aString.Length() ) return TCollection_ExtendedString(); + return aString.Split(aPos); +} + +static TCollection_ExtendedString getTitle(TCollection_ExtendedString theString) +{ + TCollection_ExtendedString aString(theString); + int aPos = aString.Search(SEPARATOR); + if(aPos < 1) return aString; + if(aPos == 1) return TCollection_ExtendedString(); + aString.Split(aPos-1); + return aString; +} + +const Standard_GUID& SALOMEDSImpl_AttributeTableOfInteger::GetID() +{ + static Standard_GUID SALOMEDSImpl_AttributeTableOfIntegerID ("128371A0-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeTableOfIntegerID; +} + +Handle(SALOMEDSImpl_AttributeTableOfInteger) SALOMEDSImpl_AttributeTableOfInteger::Set(const TDF_Label& label) +{ + Handle(SALOMEDSImpl_AttributeTableOfInteger) anAttr; + if (!label.FindAttribute(SALOMEDSImpl_AttributeTableOfInteger::GetID(),anAttr)) { + anAttr = new SALOMEDSImpl_AttributeTableOfInteger(); + label.AddAttribute(anAttr); + } + return anAttr; +} + +SALOMEDSImpl_AttributeTableOfInteger::SALOMEDSImpl_AttributeTableOfInteger() +:SALOMEDSImpl_GenericAttribute("AttributeTableOfInteger") +{ + myRows = new TColStd_HSequenceOfExtendedString(); + myCols = new TColStd_HSequenceOfExtendedString(); + myNbRows = 0; + myNbColumns = 0; +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetNbColumns(const Standard_Integer theNbColumns) +{ + CheckLocked(); + Backup(); + + TColStd_DataMapOfIntegerInteger aMap; + aMap = myTable; + myTable.Clear(); + + TColStd_DataMapIteratorOfDataMapOfIntegerInteger anIterator(aMap); + for(; anIterator.More(); anIterator.Next()) { + int aRow = (int)(anIterator.Key()/myNbColumns) + 1; + int aCol = (int)(anIterator.Key() - myNbColumns*(aRow-1)); + if(aCol == 0) { aCol = myNbColumns; aRow--; } + if(aCol > theNbColumns) continue; + int aKey = (aRow-1)*theNbColumns+aCol; + myTable.Bind(aKey, anIterator.Value()); + } + + myNbColumns = theNbColumns; + + while (myCols->Length() < myNbColumns) { // append empty columns titles + myCols->Append(TCollection_ExtendedString("")); + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved + +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetTitle(const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + myTitle = theTitle; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfInteger::GetTitle() const +{ + return myTitle; +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetRowData(const Standard_Integer theRow, + const Handle(TColStd_HSequenceOfInteger)& theData) +{ + CheckLocked(); + if(theData->Length() > myNbColumns) SetNbColumns(theData->Length()); + + Backup(); + + while (myRows->Length() < theRow) { // append new row titles + myRows->Append(TCollection_ExtendedString("")); + } + + Standard_Integer i, aShift = (theRow-1)*myNbColumns, aLength = theData->Length(); + for(i = 1; i <= aLength; i++) { + myTable.Bind(aShift + i, theData->Value(i)); + } + + if(theRow > myNbRows) myNbRows = theRow; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfInteger) SALOMEDSImpl_AttributeTableOfInteger::GetRowData(const Standard_Integer theRow) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger(); + Standard_Integer i, aShift = (theRow-1)*myNbColumns; + for(i = 1; i <= myNbColumns; i++) { + if(myTable.IsBound(aShift+i)) + aSeq->Append(myTable.Find(aShift+i)); + else + aSeq->Append(0); + } + + return aSeq; +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetRowTitle(const Standard_Integer theRow, + const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + TCollection_ExtendedString aTitle(theTitle), aUnit = GetRowUnit(theRow); + if(aUnit.Length()>0) { + aTitle += SEPARATOR; + aTitle += aUnit; + } + myRows->SetValue(theRow, aTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetRowUnit(const Standard_Integer theRow, + const TCollection_ExtendedString& theUnit) +{ + CheckLocked(); + Backup(); + TCollection_ExtendedString aTitle = GetRowTitle(theRow); + aTitle += SEPARATOR; + aTitle += theUnit; + + myRows->SetValue(theRow, aTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetRowUnits(const Handle(TColStd_HSequenceOfExtendedString)& theUnits) +{ + if (theUnits->Length() != GetNbRows()) Standard_Failure::Raise("Invalid number of rows"); + int aLength = theUnits->Length(), i; + for(i = 1; i <= aLength; i++) SetRowUnit(i, theUnits->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfInteger::GetRowUnits() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myRows->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(getUnit(myRows->Value(i))); + return aSeq; +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetRowTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) +{ + if (theTitles->Length() != GetNbRows()) Standard_Failure::Raise("Invalid number of rows"); + int aLength = theTitles->Length(), i; + for(i = 1; i <= aLength; i++) SetRowTitle(i, theTitles->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfInteger::GetRowTitles() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myRows->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(getTitle(myRows->Value(i))); + return aSeq; +} + + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfInteger::GetRowTitle(const Standard_Integer theRow) const +{ + return getTitle(myRows->Value(theRow)); +} + + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfInteger::GetRowUnit(const Standard_Integer theRow) const +{ + return getUnit(myRows->Value(theRow)); +} + + +void SALOMEDSImpl_AttributeTableOfInteger::SetColumnData(const Standard_Integer theColumn, + const Handle(TColStd_HSequenceOfInteger)& theData) +{ + CheckLocked(); + if(theColumn > myNbColumns) SetNbColumns(theColumn); + + Backup(); + + Standard_Integer i, aLength = theData->Length(); + for(i = 1; i <= aLength; i++) { + myTable.Bind(myNbColumns*(i-1)+theColumn, theData->Value(i)); + } + + if(aLength > myNbRows) { + myNbRows = aLength; + while (myRows->Length() < myNbRows) { // append empty row titles + myRows->Append(TCollection_ExtendedString("")); + } + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + +Handle(TColStd_HSequenceOfInteger) SALOMEDSImpl_AttributeTableOfInteger::GetColumnData(const Standard_Integer theColumn) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + + Standard_Integer i, anIndex; + for(i = 1; i <= myNbRows; i++) { + anIndex = myNbColumns*(i-1) + theColumn; + if(myTable.IsBound(anIndex)) + aSeq->Append(myTable.Find(anIndex)); + else + aSeq->Append(0); + } + + return aSeq; +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetColumnTitle(const Standard_Integer theColumn, + const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + while(myCols->Length() < theColumn) myCols->Append(TCollection_ExtendedString("")); + myCols->SetValue(theColumn,theTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfInteger::GetColumnTitle(const Standard_Integer theColumn) const +{ + if(myCols.IsNull()) return ""; + if(myCols->Length() < theColumn) return ""; + return myCols->Value(theColumn); +} + +void SALOMEDSImpl_AttributeTableOfInteger::SetColumnTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) +{ + if (theTitles->Length() != myNbColumns) Standard_Failure::Raise("Invalid number of columns"); + int aLength = theTitles->Length(), i; + for(i = 1; i <= aLength; i++) myCols->SetValue(i, theTitles->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfInteger::GetColumnTitles() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myCols->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(myCols->Value(i)); + return aSeq; +} + +Standard_Integer SALOMEDSImpl_AttributeTableOfInteger::GetNbRows() const +{ + return myNbRows; +} + +Standard_Integer SALOMEDSImpl_AttributeTableOfInteger::GetNbColumns() const +{ + return myNbColumns; +} + +void SALOMEDSImpl_AttributeTableOfInteger::PutValue(const Standard_Integer theValue, + const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + CheckLocked(); + if(theColumn > myNbColumns) SetNbColumns(theColumn); + + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + myTable.Bind(anIndex, theValue); + + if(theRow > myNbRows) { + while (myRows->Length() < theRow) { // append empty row titles + myRows->Append(TCollection_ExtendedString("")); + } + myNbRows = theRow; + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Standard_Boolean SALOMEDSImpl_AttributeTableOfInteger::HasValue(const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + if(theRow > myNbRows || theRow < 1) return Standard_False; + if(theColumn > myNbColumns || theColumn < 1) return Standard_False; + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + return myTable.IsBound(anIndex); +} + +Standard_Integer SALOMEDSImpl_AttributeTableOfInteger::GetValue(const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + if(theRow > myNbRows || theRow < 1) Standard_Failure::Raise("Invalid cell index"); + if(theColumn > myNbColumns || theColumn < 1) Standard_Failure::Raise("Invalid cell index"); + + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + if(myTable.IsBound(anIndex)) return myTable.Find(anIndex); + + Standard_Failure::Raise("Invalid cell index"); + return 0; +} + +const Standard_GUID& SALOMEDSImpl_AttributeTableOfInteger::ID() const +{ + return GetID(); +} + +void SALOMEDSImpl_AttributeTableOfInteger::Restore(const Handle(TDF_Attribute)& with) +{ + Standard_Integer anIndex; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(with); + + myTable.Clear(); + myCols->Clear(); + myRows->Clear(); + + myTable = aTable->myTable; + myNbRows = aTable->myNbRows; + myNbColumns = aTable->myNbColumns; + myTitle = aTable->myTitle; + + for(anIndex = 1; anIndex <= aTable->GetNbRows();anIndex++) + myRows->Append(aTable->GetRowTitle(anIndex)); + + for(anIndex = 1; anIndex <= aTable->GetNbColumns(); anIndex++) + myCols->Append(aTable->GetColumnTitle(anIndex)); +} + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeTableOfInteger::NewEmpty() const +{ + return new SALOMEDSImpl_AttributeTableOfInteger(); +} + +void SALOMEDSImpl_AttributeTableOfInteger::Paste(const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)&) const +{ + Standard_Integer anIndex; + Handle(SALOMEDSImpl_AttributeTableOfInteger) aTable = Handle(SALOMEDSImpl_AttributeTableOfInteger)::DownCast(into); + + aTable->myTable.Clear(); + aTable->myCols->Clear(); + aTable->myRows->Clear(); + + aTable->myTable = myTable; + aTable->myTitle = myTitle; + aTable->myNbRows = myNbRows; + aTable->myNbColumns = myNbColumns; + + for(anIndex = 1; anIndex <= GetNbRows();anIndex++) + aTable->myRows->Append(GetRowTitle(anIndex)); + for(anIndex = 1; anIndex <= GetNbColumns(); anIndex++) + aTable->myCols->Append(GetColumnTitle(anIndex)); +} + + +Handle_TColStd_HSequenceOfInteger SALOMEDSImpl_AttributeTableOfInteger::GetSetRowIndices(const Standard_Integer theRow) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + + Standard_Integer i, aShift = myNbColumns*(theRow-1); + for(i = 1; i <= myNbColumns; i++) { + if(myTable.IsBound(aShift + i)) aSeq->Append(i); + } + + return aSeq; +} + +Handle_TColStd_HSequenceOfInteger SALOMEDSImpl_AttributeTableOfInteger::GetSetColumnIndices(const Standard_Integer theColumn) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + + Standard_Integer i, anIndex; + for(i = 1; i <= myNbRows; i++) { + anIndex = myNbColumns*(i-1)+theColumn; + if(myTable.IsBound(anIndex)) aSeq->Append(i); + } + + return aSeq; +} + + +void SALOMEDSImpl_AttributeTableOfInteger::ConvertToString(ostrstream& theStream) +{ + int i, j, l; + + theStream.precision(64); + + //Title + l = myTitle.Length(); + theStream << l << "\n"; + for(i=1; i<=l; i++) + theStream << myTitle.Value(i) << "\n"; + + //Nb rows + theStream << myNbRows << "\n"; + + //Rows titles + for(i=1; i<=myNbRows; i++) { + l = myRows->Value(i).Length(); + theStream << l << "\n"; + for(j=1; j<=l; j++) + theStream << myRows->Value(i).Value(j) << "\n"; + } + + //Nb columns + theStream << myNbColumns << "\n"; + + //Columns titles + for(i=1; i<=myNbColumns; i++) { + l = myCols->Value(i).Length(); + theStream << l << "\n"; + for(j=1; j<=l; j++) + theStream << myCols->Value(i).Value(j) << "\n"; + } + + //Store the table values + l = myTable.Extent(); + theStream << l << "\n"; + TColStd_DataMapIteratorOfDataMapOfIntegerInteger anIterator(myTable); + for(; anIterator.More(); anIterator.Next()) { + theStream << anIterator.Key() << "\n"; + theStream << anIterator.Value() << "\n"; + } + + return; +} + +bool SALOMEDSImpl_AttributeTableOfInteger::RestoreFromString(istrstream& theStream) +{ + Backup(); + + int i, j, l; + + Standard_ExtCharacter anExtChar; + TCollection_ExtendedString aStr; + + //Title + theStream >> l; + + myTitle = TCollection_ExtendedString(l, 0); + for(i=1; i<=l; i++) { + theStream >> anExtChar; + myTitle.SetValue(i, anExtChar); + } + + //Nb rows + theStream >> myNbRows; + + //Rows titles + myRows->Clear(); + for(i=1; i<=myNbRows; i++) { + theStream >> l; + aStr = TCollection_ExtendedString(l,0); + for(j=1; j<=l; j++) { + theStream >> anExtChar; + aStr.SetValue(j, anExtChar); + } + myRows->Append(aStr); + } + + //Nb columns + theStream >> myNbColumns; + + //Columns titles + myCols->Clear(); + for(i=1; i<=myNbColumns; i++) { + theStream >> l; + aStr = TCollection_ExtendedString(l,0); + for(j=1; j<=l; j++) { + theStream >> anExtChar; + aStr.SetValue(j, anExtChar); + } + myCols->Append(aStr); + } + + //Restore the table values + theStream >> l; + myTable.Clear(); + for(i=1; i<=l; i++) { + int aKey, aValue; + theStream >> aKey; + theStream >> aValue; + myTable.Bind(aKey, aValue); + } + + return true; +} + + +TCollection_AsciiString SALOMEDSImpl_AttributeTableOfInteger::Save() +{ + ostrstream ostr; + ConvertToString(ostr); + TCollection_AsciiString aString((char*)ostr.rdbuf()->str()); + return aString; +} + +void SALOMEDSImpl_AttributeTableOfInteger::Load(const TCollection_AsciiString& value) +{ + istrstream aStream(value.ToCString(), strlen(value.ToCString())); + RestoreFromString(aStream); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfInteger.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfInteger.hxx new file mode 100644 index 000000000..d1c1d402f --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfInteger.hxx @@ -0,0 +1,94 @@ +// SALOME SALOMEDSImpl : data structure of SALOME and sources of Salome data server +// +// Copyright (C) 2003 CEA/DEN, EDF R&D +// +// +// +// File : SALOMEDSImpl_AttributeTableOfInteger.hxx +// Author : Michael Ponikarov +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeTableOfInteger_HeaderFile +#define _SALOMEDSImpl_AttributeTableOfInteger_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + +#include +#include +#include +#include +#include +#include +#include + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeTableOfInteger, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeTableOfInteger : public SALOMEDSImpl_GenericAttribute +{ + +public: +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeTableOfInteger Set(const TDF_Label& label) ; +Standard_EXPORT SALOMEDSImpl_AttributeTableOfInteger(); +Standard_EXPORT void SetNbColumns(const Standard_Integer theNbColumns); +Standard_EXPORT void SetTitle(const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT TCollection_ExtendedString GetTitle() const; +Standard_EXPORT void SetRowData(const Standard_Integer theRow,const Handle(TColStd_HSequenceOfInteger)& theData) ; +Standard_EXPORT Handle_TColStd_HSequenceOfInteger GetRowData(const Standard_Integer theRow) ; +Standard_EXPORT void SetRowTitle(const Standard_Integer theRow,const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT void SetRowUnit(const Standard_Integer theRow,const TCollection_ExtendedString& theUnit) ; +Standard_EXPORT TCollection_ExtendedString GetRowUnit(const Standard_Integer theRow) const; +Standard_EXPORT void SetRowUnits(const Handle(TColStd_HSequenceOfExtendedString)& theUnits) ; +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetRowUnits(); +Standard_EXPORT void SetRowTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) ; +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetRowTitles(); +Standard_EXPORT TCollection_ExtendedString GetRowTitle(const Standard_Integer theRow) const; +Standard_EXPORT void SetColumnData(const Standard_Integer theColumn,const Handle(TColStd_HSequenceOfInteger)& theData) ; +Standard_EXPORT Handle_TColStd_HSequenceOfInteger GetColumnData(const Standard_Integer theColumn) ; +Standard_EXPORT void SetColumnTitle(const Standard_Integer theColumn,const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT TCollection_ExtendedString GetColumnTitle(const Standard_Integer theColumn) const; +Standard_EXPORT void SetColumnTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles); +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetColumnTitles(); +Standard_EXPORT Standard_Integer GetNbRows() const; +Standard_EXPORT Standard_Integer GetNbColumns() const; + +Standard_EXPORT void PutValue(const Standard_Integer theValue,const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT Standard_Boolean HasValue(const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT Standard_Integer GetValue(const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; + +Standard_EXPORT Handle_TColStd_HSequenceOfInteger GetSetRowIndices(const Standard_Integer theRow); +Standard_EXPORT Handle_TColStd_HSequenceOfInteger GetSetColumnIndices(const Standard_Integer theColumn); + +Standard_EXPORT void ConvertToString(ostrstream& theStream); +Standard_EXPORT bool RestoreFromString(istrstream& theStream); + +Standard_EXPORT ~SALOMEDSImpl_AttributeTableOfInteger() {} + +private: + +TColStd_DataMapOfIntegerInteger myTable; +TCollection_ExtendedString myTitle; +Handle_TColStd_HSequenceOfExtendedString myRows; +Handle_TColStd_HSequenceOfExtendedString myCols; +Standard_Integer myNbRows; +Standard_Integer myNbColumns; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeTableOfInteger ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfReal.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfReal.cxx new file mode 100644 index 000000000..a57676472 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfReal.cxx @@ -0,0 +1,546 @@ +// File : SALOMEDSImpl_AttributeTableOfReal.cxx +// Author : Michael Ponikarov +// Module : SALOME + +#include +#include +#include +#include +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeTableOfReal, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeTableOfReal, SALOMEDSImpl_GenericAttribute ) + +#define SEPARATOR '\1' + +static TCollection_ExtendedString getUnit(TCollection_ExtendedString theString) +{ + TCollection_ExtendedString aString(theString); + int aPos = aString.Search(SEPARATOR); + if(aPos <= 0 || aPos == aString.Length() ) return TCollection_ExtendedString(); + return aString.Split(aPos); +} + +static TCollection_ExtendedString getTitle(TCollection_ExtendedString theString) +{ + TCollection_ExtendedString aString(theString); + int aPos = aString.Search(SEPARATOR); + if(aPos < 1) return aString; + if(aPos == 1) return TCollection_ExtendedString(); + aString.Split(aPos-1); + return aString; +} + +const Standard_GUID& SALOMEDSImpl_AttributeTableOfReal::GetID() +{ + static Standard_GUID SALOMEDSImpl_AttributeTableOfRealID ("128371A1-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeTableOfRealID; +} + +Handle(SALOMEDSImpl_AttributeTableOfReal) SALOMEDSImpl_AttributeTableOfReal::Set(const TDF_Label& label) +{ + Handle(SALOMEDSImpl_AttributeTableOfReal) anAttr; + if (!label.FindAttribute(SALOMEDSImpl_AttributeTableOfReal::GetID(),anAttr)) { + anAttr = new SALOMEDSImpl_AttributeTableOfReal(); + label.AddAttribute(anAttr); + } + return anAttr; +} + +SALOMEDSImpl_AttributeTableOfReal::SALOMEDSImpl_AttributeTableOfReal() +:SALOMEDSImpl_GenericAttribute("AttributeTableOfReal") +{ + myRows = new TColStd_HSequenceOfExtendedString(); + myCols = new TColStd_HSequenceOfExtendedString(); + myNbRows = 0; + myNbColumns = 0; +} + +void SALOMEDSImpl_AttributeTableOfReal::SetNbColumns(const Standard_Integer theNbColumns) +{ + CheckLocked(); + Backup(); + + TColStd_DataMapOfIntegerReal aMap; + aMap = myTable; + myTable.Clear(); + + TColStd_DataMapIteratorOfDataMapOfIntegerReal anIterator(aMap); + for(; anIterator.More(); anIterator.Next()) { + int aRow = (int)(anIterator.Key()/myNbColumns) + 1; + int aCol = (int)(anIterator.Key() - myNbColumns*(aRow-1)); + if(aCol == 0) { aCol = myNbColumns; aRow--; } + if(aCol > theNbColumns) continue; + int aKey = (aRow-1)*theNbColumns+aCol; + myTable.Bind(aKey, anIterator.Value()); + } + + myNbColumns = theNbColumns; + + while (myCols->Length() < myNbColumns) { // append empty columns titles + myCols->Append(TCollection_ExtendedString("")); + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfReal::SetTitle(const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + myTitle = theTitle; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfReal::GetTitle() const +{ + return myTitle; +} + +void SALOMEDSImpl_AttributeTableOfReal::SetRowData(const Standard_Integer theRow, + const Handle(TColStd_HSequenceOfReal)& theData) +{ + CheckLocked(); + if(theData->Length() > myNbColumns) SetNbColumns(theData->Length()); + + Backup(); + + while (myRows->Length() < theRow) { // append new row titles + myRows->Append(TCollection_ExtendedString("")); + } + + Standard_Integer i, aShift = (theRow-1)*myNbColumns, aLength = theData->Length(); + for(i = 1; i <= aLength; i++) { + myTable.Bind(aShift + i, theData->Value(i)); + } + + if(theRow > myNbRows) myNbRows = theRow; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfReal) SALOMEDSImpl_AttributeTableOfReal::GetRowData(const Standard_Integer theRow) +{ + Handle(TColStd_HSequenceOfReal) aSeq = new TColStd_HSequenceOfReal(); + Standard_Integer i, aShift = (theRow-1)*myNbColumns; + for(i = 1; i <= myNbColumns; i++) { + if(myTable.IsBound(aShift+i)) + aSeq->Append(myTable.Find(aShift+i)); + else + aSeq->Append(0.); + } + + return aSeq; +} + + +void SALOMEDSImpl_AttributeTableOfReal::SetRowTitle(const Standard_Integer theRow, + const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + TCollection_ExtendedString aTitle(theTitle), aUnit = GetRowUnit(theRow); + if(aUnit.Length()>0) { + aTitle += SEPARATOR; + aTitle += aUnit; + } + myRows->SetValue(theRow, aTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfReal::SetRowUnit(const Standard_Integer theRow, + const TCollection_ExtendedString& theUnit) +{ + CheckLocked(); + Backup(); + TCollection_ExtendedString aTitle = GetRowTitle(theRow); + aTitle += SEPARATOR; + aTitle += theUnit; + + myRows->SetValue(theRow, aTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfReal::SetRowUnits(const Handle(TColStd_HSequenceOfExtendedString)& theUnits) +{ + if (theUnits->Length() != GetNbRows()) Standard_Failure::Raise("Invalid number of rows"); + int aLength = theUnits->Length(), i; + for(i = 1; i <= aLength; i++) SetRowUnit(i, theUnits->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfReal::GetRowUnits() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myRows->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(getUnit(myRows->Value(i))); + return aSeq; +} + +void SALOMEDSImpl_AttributeTableOfReal::SetRowTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) +{ + if (theTitles->Length() != GetNbRows()) Standard_Failure::Raise("Invalid number of rows"); + int aLength = theTitles->Length(), i; + for(i = 1; i <= aLength; i++) SetRowTitle(i, theTitles->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfReal::GetRowTitles() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myRows->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(getTitle(myRows->Value(i))); + return aSeq; +} + + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfReal::GetRowTitle(const Standard_Integer theRow) const +{ + return getTitle(myRows->Value(theRow)); +} + + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfReal::GetRowUnit(const Standard_Integer theRow) const +{ + return getUnit(myRows->Value(theRow)); +} + +void SALOMEDSImpl_AttributeTableOfReal::SetColumnData(const Standard_Integer theColumn, + const Handle(TColStd_HSequenceOfReal)& theData) +{ + CheckLocked(); + if(theColumn > myNbColumns) SetNbColumns(theColumn); + + Backup(); + + Standard_Integer i, aLength = theData->Length(); + for(i = 1; i <= aLength; i++) { + myTable.Bind(myNbColumns*(i-1)+theColumn, theData->Value(i)); + } + + if(aLength > myNbRows) { + myNbRows = aLength; + while (myRows->Length() < myNbRows) { // append empty row titles + myRows->Append(TCollection_ExtendedString("")); + } + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + +Handle(TColStd_HSequenceOfReal) SALOMEDSImpl_AttributeTableOfReal::GetColumnData(const Standard_Integer theColumn) +{ + Handle(TColStd_HSequenceOfReal) aSeq = new TColStd_HSequenceOfReal; + + Standard_Integer i, anIndex; + for(i = 1; i <= myNbRows; i++) { + anIndex = myNbColumns*(i-1) + theColumn; + if(myTable.IsBound(anIndex)) + aSeq->Append(myTable.Find(anIndex)); + else + aSeq->Append(0.); + } + + return aSeq; +} + +void SALOMEDSImpl_AttributeTableOfReal::SetColumnTitle(const Standard_Integer theColumn, + const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + while(myCols->Length() < theColumn) myCols->Append(TCollection_ExtendedString("")); + myCols->SetValue(theColumn,theTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfReal::GetColumnTitle(const Standard_Integer theColumn) const +{ + if(myCols.IsNull()) return ""; + if(myCols->Length() < theColumn) return ""; + return myCols->Value(theColumn); +} + +void SALOMEDSImpl_AttributeTableOfReal::SetColumnTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) +{ + if (theTitles->Length() != myNbColumns) Standard_Failure::Raise("Invalid number of columns"); + int aLength = theTitles->Length(), i; + for(i = 1; i <= aLength; i++) myCols->SetValue(i, theTitles->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfReal::GetColumnTitles() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myCols->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(myCols->Value(i)); + return aSeq; +} + +Standard_Integer SALOMEDSImpl_AttributeTableOfReal::GetNbRows() const +{ + return myNbRows; +} + +Standard_Integer SALOMEDSImpl_AttributeTableOfReal::GetNbColumns() const +{ + return myNbColumns; +} + +void SALOMEDSImpl_AttributeTableOfReal::PutValue(const Standard_Real theValue, + const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + CheckLocked(); + if(theColumn > myNbColumns) SetNbColumns(theColumn); + + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + myTable.Bind(anIndex, theValue); + + if(theRow > myNbRows) { + while (myRows->Length() < theRow) { // append empty row titles + myRows->Append(TCollection_ExtendedString("")); + } + myNbRows = theRow; + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Standard_Boolean SALOMEDSImpl_AttributeTableOfReal::HasValue(const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + if(theRow > myNbRows || theRow < 1) return Standard_False; + if(theColumn > myNbColumns || theColumn < 1) return Standard_False; + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + return myTable.IsBound(anIndex); +} + +Standard_Real SALOMEDSImpl_AttributeTableOfReal::GetValue(const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + if(theRow > myNbRows || theRow < 1) Standard_Failure::Raise("Invalid cell index"); + if(theColumn > myNbColumns || theColumn < 1) Standard_Failure::Raise("Invalid cell index"); + + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + if(myTable.IsBound(anIndex)) return myTable.Find(anIndex); + + Standard_Failure::Raise("Invalid cell index"); + return 0.; +} + +const Standard_GUID& SALOMEDSImpl_AttributeTableOfReal::ID() const +{ + return GetID(); +} + +void SALOMEDSImpl_AttributeTableOfReal::Restore(const Handle(TDF_Attribute)& with) +{ + Standard_Integer anIndex; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(with); + + myTable.Clear(); + myCols->Clear(); + myRows->Clear(); + + myTable = aTable->myTable; + myNbRows = aTable->myNbRows; + myNbColumns = aTable->myNbColumns; + myTitle = aTable->myTitle; + + for(anIndex = 1; anIndex <= aTable->GetNbRows();anIndex++) + myRows->Append(aTable->GetRowTitle(anIndex)); + + for(anIndex = 1; anIndex <= aTable->GetNbColumns(); anIndex++) + myCols->Append(aTable->GetColumnTitle(anIndex)); +} + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeTableOfReal::NewEmpty() const +{ + return new SALOMEDSImpl_AttributeTableOfReal(); +} + +void SALOMEDSImpl_AttributeTableOfReal::Paste(const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)&) const +{ + Standard_Integer anIndex; + Handle(SALOMEDSImpl_AttributeTableOfReal) aTable = Handle(SALOMEDSImpl_AttributeTableOfReal)::DownCast(into); + + aTable->myTable.Clear(); + aTable->myCols->Clear(); + aTable->myRows->Clear(); + + aTable->myTable = myTable; + aTable->myTitle = myTitle; + aTable->myNbRows = myNbRows; + aTable->myNbColumns = myNbColumns; + + for(anIndex = 1; anIndex <= GetNbRows();anIndex++) + aTable->myRows->Append(GetRowTitle(anIndex)); + for(anIndex = 1; anIndex <= GetNbColumns(); anIndex++) + aTable->myCols->Append(GetColumnTitle(anIndex)); +} + + +Handle_TColStd_HSequenceOfInteger SALOMEDSImpl_AttributeTableOfReal::GetSetRowIndices(const Standard_Integer theRow) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + + Standard_Integer i, aShift = myNbColumns*(theRow-1); + for(i = 1; i <= myNbColumns; i++) { + if(myTable.IsBound(aShift + i)) aSeq->Append(i); + } + + return aSeq; +} + +Handle_TColStd_HSequenceOfInteger SALOMEDSImpl_AttributeTableOfReal::GetSetColumnIndices(const Standard_Integer theColumn) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + + Standard_Integer i, anIndex; + for(i = 1; i <= myNbRows; i++) { + anIndex = myNbColumns*(i-1)+theColumn; + if(myTable.IsBound(anIndex)) aSeq->Append(i); + } + + return aSeq; +} + + + +void SALOMEDSImpl_AttributeTableOfReal::ConvertToString(ostrstream& theStream) +{ + int i, j, l; + + + //Title + l = myTitle.Length(); + theStream << l << "\n"; + for(i=1; i<=l; i++) + theStream << myTitle.Value(i) << "\n"; + + //Nb rows + theStream << myNbRows << "\n"; + + //Rows titles + for(i=1; i<=myNbRows; i++) { + l = myRows->Value(i).Length(); + theStream << l << "\n"; + for(j=1; j<=l; j++) + theStream << myRows->Value(i).Value(j) << "\n"; + } + + //Nb columns + theStream << myNbColumns << "\n"; + + //Columns titles + for(i=1; i<=myNbColumns; i++) { + l = myCols->Value(i).Length(); + theStream << l << "\n"; + for(j=1; j<=l; j++) + theStream << myCols->Value(i).Value(j) << "\n"; + } + + //Store the table values + l = myTable.Extent(); + theStream << l << "\n"; + char *aBuffer = new char[128]; + TColStd_DataMapIteratorOfDataMapOfIntegerReal anIterator(myTable); + for(; anIterator.More(); anIterator.Next()) { + theStream << anIterator.Key() << "\n"; + sprintf(aBuffer, "%.64e", anIterator.Value()); + theStream << aBuffer << "\n"; + } + + delete []aBuffer; + + return; +} + +bool SALOMEDSImpl_AttributeTableOfReal::RestoreFromString(istrstream& theStream) +{ + Backup(); + + int i, j, l; + + Standard_ExtCharacter anExtChar; + TCollection_ExtendedString aStr; + + //Title + theStream >> l; + + myTitle = TCollection_ExtendedString(l, 0); + for(i=1; i<=l; i++) { + theStream >> anExtChar; + myTitle.SetValue(i, anExtChar); + } + + //Nb rows + theStream >> myNbRows; + + //Rows titles + myRows->Clear(); + for(i=1; i<=myNbRows; i++) { + theStream >> l; + aStr = TCollection_ExtendedString(l,0); + for(j=1; j<=l; j++) { + theStream >> anExtChar; + aStr.SetValue(j, anExtChar); + } + myRows->Append(aStr); + } + + //Nb columns + theStream >> myNbColumns; + + //Columns titles + myCols->Clear(); + for(i=1; i<=myNbColumns; i++) { + theStream >> l; + aStr = TCollection_ExtendedString(l,0); + for(j=1; j<=l; j++) { + theStream >> anExtChar; + aStr.SetValue(j, anExtChar); + } + myCols->Append(aStr); + } + + //Restore the table values + theStream >> l; + myTable.Clear(); + for(i=1; i<=l; i++) { + Standard_Integer aKey; + Standard_Real aValue; + theStream >> aKey; + theStream >> aValue; + myTable.Bind(aKey, aValue); + } + + return true; +} + +TCollection_AsciiString SALOMEDSImpl_AttributeTableOfReal::Save() +{ + ostrstream ostr; + ConvertToString(ostr); + TCollection_AsciiString aString((char*)ostr.rdbuf()->str()); + return aString; +} + +void SALOMEDSImpl_AttributeTableOfReal::Load(const TCollection_AsciiString& value) +{ + istrstream aStream(value.ToCString(), strlen(value.ToCString())); + RestoreFromString(aStream); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfReal.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfReal.hxx new file mode 100644 index 000000000..221309287 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfReal.hxx @@ -0,0 +1,97 @@ +// SALOME SALOMEDSImpl : data structure of SALOME and sources of Salome data server +// +// Copyright (C) 2003 CEA/DEN, EDF R&D +// +// +// +// File : SALOMEDSImpl_AttributeTableOfReal.hxx +// Author : Michael Ponikarov +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeTableOfReal_HeaderFile +#define _SALOMEDSImpl_AttributeTableOfReal_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeTableOfReal, SALOMEDSImpl_GenericAttribute ) + +#include +#include +#include +#include +#include +#include + +#include +#include + +class SALOMEDSImpl_AttributeTableOfReal : public SALOMEDSImpl_GenericAttribute +{ + +public: +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeTableOfReal Set(const TDF_Label& label) ; +Standard_EXPORT SALOMEDSImpl_AttributeTableOfReal(); +Standard_EXPORT void SetNbColumns(const Standard_Integer theNbColumns); +Standard_EXPORT void SetTitle(const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT TCollection_ExtendedString GetTitle() const; +Standard_EXPORT void SetRowData(const Standard_Integer theRow,const Handle(TColStd_HSequenceOfReal)& theData) ; +Standard_EXPORT Handle_TColStd_HSequenceOfReal GetRowData(const Standard_Integer theRow) ; +Standard_EXPORT void SetRowTitle(const Standard_Integer theRow,const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT void SetRowUnit(const Standard_Integer theRow,const TCollection_ExtendedString& theUnit) ; +Standard_EXPORT TCollection_ExtendedString GetRowUnit(const Standard_Integer theRow) const; +Standard_EXPORT void SetRowUnits(const Handle(TColStd_HSequenceOfExtendedString)& theUnits) ; +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetRowUnits(); +Standard_EXPORT void SetRowTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) ; +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetRowTitles(); +Standard_EXPORT TCollection_ExtendedString GetRowTitle(const Standard_Integer theRow) const; +Standard_EXPORT void SetColumnData(const Standard_Integer theColumn,const Handle(TColStd_HSequenceOfReal)& theData) ; +Standard_EXPORT Handle_TColStd_HSequenceOfReal GetColumnData(const Standard_Integer theColumn) ; +Standard_EXPORT void SetColumnTitle(const Standard_Integer theColumn,const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT void SetColumnTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles); +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetColumnTitles(); +Standard_EXPORT TCollection_ExtendedString GetColumnTitle(const Standard_Integer theColumn) const; +Standard_EXPORT Standard_Integer GetNbRows() const; +Standard_EXPORT Standard_Integer GetNbColumns() const; + +Standard_EXPORT void PutValue(const Standard_Real theValue,const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT Standard_Boolean HasValue(const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT Standard_Real GetValue(const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; + +Standard_EXPORT Handle_TColStd_HSequenceOfInteger GetSetRowIndices(const Standard_Integer theRow); +Standard_EXPORT Handle_TColStd_HSequenceOfInteger GetSetColumnIndices(const Standard_Integer theColumn); + +Standard_EXPORT void ConvertToString(ostrstream& theStream); +Standard_EXPORT bool RestoreFromString(istrstream& theStream); + +Standard_EXPORT ~SALOMEDSImpl_AttributeTableOfReal() {} + +private: +TColStd_DataMapOfIntegerReal myTable; +TCollection_ExtendedString myTitle; +Handle_TColStd_HSequenceOfExtendedString myRows; +Handle_TColStd_HSequenceOfExtendedString myCols; +Standard_Integer myNbRows; +Standard_Integer myNbColumns; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeTableOfReal ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfString.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfString.cxx new file mode 100644 index 000000000..9aca85190 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfString.cxx @@ -0,0 +1,566 @@ +// File : SALOMEDSImpl_AttributeTableOfString.cxx +// Author : Sergey Ruin +// Module : SALOME + +#include +#include +#include +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeTableOfString, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeTableOfString, SALOMEDSImpl_GenericAttribute ) + +typedef NCollection_DataMap::Iterator DataMapIterator; + +#define SEPARATOR '\1' + +static TCollection_ExtendedString getUnit(TCollection_ExtendedString theString) +{ + TCollection_ExtendedString aString(theString); + int aPos = aString.Search(SEPARATOR); + if(aPos <= 0 || aPos == aString.Length() ) return TCollection_ExtendedString(); + return aString.Split(aPos); +} + +static TCollection_ExtendedString getTitle(TCollection_ExtendedString theString) +{ + TCollection_ExtendedString aString(theString); + int aPos = aString.Search(SEPARATOR); + if(aPos < 1) return aString; + if(aPos == 1) return TCollection_ExtendedString(); + aString.Split(aPos-1); + return aString; +} + +const Standard_GUID& SALOMEDSImpl_AttributeTableOfString::GetID() +{ + static Standard_GUID SALOMEDSImpl_AttributeTableOfStringID ("128371A4-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeTableOfStringID; +} + +Handle(SALOMEDSImpl_AttributeTableOfString) SALOMEDSImpl_AttributeTableOfString::Set(const TDF_Label& label) +{ + Handle(SALOMEDSImpl_AttributeTableOfString) anAttr; + if (!label.FindAttribute(SALOMEDSImpl_AttributeTableOfString::GetID(),anAttr)) { + anAttr = new SALOMEDSImpl_AttributeTableOfString(); + label.AddAttribute(anAttr); + } + return anAttr; +} + +SALOMEDSImpl_AttributeTableOfString::SALOMEDSImpl_AttributeTableOfString() +:SALOMEDSImpl_GenericAttribute("AttributeTableOfString") +{ + myRows = new TColStd_HSequenceOfExtendedString(); + myCols = new TColStd_HSequenceOfExtendedString(); + myNbRows = 0; + myNbColumns = 0; +} + +void SALOMEDSImpl_AttributeTableOfString::SetNbColumns(const Standard_Integer theNbColumns) +{ + CheckLocked(); + Backup(); + + DataMapOfIntegerString aMap; + aMap = myTable; + myTable.Clear(); + + DataMapIterator anIterator(aMap); + for(; anIterator.More(); anIterator.Next()) { + int aRow = (int)(anIterator.Key()/myNbColumns) + 1; + int aCol = (int)(anIterator.Key() - myNbColumns*(aRow-1)); + if(aCol == 0) { aCol = myNbColumns; aRow--; } + if(aCol > theNbColumns) continue; + int aKey = (aRow-1)*theNbColumns+aCol; + myTable.Bind(aKey, anIterator.Value()); + } + + myNbColumns = theNbColumns; + + while (myCols->Length() < myNbColumns) { // append empty columns titles + myCols->Append(TCollection_ExtendedString("")); + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfString::SetRowTitle(const Standard_Integer theRow, + const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + TCollection_ExtendedString aTitle(theTitle), aUnit = GetRowUnit(theRow); + if(aUnit.Length()>0) { + aTitle += SEPARATOR; + aTitle += aUnit; + } + myRows->SetValue(theRow, aTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfString::SetRowUnit(const Standard_Integer theRow, + const TCollection_ExtendedString& theUnit) +{ + CheckLocked(); + Backup(); + TCollection_ExtendedString aTitle = GetRowTitle(theRow); + aTitle += SEPARATOR; + aTitle += theUnit; + + myRows->SetValue(theRow, aTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfString::SetRowUnits(const Handle(TColStd_HSequenceOfExtendedString)& theUnits) +{ + if (theUnits->Length() != GetNbRows()) Standard_Failure::Raise("Invalid number of rows"); + int aLength = theUnits->Length(), i; + for(i = 1; i <= aLength; i++) SetRowUnit(i, theUnits->Value(i)); +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfString::GetRowUnits() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myRows->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(getUnit(myRows->Value(i))); + return aSeq; +} + +void SALOMEDSImpl_AttributeTableOfString::SetRowTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) +{ + if (theTitles->Length() != GetNbRows()) Standard_Failure::Raise("Invalid number of rows"); + int aLength = theTitles->Length(), i; + for(i = 1; i <= aLength; i++) SetRowTitle(i, theTitles->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfString::GetRowTitles() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myRows->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(getTitle(myRows->Value(i))); + return aSeq; +} + + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfString::GetRowTitle(const Standard_Integer theRow) const +{ + return getTitle(myRows->Value(theRow)); +} + + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfString::GetRowUnit(const Standard_Integer theRow) const +{ + return getUnit(myRows->Value(theRow)); +} + +void SALOMEDSImpl_AttributeTableOfString::SetRowData(const Standard_Integer theRow, + const Handle(TColStd_HSequenceOfExtendedString)& theData) +{ + CheckLocked(); + if(theData->Length() > myNbColumns) SetNbColumns(theData->Length()); + + Backup(); + + while (myRows->Length() < theRow) { // append new row titles + myRows->Append(TCollection_ExtendedString("")); + } + + Standard_Integer i, aShift = (theRow-1)*myNbColumns, aLength = theData->Length(); + for(i = 1; i <= aLength; i++) { + myTable.Bind(aShift + i, theData->Value(i)); + } + + if(theRow > myNbRows) myNbRows = theRow; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +void SALOMEDSImpl_AttributeTableOfString::SetTitle(const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + myTitle = theTitle; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfString::GetTitle() const +{ + return myTitle; +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfString::GetRowData(const Standard_Integer theRow) +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString(); + Standard_Integer i, aShift = (theRow-1)*myNbColumns; + for(i = 1; i <= myNbColumns; i++) { + if(myTable.IsBound(aShift+i)) + aSeq->Append(myTable.Find(aShift+i)); + else + aSeq->Append(0.); + } + + return aSeq; +} + +void SALOMEDSImpl_AttributeTableOfString::SetColumnData(const Standard_Integer theColumn, + const Handle(TColStd_HSequenceOfExtendedString)& theData) +{ + CheckLocked(); + if(theColumn > myNbColumns) SetNbColumns(theColumn); + + Backup(); + + Standard_Integer i, aLength = theData->Length(); + for(i = 1; i <= aLength; i++) { + myTable.Bind(myNbColumns*(i-1)+theColumn, theData->Value(i)); + } + + if(aLength > myNbRows) { + myNbRows = aLength; + while (myRows->Length() < myNbRows) { // append empty row titles + myRows->Append(TCollection_ExtendedString("")); + } + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfString::GetColumnData(const Standard_Integer theColumn) +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + + Standard_Integer i, anIndex; + for(i = 1; i <= myNbRows; i++) { + anIndex = myNbColumns*(i-1) + theColumn; + if(myTable.IsBound(anIndex)) + aSeq->Append(myTable.Find(anIndex)); + else + aSeq->Append(0.); + } + + return aSeq; +} + +void SALOMEDSImpl_AttributeTableOfString::SetColumnTitle(const Standard_Integer theColumn, + const TCollection_ExtendedString& theTitle) +{ + CheckLocked(); + Backup(); + while(myCols->Length() < theColumn) myCols->Append(TCollection_ExtendedString("")); + myCols->SetValue(theColumn,theTitle); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfString::GetColumnTitle(const Standard_Integer theColumn) const +{ + if(myCols.IsNull()) return ""; + if(myCols->Length() < theColumn) return ""; + return myCols->Value(theColumn); +} + + +void SALOMEDSImpl_AttributeTableOfString::SetColumnTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) +{ + if (theTitles->Length() != myNbColumns) Standard_Failure::Raise("Invalid number of columns"); + int aLength = theTitles->Length(), i; + for(i = 1; i <= aLength; i++) myCols->SetValue(i, theTitles->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Handle(TColStd_HSequenceOfExtendedString) SALOMEDSImpl_AttributeTableOfString::GetColumnTitles() +{ + Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString; + int aLength = myCols->Length(), i; + for(i=1; i<=aLength; i++) aSeq->Append(myCols->Value(i)); + return aSeq; +} + + +Standard_Integer SALOMEDSImpl_AttributeTableOfString::GetNbRows() const +{ + return myNbRows; +} + +Standard_Integer SALOMEDSImpl_AttributeTableOfString::GetNbColumns() const +{ + return myNbColumns; +} + +void SALOMEDSImpl_AttributeTableOfString::PutValue(const TCollection_ExtendedString& theValue, + const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + CheckLocked(); + if(theColumn > myNbColumns) SetNbColumns(theColumn); + + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + myTable.Bind(anIndex, theValue); + + if(theRow > myNbRows) { + while (myRows->Length() < theRow) { // append empty row titles + myRows->Append(TCollection_ExtendedString("")); + } + myNbRows = theRow; + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +Standard_Boolean SALOMEDSImpl_AttributeTableOfString::HasValue(const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + if(theRow > myNbRows || theRow < 1) return Standard_False; + if(theColumn > myNbColumns || theColumn < 1) return Standard_False; + + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + return myTable.IsBound(anIndex); +} + +TCollection_ExtendedString SALOMEDSImpl_AttributeTableOfString::GetValue(const Standard_Integer theRow, + const Standard_Integer theColumn) +{ + if(theRow > myNbRows || theRow < 1) Standard_Failure::Raise("Invalid cell index"); + if(theColumn > myNbColumns || theColumn < 1) Standard_Failure::Raise("Invalid cell index"); + + Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn; + if(myTable.IsBound(anIndex)) return myTable.Find(anIndex); + + Standard_Failure::Raise("Invalid cell index"); + return 0.; +} + +const Standard_GUID& SALOMEDSImpl_AttributeTableOfString::ID() const +{ + return GetID(); +} + +void SALOMEDSImpl_AttributeTableOfString::Restore(const Handle(TDF_Attribute)& with) +{ + Standard_Integer anIndex; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(with); + + myTable.Clear(); + myCols->Clear(); + myRows->Clear(); + + myTable = aTable->myTable; + myNbRows = aTable->myNbRows; + myNbColumns = aTable->myNbColumns; + myTitle = aTable->myTitle; + + for(anIndex = 1; anIndex <= aTable->GetNbRows();anIndex++) + myRows->Append(aTable->GetRowTitle(anIndex)); + + for(anIndex = 1; anIndex <= aTable->GetNbColumns(); anIndex++) + myCols->Append(aTable->GetColumnTitle(anIndex)); +} + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeTableOfString::NewEmpty() const +{ + return new SALOMEDSImpl_AttributeTableOfString(); +} + +void SALOMEDSImpl_AttributeTableOfString::Paste(const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)&) const +{ + Standard_Integer anIndex; + Handle(SALOMEDSImpl_AttributeTableOfString) aTable = Handle(SALOMEDSImpl_AttributeTableOfString)::DownCast(into); + + aTable->myTable.Clear(); + aTable->myCols->Clear(); + aTable->myRows->Clear(); + + aTable->myTable = myTable; + aTable->myTitle = myTitle; + aTable->myNbRows = myNbRows; + aTable->myNbColumns = myNbColumns; + + for(anIndex = 1; anIndex <= GetNbRows();anIndex++) + aTable->myRows->Append(GetRowTitle(anIndex)); + for(anIndex = 1; anIndex <= GetNbColumns(); anIndex++) + aTable->myCols->Append(GetColumnTitle(anIndex)); +} + + +Handle_TColStd_HSequenceOfInteger SALOMEDSImpl_AttributeTableOfString::GetSetRowIndices(const Standard_Integer theRow) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + + Standard_Integer i, aShift = myNbColumns*(theRow-1); + for(i = 1; i <= myNbColumns; i++) { + if(myTable.IsBound(aShift + i)) aSeq->Append(i); + } + + return aSeq; +} + +Handle_TColStd_HSequenceOfInteger SALOMEDSImpl_AttributeTableOfString::GetSetColumnIndices(const Standard_Integer theColumn) +{ + Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger; + + Standard_Integer i, anIndex; + for(i = 1; i <= myNbRows; i++) { + anIndex = myNbColumns*(i-1)+theColumn; + if(myTable.IsBound(anIndex)) aSeq->Append(i); + } + + return aSeq; +} + + + +void SALOMEDSImpl_AttributeTableOfString::ConvertToString(ostrstream& theStream) +{ + int i, j, l; + + //Title + l = myTitle.Length(); + theStream << l << "\n"; + for(i=1; i<=l; i++) + theStream << myTitle.Value(i) << "\n"; + + //Nb rows + theStream << myNbRows << "\n"; + + //Rows titles + for(i=1; i<=myNbRows; i++) { + l = myRows->Value(i).Length(); + theStream << l << "\n"; + for(j=1; j<=l; j++) + theStream << myRows->Value(i).Value(j) << "\n"; + } + + //Nb columns + theStream << myNbColumns << "\n"; + + //Columns titles + for(i=1; i<=myNbColumns; i++) { + l = myCols->Value(i).Length(); + theStream << l << "\n"; + for(j=1; j<=l; j++) + theStream << myCols->Value(i).Value(j) << "\n"; + } + + //Store the table values + l = myTable.Extent(); + theStream << l << "\n"; + DataMapIterator anIterator(myTable); + for(; anIterator.More(); anIterator.Next()) { + if (anIterator.Value().Length()) { // check empty string in the value table + theStream << anIterator.Key() << "\n"; + unsigned long aValueSize = anIterator.Value().Length(); + theStream<> l; + + myTitle = TCollection_ExtendedString(l, 0); + for(i=1; i<=l; i++) { + theStream >> anExtChar; + myTitle.SetValue(i, anExtChar); + } + + //Nb rows + theStream >> myNbRows; + + //Rows titles + myRows->Clear(); + for(i=1; i<=myNbRows; i++) { + theStream >> l; + aStr = TCollection_ExtendedString(l,0); + for(j=1; j<=l; j++) { + theStream >> anExtChar; + aStr.SetValue(j, anExtChar); + } + myRows->Append(aStr); + } + + //Nb columns + theStream >> myNbColumns; + + //Columns titles + myCols->Clear(); + for(i=1; i<=myNbColumns; i++) { + theStream >> l; + aStr = TCollection_ExtendedString(l,0); + for(j=1; j<=l; j++) { + theStream >> anExtChar; + aStr.SetValue(j, anExtChar); + } + myCols->Append(aStr); + } + + //Restore the table values + TCollection_AsciiString aValue; + theStream >> l; + myTable.Clear(); + theStream.getline(aValueString,aSize,'\n'); + for(i=1; i<=l; i++) { + Standard_Integer aKey; + + theStream.getline(aValueString,aSize,'\n'); + aValue = aValueString; + aKey = aValue.IntegerValue(); + if (aValue.Value(1) == '0') + aValue = ""; + else { + unsigned long aValueSize; + theStream >> aValueSize; + theStream.read(aValueString, 1); // an '\n' omitting + theStream.read(aValueString, aValueSize); + theStream.read(aValueString, 1); // an '\n' omitting + aValue = aValueString; + } + myTable.Bind(aKey, aValue); + } + delete(aValueString); + return true; +} + +TCollection_AsciiString SALOMEDSImpl_AttributeTableOfString::Save() +{ + ostrstream ostr; + ConvertToString(ostr); + TCollection_AsciiString aString((char*)ostr.rdbuf()->str()); + return aString; +} + +void SALOMEDSImpl_AttributeTableOfString::Load(const TCollection_AsciiString& value) +{ + istrstream aStream(value.ToCString(), strlen(value.ToCString())); + RestoreFromString(aStream); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfString.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfString.hxx new file mode 100644 index 000000000..3c73a89c0 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTableOfString.hxx @@ -0,0 +1,98 @@ +// SALOME SALOMEDSImpl : data structure of SALOME and sources of Salome data server +// +// Copyright (C) 2003 CEA/DEN, EDF R&D +// +// +// +// File : SALOMEDSImpl_AttributeTableOfString.hxx +// Author : Sergey Ruin +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeTableOfString_HeaderFile +#define _SALOMEDSImpl_AttributeTableOfString_HeaderFile + +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeTableOfString, SALOMEDSImpl_GenericAttribute ) + +#include +#include +#include +#include +#include +#include +#include + +typedef NCollection_DataMap DataMapOfIntegerString; + +class SALOMEDSImpl_AttributeTableOfString : public SALOMEDSImpl_GenericAttribute +{ + +public: +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeTableOfString Set(const TDF_Label& label) ; +Standard_EXPORT SALOMEDSImpl_AttributeTableOfString(); +Standard_EXPORT void SetNbColumns(const Standard_Integer theNbColumns); +Standard_EXPORT void SetTitle(const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT TCollection_ExtendedString GetTitle() const; +Standard_EXPORT void SetRowData(const Standard_Integer theRow,const Handle(TColStd_HSequenceOfExtendedString)& theData) ; +Standard_EXPORT Handle_TColStd_HSequenceOfExtendedString GetRowData(const Standard_Integer theRow) ; +Standard_EXPORT void SetRowTitle(const Standard_Integer theRow,const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT void SetRowUnit(const Standard_Integer theRow,const TCollection_ExtendedString& theUnit) ; +Standard_EXPORT TCollection_ExtendedString GetRowUnit(const Standard_Integer theRow) const; +Standard_EXPORT void SetRowUnits(const Handle(TColStd_HSequenceOfExtendedString)& theUnits) ; +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetRowUnits(); +Standard_EXPORT void SetRowTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles) ; +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetRowTitles(); +Standard_EXPORT TCollection_ExtendedString GetRowTitle(const Standard_Integer theRow) const; +Standard_EXPORT void SetColumnData(const Standard_Integer theColumn,const Handle(TColStd_HSequenceOfExtendedString)& theData) ; +Standard_EXPORT Handle_TColStd_HSequenceOfExtendedString GetColumnData(const Standard_Integer theColumn) ; +Standard_EXPORT void SetColumnTitle(const Standard_Integer theColumn,const TCollection_ExtendedString& theTitle) ; +Standard_EXPORT TCollection_ExtendedString GetColumnTitle(const Standard_Integer theColumn) const; +Standard_EXPORT void SetColumnTitles(const Handle(TColStd_HSequenceOfExtendedString)& theTitles); +Standard_EXPORT Handle(TColStd_HSequenceOfExtendedString) GetColumnTitles(); +Standard_EXPORT Standard_Integer GetNbRows() const; +Standard_EXPORT Standard_Integer GetNbColumns() const; + +Standard_EXPORT void PutValue(const TCollection_ExtendedString& theValue,const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT Standard_Boolean HasValue(const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT TCollection_ExtendedString GetValue(const Standard_Integer theRow,const Standard_Integer theColumn) ; +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; + +Standard_EXPORT Handle_TColStd_HSequenceOfInteger GetSetRowIndices(const Standard_Integer theRow); +Standard_EXPORT Handle_TColStd_HSequenceOfInteger GetSetColumnIndices(const Standard_Integer theColumn); + +Standard_EXPORT void ConvertToString(ostrstream& theStream); +Standard_EXPORT bool RestoreFromString(istrstream& theStream); + +Standard_EXPORT ~SALOMEDSImpl_AttributeTableOfString() {} + +private: + +DataMapOfIntegerString myTable; +TCollection_ExtendedString myTitle; +Handle_TColStd_HSequenceOfExtendedString myRows; +Handle_TColStd_HSequenceOfExtendedString myCols; +Standard_Integer myNbRows; +Standard_Integer myNbColumns; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeTableOfString ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTarget.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTarget.cxx new file mode 100644 index 000000000..b12c6537f --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTarget.cxx @@ -0,0 +1,166 @@ +// File : SALOMEDSImpl_AttributeTarget.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributeTarget.hxx" +#include "SALOMEDSImpl_AttributeReference.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include +#include +#include + +using namespace std; + + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeTarget, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeTarget, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeTarget::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeTargetID ("12837197-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeTargetID; +} + + +//======================================================================= +//function : Set +//purpose : +//======================================================================= + +Handle(SALOMEDSImpl_AttributeTarget) SALOMEDSImpl_AttributeTarget::Set (const TDF_Label& L) +{ + Handle(SALOMEDSImpl_AttributeTarget) A; + if (!L.FindAttribute(SALOMEDSImpl_AttributeTarget::GetID(),A)) { + A = new SALOMEDSImpl_AttributeTarget(); + L.AddAttribute(A); + } + return A; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeTarget::SALOMEDSImpl_AttributeTarget() +:SALOMEDSImpl_GenericAttribute("AttributeTarget") +{ +} + +void SALOMEDSImpl_AttributeTarget::SetRelation(const TCollection_ExtendedString& theRelation) +{ + CheckLocked(); + if(myRelation == theRelation) return; + + Backup(); + myRelation = theRelation; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : Add +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTarget::Add(const Handle(SALOMEDSImpl_SObject)& theSO) +{ + Backup(); + TDF_Label aRefLabel = theSO->GetLabel(); + Handle(SALOMEDSImpl_AttributeReference) aReference; + if (aRefLabel.FindAttribute(SALOMEDSImpl_AttributeReference::GetID(),aReference)) { + TDF_ListIteratorOfAttributeList anIter(GetVariables()); + for(;anIter.More();anIter.Next()) if(anIter.Value()->Label() == aRefLabel) return; //BugID: PAL6192 + GetVariables().Append(aReference); + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : Get +//purpose : +//======================================================================= +Handle(TColStd_HSequenceOfTransient) SALOMEDSImpl_AttributeTarget::Get() +{ + Handle(TColStd_HSequenceOfTransient) aSeq = new TColStd_HSequenceOfTransient; + + TDF_ListIteratorOfAttributeList anIter(GetVariables()); + for(;anIter.More();anIter.Next()) { + const TDF_Label& aLabel = anIter.Value()->Label(); + aSeq->Append( SALOMEDSImpl_Study::SObject(aLabel)); + } + return aSeq; +} + +//======================================================================= +//function : Remove +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTarget::Remove(const Handle(SALOMEDSImpl_SObject)& theSO) +{ + Backup(); + TDF_Label aRefLabel = theSO->GetLabel(); + TDF_ListIteratorOfAttributeList anIter(GetVariables()); + for(;anIter.More();anIter.Next()) { + if (anIter.Value()->Label() == aRefLabel) { + GetVariables().Remove(anIter); + return; + } + } + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeTarget::ID () const { return GetID(); } + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTarget::Restore(const Handle(TDF_Attribute)& With) +{ + Handle(SALOMEDSImpl_AttributeTarget) REL = Handle(SALOMEDSImpl_AttributeTarget)::DownCast (With); + myRelation = REL->GetRelation(); + Handle(SALOMEDSImpl_AttributeReference) V; + myVariables.Clear(); + for (TDF_ListIteratorOfAttributeList it (REL->GetVariables()); it.More(); it.Next()) { + V = Handle(SALOMEDSImpl_AttributeReference)::DownCast(it.Value()); + myVariables.Append(V); + } +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeTarget::NewEmpty() const +{ + return new SALOMEDSImpl_AttributeTarget(); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTarget::Paste(const Handle(TDF_Attribute)& Into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeTarget) REL = Handle(SALOMEDSImpl_AttributeTarget)::DownCast (Into); + REL->SetRelation(myRelation); + Handle(SALOMEDSImpl_AttributeReference) V1,V2; + for (TDF_ListIteratorOfAttributeList it (myVariables); it.More(); it.Next()) { + V1 = Handle(SALOMEDSImpl_AttributeReference)::DownCast(it.Value()); + RT->HasRelocation (V1,V2); + REL->GetVariables().Append(V2); + } +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTarget.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTarget.hxx new file mode 100644 index 000000000..0eb78bb0d --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTarget.hxx @@ -0,0 +1,53 @@ +// File : SALOMEDSImpl_AttributeTarget.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeTarget_HeaderFile +#define _SALOMEDSImpl_AttributeTarget_HeaderFile + +#include +#include +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" +#include "SALOMEDSImpl_SObject.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeTarget, SALOMEDSImpl_GenericAttribute ) + + +class SALOMEDSImpl_AttributeTarget : public SALOMEDSImpl_GenericAttribute +{ +private: +TCollection_ExtendedString myRelation; +TDF_AttributeList myVariables; + +public: +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeTarget Set(const TDF_Label& label) ; +Standard_EXPORT SALOMEDSImpl_AttributeTarget(); +Standard_EXPORT void SALOMEDSImpl_AttributeTarget::Add(const Handle(SALOMEDSImpl_SObject)& theSO); +Standard_EXPORT Handle(TColStd_HSequenceOfTransient) SALOMEDSImpl_AttributeTarget::Get(); +Standard_EXPORT void SALOMEDSImpl_AttributeTarget::Remove(const Handle(SALOMEDSImpl_SObject)& theSO); +Standard_EXPORT TCollection_ExtendedString GetRelation() { return myRelation; } +Standard_EXPORT void SetRelation(const TCollection_ExtendedString& theRelation); +Standard_EXPORT TDF_AttributeList& GetVariables() { return myVariables; } +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeTarget() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeTarget ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextColor.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextColor.cxx new file mode 100644 index 000000000..8fd46859d --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextColor.cxx @@ -0,0 +1,137 @@ +// File : SALOMEDSImpl_AttributeTextColor.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributeTextColor.hxx" +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeTextColor, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeTextColor, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeTextColor::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeTextColorID ("12837189-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeTextColorID; +} + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeTextColor::SALOMEDSImpl_AttributeTextColor() +:SALOMEDSImpl_GenericAttribute("AttributeTextColor") +{ + myValue = new TColStd_HArray1OfReal(1, 3, RealFirst()); +} + +//======================================================================= +//function : SetTextColor +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTextColor::SetTextColor(const Standard_Real R, const Standard_Real G, const Standard_Real B) +{ + CheckLocked(); + if(myValue.IsNull()) return; + Backup(); + + myValue->SetValue(1, R); + myValue->SetValue(2, G); + myValue->SetValue(3, B); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : TextColor +//purpose : +//======================================================================= +Handle(TColStd_HArray1OfReal) SALOMEDSImpl_AttributeTextColor::TextColor() +{ + return myValue; +} + +//======================================================================= +//function : ChangeArray +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTextColor::ChangeArray(const Handle(TColStd_HArray1OfReal)& newArray) +{ + Backup(); + + for(int i = 1; i <= 3; i++) + myValue->SetValue(i, newArray->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeTextColor::ID () const { return GetID(); } + + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeTextColor::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeTextColor(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeTextColor::Restore(const Handle(TDF_Attribute)& with) +{ + Handle(TColStd_HArray1OfReal) s = Handle(SALOMEDSImpl_AttributeTextColor)::DownCast (with)->TextColor (); + ChangeArray(s); + return; +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeTextColor::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeTextColor)::DownCast (into)->ChangeArray (myValue); +} + + + +TCollection_AsciiString SALOMEDSImpl_AttributeTextColor::Save() +{ + char *Val = new char[75]; + sprintf(Val, "%f %f %f", (float)myValue->Value(1), + (float)myValue->Value(2), + (float)myValue->Value(3)); + TCollection_AsciiString ret(Val); + delete Val; + return ret; +} + +void SALOMEDSImpl_AttributeTextColor::Load(const TCollection_AsciiString& value) +{ + float r, g, b; + sscanf(value.ToCString(), "%f %f %f", &r, &g, &b); + myValue->SetValue(1, r); + myValue->SetValue(2, g); + myValue->SetValue(3, b); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextColor.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextColor.hxx new file mode 100644 index 000000000..1601eb0a5 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextColor.hxx @@ -0,0 +1,45 @@ +// File : SALOMEDSImpl_AttributeTextColor.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeTextColor_HeaderFile +#define _SALOMEDSImpl_AttributeTextColor_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeTextColor, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeTextColor : public SALOMEDSImpl_GenericAttribute +{ +private: + Handle(TColStd_HArray1OfReal) myValue; + +public: +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT SALOMEDSImpl_AttributeTextColor(); +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void SetTextColor(const Standard_Real R, const Standard_Real G, const Standard_Real B); +Standard_EXPORT Handle(TColStd_HArray1OfReal) TextColor(); +Standard_EXPORT void ChangeArray(const Handle(TColStd_HArray1OfReal)& newArray); +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeTextColor() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeTextColor ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextHighlightColor.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextHighlightColor.cxx new file mode 100644 index 000000000..fd9615b7a --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextHighlightColor.cxx @@ -0,0 +1,139 @@ +// File : SALOMEDSImpl_AttributeTextHighlightColor.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributeTextHighlightColor.hxx" +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeTextHighlightColor, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeTextHighlightColor, SALOMEDSImpl_GenericAttribute ) + +//======================================================================= +//function : GetID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeTextHighlightColor::GetID () +{ + static Standard_GUID SALOMEDSImpl_AttributeTextHighlightColorID ("12837190-8F52-11d6-A8A3-0001021E8C7F"); + return SALOMEDSImpl_AttributeTextHighlightColorID; +} + + + +//======================================================================= +//function : constructor +//purpose : +//======================================================================= +SALOMEDSImpl_AttributeTextHighlightColor::SALOMEDSImpl_AttributeTextHighlightColor() +:SALOMEDSImpl_GenericAttribute("AttributeTextHighlightColor") +{ + myValue = new TColStd_HArray1OfReal(1, 3, RealFirst()); +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= + +const Standard_GUID& SALOMEDSImpl_AttributeTextHighlightColor::ID () const { return GetID(); } + + +//======================================================================= +//function : SetTextHighlightColor +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTextHighlightColor::SetTextHighlightColor(const Standard_Real R, + const Standard_Real G, + const Standard_Real B) +{ + CheckLocked(); + if(myValue.IsNull()) return; + Backup(); + + myValue->SetValue(1, R); + myValue->SetValue(2, G); + myValue->SetValue(3, B); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : TextHighlightColor +//purpose : +//======================================================================= +Handle(TColStd_HArray1OfReal) SALOMEDSImpl_AttributeTextHighlightColor::TextHighlightColor() +{ + return myValue; +} + +//======================================================================= +//function : ChangeArray +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTextHighlightColor::ChangeArray(const Handle(TColStd_HArray1OfReal)& newArray) +{ + Backup(); + + for(int i = 1; i <= 3; i++) + myValue->SetValue(i, newArray->Value(i)); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeTextHighlightColor::NewEmpty () const +{ + return new SALOMEDSImpl_AttributeTextHighlightColor(); +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeTextHighlightColor::Restore(const Handle(TDF_Attribute)& with) +{ + Handle(TColStd_HArray1OfReal) s = Handle(SALOMEDSImpl_AttributeTextHighlightColor)::DownCast (with)->TextHighlightColor (); + ChangeArray(s); + return; +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= + +void SALOMEDSImpl_AttributeTextHighlightColor::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& ) const +{ + Handle(SALOMEDSImpl_AttributeTextHighlightColor)::DownCast (into)->ChangeArray (myValue); +} + +TCollection_AsciiString SALOMEDSImpl_AttributeTextHighlightColor::Save() +{ + char *Val = new char[75]; + sprintf(Val, "%f %f %f", (float)myValue->Value(1), + (float)myValue->Value(2), + (float)myValue->Value(3)); + TCollection_AsciiString ret(Val); + delete Val; + return ret; +} + +void SALOMEDSImpl_AttributeTextHighlightColor::Load(const TCollection_AsciiString& value) +{ + float r, g, b; + sscanf(value.ToCString(), "%f %f %f", &r, &g, &b); + myValue->SetValue(1, r); + myValue->SetValue(2, g); + myValue->SetValue(3, b); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextHighlightColor.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextHighlightColor.hxx new file mode 100644 index 000000000..4322c19f7 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTextHighlightColor.hxx @@ -0,0 +1,45 @@ +// File : SALOMEDSImpl_AttributeTextHighlightColor.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeTextHighlightColor_HeaderFile +#define _SALOMEDSImpl_AttributeTextHighlightColor_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeTextHighlightColor, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeTextHighlightColor : public SALOMEDSImpl_GenericAttribute +{ +private: + Handle(TColStd_HArray1OfReal) myValue; + +public: +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); +Standard_EXPORT static const Standard_GUID& GetID() ; +Standard_EXPORT SALOMEDSImpl_AttributeTextHighlightColor(); +Standard_EXPORT void SetTextHighlightColor(const Standard_Real R, const Standard_Real G, const Standard_Real B); +Standard_EXPORT Handle(TColStd_HArray1OfReal) TextHighlightColor(); +Standard_EXPORT void ChangeArray(const Handle(TColStd_HArray1OfReal)& newArray); +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeTextHighlightColor() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeTextHighlightColor ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.cxx new file mode 100644 index 000000000..9e825814f --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.cxx @@ -0,0 +1,574 @@ +// File : SALOMEDSImpl_AttributeTreeNode.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributeTreeNode.hxx" +#include +#include +#include +#include +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeTreeNode, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeTreeNode, SALOMEDSImpl_GenericAttribute ) + +static char* Entry(const TDF_Label& theLabel) +{ + TCollection_AsciiString anEntry; + TDF_Tool::Entry(theLabel, anEntry); + return anEntry.ToCString(); +} + +const Standard_GUID& SALOMEDSImpl_AttributeTreeNode::GetDefaultTreeID() +{ + static Standard_GUID TreeNodeID ("0E1C36E6-379B-4d90-AC37-17A14310E648"); + return TreeNodeID; +} + + +SALOMEDSImpl_AttributeTreeNode::SALOMEDSImpl_AttributeTreeNode() +:SALOMEDSImpl_GenericAttribute("AttributeTreeNode"), myFather(NULL), myPrevious(NULL), myNext(NULL), myFirst(NULL) +{} + + +Handle(SALOMEDSImpl_AttributeTreeNode) SALOMEDSImpl_AttributeTreeNode::Set (const TDF_Label& L, const Standard_GUID& ID) +{ + Handle(SALOMEDSImpl_AttributeTreeNode) TN; + + if (!L.FindAttribute(ID,TN)) { + TN = new SALOMEDSImpl_AttributeTreeNode (); + TN->SetTreeID(ID); + L.AddAttribute(TN); + } + + return TN; +} + +//======================================================================= +//TreeNode : ID +//purpose : Returns GUID of the TreeNode +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeTreeNode::ID() const +{ + return myTreeID; +} + +//======================================================================= +//function : Append +//purpose : Add as last child of me +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::Append (const Handle(SALOMEDSImpl_AttributeTreeNode)& TN) +{ + CheckLocked(); + + if (!(TN->ID() == myTreeID) ) + Standard_DomainError::Raise("SALOMEDSImpl_AttributeTreeNode::Append : uncompatible GUID"); + + Handle(SALOMEDSImpl_AttributeTreeNode) bid; + TN->SetNext(bid); // Deconnects from next. + + // Find the last + if (!HasFirst()) { + SetFirst(TN); + TN->SetPrevious(bid); // Deconnects from previous. + } + else { + Handle(SALOMEDSImpl_AttributeTreeNode) Last = GetFirst(); + while (Last->HasNext()) { + Last = Last->GetNext(); + } + Last->SetNext(TN); + TN->SetPrevious(Last); + } + // Set Father + TN->SetFather(this); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved + + return !TN.IsNull(); +} + +//======================================================================= +//function : Prepend +//purpose : Add as first child of me +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::Prepend (const Handle(SALOMEDSImpl_AttributeTreeNode)& TN) +{ + CheckLocked(); + + if (!(TN->ID() == myTreeID) ) + Standard_DomainError::Raise("SALOMEDSImpl_AttributeTreeNode::Prepend : uncompatible GUID"); + + Handle(SALOMEDSImpl_AttributeTreeNode) bid; + TN->SetPrevious(bid); + if (HasFirst()) { + TN->SetNext(GetFirst()); + GetFirst()->SetPrevious(TN); + } + else { + TN->SetNext(bid); + } + TN->SetFather(this); + SetFirst(TN); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved + + return !TN.IsNull(); +} + + +//======================================================================= +//function : InsertBefore +//purpose : Inserts the TreeNode before me +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::InsertBefore (const Handle(SALOMEDSImpl_AttributeTreeNode)& TN) +{ + CheckLocked(); + + if (!(TN->ID() == myTreeID) ) + Standard_DomainError::Raise("SALOMEDSImpl_AttributeTreeNode::InsertBefore : uncompatible GUID"); + + TN->SetFather(GetFather()); + TN->SetPrevious(GetPrevious()); + TN->SetNext(this); + + if (!HasPrevious()) + GetFather()->SetFirst(TN); + else + GetPrevious()->SetNext(TN); + + SetPrevious(TN); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved + + return !TN.IsNull(); +} + +//======================================================================= +//function : InsertAfter +//purpose : Inserts the TreeNode after me +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::InsertAfter (const Handle(SALOMEDSImpl_AttributeTreeNode)& TN) +{ + CheckLocked(); + + if (!(TN->ID() == myTreeID) ) + Standard_DomainError::Raise("SALOMEDSImpl_AttributeTreeNode::InsertAfter : uncompatible GUID"); + + TN->SetFather(GetFather()); + TN->SetPrevious(this); + TN->SetNext(GetNext()); + + if (HasNext()) GetNext()->SetPrevious(TN); + + SetNext(TN); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved + + return !TN.IsNull(); +} + +//======================================================================= +//function : Remove +//purpose : Removees the function from the function tree +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::Remove () +{ + CheckLocked(); + + if (IsRoot()) return Standard_True; + + Handle(SALOMEDSImpl_AttributeTreeNode) bid; + if (!HasPrevious()) + GetFather()->SetFirst(GetNext()); + else + GetPrevious()->SetNext(GetNext()); + + if (HasNext()) { + if (HasPrevious()) GetNext()->SetPrevious(GetPrevious()); + else GetNext()->SetPrevious(bid); + } + else { + if (HasPrevious()) GetPrevious()->SetNext(bid); + } + + if (GetFather()->HasFirst()) { + if (Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(this) == GetFather()->GetFirst()) { + if (HasNext()) { + GetFather()->SetFirst(GetNext()); + } + else GetFather()->SetFirst(bid); + } + } + + SetFather(bid); + SetNext(bid); + SetPrevious(bid); + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved + + return Standard_True; +} + +//======================================================================= +//function : Depth +//purpose : +//======================================================================= +Standard_Integer SALOMEDSImpl_AttributeTreeNode::Depth () const +{ + Standard_Integer depth = 0; + Handle(SALOMEDSImpl_AttributeTreeNode) current = this; + while (current->HasFather()) { + depth++; + current = current->GetFather(); + } + return depth; +} + +//======================================================================= +//function : SetTreeID +//purpose : Finds or creates a TreeNode attribute with explicit ID +// : a driver for it +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::SetTreeID (const Standard_GUID& explicitID) +{ + myTreeID = explicitID; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + +//======================================================================= +//function : IsAscendant +//purpose : +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::IsAscendant (const Handle(SALOMEDSImpl_AttributeTreeNode)& ofTN) const +{ + return ofTN->IsDescendant(this); +} + +//======================================================================= +//function : IsDescendant +//purpose : +//======================================================================= + +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::IsDescendant (const Handle(SALOMEDSImpl_AttributeTreeNode)& ofTN) const +{ + Handle(SALOMEDSImpl_AttributeTreeNode) current = this; + while (current->HasFather()) { + if (current->GetFather() == ofTN) return Standard_True; + current = current->GetFather(); + } + return Standard_False; +} + +//======================================================================= +//function : IsFather +//purpose : +//======================================================================= + +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::IsFather (const Handle(SALOMEDSImpl_AttributeTreeNode)& ofTN) const +{ + return (ofTN->GetFather() == this); +} + + +//======================================================================= +//function : IsChild +//purpose : +//======================================================================= + +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::IsChild (const Handle(SALOMEDSImpl_AttributeTreeNode)& ofTN) const +{ + return (myFather == ofTN); +} + +//======================================================================= +//TreeNode : IsRoot +//purpose : Returns Standard_True if the TreeNode is not attached to a +// TreeNode tree or hasn't an Father. +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::IsRoot() const +{ + if (myFather.IsNull() && + myPrevious.IsNull() && + myNext.IsNull()) + return Standard_True; + return Standard_False; +} + +//======================================================================= +//TreeNode : Root +//purpose : Returns the TreeNode which has no Father +//======================================================================= +Handle(SALOMEDSImpl_AttributeTreeNode) SALOMEDSImpl_AttributeTreeNode::Root() const +{ + Handle(SALOMEDSImpl_AttributeTreeNode) O = this; + while (O->HasFather()) + O = O->GetFather(); + return O; +} + +//======================================================================= +//TreeNode : SetFather +//purpose : Sets the TreeNode F as Father of me +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::SetFather(const Handle(SALOMEDSImpl_AttributeTreeNode)& F) +{ + CheckLocked(); + Backup(); + myFather = F; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//TreeNode : SetNext +//purpose : Sets the TreeNode F next to me +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::SetNext(const Handle(SALOMEDSImpl_AttributeTreeNode)& F) +{ + CheckLocked(); + Backup(); + myNext = F; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + + +//======================================================================= +//TreeNode : SetPrevious +//purpose : Sets the TreeNode F previous to me +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::SetPrevious(const Handle(SALOMEDSImpl_AttributeTreeNode)& F) +{ + CheckLocked(); + Backup(); + myPrevious = F; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//TreeNode : SetFirst +//purpose : Sets the TreeNode F as first in the TreeNode tree +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::SetFirst(const Handle(SALOMEDSImpl_AttributeTreeNode)& F) +{ + CheckLocked(); + Backup(); + myFirst = F; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//TreeNode : AfterAddition +//purpose : Connects the TreeNode to the tree. +// Backuped attribute must stay disconnected +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::AfterAddition() +{ + if (!IsBackuped()) { + if (!myPrevious.IsNull()) { + myPrevious->SetNext(this); + } + else if (!myFather.IsNull()) { + myFather->SetFirst(this); + } + if (!myNext.IsNull()) + myNext->SetPrevious(this); + } +} + +//======================================================================= +//TreeNode : BeforeForget +//purpose : Disconnect the TreeNode from the tree. +// Backuped attribute is normaly not concerned by such an operation +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::BeforeForget() +{ + if (!IsBackuped()) { + Remove(); + while (HasFirst()) GetFirst()->Remove(); + } +} + +//======================================================================= +//TreeNode : AfterResume +//purpose : Connects the TreeNode to the tree +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::AfterResume() +{ + AfterAddition(); +} + +//======================================================================= +//TreeNode : BeforeUndo +//purpose : Disconnect the TreeNode from the tree. +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::BeforeUndo(const Handle(TDF_AttributeDelta)& anAttDelta, + const Standard_Boolean forceIt) +{ + if (anAttDelta->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) BeforeForget(); // Disconnect. + return Standard_True; +} + +//======================================================================= +//TreeNode : AfterUndo +//purpose : Connect the TreeNode from the tree. +//======================================================================= +Standard_Boolean SALOMEDSImpl_AttributeTreeNode::AfterUndo(const Handle(TDF_AttributeDelta)& anAttDelta, + const Standard_Boolean forceIt) +{ + if (anAttDelta->IsKind(STANDARD_TYPE(TDF_DeltaOnRemoval))) AfterAddition(); // Reconnect. + return Standard_True; +} + +//======================================================================= +//TreeNode : Restore +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::Restore(const Handle(TDF_Attribute)& other) +{ + Handle(SALOMEDSImpl_AttributeTreeNode) F = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(other); + myFather = F->myFather; + myPrevious = F->myPrevious; + myNext = F->myNext; + myFirst = F->myFirst; + myTreeID = F->myTreeID; +} + +//======================================================================= +//TreeNode : Paste +//purpose : Method for Copy mechanism +//======================================================================= + +void SALOMEDSImpl_AttributeTreeNode::Paste(const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeTreeNode) intof = Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(into); + Handle(SALOMEDSImpl_AttributeTreeNode) func; + if (!RT->HasRelocation(myFather, func) && RT->AfterRelocate()) { + func.Nullify(); + } + intof->SetFather(func); + if (!RT->HasRelocation(myNext, func) && RT->AfterRelocate()) { + func.Nullify(); + } + intof->SetNext(func); + if (!RT->HasRelocation(myPrevious, func) && RT->AfterRelocate()) { + func.Nullify(); + } + intof->SetPrevious(func); + if (!RT->HasRelocation(myFirst, func) && RT->AfterRelocate()) { + func.Nullify(); + } + + intof->SetFirst(func); + intof->SetTreeID(myTreeID); +} + +//======================================================================= +//TreeNode : NewEmpty +//purpose : Returns new empty TreeNode attribute +//======================================================================= + +Handle(TDF_Attribute) SALOMEDSImpl_AttributeTreeNode::NewEmpty() const +{ + Handle(SALOMEDSImpl_AttributeTreeNode) T = new SALOMEDSImpl_AttributeTreeNode(); + T->SetTreeID(myTreeID); + return T; +} + +//======================================================================= +//TreeNode : References +//purpose : Collects the references +//======================================================================= +void SALOMEDSImpl_AttributeTreeNode::References(const Handle(TDF_DataSet)& aDataSet) const +{ + Handle(SALOMEDSImpl_AttributeTreeNode) fct = myFirst; + while (!fct.IsNull()) { + aDataSet->AddAttribute(fct); + fct = fct->myNext; + } +} + +TCollection_AsciiString SALOMEDSImpl_AttributeTreeNode::Type() +{ + char* aNodeName = new char[60]; + char aGUID[40]; + ID().ToCString(aGUID); + sprintf(aNodeName, "AttributeTreeNodeGUID%s",aGUID); + TCollection_AsciiString ret(aNodeName); + delete aNodeName; + + return ret; +} + +TCollection_AsciiString SALOMEDSImpl_AttributeTreeNode::Save() +{ + TCollection_AsciiString aFather, aPrevious, aNext, aFirst; + + if (HasFather()) aFather = Entry(GetFather()->Label()); else aFather = "!"; + if (HasPrevious()) aPrevious = Entry(GetPrevious()->Label()); else aPrevious = "!"; + if (HasNext()) aNext = Entry(GetNext()->Label()); else aNext = "!"; + if (HasFirst()) aFirst = Entry(GetFirst()->Label()); else aFirst = "!"; + + int aLength = 4; + aLength += aFather.Length() + aPrevious.Length() + aNext.Length() + aFirst.Length(); + char* aResult = new char[aLength]; + sprintf(aResult, "%s %s %s %s", aFather.ToCString(), aPrevious.ToCString(), aNext.ToCString(), aFirst.ToCString()); + TCollection_AsciiString ret(aResult); + delete aResult; + return ret; +} + +void SALOMEDSImpl_AttributeTreeNode::Load(const TCollection_AsciiString& value) +{ + Handle(TDF_Data) DF = Label().Data(); + + char* aCopy = (char*)value.ToCString(); + char* adr = strtok(aCopy, " "); + + TDF_Label aLabel; + Handle(SALOMEDSImpl_AttributeTreeNode) aDepNode; + + if (adr && adr[0] != '!') { + TDF_Tool::Label(DF, adr, aLabel, 1); + if (!aLabel.FindAttribute(ID(), aDepNode)) + aDepNode = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, ID()); + + SetFather(aDepNode); + } + + adr = strtok(NULL, " "); + if (adr && adr[0] != '!') { + TDF_Tool::Label(DF, adr, aLabel, 1); + if (!aLabel.FindAttribute(ID(), aDepNode)) + aDepNode = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, ID()); + SetPrevious(aDepNode); + } + + adr = strtok(NULL, " "); + if (adr && adr[0] != '!') { + TDF_Tool::Label(DF, adr, aLabel, 1); + if (!aLabel.FindAttribute(ID(), aDepNode)) + aDepNode = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, ID()); + SetNext(aDepNode); + } + + adr = strtok(NULL, " "); + if (adr && adr[0] != '!') { + TDF_Tool::Label(DF, adr, aLabel, 1); + if (!aLabel.FindAttribute(ID(), aDepNode)) + aDepNode = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, ID()); + SetFirst(aDepNode); + } +} + + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.hxx new file mode 100644 index 000000000..c61715f51 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.hxx @@ -0,0 +1,94 @@ +// File : SALOMEDSImpl_AttributeTreeNode.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeTreeNode_HeaderFile +#define _SALOMEDSImpl_AttributeTreeNode_HeaderFile + +#include +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Handle_TDF_DataSet; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); +class SALOMEDSImpl_ChildNodeIterator; + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeTreeNode, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeTreeNode : public SALOMEDSImpl_GenericAttribute +{ +public: + +Standard_EXPORT const static Standard_GUID& GetDefaultTreeID(); +Standard_EXPORT static Handle_SALOMEDSImpl_AttributeTreeNode Set(const TDF_Label& L, const Standard_GUID& ID); + +Standard_EXPORT SALOMEDSImpl_AttributeTreeNode(); +Standard_EXPORT void SetFather(const Handle(SALOMEDSImpl_AttributeTreeNode)& value); +Standard_EXPORT void SetPrevious(const Handle(SALOMEDSImpl_AttributeTreeNode)& value); +Standard_EXPORT void SetNext(const Handle(SALOMEDSImpl_AttributeTreeNode)& value); +Standard_EXPORT void SetFirst(const Handle(SALOMEDSImpl_AttributeTreeNode)& value); +Standard_EXPORT void SetTreeID(const Standard_GUID& value); + +Standard_EXPORT Standard_Boolean Append(const Handle(SALOMEDSImpl_AttributeTreeNode)& value); +Standard_EXPORT Standard_Boolean Prepend(const Handle(SALOMEDSImpl_AttributeTreeNode)& value); +Standard_EXPORT Standard_Boolean Remove(); +Standard_EXPORT Standard_Boolean InsertBefore(const Handle(SALOMEDSImpl_AttributeTreeNode)& value); +Standard_EXPORT Standard_Boolean InsertAfter(const Handle(SALOMEDSImpl_AttributeTreeNode)& value); + +Standard_EXPORT Handle(SALOMEDSImpl_AttributeTreeNode) GetFather() { return myFather; } +Standard_EXPORT Handle(SALOMEDSImpl_AttributeTreeNode) GetPrevious() { return myPrevious; } +Standard_EXPORT Handle(SALOMEDSImpl_AttributeTreeNode) GetNext() { return myNext; } +Standard_EXPORT Handle(SALOMEDSImpl_AttributeTreeNode) GetFirst() { return myFirst; } + +Standard_EXPORT Standard_Boolean HasFather() { return (!myFather.IsNull()); } +Standard_EXPORT Standard_Boolean HasPrevious() { return (!myPrevious.IsNull()); } +Standard_EXPORT Standard_Boolean HasNext() {return (!myNext.IsNull()); } +Standard_EXPORT Standard_Boolean HasFirst() { return (!myFirst.IsNull()); } +Standard_EXPORT const Standard_GUID& GetTreeID() { return ID(); } +Standard_EXPORT Standard_Integer Depth() const; +Standard_EXPORT Standard_Boolean IsRoot() const ; +Standard_EXPORT Handle(SALOMEDSImpl_AttributeTreeNode) Root() const; +Standard_EXPORT Standard_Boolean IsAscendant (const Handle(SALOMEDSImpl_AttributeTreeNode)& ofTN) const; +Standard_EXPORT Standard_Boolean IsDescendant(const Handle(SALOMEDSImpl_AttributeTreeNode)& value) const; +Standard_EXPORT Standard_Boolean IsFather(const Handle(SALOMEDSImpl_AttributeTreeNode)& value) const; +Standard_EXPORT Standard_Boolean IsChild(const Handle(SALOMEDSImpl_AttributeTreeNode)& value) const; + +Standard_EXPORT virtual TCollection_AsciiString Save(); +Standard_EXPORT virtual void Load(const TCollection_AsciiString&); +Standard_EXPORT virtual TCollection_AsciiString Type(); + +Standard_EXPORT virtual void AfterAddition() ; +Standard_EXPORT virtual void BeforeForget() ; +Standard_EXPORT virtual void AfterResume() ; +Standard_EXPORT virtual Standard_Boolean BeforeUndo(const Handle(TDF_AttributeDelta)& anAttDelta, + const Standard_Boolean forceIt = Standard_False) ; +Standard_EXPORT virtual Standard_Boolean AfterUndo(const Handle(TDF_AttributeDelta)& anAttDelta, + const Standard_Boolean forceIt = Standard_False) ; +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const; +Standard_EXPORT void References(const Handle(TDF_DataSet)& aDataSet) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeTreeNode() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeTreeNode ) + +private: + +Standard_GUID myTreeID; +Handle(SALOMEDSImpl_AttributeTreeNode) myFather; +Handle(SALOMEDSImpl_AttributeTreeNode) myPrevious; +Handle(SALOMEDSImpl_AttributeTreeNode) myNext; +Handle(SALOMEDSImpl_AttributeTreeNode) myFirst; + +friend class SALOMEDSImpl_ChildNodeIterator; + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeUserID.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeUserID.cxx new file mode 100644 index 000000000..41fcd0c8f --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeUserID.cxx @@ -0,0 +1,91 @@ +// File : SALOMEDSImpl_AttributeUAttribute.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_AttributeUserID.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_AttributeUserID, SALOMEDSImpl_GenericAttribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_AttributeUserID, SALOMEDSImpl_GenericAttribute ) + +Handle(SALOMEDSImpl_AttributeUserID) SALOMEDSImpl_AttributeUserID::Set (const TDF_Label& L, const Standard_GUID& ID) +{ + Handle(SALOMEDSImpl_AttributeUserID) A; + if (!L.FindAttribute(ID, A)) { + A = new SALOMEDSImpl_AttributeUserID(); + A->SetValue(ID); + L.AddAttribute(A); + } + return A; +} + +//======================================================================= +//function : ID +//purpose : +//======================================================================= +const Standard_GUID& SALOMEDSImpl_AttributeUserID::ID() const +{ return myID; } + + +//======================================================================= +//function : SetValue +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeUserID::SetValue( const Standard_GUID& guid) +{ + CheckLocked(); + if(myID == guid) return; + + Backup(); + myID = guid; + + SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved +} + +//======================================================================= +//function : NewEmpty +//purpose : +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_AttributeUserID::NewEmpty () const +{ + Handle(SALOMEDSImpl_AttributeUserID) A = new SALOMEDSImpl_AttributeUserID(); + A->SetValue(myID); + return A; +} + +//======================================================================= +//function : Restore +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeUserID::Restore(const Handle(TDF_Attribute)& with) +{ + Handle(SALOMEDSImpl_AttributeUserID) A = Handle(SALOMEDSImpl_AttributeUserID)::DownCast(with); + SetValue( A->ID() ); +} + +//======================================================================= +//function : Paste +//purpose : +//======================================================================= +void SALOMEDSImpl_AttributeUserID::Paste (const Handle(TDF_Attribute)& into, + const Handle(TDF_RelocationTable)& RT) const +{ + Handle(SALOMEDSImpl_AttributeUserID) A = Handle(SALOMEDSImpl_AttributeUserID)::DownCast(into); + A->SetValue( myID ); +} + +TCollection_AsciiString SALOMEDSImpl_AttributeUserID::Type() +{ + + char* aUAttrName = new char[60]; + char aGUID[40]; + ID().ToCString(aGUID); + sprintf(aUAttrName, "AttributeUserID_%s",aGUID); + + TCollection_AsciiString ret(aUAttrName); + delete aUAttrName; + + return ret; +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_AttributeUserID.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeUserID.hxx new file mode 100644 index 000000000..106c973ab --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_AttributeUserID.hxx @@ -0,0 +1,51 @@ +// File : SALOMEDSImpl_AttributeUAttribute.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_AttributeUserID_HeaderFile +#define _SALOMEDSImpl_AttributeUserID_HeaderFile + +#include +#include +#include +#include +#include +#include "SALOMEDSImpl_GenericAttribute.hxx" + +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_AttributeUserID, SALOMEDSImpl_GenericAttribute ) + +class SALOMEDSImpl_AttributeUserID : public SALOMEDSImpl_GenericAttribute +{ +private: +Standard_GUID myID; + +public: +SALOMEDSImpl_AttributeUserID():SALOMEDSImpl_GenericAttribute("AttributeUserID") {} +static Handle(SALOMEDSImpl_AttributeUserID) Set (const TDF_Label& L, const Standard_GUID& ID); +static const Standard_GUID& DefaultID() +{ + static Standard_GUID SALOMEDSImpl_DefaultUserAttributeID ("FFFFFFFF-D9CD-11d6-945D-1050DA506788"); + return SALOMEDSImpl_DefaultUserAttributeID; +} + +Standard_EXPORT const Standard_GUID& Value() const { return ID(); } +Standard_EXPORT void SetValue(const Standard_GUID& value); + +Standard_EXPORT virtual TCollection_AsciiString Type(); + +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore(const Handle(TDF_Attribute)& with) ; +Standard_EXPORT Handle_TDF_Attribute NewEmpty() const; +Standard_EXPORT void Paste(const Handle(TDF_Attribute)& into,const Handle(TDF_RelocationTable)& RT) const; +Standard_EXPORT ~SALOMEDSImpl_AttributeUserID() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_AttributeUserID ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_Attributes.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_Attributes.hxx new file mode 100644 index 000000000..c37e2a14e --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_Attributes.hxx @@ -0,0 +1,128 @@ +// File : SALOMEDSImpl_Attributes.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSIMPL_ATTRIBUTES__H__ +#define __SALOMEDSIMPL_ATTRIBUTES__H__ + +#include +class LockProtection +{ +public : + LockProtection(const char *message) { + std::cerr << message << std::endl; + } +}; + +#include "SALOMEDSImpl_GenericAttribute.hxx" +#include "SALOMEDSImpl_AttributeName.hxx" +#include "SALOMEDSImpl_AttributeComment.hxx" +#include "SALOMEDSImpl_AttributeInteger.hxx" +#include "SALOMEDSImpl_AttributeReal.hxx" +#include "SALOMEDSImpl_AttributeTreeNode.hxx" +#include "SALOMEDSImpl_AttributeUserID.hxx" +#include "SALOMEDSImpl_AttributeReference.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfReal.hxx" +#include "SALOMEDSImpl_AttributeSequenceOfInteger.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" +#include "SALOMEDSImpl_AttributePersistentRef.hxx" +#include "SALOMEDSImpl_AttributeDrawable.hxx" +#include "SALOMEDSImpl_AttributeSelectable.hxx" +#include "SALOMEDSImpl_AttributeExpandable.hxx" +#include "SALOMEDSImpl_AttributeOpened.hxx" +#include "SALOMEDSImpl_AttributeTextColor.hxx" +#include "SALOMEDSImpl_AttributeTextHighlightColor.hxx" +#include "SALOMEDSImpl_AttributePixMap.hxx" +#include "SALOMEDSImpl_AttributeLocalID.hxx" +#include "SALOMEDSImpl_AttributeTarget.hxx" +#include "SALOMEDSImpl_AttributeTableOfInteger.hxx" +#include "SALOMEDSImpl_AttributeTableOfReal.hxx" +#include "SALOMEDSImpl_AttributeTableOfString.hxx" +#include "SALOMEDSImpl_AttributeStudyProperties.hxx" +#include "SALOMEDSImpl_AttributePythonObject.hxx" +#include "SALOMEDSImpl_AttributeExternalFileDef.hxx" +#include "SALOMEDSImpl_AttributeFileType.hxx" +#include "SALOMEDSImpl_AttributeFlags.hxx" +#include "SALOMEDSImpl_AttributeGraphic.hxx" + + +#define __AttributeTypeToGUIDForSObject \ + if(theType == "AttributeReal") return SALOMEDSImpl_AttributeReal::GetID(); \ + if(theType == "AttributeInteger") return SALOMEDSImpl_AttributeInteger::GetID(); \ + if(theType == "AttributeSequenceOfReal") return SALOMEDSImpl_AttributeSequenceOfReal::GetID(); \ + if(theType == "AttributeSequenceOfInteger") return SALOMEDSImpl_AttributeSequenceOfInteger::GetID(); \ + if(theType == "AttributeName") return SALOMEDSImpl_AttributeName::GetID(); \ + if(theType == "AttributeComment") return SALOMEDSImpl_AttributeComment::GetID(); \ + if(theType == "AttributeIOR") return SALOMEDSImpl_AttributeIOR::GetID(); \ + if(theType == "AttributePersistentRef") return SALOMEDSImpl_AttributePersistentRef::GetID(); \ + if(theType == "AttributeDrawable") return SALOMEDSImpl_AttributeDrawable::GetID(); \ + if(theType == "AttributeSelectable") return SALOMEDSImpl_AttributeSelectable::GetID(); \ + if(theType == "AttributeExpandable") return SALOMEDSImpl_AttributeExpandable::GetID(); \ + if(theType == "AttributeOpened") return SALOMEDSImpl_AttributeOpened::GetID(); \ + if(theType == "AttributeTextColor") return SALOMEDSImpl_AttributeTextColor::GetID(); \ + if(theType == "AttributeTextHighlightColor") return SALOMEDSImpl_AttributeTextHighlightColor::GetID(); \ + if(theType == "AttributePixMap") return SALOMEDSImpl_AttributePixMap::GetID(); \ + if(theType == "AttributeLocalID") return SALOMEDSImpl_AttributeLocalID::GetID(); \ + if(theType == "AttributeTarget") return SALOMEDSImpl_AttributeTarget::GetID(); \ + if(theType == "AttributeTableOfInteger") return SALOMEDSImpl_AttributeTableOfInteger::GetID(); \ + if(theType == "AttributeTableOfReal") return SALOMEDSImpl_AttributeTableOfReal::GetID(); \ + if(theType == "AttributeTableOfString") return SALOMEDSImpl_AttributeTableOfString::GetID(); \ + if(theType == "AttributeStudyProperties") return SALOMEDSImpl_AttributeStudyProperties::GetID(); \ + if(theType == "AttributePythonObject") return SALOMEDSImpl_AttributePythonObject::GetID(); \ + if(theType == "AttributeUserID") return Standard_GUID("FFFFFFFF-D9CD-11d6-945D-1050DA506788"); \ + if(theType == "AttributeExternalFileDef") return SALOMEDSImpl_AttributeExternalFileDef::GetID(); \ + if(theType == "AttributeFileType") return SALOMEDSImpl_AttributeFileType::GetID(); \ + if(theType == "AttributeFlags") return SALOMEDSImpl_AttributeFlags::GetID(); \ + if(theType == "AttributeGraphic") return SALOMEDSImpl_AttributeGraphic::GetID(); \ + if(theType == "AttributeReference") return SALOMEDSImpl_AttributeReference::GetID(); + + +#define __FindOrCreateAttributeLocked(ClassName) if (strcmp(aTypeOfAttribute.ToCString(), #ClassName) == 0) { \ + Handle(SALOMEDSImpl_##ClassName) anAttr; \ + if (!Lab.FindAttribute(SALOMEDSImpl_##ClassName::GetID(), anAttr)) { \ + CheckLocked(); \ + anAttr = new SALOMEDSImpl_##ClassName; \ + Lab.AddAttribute(anAttr); \ + } \ + return anAttr; \ + } + +#define __FindOrCreateAttribute(ClassName) if (strcmp(aTypeOfAttribute.ToCString(), #ClassName) == 0) { \ + Handle(SALOMEDSImpl_##ClassName) anAttr; \ + if (!Lab.FindAttribute(SALOMEDSImpl_##ClassName::GetID(), anAttr)) { \ + anAttr = new SALOMEDSImpl_##ClassName; \ + Lab.AddAttribute(anAttr); \ + } \ + return anAttr; \ + } + +#define __FindOrCreateAttributeForBuilder \ +__FindOrCreateAttributeLocked(AttributeReal) \ +__FindOrCreateAttributeLocked(AttributeInteger) \ +__FindOrCreateAttributeLocked(AttributeSequenceOfReal) \ +__FindOrCreateAttributeLocked(AttributeSequenceOfInteger) \ +__FindOrCreateAttributeLocked(AttributeName) \ +__FindOrCreateAttributeLocked(AttributeComment) \ +__FindOrCreateAttributeLocked(AttributeIOR) \ +__FindOrCreateAttributeLocked(AttributePixMap) \ +__FindOrCreateAttributeLocked(AttributeLocalID) \ +__FindOrCreateAttributeLocked(AttributeTableOfInteger) \ +__FindOrCreateAttributeLocked(AttributeTableOfReal) \ +__FindOrCreateAttributeLocked(AttributeTableOfString) \ +__FindOrCreateAttributeLocked(AttributePythonObject) \ +__FindOrCreateAttribute(AttributePersistentRef) \ +__FindOrCreateAttribute(AttributeDrawable) \ +__FindOrCreateAttribute(AttributeSelectable) \ +__FindOrCreateAttribute(AttributeExpandable) \ +__FindOrCreateAttribute(AttributeOpened) \ +__FindOrCreateAttribute(AttributeTextColor) \ +__FindOrCreateAttribute(AttributeTextHighlightColor) \ +__FindOrCreateAttribute(AttributeTarget) \ +__FindOrCreateAttribute(AttributeStudyProperties) \ +__FindOrCreateAttribute(AttributeExternalFileDef) \ +__FindOrCreateAttribute(AttributeFileType) \ +__FindOrCreateAttribute(AttributeFlags) \ +__FindOrCreateAttribute(AttributeGraphic) + + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_Callback.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_Callback.cxx new file mode 100644 index 000000000..8b5563993 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_Callback.cxx @@ -0,0 +1,9 @@ +// File : SALOMEDSImpl_Callback.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_Callback.hxx" + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_Callback, MMgt_TShared ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_Callback, MMgt_TShared ) + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_Callback.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_Callback.hxx new file mode 100644 index 000000000..c78054bd7 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_Callback.hxx @@ -0,0 +1,42 @@ +// File : SALOMEDSImpl_Callback.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSIMPL_CALLBACK_H__ +#define __SALOMEDSIMPL_CALLBACK_H__ + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_Callback, MMgt_TShared ) + +#include "SALOMEDSImpl_UseCaseBuilder.hxx" + +class SALOMEDSImpl_Callback : public MMgt_TShared +{ +private: + Handle(SALOMEDSImpl_UseCaseBuilder) _builder; + +public: + + SALOMEDSImpl_Callback(const Handle(SALOMEDSImpl_UseCaseBuilder)& builder) + { + _builder = builder; + } + + virtual void OnAddSObject(Handle(SALOMEDSImpl_SObject) theObject) + { + if(_builder != NULL && theObject != NULL) _builder->Append(theObject); + } + + virtual void OnRemoveSObject(Handle(SALOMEDSImpl_SObject) theObject) + { + if(_builder != NULL && theObject != NULL) _builder->Remove(theObject); + } + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_Callback ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_ChildIterator.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_ChildIterator.cxx new file mode 100644 index 000000000..79a21af63 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_ChildIterator.cxx @@ -0,0 +1,62 @@ +// File : SALOMEDSImpl_ChildIterator.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_ChildIterator.hxx" +#include "SALOMEDSImpl_Study.hxx" + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_ChildIterator, MMgt_TShared ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_ChildIterator, MMgt_TShared ) + +SALOMEDSImpl_ChildIterator::SALOMEDSImpl_ChildIterator(const Handle(SALOMEDSImpl_SObject)& theSO) +{ + _so = theSO; + _it = TDF_ChildIterator(_so->GetLabel()); +} + +SALOMEDSImpl_ChildIterator::SALOMEDSImpl_ChildIterator(const TDF_Label& theLabel) +{ + _so = SALOMEDSImpl_Study::SObject(theLabel); + _it = TDF_ChildIterator(theLabel); +} + +void SALOMEDSImpl_ChildIterator::Init() +{ + _it.Initialize(_so->GetLabel(), Standard_False); +} + +void SALOMEDSImpl_ChildIterator::Init(const TDF_Label& theLabel) +{ + _it.Initialize(theLabel, Standard_False); +} + +void SALOMEDSImpl_ChildIterator::InitEx(bool theAllLevels) +{ + _it.Initialize(_so->GetLabel(), theAllLevels); +} + +void SALOMEDSImpl_ChildIterator::InitEx(const TDF_Label& theLabel, bool theAllLevels) +{ + _it.Initialize(theLabel, theAllLevels); +} + +bool SALOMEDSImpl_ChildIterator::More() +{ + return _it.More(); +} + +void SALOMEDSImpl_ChildIterator::Next() +{ + _it.Next(); +} + +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_ChildIterator::Value() +{ + return SALOMEDSImpl_Study::SObject(_it.Value()); +} + +TDF_Label SALOMEDSImpl_ChildIterator::Label() +{ + return _it.Value(); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_ChildIterator.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_ChildIterator.hxx new file mode 100644 index 000000000..6cbb18540 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_ChildIterator.hxx @@ -0,0 +1,41 @@ +// File : SALOMEDSImpl_ChildIterator.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSImpl_CHILDITERATOR_H__ +#define __SALOMEDSImpl_CHILDITERATOR_H__ + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_ChildIterator, MMgt_TShared ) + +#include "SALOMEDSImpl_SObject.hxx" +#include "TDF_ChildIterator.hxx" +#include "TDF_Label.hxx" + +class SALOMEDSImpl_ChildIterator: public MMgt_TShared +{ +private: + TDF_ChildIterator _it; + Handle(SALOMEDSImpl_SObject) _so; + +public: + + Standard_EXPORT SALOMEDSImpl_ChildIterator(const Handle(SALOMEDSImpl_SObject)& theSO); + Standard_EXPORT SALOMEDSImpl_ChildIterator(const TDF_Label& theLabel); + Standard_EXPORT ~SALOMEDSImpl_ChildIterator() {}; + + Standard_EXPORT virtual void Init(); + Standard_EXPORT virtual void Init(const TDF_Label& theLabel); + Standard_EXPORT virtual void InitEx(bool theAllLevels); + Standard_EXPORT virtual void InitEx(const TDF_Label& theLabel, bool theAllLevels); + Standard_EXPORT virtual bool More(); + Standard_EXPORT virtual void Next(); + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) Value(); + Standard_EXPORT virtual TDF_Label Label(); + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_SObject ) +}; +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.cxx new file mode 100644 index 000000000..11ce37bd5 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.cxx @@ -0,0 +1,75 @@ +// File: SALOMEDSImpl_ChildNodeIterator.cxx +// Created: Wed Jan 26 16:43:08 2000 +// Author: Denis PASCAL +// + + +#include + +#define ChildNodeIterator_UpToBrother \ +{ \ + while (!myNode.IsNull() && (myNode->Depth() > myFirstLevel) && myNode->myNext == NULL) \ + myNode = myNode->myFather; \ + if (!myNode.IsNull() && (myNode->Depth() > myFirstLevel) && myNode->myFather != NULL) \ + myNode = myNode->myNext; \ + else \ + myNode = NULL; \ +} + +//======================================================================= +//function : SALOMEDSImpl_ChildNodeIterator +//purpose : +//======================================================================= +SALOMEDSImpl_ChildNodeIterator::SALOMEDSImpl_ChildNodeIterator() + : myFirstLevel(0) +{} + +//======================================================================= +//function : SALOMEDSImpl_ChildNodeIterator +//purpose : +//======================================================================= + +SALOMEDSImpl_ChildNodeIterator::SALOMEDSImpl_ChildNodeIterator (const Handle(SALOMEDSImpl_AttributeTreeNode)& aNode, + const Standard_Boolean allLevels) +: myNode(aNode->myFirst), + myFirstLevel(allLevels ? aNode->Depth() : -1) +{} + +//======================================================================= +//function : Initialize +//purpose : +//======================================================================= + +void SALOMEDSImpl_ChildNodeIterator::Initialize(const Handle(SALOMEDSImpl_AttributeTreeNode)& aNode, + const Standard_Boolean allLevels) +{ + myNode = aNode->myFirst; + myFirstLevel = allLevels ? aNode->Depth() : -1; +} + +//======================================================================= +//function : Next +//purpose : +//======================================================================= + +void SALOMEDSImpl_ChildNodeIterator::Next() +{ + if (myFirstLevel == -1) { + myNode = myNode->myNext; + } + else { + if (myNode->myFirst != NULL) myNode = myNode->myFirst; + else ChildNodeIterator_UpToBrother; + } +} + +//======================================================================= +//function : NextBrother +//purpose : +//======================================================================= + +void SALOMEDSImpl_ChildNodeIterator::NextBrother() +{ + if (myNode->myNext != NULL) myNode = myNode->myNext; + else ChildNodeIterator_UpToBrother; +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.hxx new file mode 100644 index 000000000..5b7b5924a --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.hxx @@ -0,0 +1,45 @@ + +#ifndef _SALOMEDSImpl_ChildNodeIterator_HeaderFile +#define _SALOMEDSImpl_ChildNodeIterator_HeaderFile + +#ifndef _Standard_Integer_HeaderFile +#include +#endif +#ifndef _Standard_Boolean_HeaderFile +#include +#endif + +#include "SALOMEDSImpl_AttributeTreeNode.hxx" + + +#ifndef _Standard_HeaderFile +#include +#endif +#ifndef _Standard_Macro_HeaderFile +#include +#endif + +class SALOMEDSImpl_ChildNodeIterator +{ + +public: + +Standard_EXPORT SALOMEDSImpl_ChildNodeIterator(); +Standard_EXPORT SALOMEDSImpl_ChildNodeIterator(const Handle(SALOMEDSImpl_AttributeTreeNode)& aTreeNode, + const Standard_Boolean allLevels = Standard_False); +Standard_EXPORT void Initialize(const Handle(SALOMEDSImpl_AttributeTreeNode)& aTreeNode, + const Standard_Boolean allLevels = Standard_False) ; +Standard_EXPORT Standard_Boolean More() const { return !myNode.IsNull(); } +Standard_EXPORT void Next() ; +Standard_EXPORT void NextBrother() ; +Standard_EXPORT Handle_SALOMEDSImpl_AttributeTreeNode Value() const { return myNode; } + +private: + +Handle_SALOMEDSImpl_AttributeTreeNode myNode; +Standard_Integer myFirstLevel; + +}; + + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_Driver.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_Driver.hxx new file mode 100644 index 000000000..000b0acf5 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_Driver.hxx @@ -0,0 +1,80 @@ +#ifndef __SALOMEDSIMPL_DRIVER_H__ +#define __SALOMEDSIMPL_DRIVER_H__ + +#include +#include +#include + + +class SALOMEDSImpl_Driver +{ +public: + + virtual TCollection_AsciiString GetIOR() = 0; + + virtual unsigned char* Save(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const TCollection_AsciiString& theURL, + long& theStreamLength, + bool isMultiFile) = 0; + + virtual unsigned char* SaveASCII(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const TCollection_AsciiString& theURL, + long& theStreamLength, + bool isMultiFile) = 0; + + virtual bool Load(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const unsigned char* theStream, + const long theStreamLength, + const TCollection_AsciiString& theURL, + bool isMultiFile) = 0; + + virtual bool LoadASCII(const Handle(SALOMEDSImpl_SComponent)& theComponent, + const unsigned char* theStream, + const long theStreamLength, + const TCollection_AsciiString& theURL, + bool isMultiFile) = 0; + + virtual void Close(const Handle(SALOMEDSImpl_SComponent)& theComponent) = 0; + + virtual TCollection_AsciiString ComponentDataType() = 0; + + + virtual TCollection_AsciiString IORToLocalPersistentID(const Handle(SALOMEDSImpl_SObject)& theSObject, + const TCollection_AsciiString& IORString, + bool isMultiFile, + bool isASCII) = 0; + + virtual TCollection_AsciiString LocalPersistentIDToIOR(const Handle(SALOMEDSImpl_SObject)& theSObject, + const TCollection_AsciiString& aLocalPersistentID, + bool isMultiFile, + bool isASCII) = 0; + + virtual bool CanCopy(const Handle(SALOMEDSImpl_SObject)& theObject) = 0; + + virtual unsigned char* CopyFrom(const Handle(SALOMEDSImpl_SObject)& theObject, + int& theObjectID, + long& theStreamLength) = 0; + + virtual bool CanPaste(const TCollection_AsciiString& theComponentName, int theObjectID) = 0; + + virtual TCollection_AsciiString PasteInto(const unsigned char* theStream, + const long theStreamLength, + int theObjectID, + const Handle(SALOMEDSImpl_SObject)& theObject) = 0; + + virtual unsigned char* DumpPython(const Handle(SALOMEDSImpl_Study)& theStudy, + bool isPublished, + bool& isValidScript, + long& theStreamLength) = 0; +}; + +class SALOMEDSImpl_DriverFactory +{ +public: + + virtual SALOMEDSImpl_Driver* GetDriverByType(const TCollection_AsciiString& theComponentType) = 0; + + virtual SALOMEDSImpl_Driver* GetDriverByIOR(const TCollection_AsciiString& theIOR) = 0; +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.cxx new file mode 100644 index 000000000..6f2384fb6 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.cxx @@ -0,0 +1,67 @@ +// File : SALOMEDSImpl_GenericAttribute.hxx +// Author : SERGEY_RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_Attributes.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_StudyBuilder.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_GenericAttribute, TDF_Attribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_GenericAttribute, TDF_Attribute ) + +char* SALOMEDSImpl_GenericAttribute::Impl_GetType(const Handle(TDF_Attribute)& theAttr) +{ + Handle(SALOMEDSImpl_GenericAttribute) ga = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(theAttr); + return ga->Type().ToCString(); +} + +char* SALOMEDSImpl_GenericAttribute::Impl_GetClassType(const Handle(TDF_Attribute)& theAttr) +{ + Handle(SALOMEDSImpl_GenericAttribute) ga = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(theAttr); + return ga->GetClassType().ToCString(); +} + +void SALOMEDSImpl_GenericAttribute::Impl_CheckLocked(const Handle(TDF_Attribute)& theAttr) +{ + Handle(SALOMEDSImpl_GenericAttribute) ga = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(theAttr); + ga->CheckLocked(); +} + +TCollection_AsciiString SALOMEDSImpl_GenericAttribute::Type() +{ + return _type; +} + + +void SALOMEDSImpl_GenericAttribute::CheckLocked() +{ + TDF_Label aLabel = Label(); + if(aLabel.IsNull()) return; + + Handle(SALOMEDSImpl_Study) aStudy = SALOMEDSImpl_Study::GetStudy(aLabel); + if(aStudy.IsNull() || aStudy->NewBuilder()->HasOpenCommand()) return; + if(aStudy->IsLocked()) { + aStudy->_errorCode = "LockProtection"; + throw LockProtection("LockProtection"); + } +} + +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_GenericAttribute::GetSObject() +{ + TDF_Label aLabel = Label(); + if(aLabel.IsNull()) return NULL; + return SALOMEDSImpl_Study::SObject(aLabel); +} + +void SALOMEDSImpl_GenericAttribute::SetModifyFlag() +{ + TDF_Label aLabel = Label(); + if(aLabel.IsNull()) return; + + Handle(SALOMEDSImpl_Study) aStudy = SALOMEDSImpl_Study::GetStudy(aLabel); + if(!aStudy.IsNull()) aStudy->Modify(); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.hxx new file mode 100644 index 000000000..47c1cc9e9 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_GenericAttribute.hxx @@ -0,0 +1,52 @@ +// File : SALOMEDSImpl_GenericAttribute.hxx +// Author : SERGEY_RUIN +// Module : SALOME + +#ifndef _GENERICIMPL_ATTRIBUTE_HXX_ +#define _GENERICIMPL_ATTRIBUTE_HXX_ + +#include +#include +#include +#include +#include + +#include "SALOMEDSImpl_SObject.hxx" + +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_GenericAttribute, TDF_Attribute ) + +class SALOMEDSImpl_GenericAttribute: public TDF_Attribute +{ +protected: + + TCollection_AsciiString _type; //This field must be filled in each attribute that inherits from this class. + +public: + +Standard_EXPORT SALOMEDSImpl_GenericAttribute(const TCollection_AsciiString& theType) +:_type(theType) +{} + +Standard_EXPORT virtual TCollection_AsciiString Save() { return ""; } +Standard_EXPORT virtual void Load(const TCollection_AsciiString&) {} +Standard_EXPORT virtual TCollection_AsciiString Type(); +Standard_EXPORT virtual void CheckLocked(); +Standard_EXPORT TCollection_AsciiString GetClassType() { return _type; } +Standard_EXPORT Handle(SALOMEDSImpl_SObject) GetSObject(); +Standard_EXPORT void SetModifyFlag(); + +Standard_EXPORT static char* Impl_GetType(const Handle(TDF_Attribute)& theAttr); +Standard_EXPORT static char* Impl_GetClassType(const Handle(TDF_Attribute)& theAttr); +Standard_EXPORT static void Impl_CheckLocked(const Handle(TDF_Attribute)& theAttr); + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_GenericAttribute ) + +}; + + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_OCAFApplication.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_OCAFApplication.cxx new file mode 100644 index 000000000..4dcdedf6d --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_OCAFApplication.cxx @@ -0,0 +1,46 @@ +// File : SALOMEDSImpl_OCAFApplication.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_OCAFApplication.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_OCAFApplication, TDocStd_Application ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_OCAFApplication, TDocStd_Application ) + +//======================================================================= +//function : SALOMEDSImpl_OCAFApplication +//purpose : +//======================================================================= + +SALOMEDSImpl_OCAFApplication::SALOMEDSImpl_OCAFApplication() +{ +} + + +//======================================================================= +//function : Formats +//purpose : +//======================================================================= + +void SALOMEDSImpl_OCAFApplication::Formats(TColStd_SequenceOfExtendedString& Formats) +{ + Formats.Append(TCollection_ExtendedString ("SALOME_STUDY")); +} + + +//======================================================================= +//function : ResourcesName +//purpose : +//======================================================================= + +Standard_CString SALOMEDSImpl_OCAFApplication::ResourcesName() +{ + return Standard_CString ("SALOMEDSImpl_Resources"); +} + + + + + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_OCAFApplication.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_OCAFApplication.hxx new file mode 100644 index 000000000..e34a1fa09 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_OCAFApplication.hxx @@ -0,0 +1,32 @@ +// File : SALOMEDSImpl_OCAFApplication.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef _SALOMEDSImpl_OCAFApplication_HeaderFile +#define _SALOMEDSImpl_OCAFApplication_HeaderFile + + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_OCAFApplication, TDocStd_Application) + +#include +#include + + +class SALOMEDSImpl_OCAFApplication : public TDocStd_Application { + +public: + +Standard_EXPORT SALOMEDSImpl_OCAFApplication(); +Standard_EXPORT virtual void Formats(TColStd_SequenceOfExtendedString& Formats) ; +Standard_EXPORT Standard_CString ResourcesName() ; +Standard_EXPORT ~SALOMEDSImpl_OCAFApplication() {} + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_OCAFApplication ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_SComponent.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_SComponent.cxx new file mode 100644 index 000000000..ed4eaefc8 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_SComponent.cxx @@ -0,0 +1,78 @@ +// File : SALOMEDSImpl_SComponent.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_AttributeComment.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_SComponent, SALOMEDSImpl_SObject ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_SComponent, SALOMEDSImpl_SObject ) + +//============================================================================ +/*! Function : constructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_SComponent::SALOMEDSImpl_SComponent(const TDF_Label& theLabel) + :SALOMEDSImpl_SObject(theLabel) +{ +} + +//============================================================================ +/*! Function : destructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_SComponent::~SALOMEDSImpl_SComponent() +{} + + +//============================================================================ +/*! Function : ComponentDataType + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_SComponent::ComponentDataType() +{ + TCollection_AsciiString res = ""; + Handle(SALOMEDSImpl_AttributeComment) type; + if ( _lab.FindAttribute(SALOMEDSImpl_AttributeComment::GetID(),type) ) { + res = type->Value(); + } + + return res; +} + + +//============================================================================ +/*! Function : ComponentIOR + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_SComponent::ComponentIOR(TCollection_AsciiString& IOR) +{ + Handle(SALOMEDSImpl_AttributeIOR) ior; + if (!_lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(),ior) ) + return false; + IOR = ior->Value(); + return true; +} + + +//============================================================================ +/*! Function : IsA + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_SComponent::IsA(const TDF_Label& theLabel) +{ + // scomponent must contain comment and belong to the 2th depth label + if ( theLabel.IsAttribute(SALOMEDSImpl_AttributeComment::GetID()) && theLabel.Depth() == 2) { + return true; + } + return false; +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_SComponent.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_SComponent.hxx new file mode 100644 index 000000000..af7317d83 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_SComponent.hxx @@ -0,0 +1,41 @@ +// File : SALOMEDSImpl_SComponent.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSIMPL_SCOMPONENT_H__ +#define __SALOMEDSIMPL_SCOMPONENT_H__ + +//SALOMEDSImpl headers +#include "SALOMEDSImpl_SObject.hxx" + +//Handle definition +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_SComponent, SALOMEDSImpl_SObject ) + +// std C++ headers +#include + +// Cascade headers +#include +#include +#include +#include +#include + +class SALOMEDSImpl_SComponent : public SALOMEDSImpl_SObject +{ +public: + + SALOMEDSImpl_SComponent(const TDF_Label& lab); + + ~SALOMEDSImpl_SComponent(); + + virtual TCollection_AsciiString ComponentDataType(); + virtual bool ComponentIOR(TCollection_AsciiString& theID); + static bool IsA(const TDF_Label& theLabel); + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_SComponent ) + +}; +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_SComponentIterator.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_SComponentIterator.cxx new file mode 100644 index 000000000..85aa53762 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_SComponentIterator.cxx @@ -0,0 +1,68 @@ +// File : SALOMEDSImpl_SComponentIterator.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_SComponentIterator.hxx" +#include "SALOMEDSImpl_Study.hxx" + +using namespace std; + +//============================================================================ +/*! Function : constructor + * + */ +//============================================================================ + +SALOMEDSImpl_SComponentIterator::SALOMEDSImpl_SComponentIterator(const Handle(TDocStd_Document)& theDocument) +{ + _lab = theDocument->Main(); + _it.Initialize (_lab); +} + +//============================================================================ +/*! Function : Init + * + */ +//============================================================================ +void SALOMEDSImpl_SComponentIterator::Init() +{ + _it.Initialize (_lab); +} + +//============================================================================ +/*! Function : More + * + */ +//============================================================================ +bool SALOMEDSImpl_SComponentIterator::More() +{ + if (!_it.More()) + return false; + TDF_Label L = _it.Value(); + if (SALOMEDSImpl_SComponent::IsA(L)) + return true; + + return _it.More(); +} + + //============================================================================ +/*! Function : Next + */ +//============================================================================ +void SALOMEDSImpl_SComponentIterator::Next() +{ + _it.Next(); +} + + +//============================================================================ +/*! Function : Value + * + */ +//============================================================================ +Handle(SALOMEDSImpl_SComponent) SALOMEDSImpl_SComponentIterator::Value() +{ + return SALOMEDSImpl_Study::SComponent(_it.Value()); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_SComponentIterator.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_SComponentIterator.hxx new file mode 100644 index 000000000..b16584481 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_SComponentIterator.hxx @@ -0,0 +1,44 @@ +// File : SALOMEDSImpl_SComponentIterator_i.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSIMPL_SCOMPONENTITERATOR_H__ +#define __SALOMEDSIMPL_SCOMPONENTITERATOR_H__ + + +//SALOMEDSImpl headers +#include "SALOMEDSImpl_SComponent.hxx" + +// Cascade headers +#include +#include +#include +#include + +class Standard_EXPORT SALOMEDSImpl_SComponentIterator +{ +private: + + TDF_ChildIterator _it; + TDF_Label _lab; + +public: + + SALOMEDSImpl_SComponentIterator(const SALOMEDSImpl_SComponentIterator& theIterator) + { + _it = theIterator._it; + _lab = theIterator._lab; + } + + SALOMEDSImpl_SComponentIterator() {}; + + SALOMEDSImpl_SComponentIterator(const Handle(TDocStd_Document)& theDocument); + + ~SALOMEDSImpl_SComponentIterator() {}; + + virtual void Init(); + virtual bool More(); + virtual void Next(); + virtual Handle(SALOMEDSImpl_SComponent) Value(); +}; +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_SObject.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_SObject.cxx new file mode 100644 index 000000000..6d967b372 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_SObject.cxx @@ -0,0 +1,221 @@ +// SALOME SALOMEDS : data structure of SALOME and sources of Salome data server +// File : SALOMEDSImpl_SObject.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_Attributes.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_Study.hxx" + +using namespace std; + +#include +#include + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_SObject, MMgt_TShared ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_SObject, MMgt_TShared ) + +//============================================================================ +/*! Function : constructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_SObject::SALOMEDSImpl_SObject(const TDF_Label& theLabel) + :_lab(theLabel) +{ + _value = ""; + _type = ""; + _name = ""; +} + +//============================================================================ +/*! Function : Desctructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_SObject::~SALOMEDSImpl_SObject() +{} + +//============================================================================ +/*! Function : GetID + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_SObject::GetID() +{ + TCollection_AsciiString anEntry; + TDF_Tool::Entry (_lab,anEntry); + return anEntry; +} + +//============================================================================ +/*! Function : GetFatherComponent + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SComponent) SALOMEDSImpl_SObject::GetFatherComponent() +{ + TDF_Label LF = _lab; + while (!SALOMEDSImpl_SComponent::IsA(LF) && !LF.IsRoot()) { + LF = LF.Father(); + } + + if(LF.IsRoot()) return NULL; + + return GetStudy()->GetSComponent(LF); +} + +//============================================================================ +/*! Function : GetFather + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_SObject::GetFather() +{ + return GetStudy()->GetSObject(_lab.Father()); +} + + +//============================================================================ +/*! Function : GetStudy + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_Study) SALOMEDSImpl_SObject::GetStudy() +{ + return SALOMEDSImpl_Study::GetStudy(_lab); +} + +//============================================================================ +/*! Function : FindAttribute + * Purpose : Find attribute of given type on this SObject + */ +//============================================================================ +bool SALOMEDSImpl_SObject::FindAttribute(Handle(TDF_Attribute)& theAttribute, + const TCollection_AsciiString& theTypeOfAttribute) +{ + if(_lab.IsNull()) return Standard_False; + Standard_GUID aGUID = GetGUID(theTypeOfAttribute); + if (_lab.FindAttribute(aGUID, theAttribute)) return Standard_True; + return Standard_False; +} + + + +//============================================================================ +/*! Function : GetAllAttributes + * Purpose : Returns list of all attributes for this sobject + */ +//============================================================================ +Handle(TColStd_HSequenceOfTransient) SALOMEDSImpl_SObject::GetAllAttributes() +{ + Standard_Integer NumAttr = _lab.NbAttributes(); + Handle(TColStd_HSequenceOfTransient) SeqOfAttr = new TColStd_HSequenceOfTransient(); + Handle(SALOMEDSImpl_GenericAttribute) anAttr; + if (NumAttr != 0) { + for(TDF_AttributeIterator iter(_lab);iter.More();iter.Next()) { + anAttr = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(iter.Value()); + if(!anAttr.IsNull() && anAttr->Type() != "AttributeReference") + SeqOfAttr->Append(anAttr); + } + } + return SeqOfAttr; +} + + +//============================================================================ +/*! Function : ReferencedObject + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_SObject::ReferencedObject(Handle(SALOMEDSImpl_SObject)& theObject) +{ + Handle(SALOMEDSImpl_AttributeReference) Ref; + if (!_lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID(),Ref)) + return false; + + theObject = GetStudy()->GetSObject(Ref->Get()); + return true; +} + +//============================================================================ +/*! Function : FindSubObject + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_SObject::FindSubObject(int theTag, Handle(SALOMEDSImpl_SObject)& theObject) +{ + TDF_Label L = _lab.FindChild(theTag, false); + if (L.IsNull()) return false; + + theObject = GetStudy()->GetSObject(L); + return true; + +} + + +//============================================================================ +/*! Function : GetName + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_SObject::GetName() +{ + TCollection_AsciiString aStr = ""; + Handle(SALOMEDSImpl_AttributeName) aName; + if (_lab.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aName)) { + aStr = aName->Value(); + } + return aStr; +} + +//============================================================================ +/*! Function : GetComment + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_SObject::GetComment() +{ + TCollection_AsciiString aStr = ""; + Handle(SALOMEDSImpl_AttributeComment) aComment; + if (_lab.FindAttribute(SALOMEDSImpl_AttributeComment::GetID(), aComment)) { + aStr = aComment->Value(); + } + return aStr; +} + +//============================================================================ +/*! Function : GetIOR + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_SObject::GetIOR() +{ + TCollection_AsciiString aStr = ""; + Handle(SALOMEDSImpl_AttributeIOR) anIOR; + if (_lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(), anIOR)) { + aStr = anIOR->Value(); + } + return aStr; +} + + +Standard_GUID SALOMEDSImpl_SObject::GetGUID(const TCollection_AsciiString& theType) +{ + __AttributeTypeToGUIDForSObject + + if (strncmp(theType.ToCString(), "AttributeTreeNodeGUID",21) == 0) { + const char* aCType = theType.ToCString(); + char* aGUIDString = new char[40]; + sprintf(aGUIDString, &(aCType[21])); + Standard_GUID aGUID = Standard_GUID(aGUIDString); // create tree node GUID by name + delete(aGUIDString); + return aGUID; + } + return Standard_GUID(); +} + + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_SObject.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_SObject.hxx new file mode 100644 index 000000000..0e01455e3 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_SObject.hxx @@ -0,0 +1,66 @@ +// File : SALOMEDSImpl_SObject.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSIMPL_SOBJECT_H__ +#define __SALOMEDSIMPL_SOBJECT_H__ + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_SObject, MMgt_TShared ) + +class SALOMEDSImpl_SComponent; +class Handle_SALOMEDSImpl_SComponent; +class SALOMEDSImpl_Study; +class Handle_SALOMEDSImpl_Study; + +// Cascade headers +#include +#include +#include +#include +#include +#include +#include + +class SALOMEDSImpl_SObject : public MMgt_TShared +{ +protected: + TDF_Label _lab; + TCollection_AsciiString _name; + TCollection_AsciiString _value; + TCollection_AsciiString _type; + +public: + + Standard_EXPORT SALOMEDSImpl_SObject(const TDF_Label& theLabel); + Standard_EXPORT ~SALOMEDSImpl_SObject(); + + Standard_EXPORT virtual TCollection_AsciiString GetID(); + Standard_EXPORT virtual Handle(SALOMEDSImpl_SComponent) GetFatherComponent(); + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) GetFather() ; + Standard_EXPORT virtual bool FindAttribute(Handle(TDF_Attribute)& theAttribute, const TCollection_AsciiString& theTypeOfAttribute); + Standard_EXPORT virtual bool ReferencedObject(Handle(SALOMEDSImpl_SObject)& theObject) ; + Standard_EXPORT virtual bool FindSubObject(int theTag, Handle(SALOMEDSImpl_SObject)& theObject); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_Study) GetStudy() ; + Standard_EXPORT virtual TCollection_AsciiString Name() { return _name; } + Standard_EXPORT virtual void Name(const TCollection_AsciiString& theName) { _name = theName; } + Standard_EXPORT virtual Handle(TColStd_HSequenceOfTransient) GetAllAttributes(); + + Standard_EXPORT virtual TCollection_AsciiString GetName(); + Standard_EXPORT virtual TCollection_AsciiString GetComment(); + Standard_EXPORT virtual TCollection_AsciiString GetIOR(); + + Standard_EXPORT virtual int Tag() { return _lab.Tag(); } + Standard_EXPORT virtual int Depth() { return _lab.Depth(); } + + Standard_EXPORT virtual TDF_Label GetLabel() { return _lab; } + + Standard_EXPORT static Standard_GUID GetGUID(const TCollection_AsciiString& theTypeOfAttribute); + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_SObject ) +}; +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_Study.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_Study.cxx new file mode 100644 index 000000000..82a2cf437 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_Study.cxx @@ -0,0 +1,1476 @@ +// File : SALOMEDSImpl_Study.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_Study.hxx" + +using namespace std; + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SALOMEDSImpl_ChildNodeIterator.hxx" +#include "SALOMEDSImpl_Attributes.hxx" +#include "SALOMEDSImpl_UseCaseIterator.hxx" +#include "SALOMEDSImpl_AttributeReference.hxx" +#include "SALOMEDSImpl_StudyHandle.hxx" +#include "SALOMEDSImpl_Tool.hxx" + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_Study, MMgt_TShared ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_Study, MMgt_TShared ) + +#define DIRECTORYID 16661 +#define FILELOCALID 26662 +#define FILEID "FILE: " + +//============================================================================ +/*! Function : SALOMEDSImpl_Study + * Purpose : SALOMEDSImpl_Study constructor + */ +//============================================================================ +SALOMEDSImpl_Study::SALOMEDSImpl_Study(const Handle(TDocStd_Document)& doc, + const TCollection_AsciiString& study_name) +{ + doc->SetUndoLimit(1); // mpv (IPAL9237): if there is no undo limit, operations mechanism couldn't work + _name = study_name; + _doc = doc; + _Saved = false ; + _URL = ""; + _StudyId = -1; + _autoFill = true; + myNbPostponed.Append(0); + myNbUndos = 0; + _errorCode = ""; + _useCaseBuilder = new SALOMEDSImpl_UseCaseBuilder(_doc); + _builder = new SALOMEDSImpl_StudyBuilder(this); + _cb = new SALOMEDSImpl_Callback(_useCaseBuilder); + //Put on the root label a StudyHandle attribute to store the address of this object + //It will be used to retrieve the study object by TDF_Label that belongs to the study + SALOMEDSImpl_StudyHandle::Set(_doc->Main().Root(), this); +} + + +//============================================================================ +/*! Function : ~SALOMEDSImpl_Study + * Purpose : SALOMEDSImpl_Study destructor + */ +//============================================================================ +SALOMEDSImpl_Study::~SALOMEDSImpl_Study() +{} + +//============================================================================ +/*! Function : GetPersistentReference + * Purpose : Get persistent reference of study (idem URL()) + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Study::GetPersistentReference() +{ + _errorCode = ""; + return URL(); +} +//============================================================================ +/*! Function : GetTransientReference + * Purpose : Get IOR of the Study (registred in OCAF document in doc->Root) + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Study::GetTransientReference() +{ + _errorCode = ""; + TCollection_AsciiString IOR = ""; + + Handle(SALOMEDSImpl_AttributeIOR) Att; + TDF_Label _lab = _doc->GetData()->Root(); + if (_lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(),Att)) { + IOR = Att->Value(); + } + else { + _errorCode = "IOR is empty"; + } + + return IOR; +} + +void SALOMEDSImpl_Study::SetTransientReference(const TCollection_AsciiString& theIOR) +{ + _errorCode = ""; + + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = GetProperties(); + int aLocked = aProp->IsLocked(); + if (aLocked) aProp->SetLocked(Standard_False); + + // Assign the value of the IOR in the study->root + SALOMEDSImpl_AttributeIOR::Set(_doc->Main().Root(), theIOR); + + if (aLocked) aProp->SetLocked(Standard_True); +} + +//============================================================================ +/*! Function : IsEmpty + * Purpose : Detect if study is empty + */ +//============================================================================ +bool SALOMEDSImpl_Study::IsEmpty() +{ + _errorCode = ""; + if (_doc.IsNull()) return true; + return _doc->IsEmpty(); +} + +//============================================================================ +/*! Function : FindComponent + * Purpose : Find a Component with ComponentDataType = aComponentName + */ +//============================================================================ +Handle(SALOMEDSImpl_SComponent) SALOMEDSImpl_Study::FindComponent (const TCollection_AsciiString& aComponentName) +{ + _errorCode = ""; + bool _find = false; + TCollection_AsciiString name; + SALOMEDSImpl_SComponentIterator itcomp = NewComponentIterator(); + Handle(SALOMEDSImpl_SComponent) compo; + + for (; itcomp.More(); itcomp.Next()) { + Handle(SALOMEDSImpl_SComponent) SC = itcomp.Value(); + name = SC->ComponentDataType(); + if(aComponentName == name) { + _find = true; + return SC; + } + } + + if(!_find) + { + _errorCode = "No component was found"; + return NULL; + } + return compo; +} + +//============================================================================ +/*! Function : FindComponentID + * Purpose : Find a Component from it's ID + */ +//============================================================================ +Handle(SALOMEDSImpl_SComponent) SALOMEDSImpl_Study::FindComponentID(const TCollection_AsciiString& aComponentID) +{ + _errorCode = ""; + + // Iterate on each components defined in the study + // Get the component ID and compare with aComponentID + bool _find = false; + TCollection_AsciiString ID; + Handle(SALOMEDSImpl_SComponent) compo; + + SALOMEDSImpl_SComponentIterator itcomp = NewComponentIterator(); + for (; itcomp.More(); itcomp.Next()) { + Handle(SALOMEDSImpl_SComponent) SC = itcomp.Value(); + ID = SC->GetID(); + if(aComponentID == ID) + { + // ComponentID found + _find = true; + compo = SC; + } + } + if(!_find) + { + _errorCode = "No component was found"; + compo = NULL; + } + + return compo; +} + +//============================================================================ +/*! Function : FindObject + * Purpose : Find an Object with SALOMEDSImpl_Name = anObjectName + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::FindObject(const TCollection_AsciiString& anObjectName) +{ + _errorCode = ""; + + // Iterate to all components defined in the study + // After testing the component name, iterate in all objects defined under + // components (function _FindObject) + bool _find = false; + Handle(SALOMEDSImpl_SObject) RefSO = NULL; + + SALOMEDSImpl_SComponentIterator it = NewComponentIterator(); + for (; it.More();it.Next()){ + if(!_find) + { + Handle(SALOMEDSImpl_SComponent) SC = it.Value(); + if (SC->GetName() == anObjectName) + { + _find = true; + RefSO = SC; + + } + if (!_find) RefSO = _FindObject(SC, anObjectName, _find); + } + } + if(RefSO.IsNull()) _errorCode = "No object was found"; + return RefSO; +} + +//============================================================================ +/*! Function : FindObjectID + * Purpose : Find an Object with ID = anObjectID + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::FindObjectID(const TCollection_AsciiString& anObjectID) +{ + _errorCode = ""; + + // Convert aSO->GetID in TDF_Label. + TDF_Label Lab; + TDF_Tool::Label(_doc->Main().Data(), anObjectID, Lab); + + if (Lab.IsNull()) { + _errorCode = "No label was found by ID"; + return NULL; + } + return GetSObject(Lab); + +} + +//============================================================================ +/*! Function : CreateObjectID + * Purpose : Creates an Object with ID = anObjectID + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::CreateObjectID(const TCollection_AsciiString& anObjectID) +{ + _errorCode = ""; + + // Convert aSO->GetID in TDF_Label. + TDF_Label Lab; + TDF_Tool::Label(_doc->Main().Data(), anObjectID, Lab, Standard_True); + + if (Lab.IsNull()) { + _errorCode = "Can not create a label"; + return NULL; + } + return GetSObject(Lab); + +} + +//============================================================================ +/*! Function : FindObjectByName + * Purpose : Find Objects with SALOMEDSImpl_Name = anObjectName in a Component + * : with ComponentDataType = aComponentName + */ +//============================================================================ +Handle(TColStd_HSequenceOfTransient) SALOMEDSImpl_Study::FindObjectByName(const TCollection_AsciiString& anObjectName, + const TCollection_AsciiString& aComponentName) +{ + _errorCode = ""; + + Handle(TColStd_HSequenceOfTransient) listSO = new TColStd_HSequenceOfTransient(); + + Handle(SALOMEDSImpl_SComponent) compo = FindComponent(aComponentName) ; + if ( compo.IsNull() ) { + _errorCode = "Can not find the component"; + return listSO; + } + + // Iterate on each object and subobject of the component + // If objectName is found add it to the list of SObjects + TCollection_AsciiString childName ; + + TCollection_AsciiString compoId = compo->GetID(); + Handle(SALOMEDSImpl_ChildIterator) it = NewChildIterator(compo); + for ( ; it->More(); it->Next() ) { + + Handle(SALOMEDSImpl_SObject) CSO = it->Value(); + if ( CSO->GetName() == anObjectName ) { + /* add to list */ + listSO->Append(CSO) ; + } + + /* looks also for eventual children */ + bool found = false ; + CSO = _FindObject( CSO, anObjectName, found ) ; + if( found) { + listSO->Append(CSO) ; + } + } + + return listSO; +} + + + +//============================================================================ +/*! Function : FindObjectIOR + * Purpose : Find an Object with IOR = anObjectIOR + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::FindObjectIOR(const TCollection_AsciiString& anObjectIOR) +{ + _errorCode = ""; + + // firstly searching in the datamap for optimization + if (myIORLabels.IsBound(anObjectIOR)) { + Handle(SALOMEDSImpl_SObject) aResult = GetSObject(myIORLabels.Find(anObjectIOR)); + // 11 oct 2002: forbidden attributes must be checked here + if (!aResult->GetLabel().IsAttribute(SALOMEDSImpl_AttributeIOR::GetID())) { + myIORLabels.UnBind(anObjectIOR); + } else + return aResult; + } + // Iterate to all components defined in the study + // After testing the component name, iterate in all objects defined under + // components (function _FindObject) + bool _find = false; + Handle(SALOMEDSImpl_SObject) RefSO = NULL; + + SALOMEDSImpl_SComponentIterator it = NewComponentIterator(); + Handle(SALOMEDSImpl_SComponent) SC; + for (; it.More();it.Next()){ + if(!_find) + { + SC = it.Value(); + TCollection_AsciiString ior = SC->GetIOR(); + if (ior != "") + { + if (ior == anObjectIOR) + { + _find = true; + RefSO = SC; + } + } + if (!_find) + RefSO = _FindObjectIOR(SC, anObjectIOR, _find); + } + } + + if(RefSO.IsNull()) _errorCode = "No object was found"; + return RefSO; +} + +//============================================================================ +/*! Function : FindObjectByPath + * Purpose : Find an Object by its path = thePath + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::FindObjectByPath(const TCollection_AsciiString& thePath) +{ + _errorCode = ""; + + TCollection_AsciiString aPath(thePath), aToken; + Handle(SALOMEDSImpl_SObject) aSO = NULL; + int i = 1, aLength = aPath.Length(); + bool isRelative = false; + + if(aLength == 0) { //Empty path - return the current context + return GetSObject(_current); + } + + if(aPath.Value(1) != '/') //Relative path + isRelative = true; + + TDF_ChildIterator anIterator; + TDF_Label aLabel; + Handle(SALOMEDSImpl_AttributeName) anAttr; + + if(isRelative) { + if(_current.IsNull()) return NULL; + anIterator.Initialize(_current, Standard_False); + } + else { + if(aPath.Length() == 1 && aPath.Value(1) == '/') { //Root + return GetSObject(_doc->Main()); + } + anIterator.Initialize(_doc->Main(), Standard_False); + } + + while(i <= aLength) { + + aToken = aPath.Token("/", i); + if(aToken.Length() == 0) break; + + for ( ; anIterator.More(); anIterator.Next() ) { + aLabel = anIterator.Value(); + if(aLabel.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), anAttr)) { + if(anAttr->Value() == aToken) { + aToken = aPath.Token("/", i+1); //Check if it was the last part of the path + if(aToken.Length() == 0) { //The searched label is found (no part of the path is left) + return GetSObject(aLabel); + } + + anIterator.Initialize(aLabel, Standard_False); + break; + } + } + } + + i++; + } + + if(aSO.IsNull()) _errorCode = "No object was found"; + return aSO; +} + +//============================================================================ +/*! Function : GetObjectPath + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Study::GetObjectPath(const Handle(SALOMEDSImpl_SObject)& theObject) +{ + _errorCode = ""; + + TCollection_AsciiString aPath(""); + if(theObject.IsNull()) { + _errorCode = "Null object"; + return aPath.ToCString(); + } + + TCollection_AsciiString aName = theObject->GetName(); + if(!aName.IsEmpty() && aName != "" ) { + TCollection_AsciiString aValue((char*)aName.ToCString()); + aValue.Prepend("/"); + aValue += aPath; + aPath = aValue; + Handle(SALOMEDSImpl_SObject) aFather = theObject->GetFather(); + if(!aFather.IsNull()) { + aName = aFather->GetName(); + if(!aName.IsEmpty() && aName != "") { + aValue = (char*)GetObjectPath(aFather).ToCString(); + aPath = aValue + aPath; + } + } + } + + return aPath; +} + + +//============================================================================ +/*! Function : GetObjectPathByIOR + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Study::GetObjectPathByIOR(const TCollection_AsciiString& theIOR) +{ + _errorCode = ""; + + TCollection_AsciiString aPath; + Handle(SALOMEDSImpl_SObject) so = FindObjectIOR(theIOR); + if(so.IsNull()) { + _errorCode = "No SObject was found by IOR"; + return aPath; + } + + return GetObjectPath(so); +} + + +//============================================================================ +/*! Function : SetContext + * Purpose : Sets the current context + */ +//============================================================================ +bool SALOMEDSImpl_Study::SetContext(const TCollection_AsciiString& thePath) +{ + _errorCode = ""; + if(thePath.IsEmpty()) { + _errorCode = "InvalidPath"; + return false; + } + + TCollection_AsciiString aPath(thePath), aContext(""); + bool isInvalid = false; + Handle(SALOMEDSImpl_SObject) aSO; + + if(aPath.Value(1) != '/') { //Relative path + aContext = GetContext(); + aContext += '/'; + aContext += aPath; + } + else + aContext = aPath; + + try { + aSO = FindObjectByPath(aContext.ToCString()); + } + catch( ... ) { + isInvalid = true; + } + + if(isInvalid || aSO.IsNull()) { + _errorCode = "InvalidContext"; + return false; + } + + TDF_Label aLabel = aSO->GetLabel(); + if(aLabel.IsNull()) { + _errorCode = "InvalidContext"; + return false; + } + else + _current = aLabel; //Set the current context + + return true; +} + +//============================================================================ +/*! Function : GetContext + * Purpose : Gets the current context + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Study::GetContext() +{ + _errorCode = ""; + + if(_current.IsNull()) { + _errorCode = "InvaidContext"; + return ""; + } + Handle(SALOMEDSImpl_SObject) so = GetSObject(_current); + return GetObjectPath(so); +} + +//============================================================================ +/*! Function : GetObjectNames + * Purpose : method to get all object names in the given context (or in the current context, if 'theContext' is empty) + */ +//============================================================================ +Handle(TColStd_HSequenceOfAsciiString) SALOMEDSImpl_Study::GetObjectNames(const TCollection_AsciiString& theContext) +{ + _errorCode = ""; + + Handle(TColStd_HSequenceOfAsciiString) aResultSeq = new TColStd_HSequenceOfAsciiString; + TDF_Label aLabel; + if (theContext.IsEmpty()) { + if(_current.IsNull()) { + _errorCode = "InvalidContext"; + return aResultSeq; + } + aLabel = _current; + } else { + TDF_Label aTmp = _current; + SetContext(theContext); + aLabel = _current; + _current = aTmp; + } + TDF_ChildIterator anIter(aLabel, Standard_False); // iterate all subchildren at all sublevels + for(; anIter.More(); anIter.Next()) { + TDF_Label aLabel = anIter.Value(); + Handle(SALOMEDSImpl_AttributeName) aName; + if (aLabel.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aName)) aResultSeq->Append(aName->Value()); + } + + return aResultSeq; +} + +//============================================================================ +/*! Function : GetDirectoryNames + * Purpose : method to get all directory names in the given context (or in the current context, if 'theContext' is empty) + */ +//============================================================================ +Handle(TColStd_HSequenceOfAsciiString) SALOMEDSImpl_Study::GetDirectoryNames(const TCollection_AsciiString& theContext) +{ + _errorCode = ""; + + Handle(TColStd_HSequenceOfAsciiString) aResultSeq = new TColStd_HSequenceOfAsciiString; + TDF_Label aLabel; + if (theContext.IsEmpty()) { + if(_current.IsNull()) { + _errorCode = "InvalidContext"; + return aResultSeq; + } + aLabel = _current; + } else { + TDF_Label aTmp = _current; + SetContext(theContext); + aLabel = _current; + _current = aTmp; + } + TDF_ChildIterator anIter(aLabel, Standard_False); // iterate first-level children at all sublevels + for(; anIter.More(); anIter.Next()) { + TDF_Label aLabel = anIter.Value(); + Handle(SALOMEDSImpl_AttributeLocalID) anID; + if (aLabel.FindAttribute(SALOMEDSImpl_AttributeLocalID::GetID(), anID)) { + if (anID->Value() == DIRECTORYID) { + Handle(SALOMEDSImpl_AttributeName) aName; + if (aLabel.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aName)) { + aResultSeq->Append(aName->Value()); + } + } + } + } + + return aResultSeq; +} + +//============================================================================ +/*! Function : GetFileNames + * Purpose : method to get all file names in the given context (or in the current context, if 'theContext' is empty) + */ +//============================================================================ +Handle(TColStd_HSequenceOfAsciiString) SALOMEDSImpl_Study::GetFileNames(const TCollection_AsciiString& theContext) +{ + _errorCode = ""; + + Handle(TColStd_HSequenceOfAsciiString) aResultSeq = new TColStd_HSequenceOfAsciiString; + TDF_Label aLabel; + if (theContext.IsEmpty()) { + if(_current.IsNull()) { + _errorCode = "InvalidContext"; + return aResultSeq; + } + aLabel = _current; + } else { + TDF_Label aTmp = _current; + SetContext(theContext); + aLabel = _current; + _current = aTmp; + } + TDF_ChildIterator anIter(aLabel, Standard_False); // iterate all subchildren at all sublevels + for(; anIter.More(); anIter.Next()) { + TDF_Label aLabel = anIter.Value(); + Handle(SALOMEDSImpl_AttributeLocalID) anID; + if (aLabel.FindAttribute(SALOMEDSImpl_AttributeLocalID::GetID(), anID)) { + if (anID->Value() == FILELOCALID) { + Handle(SALOMEDSImpl_AttributePersistentRef) aName; + if(aLabel.FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID(), aName)) { + TCollection_ExtendedString aFileName = aName->Value(); + if(aFileName.Length() > 0) + aResultSeq->Append(aFileName.Split(strlen(FILEID))); + } + } + } + } + + return aResultSeq; +} + +//============================================================================ +/*! Function : GetComponentNames + * Purpose : method to get all components names + */ +//============================================================================ +Handle(TColStd_HSequenceOfAsciiString) SALOMEDSImpl_Study::GetComponentNames(const TCollection_AsciiString& theContext) +{ + _errorCode = ""; + + Handle(TColStd_HSequenceOfAsciiString) aResultSeq = new TColStd_HSequenceOfAsciiString; + TDF_ChildIterator anIter(_doc->Main(), Standard_False); // iterate all subchildren at first level + for(; anIter.More(); anIter.Next()) { + TDF_Label aLabel = anIter.Value(); + Handle(SALOMEDSImpl_AttributeName) aName; + if (aLabel.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aName)) aResultSeq->Append(aName->Value()); + } + + return aResultSeq; +} + +//============================================================================ +/*! Function : NewChildIterator + * Purpose : Create a ChildIterator from an SObject + */ +//============================================================================ +Handle(SALOMEDSImpl_ChildIterator) SALOMEDSImpl_Study::NewChildIterator(const Handle(SALOMEDSImpl_SObject)& aSO) +{ + _errorCode = ""; + return new SALOMEDSImpl_ChildIterator(aSO); +} + + +//============================================================================ +/*! Function : NewComponentIterator + * Purpose : Create a SComponentIterator + */ +//============================================================================ +SALOMEDSImpl_SComponentIterator SALOMEDSImpl_Study::NewComponentIterator() +{ + _errorCode = ""; + return SALOMEDSImpl_SComponentIterator(_doc); +} + + +//============================================================================ +/*! Function : NewBuilder + * Purpose : Create a StudyBuilder + */ +//============================================================================ +Handle(SALOMEDSImpl_StudyBuilder) SALOMEDSImpl_Study::NewBuilder() +{ + _errorCode = ""; + if(_autoFill) { + _builder->SetOnAddSObject(_cb); + _builder->SetOnRemoveSObject(_cb); + } + return _builder; + +} + +//============================================================================ +/*! Function : Name + * Purpose : get study name + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Study::Name() +{ + _errorCode = ""; + return _name; +} + +//============================================================================ +/*! Function : Name + * Purpose : set study name + */ +//============================================================================ +void SALOMEDSImpl_Study::Name(const TCollection_AsciiString& name) +{ + _errorCode = ""; + _name = name; +} + +//============================================================================ +/*! Function : IsSaved + * Purpose : get if study has been saved + */ +//============================================================================ +bool SALOMEDSImpl_Study::IsSaved() +{ + _errorCode = ""; + return _Saved; +} + +//============================================================================ +/*! Function : IsSaved + * Purpose : set if study has been saved + */ +//============================================================================ +void SALOMEDSImpl_Study::IsSaved(bool save) +{ + _errorCode = ""; + _Saved = save; + if(save) _doc->UnModify(); +} + +//============================================================================ +/*! Function : IsModified + * Purpose : Detect if a Study has been modified since it has been saved + */ +//============================================================================ +bool SALOMEDSImpl_Study::IsModified() +{ + _errorCode = ""; + + // True if is modified + if (_doc->IsModified()) return true; + + return false; +} + +//============================================================================ +/*! Function : URL + * Purpose : get URL of the study (persistent reference of the study) + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Study::URL() +{ + _errorCode = ""; + return _URL; +} + +//============================================================================ +/*! Function : URL + * Purpose : set URL of the study (persistent reference of the study) + */ +//============================================================================ +void SALOMEDSImpl_Study::URL(const TCollection_AsciiString& url) +{ + _errorCode = ""; + _URL = url; + + /*jfa: Now name of SALOMEDS study will correspond to name of SalomeApp study + TCollection_AsciiString tmp(_URL); + + char *aName = (char*)tmp.ToCString(); + char *adr = strtok(aName, "/"); + while (adr) + { + aName = adr; + adr = strtok(NULL, "/"); + } + Name(aName);*/ + Name(url); +} + + +//============================================================================ +/*! Function : _FindObject + * Purpose : Find an Object with SALOMEDSImpl_Name = anObjectName + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::_FindObject(const Handle(SALOMEDSImpl_SObject)& SO, + const TCollection_AsciiString& theObjectName, + bool& _find) +{ + if(SO.IsNull()) return NULL; + + // Iterate on each objects and subobjects of the component + // If objectName find, stop the loop and get the object reference + Handle(SALOMEDSImpl_SObject) RefSO; + Handle(SALOMEDSImpl_AttributeName) anAttr; + + TCollection_AsciiString soid = SO->GetID(); + TDF_ChildIterator it(SO->GetLabel()); + for (; it.More(); it.Next()){ + if(!_find) + { + if (it.Value().FindAttribute(SALOMEDSImpl_AttributeName::GetID(), anAttr)) + { + TCollection_AsciiString Val(anAttr->Value()); + if (Val == theObjectName) + { + RefSO = GetSObject(it.Value()); + _find = true; + } + } + if (!_find) RefSO = _FindObject(GetSObject(it.Value()), theObjectName, _find); + } + } + return RefSO; +} + +//============================================================================ +/*! Function : _FindObjectIOR + * Purpose : Find an Object with SALOMEDSImpl_IOR = anObjectIOR + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) +SALOMEDSImpl_Study::_FindObjectIOR(const Handle(SALOMEDSImpl_SObject)& SO, + const TCollection_AsciiString& theObjectIOR, + bool& _find) +{ + if(SO.IsNull()) return NULL; + + // Iterate on each objects and subobjects of the component + // If objectName find, stop the loop and get the object reference + Handle(SALOMEDSImpl_SObject) RefSO, aSO; + Handle(SALOMEDSImpl_AttributeIOR) anAttr; + + TDF_ChildIterator it(SO->GetLabel()); + for (; it.More();it.Next()){ + if(!_find) + { + if (it.Value().FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(), anAttr)) + { + TCollection_AsciiString Val(anAttr->Value()); + if (Val == theObjectIOR) + { + RefSO = GetSObject(it.Value()); + _find = true; + } + } + aSO = GetSObject(it.Value()); + if (!_find) RefSO = _FindObjectIOR(aSO, theObjectIOR, _find); + } + } + return RefSO; +} + +bool SALOMEDSImpl_Study::IsLocked() +{ + _errorCode = ""; + return GetProperties()->IsLocked(); +} + +int SALOMEDSImpl_Study::StudyId() +{ + _errorCode = ""; + return _StudyId; +} + +void SALOMEDSImpl_Study::StudyId(int id) +{ + _errorCode = ""; + _StudyId = id; +} + +void SALOMEDSImpl_Study::UpdateIORLabelMap(const TCollection_AsciiString& anIOR,const TCollection_AsciiString& anEntry) +{ + _errorCode = ""; + TDF_Label aLabel; + char* anEn = (char*)anEntry.ToCString(); + char* IOR = (char*)anIOR.ToCString(); + TDF_Tool::Label(_doc->GetData(),anEn, aLabel, Standard_True); + if (myIORLabels.IsBound(TCollection_ExtendedString(IOR))) myIORLabels.UnBind(TCollection_ExtendedString(IOR)); + myIORLabels.Bind(TCollection_ExtendedString(IOR), aLabel); +} + +Handle(SALOMEDSImpl_Study) SALOMEDSImpl_Study::GetStudy(const TDF_Label& theLabel) +{ + Handle(SALOMEDSImpl_StudyHandle) Att; + if (theLabel.Root().FindAttribute(SALOMEDSImpl_StudyHandle::GetID(),Att)) { + return Att->GetHandle(); + } + return NULL; +} + +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::SObject(const TDF_Label& theLabel) +{ + return GetStudy(theLabel)->GetSObject(theLabel); +} + +Handle(SALOMEDSImpl_SComponent) SALOMEDSImpl_Study::SComponent(const TDF_Label& theLabel) +{ + return GetStudy(theLabel)->GetSComponent(theLabel); +} + + +void SALOMEDSImpl_Study::IORUpdated(const Handle(SALOMEDSImpl_AttributeIOR)& theAttribute) +{ + TCollection_AsciiString aString; + TDF_Tool::Entry(theAttribute->Label(), aString); + GetStudy(theAttribute->Label())->UpdateIORLabelMap(theAttribute->Value(), aString); +} + +Handle(TColStd_HSequenceOfTransient) SALOMEDSImpl_Study::FindDependances(const Handle(SALOMEDSImpl_SObject)& anObject) +{ + _errorCode = ""; + Handle(TColStd_HSequenceOfTransient) aSeq; + + Handle(SALOMEDSImpl_AttributeTarget) aTarget; + if (anObject->GetLabel().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID(), aTarget)) { + return aTarget->Get(); + } + + return aSeq; +} + + +Handle(SALOMEDSImpl_AttributeStudyProperties) SALOMEDSImpl_Study::GetProperties() +{ + _errorCode = ""; + return SALOMEDSImpl_AttributeStudyProperties::Set(_doc->Main()); +} + +TCollection_AsciiString SALOMEDSImpl_Study::GetLastModificationDate() +{ + _errorCode = ""; + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = GetProperties(); + + Handle(TColStd_HSequenceOfExtendedString) aNames; + Handle(TColStd_HSequenceOfInteger) aMinutes, aHours, aDays, aMonths, aYears; + aProp->GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears); + + int aLastIndex = aNames->Length(); + char aResult[20]; + sprintf(aResult, "%2.2d/%2.2d/%4.4d %2.2d:%2.2d", + (int)(aDays->Value(aLastIndex)),(int)(aMonths->Value(aLastIndex)), (int)(aYears->Value(aLastIndex)), + (int)(aHours->Value(aLastIndex)), (int)(aMinutes->Value(aLastIndex))); + TCollection_AsciiString aResStr (aResult); + return aResStr; +} + +Handle(TColStd_HSequenceOfAsciiString) SALOMEDSImpl_Study::GetModificationsDate() +{ + _errorCode = ""; + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = GetProperties(); + + Handle(TColStd_HSequenceOfExtendedString) aNames; + Handle(TColStd_HSequenceOfInteger) aMinutes, aHours, aDays, aMonths, aYears; + aProp->GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears); + + int anIndex, aLength = aNames->Length(); + Handle(TColStd_HSequenceOfAsciiString) aDates = new TColStd_HSequenceOfAsciiString; + + for (anIndex = 2; anIndex <= aLength; anIndex++) { + char aDate[20]; + sprintf(aDate, "%2.2d/%2.2d/%4.4d %2.2d:%2.2d", + (int)(aDays->Value(anIndex)), (int)(aMonths->Value(anIndex)), (int)(aYears->Value(anIndex)), + (int)(aHours->Value(anIndex)), (int)(aMinutes->Value(anIndex))); + aDates->Append(aDate); + } + return aDates; +} + + + +//============================================================================ +/*! Function : GetUseCaseBuilder + * Purpose : Returns a UseCase builder + */ +//============================================================================ +Handle(SALOMEDSImpl_UseCaseBuilder) SALOMEDSImpl_Study::GetUseCaseBuilder() +{ + _errorCode = ""; + return _useCaseBuilder; +} + + +//============================================================================ +/*! Function : Close + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_Study::Close() +{ + _errorCode = ""; + Handle(TDocStd_Application) anApp = Handle(TDocStd_Application)::DownCast(_doc->Application()); + if(!anApp.IsNull()) anApp->Close(_doc); + _doc.Nullify(); + _mapOfSO.Clear(); + _mapOfSCO.Clear(); +} + +//============================================================================ +/*! Function : AddPostponed + * Purpose : + */ + //============================================================================ +void SALOMEDSImpl_Study::AddPostponed(const TCollection_AsciiString& theIOR) +{ + _errorCode = ""; + if (!NewBuilder()->HasOpenCommand()) return; + TCollection_AsciiString anIOR(theIOR); + anIOR.Prepend("d"); + myPostponedIORs.Append(anIOR); // add prefix: deleted + myNbPostponed.SetValue(myNbPostponed.Length(), myNbPostponed.Last() + 1); +} + +//============================================================================ +/*! Function : AddCreatedPostponed + * Purpose : + */ + //============================================================================ +void SALOMEDSImpl_Study::AddCreatedPostponed(const TCollection_AsciiString& theIOR) +{ + _errorCode = ""; + if (!NewBuilder()->HasOpenCommand()) return; + TCollection_AsciiString anIOR(theIOR); + anIOR.Prepend("c"); + myPostponedIORs.Append(anIOR); // add prefix: created + myNbPostponed.SetValue(myNbPostponed.Length(), myNbPostponed.Last() + 1); +} + +//============================================================================ +/*! Function : RemovePostponed + * Purpose : + */ +//============================================================================ +Handle(TColStd_HSequenceOfAsciiString) SALOMEDSImpl_Study::RemovePostponed(const int theUndoLimit) +{ + _errorCode = ""; + + int anIndex; + int anOld; + + int aUndoLimit = theUndoLimit; + if (theUndoLimit < 0) aUndoLimit = 0; + + Handle(TColStd_HSequenceOfAsciiString) aSeq = new TColStd_HSequenceOfAsciiString; + + if (myNbUndos > 0) { // remove undone + anOld = 0; + for(anIndex = 1; anIndex < myNbPostponed.Length() - myNbUndos; anIndex++) + anOld += myNbPostponed(anIndex); + int aNew = myPostponedIORs.Length() - myNbPostponed.Last(); + + for(anIndex = anOld + 1; anIndex <= aNew; anIndex++) { + TCollection_AsciiString anIOR = myPostponedIORs(anIndex); + if (anIOR.Value(1) == 'c') { + aSeq->Append(anIOR.Split(1).ToCString()); + } + } + if (anOld < aNew) myPostponedIORs.Remove(anOld + 1, aNew); + if (myNbPostponed.Length() > 0) myNbPostponed.Remove(myNbPostponed.Length() - myNbUndos, myNbPostponed.Length() - 1); + + myNbUndos = 0; + } + + if (myNbPostponed.Length() > aUndoLimit) { // remove objects, that can not be undone + anOld = 0; + for(anIndex = myNbPostponed.Length() - aUndoLimit; anIndex >= 1; anIndex--) + anOld += myNbPostponed(anIndex); + for(anIndex = 1; anIndex <= anOld; anIndex++) { + TCollection_AsciiString anIOR = myPostponedIORs(anIndex); + if (anIOR.Value(1) == 'd') { + aSeq->Append(anIOR.Split(1).ToCString()); + } + } + if (anOld > 0) myPostponedIORs.Remove(1, anOld); + myNbPostponed.Remove(1, myNbPostponed.Length() - aUndoLimit); + } + + if (theUndoLimit == -1) { // remove all IORs from the study on the study close + TDF_ChildIDIterator anIter(_doc->GetData()->Root(), SALOMEDSImpl_AttributeIOR::GetID(), Standard_True); + for(; anIter.More(); anIter.Next()) { + Handle(SALOMEDSImpl_AttributeIOR) anAttr = Handle(SALOMEDSImpl_AttributeIOR)::DownCast(anIter.Value()); + aSeq->Append(anAttr->Value()); + } + } else myNbPostponed.Append(0); + + return aSeq; +} + +//============================================================================ +/*! Function : UndoPostponed + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_Study::UndoPostponed(const int theWay) +{ + _errorCode = ""; + + myNbUndos += theWay; + // remove current postponed + if (myNbPostponed.Last() > 0) + myPostponedIORs.Remove(myPostponedIORs.Length() - myNbPostponed.Last() + 1, myPostponedIORs.Length()); + myNbPostponed(myNbPostponed.Length()) = 0; +} + + +//============================================================================ +/*! Function : GetSComponent + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SComponent) SALOMEDSImpl_Study::GetSComponent(const TCollection_AsciiString& theEntry) +{ + Handle(SALOMEDSImpl_SComponent) aSCO; + if(_mapOfSCO.IsBound(theEntry)) + aSCO = Handle(SALOMEDSImpl_SComponent)::DownCast(_mapOfSCO.Find(theEntry)); + else { + TDF_Label aLabel; + TDF_Tool::Label(_doc->GetData(), theEntry, aLabel); + aSCO = new SALOMEDSImpl_SComponent(aLabel); + _mapOfSCO.Bind(theEntry, aSCO); + } + + return aSCO; +} + +//============================================================================ +/*! Function : GetSComponent + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SComponent) SALOMEDSImpl_Study::GetSComponent(const TDF_Label& theLabel) +{ + TCollection_AsciiString anEntry; + TDF_Tool::Entry(theLabel, anEntry); + return GetSComponent(anEntry); +} + +//============================================================================ +/*! Function : GetSObject + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::GetSObject(const TCollection_AsciiString& theEntry) +{ + Handle(SALOMEDSImpl_SObject) aSO; + if(_mapOfSO.IsBound(theEntry)) + aSO = Handle(SALOMEDSImpl_SObject)::DownCast(_mapOfSO.Find(theEntry)); + else { + TDF_Label aLabel; + TDF_Tool::Label(_doc->GetData(), theEntry, aLabel); + aSO = new SALOMEDSImpl_SObject(aLabel); + _mapOfSO.Bind(theEntry, aSO); + } + + return aSO; +} + +//============================================================================ +/*! Function : GetSObject + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_Study::GetSObject(const TDF_Label& theLabel) +{ + TCollection_AsciiString anEntry; + TDF_Tool::Entry(theLabel, anEntry); + return GetSObject(anEntry); +} + +//============================================================================ +/*! Function : GetAttribute + * Purpose : + */ +//============================================================================ +Handle(TDF_Attribute) SALOMEDSImpl_Study::GetAttribute(const TCollection_AsciiString& theEntry, + const TCollection_AsciiString& theType) +{ + Handle(SALOMEDSImpl_SObject) aSO = GetSObject(theEntry); + Handle(TDF_Attribute) anAttr; + aSO->FindAttribute(anAttr, theType); + return anAttr; +} + +//============================================================================ +/*! Function : DumpStudy + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_Study::DumpStudy(const TCollection_AsciiString& thePath, + const TCollection_AsciiString& theBaseName, + bool isPublished, + SALOMEDSImpl_DriverFactory* theFactory) +{ + _errorCode = ""; + + if(theFactory == NULL) { + _errorCode = "Null factory for creation of Engines"; + return false; + } + + TColStd_SequenceOfExtendedString aSeq; + TCollection_AsciiString aCompType, aFactoryType; + + //Build a list of all components in the Study + SALOMEDSImpl_SComponentIterator itcomponent = NewComponentIterator(); + + for (; itcomponent.More(); itcomponent.Next()) { + Handle(SALOMEDSImpl_SComponent) sco = itcomponent.Value(); + aCompType = sco->ComponentDataType(); + //GEOM and MED are independent components + if(aCompType == "GEOM" || aCompType == "MED") aSeq.Prepend(TCollection_ExtendedString(aCompType)); + else aSeq.Append(TCollection_ExtendedString(aCompType)); + } + +#ifdef WIN32 + TCollection_AsciiString aFileName=thePath+TCollection_AsciiString("\\")+theBaseName+TCollection_AsciiString(".py"); +#else + TCollection_AsciiString aFileName=thePath+TCollection_AsciiString("/")+theBaseName+TCollection_AsciiString(".py"); +#endif + + //Create a file that will contain a main Study script + fstream fp; + fp.open(aFileName.ToCString(), ios::out); + +#ifdef WIN32 + bool isOpened = fp.is_open(); +#else + bool isOpened = fp.rdbuf()->is_open(); +#endif + + if(!isOpened) { + _errorCode = TCollection_AsciiString("Can't create a file ")+aFileName; + return false; + } + + TCollection_AsciiString aBatchModeScript = "salome"; + + //Output to the main Study script required Python modules import, set sys.path and add a creation of the study. + fp << GetDumpStudyComment().ToCString() << endl << endl; + fp << "import sys" << endl; + fp << "import " << aBatchModeScript << "\n" << endl; + fp << "sys.path.insert( 0, \'" << thePath << "\')\n" << endl; + + Handle(TColStd_HSequenceOfAsciiString) aSeqOfFileNames = new TColStd_HSequenceOfAsciiString; + + //Iterate all components and create the componponents specific scripts. + bool isOk = true; + int aLength = aSeq.Length(); + for(int i = 1; i <= aLength; i++) { + + aCompType = aSeq.Value(i); + Handle(SALOMEDSImpl_SComponent) sco = FindComponent(aCompType); + SALOMEDSImpl_Driver* aDriver = NULL; + // if there is an associated Engine call its method for saving + TCollection_AsciiString IOREngine; + try { + if (!sco->ComponentIOR(IOREngine)) { + if (!aCompType.IsEmpty()) { + + aDriver = theFactory->GetDriverByType(aCompType); + + if (aDriver != NULL) { + Handle(SALOMEDSImpl_StudyBuilder) SB = NewBuilder(); + cout << "Before SB" << endl; + if(!SB->LoadWith(sco, aDriver)) { + _errorCode = SB->GetErrorCode(); + return false; + } + cout << "After SB" << endl; + } + else continue; + } + } + else { + aDriver = theFactory->GetDriverByIOR(IOREngine); + } + } catch(...) { + _errorCode = "Can not restore information to dump it"; + return false; + } + + if(aDriver == NULL) continue; + + bool isValidScript; + long aStreamLength = 0; + unsigned char* aStream = aDriver->DumpPython(this, isPublished, isValidScript, aStreamLength); + if ( !isValidScript ) + isOk = false; + + //Create a file that will contain the component specific script + fstream fp2; +#ifdef WIN32 + aFileName=thePath+TCollection_AsciiString("\\"); +#else + aFileName=thePath+TCollection_AsciiString("/"); +#endif + TCollection_AsciiString aScriptName; + aScriptName += theBaseName; + aScriptName += "_"; + aScriptName += aCompType; + + aFileName += aScriptName+ TCollection_AsciiString(".py"); + aSeqOfFileNames->Append(aFileName); + + fp2.open(aFileName.ToCString(), ios::out); + +#ifdef WIN32 + isOpened = fp.is_open(); +#else + isOpened = fp.rdbuf()->is_open(); +#endif + + if(!isOpened) { + _errorCode = TCollection_AsciiString("Can't create a file ")+aFileName; + SALOMEDSImpl_Tool::RemoveTemporaryFiles(thePath, aSeqOfFileNames, false); + return false; + } + + //Output the Python script generated by the component in the newly created file. + fp2 << aStream; + fp2.close(); + + //Add to the main script a call to RebuildData of the generated by the component the Python script + fp << "import " << aScriptName << endl; + fp << aScriptName << ".RebuildData(" << aBatchModeScript << ".myStudy)" << endl; + } + + fp << "salome.sg.updateObjBrowser(1)" << endl; + + fp.close(); + return isOk; +} + +//======================================================================= +//function : GetDumpStudyComment +//purpose : return a header comment for a DumpStudy script +//======================================================================= + +TCollection_AsciiString SALOMEDSImpl_Study::GetDumpStudyComment(const char* theComponentName) +{ + TCollection_AsciiString txt + ("### This file is generated by SALOME automatically by dump python functionality"); + if ( theComponentName ) + txt += TCollection_AsciiString(" of ") + (char*) theComponentName + " component"; + return txt; +} + +void dumpSO(const Handle(SALOMEDSImpl_SObject)& theSO, + fstream& fp, + const TCollection_AsciiString& Tab, + const Handle(SALOMEDSImpl_Study) theStudy); +//============================================================================ +/*! Function : dump + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_Study::dump(const TCollection_AsciiString& theFileName) +{ + //Create a file that will contain a main Study script + fstream fp; + fp.open(theFileName.ToCString(), ios::out); + +#ifdef WIN32 + bool isOpened = fp.is_open(); +#else + bool isOpened = fp.rdbuf()->is_open(); +#endif + + if(!isOpened) { + _errorCode = TCollection_AsciiString("Can't create a file ")+theFileName; + cout << "### SALOMEDSImpl_Study::dump Error: " << _errorCode << endl; + return; + } + + Handle(SALOMEDSImpl_SObject) aSO = FindObjectID("0:1"); + fp << "0:1" << endl; + Handle(SALOMEDSImpl_ChildIterator) Itr = NewChildIterator(aSO); + TCollection_AsciiString aTab(" "); + for(; Itr->More(); Itr->Next()) { + dumpSO(Itr->Value(), fp, aTab, this); + } + + fp.close(); +} + + +void dumpSO(const Handle(SALOMEDSImpl_SObject)& theSO, + fstream& fp, + const TCollection_AsciiString& Tab, + const Handle(SALOMEDSImpl_Study) theStudy) +{ + TCollection_AsciiString aTab(Tab), anID(theSO->GetID()); + fp << aTab << anID << endl; + TDF_AttributeIterator anItr(theSO->GetLabel()); + for(; anItr.More(); anItr.Next()) { + Handle(SALOMEDSImpl_GenericAttribute) anAttr = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(anItr.Value()); + + if(anAttr.IsNull()) { + fp << Tab << " -- " << anItr.Value()->DynamicType(); + continue; + } + + TCollection_AsciiString aType = anAttr->GetClassType(); + fp << Tab << " -- " << aType; + + if(aType == "AttributeReal") { + fp << " : " << Handle(SALOMEDSImpl_AttributeReal)::DownCast(anAttr)->Value(); + } + else if(aType == "AttributeInteger") { + fp << " : " << Handle(SALOMEDSImpl_AttributeInteger)::DownCast(anAttr)->Value(); + } + else if(aType == "AttributeName") { + fp << " : " << Handle(SALOMEDSImpl_AttributeName)::DownCast(anAttr)->Value(); + } + else if(aType == "AttributeComment") { + fp << " : " << Handle(SALOMEDSImpl_AttributeComment)::DownCast(anAttr)->Value(); + } + else if(aType == "AttributeReference") { + fp << " : " << Handle(SALOMEDSImpl_AttributeReference)::DownCast(anAttr)->Save(); + } + fp << endl; + } + + Handle(SALOMEDSImpl_ChildIterator) Itr = theStudy->NewChildIterator(theSO); + TCollection_AsciiString aNewTab(" "); + aNewTab+=aTab; + for(; Itr->More(); Itr->Next()) { + dumpSO(Itr->Value(), fp, aNewTab, theStudy); + } + + return; +} + +void SALOMEDSImpl_Study::Modify() +{ + _errorCode = ""; + _doc->Modify(); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_Study.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_Study.hxx new file mode 100644 index 000000000..dd986a7ff --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_Study.hxx @@ -0,0 +1,258 @@ +// File : SALOMEDSImpl_Study.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSIMPL_STUDY_I_H__ +#define __SALOMEDSIMPL_STUDY_I_H__ + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_Study, MMgt_TShared ) + +// std C++ headers +#include + +// Cascade headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef WNT +#include +#else +#include +#endif + +//SALOMEDSImpl headers +#include "SALOMEDSImpl_SComponentIterator.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_StudyBuilder.hxx" +#include "SALOMEDSImpl_UseCaseBuilder.hxx" +#include "SALOMEDSImpl_AttributeStudyProperties.hxx" +#include "SALOMEDSImpl_AttributeIOR.hxx" +#include "SALOMEDSImpl_Callback.hxx" +#include "SALOMEDSImpl_Driver.hxx" +#include "SALOMEDSImpl_ChildIterator.hxx" + +class SALOMEDSImpl_StudyManager; +class SALOMEDSImpl_GenericAttribute; + +#ifndef WNT +typedef NCollection_DataMap DataMapOfAsciiStringTransient; +typedef NCollection_DataMap DataMapAsciiStringLabel; +#else +typedef NCollection_DataMap1 DataMapOfAsciiStringTransient; +typedef NCollection_DataMap1 DataMapAsciiStringLabel; +#endif + +class SALOMEDSImpl_Study : public MMgt_TShared +{ +private: + TCollection_AsciiString _name; + Handle(TDocStd_Document) _doc; // OCAF Document + bool _Saved; // True if the Study is saved + TCollection_AsciiString _URL; //URL of the persistent reference of the study + int _StudyId; + TDF_Label _current; + bool _autoFill; + TCollection_AsciiString _errorCode; + Handle(SALOMEDSImpl_Callback) _cb; + Handle(SALOMEDSImpl_StudyBuilder) _builder; + Handle(SALOMEDSImpl_UseCaseBuilder) _useCaseBuilder; + + DataMapOfAsciiStringTransient _mapOfSO; + DataMapOfAsciiStringTransient _mapOfSCO; + + // data structures for postponed destroying of object functionality + TColStd_SequenceOfAsciiString myPostponedIORs; // ordered set of IORs + TColStd_SequenceOfInteger myNbPostponed; // number of IOR in the each transaction + int myNbUndos; // number of current Undos, made by user + DataMapAsciiStringLabel myIORLabels; + + + Handle(SALOMEDSImpl_SObject) _FindObject(const Handle(SALOMEDSImpl_SObject)& SO, + const TCollection_AsciiString& anObjectName, + bool& _find); + + Handle(SALOMEDSImpl_SObject) _FindObjectIOR(const Handle(SALOMEDSImpl_SObject)& SO, + const TCollection_AsciiString& anObjectIOR, + bool& _find); + +public: + + Standard_EXPORT static Handle(SALOMEDSImpl_Study) GetStudy(const TDF_Label& theLabel); + Standard_EXPORT static Handle(SALOMEDSImpl_SObject) SObject(const TDF_Label& theLabel); + Standard_EXPORT static Handle(SALOMEDSImpl_SComponent) SComponent(const TDF_Label& theLabel); + Standard_EXPORT static void IORUpdated(const Handle(SALOMEDSImpl_AttributeIOR)& theAttribute); + + //! standard constructor + Standard_EXPORT SALOMEDSImpl_Study(const Handle(TDocStd_Document)&, const TCollection_AsciiString& study_name); + + //! standard destructor + Standard_EXPORT virtual ~SALOMEDSImpl_Study(); + + //! method to Get persistent reference of study (idem URL()) + Standard_EXPORT virtual TCollection_AsciiString GetPersistentReference(); + + //! method to Get transient reference of study + Standard_EXPORT virtual TCollection_AsciiString GetTransientReference(); + + Standard_EXPORT virtual void SetTransientReference(const TCollection_AsciiString& theIOR); + + //! method to detect if a study is empty + Standard_EXPORT virtual bool IsEmpty(); + + //! method to Find a Component with ComponentDataType = aComponentName + Standard_EXPORT virtual Handle(SALOMEDSImpl_SComponent) FindComponent (const TCollection_AsciiString& aComponentName); + + //! method to Find a Component Find a Component from it's ID + Standard_EXPORT virtual Handle(SALOMEDSImpl_SComponent) FindComponentID(const TCollection_AsciiString& aComponentID); + + //! method to Find an Object with SALOMEDSImpl::Name = anObjectName + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) FindObject(const TCollection_AsciiString& anObjectName); + + + //! method to Find Object(s) with SALOMEDSImpl::Name=anObjectName in a component with ComponentDataType = aComponentName + Standard_EXPORT virtual Handle(TColStd_HSequenceOfTransient) FindObjectByName( const TCollection_AsciiString& anObjectName, + const TCollection_AsciiString& aComponentName ) ; + + //! method to Find an Object with ID = anObjectID + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) FindObjectID(const TCollection_AsciiString& anObjectID); + + //! method to Create an Object with ID = anObjectID + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) CreateObjectID(const TCollection_AsciiString& anObjectID); + + //! method to Find an Object with ID = anObjectIOR + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) FindObjectIOR(const TCollection_AsciiString& anObjectIOR); + + //! method to Find an Object by its path + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) FindObjectByPath(const TCollection_AsciiString& thePath); + + //! method to get a path of SObject + Standard_EXPORT virtual TCollection_AsciiString GetObjectPath(const Handle(SALOMEDSImpl_SObject)& theObject); + + Standard_EXPORT TCollection_AsciiString GetObjectPathByIOR(const TCollection_AsciiString& theIOR); + + //! method to set a context: root ('/') is UserData component + Standard_EXPORT virtual bool SetContext(const TCollection_AsciiString& thePath); + + //! method to get a context + Standard_EXPORT virtual TCollection_AsciiString GetContext(); + + //! method to get all object names in the given context (or in the current context, if 'theContext' is empty) + Standard_EXPORT virtual Handle(TColStd_HSequenceOfAsciiString) GetObjectNames(const TCollection_AsciiString& theContext); + + //! method to get all directory names in the given context (or in the current context, if 'theContext' is empty) + Standard_EXPORT virtual Handle(TColStd_HSequenceOfAsciiString) GetDirectoryNames(const TCollection_AsciiString& theContext); + + //! method to get all file names in the given context (or in the current context, if 'theContext' is empty) + Standard_EXPORT virtual Handle(TColStd_HSequenceOfAsciiString) GetFileNames(const TCollection_AsciiString& theContext); + + //! method to get all components names + Standard_EXPORT virtual Handle(TColStd_HSequenceOfAsciiString) GetComponentNames(const TCollection_AsciiString& theContext); + + //! method to Create a ChildIterator from an SObject + Standard_EXPORT virtual Handle(SALOMEDSImpl_ChildIterator) NewChildIterator(const Handle(SALOMEDSImpl_SObject)& aSO); + + //! method to Create a SComponentIterator + Standard_EXPORT virtual SALOMEDSImpl_SComponentIterator NewComponentIterator(); + + //! method to Create a StudyBuilder + Standard_EXPORT virtual Handle(SALOMEDSImpl_StudyBuilder) NewBuilder(); + + //! method to get study name + Standard_EXPORT virtual TCollection_AsciiString Name(); + + //! method to set study name + Standard_EXPORT virtual void Name(const TCollection_AsciiString& name); + + //! method to get if study has been saved + Standard_EXPORT virtual bool IsSaved(); + + //! method to set if study has been saved + Standard_EXPORT virtual void IsSaved(bool save); + + //! method to Detect if a Study has been modified since it has been saved + Standard_EXPORT virtual bool IsModified(); + + //! method to get URL of the study (idem GetPersistentReference) + Standard_EXPORT virtual TCollection_AsciiString URL(); + + //! method to set URL of the study + Standard_EXPORT virtual void URL(const TCollection_AsciiString& url); + + Standard_EXPORT virtual bool IsLocked(); + + Standard_EXPORT virtual int StudyId(); + + Standard_EXPORT virtual void StudyId(int id); + + Standard_EXPORT virtual void UpdateIORLabelMap(const TCollection_AsciiString& anIOR, const TCollection_AsciiString& aLabel); + + Standard_EXPORT virtual Handle(TColStd_HSequenceOfTransient) FindDependances(const Handle(SALOMEDSImpl_SObject)& anObject); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_AttributeStudyProperties) SALOMEDSImpl_Study::GetProperties(); + + Standard_EXPORT virtual TCollection_AsciiString GetLastModificationDate(); + + Standard_EXPORT virtual Handle(TColStd_HSequenceOfAsciiString) GetModificationsDate(); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_UseCaseBuilder) GetUseCaseBuilder(); + + Standard_EXPORT virtual void Close(); + + Standard_EXPORT void EnableUseCaseAutoFilling(bool isEnabled) { _errorCode = ""; _autoFill = isEnabled; } + + // postponed destroying of object functionality + Standard_EXPORT virtual void AddPostponed(const TCollection_AsciiString& theIOR); + + Standard_EXPORT virtual void AddCreatedPostponed(const TCollection_AsciiString& theIOR); + + Standard_EXPORT virtual Handle(TColStd_HSequenceOfAsciiString) RemovePostponed(const int theUndoLimit); + // removes postponed IORs of old transaction + // if theUndoLimit==0, removes all + Standard_EXPORT virtual void UndoPostponed(const int theWay); // theWay = 1: resurrect objects, + // theWay = -1: get back to the list of postponed + + + Standard_EXPORT virtual TCollection_AsciiString GetErrorCode() { return _errorCode; } + Standard_EXPORT virtual bool IsError() { return _errorCode != ""; } + + Standard_EXPORT virtual Handle(SALOMEDSImpl_SComponent) GetSComponent(const TCollection_AsciiString& theEntry); + Standard_EXPORT virtual Handle(SALOMEDSImpl_SComponent) GetSComponent(const TDF_Label& theLabel); + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) GetSObject(const TCollection_AsciiString& theEntry); + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) GetSObject(const TDF_Label& theEntryLabel); + Standard_EXPORT virtual Handle(TDF_Attribute) GetAttribute(const TCollection_AsciiString& theEntry, + const TCollection_AsciiString& theType); + + Standard_EXPORT virtual bool HasCurrentContext() { return !_current.IsNull(); } + + Standard_EXPORT virtual bool DumpStudy(const TCollection_AsciiString& thePath, + const TCollection_AsciiString& theBaseName, + bool isPublished, + SALOMEDSImpl_DriverFactory* theFactory); + + Standard_EXPORT static TCollection_AsciiString GetDumpStudyComment(const char* theComponentName = 0); + + Standard_EXPORT virtual Handle(TDocStd_Document) GetDocument() { return _doc; } + + //The method dump creates a txt file that contain a dump of the study, for debug use + Standard_EXPORT void dump(const TCollection_AsciiString& theFileName); + + //This method marks the study as being modified + Standard_EXPORT void Modify(); + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_Study ) + +friend class SALOMEDSImpl_StudyManager; +friend class SALOMEDSImpl_GenericAttribute; +}; +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.cxx new file mode 100644 index 000000000..5f782eb33 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.cxx @@ -0,0 +1,1028 @@ +// File : SALOMEDSImpl_StudyBuilder.cxx +// Author : Sergey RUIN +// Module : SALOME + + + +#include "SALOMEDSImpl_Attributes.hxx" + +using namespace std; + +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_StudyBuilder.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_Tool.hxx" + +#include +#include +#include +#include +#include +#include + +#include +#include + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_StudyBuilder, MMgt_TShared ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_StudyBuilder, MMgt_TShared ) + +#define USE_CASE_LABEL_TAG 2 +#define DIRECTORYID 16661 +#define FILELOCALID 26662 + +static void Translate_persistentID_to_IOR(TDF_Label& Lab, SALOMEDSImpl_Driver* driver, bool isMultiFile, bool isASCII); + +//============================================================================ +/*! Function : constructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_StudyBuilder::SALOMEDSImpl_StudyBuilder(const Handle(Standard_Transient)& theOwner) +{ + _errorCode = ""; + _study = theOwner; + _doc = Handle(SALOMEDSImpl_Study)::DownCast(theOwner)->GetDocument(); +} + +//============================================================================ +/*! Function : destructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_StudyBuilder::~SALOMEDSImpl_StudyBuilder() +{} + +//============================================================================ +/*! Function : NewComponent + * Purpose : Create a new component (Scomponent) + */ +//============================================================================ +Handle(SALOMEDSImpl_SComponent) SALOMEDSImpl_StudyBuilder::NewComponent(const TCollection_AsciiString& DataType) +{ + _errorCode = ""; + CheckLocked(); + //Always create component under main label. + TDF_Label L = _doc->Main(); + + int imax = 0; + for (TDF_ChildIterator it(L); it.More(); it.Next()) { + if (it.Value().Tag() > imax) + imax = it.Value().Tag(); + } + imax++; + TDF_Label NL = L.FindChild(imax); + + SALOMEDSImpl_AttributeComment::Set(NL, DataType); + + Handle(SALOMEDSImpl_SComponent) so = Handle(SALOMEDSImpl_Study)::DownCast(_study)->GetSComponent (NL); + + if(!_callbackOnAdd.IsNull()) _callbackOnAdd->OnAddSObject(so); + + _doc->Modify(); + + return so; +} + +//============================================================================ +/*! Function : DefineComponentInstance + * Purpose : Add IOR attribute of a Scomponent + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::DefineComponentInstance(const Handle(SALOMEDSImpl_SComponent)& aComponent, + const TCollection_AsciiString& IOR) +{ + _errorCode = ""; + + CheckLocked(); + if(aComponent.IsNull() || IOR.IsEmpty()) { + _errorCode = "Invalid arguments"; + return false; + } + //add IOR definition + SALOMEDSImpl_AttributeIOR::Set(aComponent->GetLabel(), IOR); + + //_doc->Modify(); + + return true; +} + +//============================================================================ +/*! Function : RemoveComponent + * Purpose : Delete a Scomponent + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::RemoveComponent(const Handle(SALOMEDSImpl_SComponent)& aComponent) +{ + _errorCode = ""; + CheckLocked(); + return RemoveObject(aComponent); +} + +//============================================================================ +/*! Function : NewObject + * Purpose : Create a new SObject + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_StudyBuilder::NewObject(const Handle(SALOMEDSImpl_SObject)& theFatherObject) +{ + _errorCode = ""; + CheckLocked(); + + //Find label of father + TDF_Label Lab = theFatherObject->GetLabel(); + + //Create a new label + int imax = 0; + for (TDF_ChildIterator it(Lab); it.More(); it.Next()) { + if (it.Value().Tag() > imax) + imax = it.Value().Tag(); + } + imax++; + TDF_Label NewLab = Lab.FindChild(imax); + + Handle(SALOMEDSImpl_SObject) so = Handle(SALOMEDSImpl_Study)::DownCast(_study)->GetSObject(NewLab); + if(!_callbackOnAdd.IsNull()) _callbackOnAdd->OnAddSObject(so); + + _doc->Modify(); + return so; +} + +//============================================================================ +/*! Function : NewObjectToTag + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_StudyBuilder::NewObjectToTag(const Handle(SALOMEDSImpl_SObject)& theFatherObject, + const int theTag) +{ + _errorCode = ""; + CheckLocked(); + //Find label of father + TDF_Label Lab = theFatherObject->GetLabel(); + + //Create or find label + TDF_Label NewLab = Lab.FindChild(theTag, 1); + + Handle(SALOMEDSImpl_SObject) so = Handle(SALOMEDSImpl_Study)::DownCast(_study)->GetSObject(NewLab); + + if(!_callbackOnAdd.IsNull()) _callbackOnAdd->OnAddSObject(so); + + _doc->Modify(); + return so; +} + +//============================================================================ +/*! Function : RemoveObject + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::RemoveObject(const Handle(SALOMEDSImpl_SObject)& anObject) +{ + _errorCode = ""; + CheckLocked(); + if(anObject.IsNull()) { + _errorCode = "Null object"; + return false; + } + + if(!_callbackOnRemove.IsNull()) _callbackOnRemove->OnRemoveSObject(anObject); + + TDF_Label Lab = anObject->GetLabel(); + + Handle(SALOMEDSImpl_AttributeReference) aReference; + if (Lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aReference)) { + Handle(SALOMEDSImpl_AttributeTarget) aTarget; + if (aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID(),aTarget)) + aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab)); + } + + Handle(SALOMEDSImpl_AttributeIOR) anAttr; // postponed removing of CORBA objects + if (Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(), anAttr)) + SALOMEDSImpl_Study::GetStudy(_doc->Main())->AddPostponed(TCollection_AsciiString(anAttr->Value()).ToCString()); + + Lab.ForgetAllAttributes(); + + _doc->Modify(); + + return true; +} + +//============================================================================ +/*! Function : RemoveObjectWithChildren + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::RemoveObjectWithChildren(const Handle(SALOMEDSImpl_SObject)& anObject) +{ + _errorCode = ""; + CheckLocked(); + if(anObject.IsNull()) { + _errorCode = "Null object"; + return false; + } + + if(!_callbackOnRemove.IsNull()) _callbackOnRemove->OnRemoveSObject(anObject); + + TDF_Label Lab = anObject->GetLabel(); + + Handle(SALOMEDSImpl_AttributeReference) aReference; + if (Lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aReference)) { + Handle(SALOMEDSImpl_AttributeTarget) aTarget; + if (aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID(),aTarget)) + aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab)); + } + Handle(SALOMEDSImpl_AttributeIOR) anAttr; // postponed removing of CORBA objects + if (Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(), anAttr)) + SALOMEDSImpl_Study::GetStudy(_doc->Main())->AddPostponed(TCollection_AsciiString(anAttr->Value()).ToCString()); + + TDF_ChildIterator it(Lab, Standard_True); + for(;it.More();it.Next()) { + TDF_Label aLabel = it.Value(); + if (aLabel.FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aReference)) { + Handle(SALOMEDSImpl_AttributeTarget) aTarget; + if (aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID(),aTarget)) + aTarget->Remove(SALOMEDSImpl_Study::SObject(aLabel)); + } + Handle(SALOMEDSImpl_AttributeIOR) anAttr; // postponed removing of CORBA objects + if (aLabel.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(), anAttr)) + SALOMEDSImpl_Study::GetStudy(_doc->Main())->AddPostponed(TCollection_AsciiString(anAttr->Value()).ToCString()); + } + + Lab.ForgetAllAttributes(Standard_True); + + _doc->Modify(); + + return true; +} + +//============================================================================ +/*! Function : LoadWith + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::LoadWith(const Handle(SALOMEDSImpl_SComponent)& anSCO, SALOMEDSImpl_Driver* aDriver) +{ + _errorCode = ""; + + TDF_Label Lab = anSCO->GetLabel(); + Handle(SALOMEDSImpl_AttributePersistentRef) Att; + + //Find the current Url of the study + if (_doc->Main().FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID(),Att)) { + int aLocked = anSCO->GetStudy()->GetProperties()->IsLocked(); + if (aLocked) anSCO->GetStudy()->GetProperties()->SetLocked(false); + + TCollection_ExtendedString Res(Att->Value()); + + Handle(SALOMEDSImpl_AttributeComment) type; + TCollection_ExtendedString DataType; + if (Lab.FindAttribute(SALOMEDSImpl_AttributeComment::GetID(),type)) + DataType = type->Value(); + + // associate the driver to the SComponent + if(aDriver == NULL) { + _errorCode = "Driver is null"; + return false; + } + + // mpv 06.03.2003: SAL1927 - if component data if already loaded, it is not necessary to do it again + Handle(SALOMEDSImpl_AttributeIOR) attrIOR; + if (Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(), attrIOR)) { + if (aLocked) anSCO->GetStudy()->GetProperties()->SetLocked(true); + return true; + } + + DefineComponentInstance (anSCO, aDriver->GetIOR()); + + TCollection_AsciiString aHDFPath(Res); + + char* aHDFUrl; + bool isASCII = false; + if (HDFascii::isASCII(aHDFPath.ToCString())) { + isASCII = true; + char* aResultPath = HDFascii::ConvertFromASCIIToHDF(aHDFPath.ToCString()); + aHDFUrl = new char[strlen(aResultPath) + 19]; + sprintf(aHDFUrl, "%shdf_from_ascii.hdf", aResultPath); + delete(aResultPath); + } else { + aHDFUrl = aHDFPath.ToCString(); + } + + //Open the Study HDF file + HDFfile *hdf_file = new HDFfile(aHDFUrl); + + char aMultifileState[2]; + char ASCIIfileState[2]; + try { + TCollection_AsciiString scoid = anSCO->GetID(); + hdf_file->OpenOnDisk(HDF_RDONLY); + HDFgroup *hdf_group = new HDFgroup("DATACOMPONENT",hdf_file); + hdf_group->OpenOnDisk(); + HDFgroup *hdf_sco_group = new HDFgroup(scoid.ToCString(), hdf_group); + hdf_sco_group->OpenOnDisk(); + + unsigned char* aStreamFile = NULL; + int aStreamSize = 0; + + if (hdf_sco_group->ExistInternalObject("FILE_STREAM")) { + HDFdataset *hdf_dataset = new HDFdataset("FILE_STREAM", hdf_sco_group); + hdf_dataset->OpenOnDisk(); + aStreamSize = hdf_dataset->GetSize(); + aStreamFile = new unsigned char[aStreamSize]; + if(aStreamFile == NULL) throw HDFexception("Unable to open dataset FILE_STREAM"); + hdf_dataset->ReadFromDisk(aStreamFile); + hdf_dataset->CloseOnDisk(); + hdf_dataset = 0; + } else aStreamFile = NULL; + + HDFdataset *multifile_hdf_dataset = new HDFdataset("MULTIFILE_STATE", hdf_sco_group); + multifile_hdf_dataset->OpenOnDisk(); + multifile_hdf_dataset->ReadFromDisk(aMultifileState); + + HDFdataset *ascii_hdf_dataset = new HDFdataset("ASCII_STATE", hdf_sco_group); + ascii_hdf_dataset->OpenOnDisk(); + ascii_hdf_dataset->ReadFromDisk(ASCIIfileState); + + // set path without file name from URL + int aFileNameSize = Res.Length(); + char* aDir = new char[aFileNameSize]; + memcpy(aDir, TCollection_AsciiString(Res).ToCString(), aFileNameSize); + for(int aCounter = aFileNameSize-1; aCounter>=0; aCounter--) + if (aDir[aCounter] == '/') { + aDir[aCounter+1] = 0; + break; + } + + bool aResult = (ASCIIfileState[0]=='A')? + aDriver->LoadASCII(anSCO, aStreamFile, aStreamSize, aDir, aMultifileState[0]=='M'): + aDriver->Load(anSCO, aStreamFile, aStreamSize, aDir, aMultifileState[0]=='M'); + + if(aStreamFile != NULL) delete []aStreamFile; + + if(!aResult) { + RemoveAttribute( anSCO, "AttributeIOR" ); + + _errorCode = "Can't load component"; + throw HDFexception("Unable to load component"); + } + + if(aDir != NULL) delete []aDir; + + multifile_hdf_dataset->CloseOnDisk(); + multifile_hdf_dataset = 0; + ascii_hdf_dataset->CloseOnDisk(); + ascii_hdf_dataset = 0; + + hdf_sco_group->CloseOnDisk(); + hdf_sco_group = 0; + hdf_group->CloseOnDisk(); + hdf_group = 0; + hdf_file->CloseOnDisk(); + delete hdf_file; + + if (isASCII) { + Handle(TColStd_HSequenceOfAsciiString) aFilesToRemove = new TColStd_HSequenceOfAsciiString; + aFilesToRemove->Append(aHDFUrl); + SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true); + } + + delete aHDFUrl; + } + catch (HDFexception) { + delete hdf_file; + + if (isASCII) { + Handle(TColStd_HSequenceOfAsciiString) aFilesToRemove = new TColStd_HSequenceOfAsciiString; + aFilesToRemove->Append(aHDFUrl); + SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true); + } + delete aHDFUrl; + + if (aLocked) anSCO->GetStudy()->GetProperties()->SetLocked(true); + _errorCode = "No persistent file"; + return false; + } + + try { + Translate_persistentID_to_IOR (Lab, aDriver, aMultifileState[0]=='M', ASCIIfileState[0] == 'A'); + } catch(...) { + _errorCode = "Can not convert persistent IDs to IORs"; + return false; + } + + if (aLocked) anSCO->GetStudy()->GetProperties()->SetLocked(true); + } else { + _errorCode = "No persistent file"; + } + + return true; +} + + +//============================================================================ +/*! Function : Load + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::Load(const Handle(SALOMEDSImpl_SObject)& sco) +{ + _errorCode = "Not implemented"; + return false; +} + +//============================================================================ +/*! Function : FindOrCreateAttribute + * Purpose : Add attribute of given type to SObject, if there is attribute of such type, returns + * existing one + */ +//============================================================================ +Handle(TDF_Attribute) SALOMEDSImpl_StudyBuilder::FindOrCreateAttribute(const Handle(SALOMEDSImpl_SObject)& anObject, + const TCollection_AsciiString& aTypeOfAttribute) +{ + _errorCode = ""; + if(anObject.IsNull()) { + _errorCode = "Invalid arguments"; + return NULL; + } + + TDF_Label Lab = anObject->GetLabel(); + if(Lab.IsNull()) { + _errorCode = "Null label"; + return NULL; + } + + _doc->Modify(); + + //The macro adds all necessary checks for standardly behaiving attributes + __FindOrCreateAttributeForBuilder + + //Add checks for TreeNode and UserID attributes + if (strncmp(aTypeOfAttribute.ToCString(), "AttributeTreeNode",17) == 0 ) { + Standard_GUID aTreeNodeGUID; + if (strcmp(aTypeOfAttribute.ToCString(), "AttributeTreeNode") == 0) { + aTreeNodeGUID = SALOMEDSImpl_AttributeTreeNode::GetDefaultTreeID(); + } else { + char* aGUIDString = new char[40]; + char* aType = (char*)aTypeOfAttribute.ToCString(); + sprintf(aGUIDString, &(aType[21])); + aTreeNodeGUID = Standard_GUID(aGUIDString); // create tree node GUID by name + delete(aGUIDString); + } + Handle(SALOMEDSImpl_AttributeTreeNode) anAttr; + if (!Lab.FindAttribute(aTreeNodeGUID, anAttr)) { + CheckLocked(); + anAttr = SALOMEDSImpl_AttributeTreeNode::Set(Lab, aTreeNodeGUID); + } + return anAttr; + } + + if (strncmp(aTypeOfAttribute.ToCString(), "AttributeUserID",15) == 0 ) { + Handle(SALOMEDSImpl_AttributeUserID) anAttr; + if (!Lab.FindAttribute(SALOMEDSImpl_AttributeUserID::DefaultID(), anAttr)) { + CheckLocked(); + anAttr = SALOMEDSImpl_AttributeUserID::Set(Lab, SALOMEDSImpl_AttributeUserID::DefaultID()); + } + return anAttr; + } + _errorCode = "Can not create an attribute"; + + return NULL; +} + +//============================================================================ +/*! Function : FindAttribute + * Purpose : Find attribute of given type assigned SObject, returns Standard_True if it is found + */ +//============================================================================ + +bool SALOMEDSImpl_StudyBuilder::FindAttribute(const Handle(SALOMEDSImpl_SObject)& anObject, + Handle(TDF_Attribute)& anAttribute, + const TCollection_AsciiString& aTypeOfAttribute) +{ + _errorCode = ""; + if(anObject.IsNull()) { + _errorCode = "Invalid arguments"; + return false; + } + TDF_Label Lab = anObject->GetLabel(); + if (Lab.FindAttribute(SALOMEDSImpl_SObject::GetGUID(aTypeOfAttribute), anAttribute)) { + _doc->Modify(); + return Standard_True; + } + return Standard_False; +} + +//============================================================================ +/*! Function : RemoveAttribute + * Purpose : Remove attribute of given type assigned SObject + */ +//============================================================================ + +bool SALOMEDSImpl_StudyBuilder::RemoveAttribute(const Handle(SALOMEDSImpl_SObject)& anObject, + const TCollection_AsciiString& aTypeOfAttribute) +{ + _errorCode = ""; + CheckLocked(); + if(anObject.IsNull()) { + _errorCode = "Invalid arguments"; + return false; + } + TDF_Label Lab = anObject->GetLabel(); + + if (aTypeOfAttribute == "AttributeIOR") { // postponed removing of CORBA objects + Handle(SALOMEDSImpl_AttributeIOR) anAttr; + if (Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(), anAttr)) + SALOMEDSImpl_Study::GetStudy(_doc->Main())->AddPostponed(anAttr->Value()); + } + + Lab.ForgetAttribute (SALOMEDSImpl_SObject::GetGUID(aTypeOfAttribute)); + + _doc->Modify(); + + return true; +} + +//============================================================================ +/*! Function : Addreference + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::Addreference(const Handle(SALOMEDSImpl_SObject)& me, + const Handle(SALOMEDSImpl_SObject)& theReferencedObject) +{ + _errorCode = ""; + if(me.IsNull() || theReferencedObject.IsNull()) { + _errorCode = "Invalid arguments"; + return false; + } + CheckLocked(); + TDF_Label Lab = me->GetLabel(); + TDF_Label RefLab = theReferencedObject->GetLabel(); + SALOMEDSImpl_AttributeReference::Set(Lab,RefLab); + + SALOMEDSImpl_AttributeTarget::Set(RefLab)->Add(SALOMEDSImpl_Study::SObject(Lab)); + + if(!_callbackOnRemove.IsNull() && Lab.IsDescendant(_doc->Main())) _callbackOnRemove->OnRemoveSObject(me); + + return true; +} + +//============================================================================ +/*! Function : RemoveReference + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::RemoveReference(const Handle(SALOMEDSImpl_SObject)& me) +{ + _errorCode = ""; + Handle(SALOMEDSImpl_SObject) theReferencedObject; + if(!me->ReferencedObject(theReferencedObject)) return false; //No reference is found + + CheckLocked(); + TDF_Label Lab = me->GetLabel(); + + Lab.ForgetAttribute(SALOMEDSImpl_AttributeReference::GetID()); + + //SRN: 30 Aug, 2004 : fix from Ecole l'ete version + + TDF_Label RefLab = theReferencedObject->GetLabel(); + + Handle(SALOMEDSImpl_AttributeTarget) aTarget; + if(RefLab.FindAttribute(SALOMEDSImpl_AttributeTarget::GetID(), aTarget)) + aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab)); + + _doc->Modify(); + + return true; +} + + + +//============================================================================ +/*! Function : AddDirectory + * Purpose : adds a new directory with a path = thePath + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::AddDirectory(const TCollection_AsciiString& thePath) +{ + _errorCode = ""; + CheckLocked(); + if(thePath.IsEmpty() || thePath == "") { + _errorCode = "Invalid path"; + return false; + } + + TCollection_AsciiString aPath(thePath), aContext(""), aFatherPath; + TDF_Label aLabel; + Handle(SALOMEDSImpl_Study) aStudy = SALOMEDSImpl_Study::GetStudy(_doc->Main()); + Handle(SALOMEDSImpl_SObject) anObject; + + try { + anObject = aStudy->FindObjectByPath(thePath); //Check if the directory already exists + } + catch(...) { } + + if(!anObject.IsNull()) { + _errorCode = "StudyNameAlreadyUsed"; + return false; + } + + if(aPath.Value(1) != '/') { //Relative path + aPath.Prepend('/'); + aPath = aStudy->GetContext() + aPath; + } + + TCollection_AsciiString aToken = aPath.Token("/", 1); + if(aToken.Length() == 0) aFatherPath = "/"; + + int i = 1; + while(aToken.Length() != 0) { + if(aPath.Token("/", i+1).Length() > 0) { + aFatherPath += "/"; + aFatherPath += aToken; + } + aToken = aPath.Token("/", ++i); + } + + anObject.Nullify(); + try { + anObject = aStudy->FindObjectByPath(aFatherPath); //Check if the father directory exists + } + catch(...) { ; } + if(anObject.IsNull()) { + _errorCode = "StudyInvalidDirectory"; + return false; + } + + Handle(SALOMEDSImpl_SObject) aNewObject = NewObject(anObject); + aLabel = aNewObject->GetLabel(); + if(aLabel.IsNull()) { + _errorCode = "StudyInvalidComponent"; + return false; + } + + SALOMEDSImpl_AttributeName::Set(aLabel, aPath.Token("/", i-1)); + + //Set LocalID attribute to identify the directory object + Handle(SALOMEDSImpl_AttributeLocalID) aLocalID = SALOMEDSImpl_AttributeLocalID::Set(aLabel, DIRECTORYID); + + _doc->Modify(); + + return true; +} + + +//============================================================================ +/*! Function : SetGUID + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::SetGUID(const Handle(SALOMEDSImpl_SObject)& anObject, + const TCollection_AsciiString& theGUID) +{ + _errorCode = ""; + CheckLocked(); + if(anObject.IsNull()) { + _errorCode = "Invalid arguments"; + return false; + } + + TDF_Label aLabel = anObject->GetLabel(); + SALOMEDSImpl_AttributeUserID::Set(aLabel, theGUID.ToCString()); + + _doc->Modify(); + + return true; +} + +//============================================================================ +/*! Function : IsGUID + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::IsGUID(const Handle(SALOMEDSImpl_SObject)& anObject, + const TCollection_AsciiString& theGUID) +{ + _errorCode = ""; + if(anObject.IsNull()) { + _errorCode = "Invalid arguments"; + return false; + } + TDF_Label aLabel = anObject->GetLabel(); + return aLabel.IsAttribute(theGUID.ToCString()); +} + + +//============================================================================ +/*! Function : NewCommand + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_StudyBuilder::NewCommand() +{ + _errorCode = ""; + // mpv: for SAL2114 - unset "lock changed" flag at the operation start + Handle(SALOMEDSImpl_AttributeStudyProperties) anAttr; + if (!_doc->Main().FindAttribute(SALOMEDSImpl_AttributeStudyProperties::GetID(), anAttr)) { + anAttr = new SALOMEDSImpl_AttributeStudyProperties; + _doc->Main().AddAttribute(anAttr); + } + anAttr->IsLockChanged(true); + + _doc->NewCommand(); +} + +//============================================================================ +/*! Function : CommitCommand + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_StudyBuilder::CommitCommand() +{ + _errorCode = ""; + Handle(SALOMEDSImpl_AttributeStudyProperties) anAttr; + if (!_doc->Main().FindAttribute(SALOMEDSImpl_AttributeStudyProperties::GetID(), anAttr)) { + anAttr = new SALOMEDSImpl_AttributeStudyProperties; + _doc->Main().AddAttribute(anAttr); + } + if (anAttr->IsLocked() && !anAttr->IsLockChanged(true)) { + AbortCommand(); + _errorCode = "LockProtection"; + throw LockProtection("LockProtection"); + } else { + SALOMEDSImpl_Study::GetStudy(_doc->Main())->RemovePostponed(_doc->GetUndoLimit()); + + int aModif = anAttr->GetModified(); + if (aModif < 0) aModif = 1000; // if user make undo and then - new transaction "modify" will never be zero + anAttr->SetModified(aModif+1); + _doc->CommitCommand(); + } + + _doc->Modify(); +} + +//============================================================================ +/*! Function : HasOpenCommand + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::HasOpenCommand() +{ + _errorCode = ""; + return _doc->HasOpenCommand(); +} + +//============================================================================ +/*! Function : AbortCommand + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_StudyBuilder::AbortCommand() +{ + _errorCode = ""; + SALOMEDSImpl_Study::GetStudy(_doc->Main())->UndoPostponed(0); + + _doc->AbortCommand(); +} + +//============================================================================ +/*! Function : Undo + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_StudyBuilder::Undo() +{ + _errorCode = ""; + Handle(SALOMEDSImpl_AttributeStudyProperties) anAttr; + if (!_doc->Main().FindAttribute(SALOMEDSImpl_AttributeStudyProperties::GetID(), anAttr)) { + anAttr = new SALOMEDSImpl_AttributeStudyProperties; + _doc->Main().AddAttribute(anAttr); + } + if (anAttr->IsLocked()) { + _errorCode = "LockProtection"; + throw LockProtection("LockProtection"); + } else { + SALOMEDSImpl_Study::GetStudy(_doc->Main())->UndoPostponed(1); + _doc->Undo(); + anAttr->SetModified(anAttr->GetModified()-1); + } + + _doc->Modify(); +} + +//============================================================================ +/*! Function : Redo + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_StudyBuilder::Redo() +{ + _errorCode = ""; + Handle(SALOMEDSImpl_AttributeStudyProperties) anAttr; + if (!_doc->Main().FindAttribute(SALOMEDSImpl_AttributeStudyProperties::GetID(), anAttr)) { + anAttr = new SALOMEDSImpl_AttributeStudyProperties; + _doc->Main().AddAttribute(anAttr); + } + + if (anAttr->IsLocked()) { + _errorCode = "LockProtection"; + throw LockProtection("LockProtection"); + } else { + _doc->Redo(); + SALOMEDSImpl_Study::GetStudy(_doc->Main())->UndoPostponed(-1); + anAttr->SetModified(anAttr->GetModified()+1); + } + + _doc->Modify(); +} + +//============================================================================ +/*! Function : GetAvailableUndos + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::GetAvailableUndos() +{ + _errorCode = ""; + return _doc->GetAvailableUndos(); +} + +//============================================================================ +/*! Function : GetAvailableRedos + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::GetAvailableRedos() +{ + _errorCode = ""; + return _doc->GetAvailableRedos(); +} + +//============================================================================ +/*! Function : UndoLimit + * Purpose : + */ +//============================================================================ +int SALOMEDSImpl_StudyBuilder::UndoLimit() +{ + _errorCode = ""; + return _doc->GetUndoLimit(); +} + +//============================================================================ +/*! Function : UndoLimit + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_StudyBuilder::UndoLimit(int n) +{ + _errorCode = ""; + CheckLocked(); + _doc->SetUndoLimit (n); +} + +//============================================================================ +/*! Function : SetOnAddSObject + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_Callback) +SALOMEDSImpl_StudyBuilder::SetOnAddSObject(const Handle(SALOMEDSImpl_Callback)& theCallback) +{ + _errorCode = ""; + Handle(SALOMEDSImpl_Callback) aRet = _callbackOnAdd; + _callbackOnAdd = theCallback; + return aRet; +} + +//============================================================================ +/*! Function : SetOnNewSObject + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_Callback) +SALOMEDSImpl_StudyBuilder::SetOnRemoveSObject(const Handle(SALOMEDSImpl_Callback)& theCallback) +{ + _errorCode = ""; + Handle(SALOMEDSImpl_Callback) aRet = _callbackOnRemove; + _callbackOnRemove = theCallback; + return aRet; +} + +//============================================================================ +/*! Function : CheckLocked + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_StudyBuilder::CheckLocked() +{ + _errorCode = ""; + if (_doc->HasOpenCommand()) return; + Handle(SALOMEDSImpl_AttributeStudyProperties) anAttr; + if (!_doc->Main().FindAttribute(SALOMEDSImpl_AttributeStudyProperties::GetID(), anAttr)) { + anAttr = new SALOMEDSImpl_AttributeStudyProperties; + _doc->Main().AddAttribute(anAttr); + } + if (anAttr->IsLocked()) { + _errorCode = "LockProtection"; + throw LockProtection("LockProtection"); + } +} + +//============================================================================ +/*! Function : SetName + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::SetName(const Handle(SALOMEDSImpl_SObject)& theSO, + const TCollection_AsciiString& theValue) +{ + _errorCode = ""; + CheckLocked(); + if(theSO.IsNull()) { + _errorCode = "Invalid arguments"; + return false; + } + SALOMEDSImpl_AttributeName::Set(theSO->GetLabel(), theValue); + + _doc->Modify(); + + return true; +} + +//============================================================================ +/*! Function : SetComment + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::SetComment(const Handle(SALOMEDSImpl_SObject)& theSO, + const TCollection_AsciiString& theValue) +{ + _errorCode = ""; + CheckLocked(); + if(theSO.IsNull()) { + _errorCode = "Invalid arguments"; + return false; + } + SALOMEDSImpl_AttributeComment::Set(theSO->GetLabel(), theValue); + + _doc->Modify(); + + return true; +} + +//============================================================================ +/*! Function : SetIOR + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyBuilder::SetIOR(const Handle(SALOMEDSImpl_SObject)& theSO, + const TCollection_AsciiString& theValue) +{ + _errorCode = ""; + CheckLocked(); + if(theSO.IsNull()) { + _errorCode = "Invalid arguments"; + return false; + } + SALOMEDSImpl_AttributeIOR::Set(theSO->GetLabel(), theValue); + + _doc->Modify(); + + return true; +} + + +//============================================================================ +/*! Function : Translate_persistentID_to_IOR + * Purpose : + */ +//============================================================================ +static void Translate_persistentID_to_IOR(TDF_Label& Lab, SALOMEDSImpl_Driver* driver, bool isMultiFile, bool isASCII) +{ + if(driver == NULL) return; + TDF_ChildIterator itchild (Lab); + + for (; itchild.More(); itchild.Next()) { + TDF_Label current = itchild.Value(); + Handle(SALOMEDSImpl_AttributePersistentRef) Att; + if (current.FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID(),Att)) { + + Handle(SALOMEDSImpl_AttributeLocalID) anID; + if (current.FindAttribute(SALOMEDSImpl_AttributeLocalID::GetID(), anID)) + if (anID->Value() == FILELOCALID) continue; //SRN: This attribute store a file name, skip it + + TCollection_AsciiString persist_ref(Att->Value()); + Handle(SALOMEDSImpl_SObject) so = SALOMEDSImpl_Study::SObject(current); + TCollection_AsciiString ior_string = driver->LocalPersistentIDToIOR(so, + persist_ref, + isMultiFile, + isASCII); + SALOMEDSImpl_AttributeIOR::Set (current, ior_string); + + } + Translate_persistentID_to_IOR (current, driver, isMultiFile, isASCII); + } +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.hxx new file mode 100644 index 000000000..619ed7e56 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.hxx @@ -0,0 +1,106 @@ +// File : SALOMEDSImpl_StudyBuilder.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSImpl_STUDYBUILDER_H__ +#define __SALOMEDSImpl_STUDYBUILDER_H__ + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_StudyBuilder, MMgt_TShared ) + +// std C++ headers +#include + +// Cascade header +#include +#include + +#include "SALOMEDSImpl_Callback.hxx" +#include "SALOMEDSImpl_Driver.hxx" + +class SALOMEDSImpl_StudyBuilder : public MMgt_TShared +{ +private: + Handle(TDocStd_Document) _doc; + Handle(Standard_Transient) _study; + Handle(SALOMEDSImpl_Callback) _callbackOnAdd; + Handle(SALOMEDSImpl_Callback) _callbackOnRemove; + TCollection_AsciiString _errorCode; + +public: + + Standard_EXPORT SALOMEDSImpl_StudyBuilder(const Handle(Standard_Transient)& theOwner); + + Standard_EXPORT ~SALOMEDSImpl_StudyBuilder(); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_SComponent) NewComponent(const TCollection_AsciiString& ComponentDataType); + + Standard_EXPORT virtual bool DefineComponentInstance (const Handle(SALOMEDSImpl_SComponent)&, const TCollection_AsciiString& ComponentIOR); + + Standard_EXPORT virtual bool RemoveComponent(const Handle(SALOMEDSImpl_SComponent)& aComponent); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) NewObject(const Handle(SALOMEDSImpl_SObject)& theFatherObject); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) NewObjectToTag(const Handle(SALOMEDSImpl_SObject)& theFatherObject, + const int theTag); + + //! The methods adds a new subdirectory, the path can be absolute or relative (then the current context is used) + Standard_EXPORT virtual bool AddDirectory(const TCollection_AsciiString& thePath); + + Standard_EXPORT virtual bool LoadWith(const Handle(SALOMEDSImpl_SComponent)& sco, SALOMEDSImpl_Driver* Engine); + Standard_EXPORT virtual bool Load(const Handle(SALOMEDSImpl_SObject)& sco); + + Standard_EXPORT virtual bool RemoveObject(const Handle(SALOMEDSImpl_SObject)& anObject); + Standard_EXPORT virtual bool RemoveObjectWithChildren(const Handle(SALOMEDSImpl_SObject)& anObject); + + Standard_EXPORT virtual Handle(TDF_Attribute) FindOrCreateAttribute(const Handle(SALOMEDSImpl_SObject)& anObject, + const TCollection_AsciiString& aTypeOfAttribute); + Standard_EXPORT virtual bool FindAttribute(const Handle(SALOMEDSImpl_SObject)& anObject, + Handle(TDF_Attribute)& anAttribute, + const TCollection_AsciiString& aTypeOfAttribute); + + Standard_EXPORT virtual bool RemoveAttribute(const Handle(SALOMEDSImpl_SObject)& anObject, const TCollection_AsciiString& aTypeOfAttribute); + + Standard_EXPORT virtual bool Addreference(const Handle(SALOMEDSImpl_SObject)& me, + const Handle(SALOMEDSImpl_SObject)& thereferencedObject); + + Standard_EXPORT virtual bool RemoveReference(const Handle(SALOMEDSImpl_SObject)& me); + + Standard_EXPORT virtual bool SetGUID(const Handle(SALOMEDSImpl_SObject)& anObject, const TCollection_AsciiString& theGUID); + Standard_EXPORT virtual bool IsGUID(const Handle(SALOMEDSImpl_SObject)& anObject, const TCollection_AsciiString& theGUID); + + Standard_EXPORT virtual void NewCommand(); + Standard_EXPORT virtual void CommitCommand(); + Standard_EXPORT virtual bool HasOpenCommand(); + Standard_EXPORT virtual void AbortCommand(); + Standard_EXPORT virtual void Undo(); + Standard_EXPORT virtual void Redo(); + Standard_EXPORT bool GetAvailableUndos(); + Standard_EXPORT bool GetAvailableRedos(); + Standard_EXPORT bool IsSaved(); + Standard_EXPORT bool IsModified(); + Standard_EXPORT virtual int UndoLimit(); + Standard_EXPORT virtual void UndoLimit(const int); + + Standard_EXPORT void CheckLocked(); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_Callback) SetOnAddSObject(const Handle(SALOMEDSImpl_Callback)& theCallback); + Standard_EXPORT virtual Handle(SALOMEDSImpl_Callback) SetOnRemoveSObject(const Handle(SALOMEDSImpl_Callback)& theCallback); + + Standard_EXPORT virtual bool SetName(const Handle(SALOMEDSImpl_SObject)& theSO, const TCollection_AsciiString& theValue); + + Standard_EXPORT virtual bool SetComment(const Handle(SALOMEDSImpl_SObject)& theSO, const TCollection_AsciiString& theValue); + + Standard_EXPORT virtual bool SetIOR(const Handle(SALOMEDSImpl_SObject)& theSO, const TCollection_AsciiString& theValue); + + Standard_EXPORT virtual TCollection_AsciiString GetErrorCode() { return _errorCode; } + Standard_EXPORT virtual bool IsError() { return _errorCode != ""; } + + Standard_EXPORT virtual Handle(Standard_Transient) GetOwner() { return _study; } + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_StudyBuilder ) +}; +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.cxx new file mode 100644 index 000000000..4952318e6 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.cxx @@ -0,0 +1,95 @@ +// File : SALOMEDSImpl_StudyHandle.cxx +// Author : Sergey LITONIN +// Module : SALOME + +#include "SALOMEDSImpl_StudyHandle.hxx" +#include +#include + +/* + Class : SALOMEDSImpl_StudyHandle + Description : This class is intended for storing information about + graphic representation of objects in dirrent views +*/ + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_StudyHandle, TDF_Attribute ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_StudyHandle, TDF_Attribute ) + +//======================================================================= +//function : GetID +//purpose : Get GUID of this attribute +//======================================================================= +const Standard_GUID& SALOMEDSImpl_StudyHandle::GetID() +{ + static Standard_GUID SALOMEDSImpl_StudyHandleID( "050C9555-4BA8-49bf-8F1C-086F0469A40B" ); + return SALOMEDSImpl_StudyHandleID; +} + +//======================================================================= +//function : SALOMEDSImpl_StudyHandle +//purpose : Empty Constructor +//======================================================================= +SALOMEDSImpl_StudyHandle::SALOMEDSImpl_StudyHandle() +{ + myHandle.Nullify(); +} + +//======================================================================= +//function : Set +//purpose : +//======================================================================= +Handle(SALOMEDSImpl_StudyHandle) SALOMEDSImpl_StudyHandle::Set(const TDF_Label& theLabel, + const Handle(SALOMEDSImpl_Study)& theStudy) +{ + Handle(SALOMEDSImpl_StudyHandle) A; + if (!theLabel.FindAttribute(GetID(), A)) { + A = new SALOMEDSImpl_StudyHandle(); + theLabel.AddAttribute(A); + } + + A->SetHandle(theStudy); + return A; +} + + +//======================================================================= +//function : ID +//purpose : Get GUID of this attribute +//======================================================================= +const Standard_GUID& SALOMEDSImpl_StudyHandle::ID () const +{ + return GetID(); +} + + +//======================================================================= +//function : NewEmpty +//purpose : Create new empty attribute +//======================================================================= +Handle(TDF_Attribute) SALOMEDSImpl_StudyHandle::NewEmpty () const +{ + return new SALOMEDSImpl_StudyHandle (); +} + + +//======================================================================= +//function : Restore +//purpose : Restore value of attribute with value of theWith one +//======================================================================= +void SALOMEDSImpl_StudyHandle::Restore( const Handle(TDF_Attribute)& theWith ) +{ + Handle(SALOMEDSImpl_StudyHandle) anAttr = Handle(SALOMEDSImpl_StudyHandle)::DownCast( theWith ); + if ( !anAttr.IsNull() ) SetHandle( anAttr->GetHandle() ); +} + +//======================================================================= +//function : Paste +//purpose : Paste value of current attribute to the value of entry one +//======================================================================= +void SALOMEDSImpl_StudyHandle::Paste( const Handle(TDF_Attribute)& theInto, + const Handle(TDF_RelocationTable)& ) const +{ + Handle(SALOMEDSImpl_StudyHandle) anAttr = Handle(SALOMEDSImpl_StudyHandle)::DownCast( theInto ); + if ( !anAttr.IsNull() ) anAttr->SetHandle( myHandle ); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.hxx new file mode 100644 index 000000000..578d5948f --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_StudyHandle.hxx @@ -0,0 +1,54 @@ +// File : SALOMEDSImpl_StudyHandle.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef SALOMEDSImpl_StudyHandle_HeaderFile +#define SALOMEDSImpl_StudyHandle_HeaderFile + +#include +#include +#include + +class Standard_GUID; +class Handle(TDF_Attribute); +class Handle(TDF_RelocationTable); + +/* + Class : SALOMEDSImpl_StudyHandle + Description : PRIVATE: This class is intended for storing of the study handle +*/ + +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_StudyHandle, TDF_Attribute ) + +#include "SALOMEDSImpl_Study.hxx" + +#ifndef WNT +class Standard_EXPORT SALOMEDSImpl_StudyHandle : public TDF_Attribute +#else +class SALOMEDSImpl_StudyHandle : public TDF_Attribute +#endif +{ + +public: +Standard_EXPORT SALOMEDSImpl_StudyHandle(); +Standard_EXPORT ~SALOMEDSImpl_StudyHandle() { myHandle.Nullify(); } + +Standard_EXPORT static Handle(SALOMEDSImpl_StudyHandle) Set(const TDF_Label& theLabel, const Handle(SALOMEDSImpl_Study)& theStudy); +Standard_EXPORT static const Standard_GUID& GetID() ; + +Standard_EXPORT void SetHandle(const Handle(SALOMEDSImpl_Study)& theStudy) { myHandle = theStudy; } +Standard_EXPORT Handle(SALOMEDSImpl_Study) GetHandle() { return myHandle; } +Standard_EXPORT const Standard_GUID& ID() const; +Standard_EXPORT void Restore( const Handle(TDF_Attribute)& theWith ); +Standard_EXPORT Handle(TDF_Attribute) NewEmpty() const; +Standard_EXPORT void Paste( const Handle(TDF_Attribute)& theInto, + const Handle(TDF_RelocationTable)& ) const; + +private: + Handle(SALOMEDSImpl_Study) myHandle; + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_StudyHandle ) +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx new file mode 100644 index 000000000..71adc5a50 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx @@ -0,0 +1,1278 @@ +// File : SALOMEDSImpl_StudyManager.cxx +// Author : Sergey RUIN +// Module : SALOME + +#include "SALOMEDSImpl_StudyManager.hxx" + +using namespace std; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "HDFexplorer.hxx" + +#include "SALOMEDSImpl_Attributes.hxx" +#include "SALOMEDSImpl_Tool.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include + +#include "HDFOI.hxx" +#include +#include + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_StudyManager, MMgt_TShared ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_StudyManager, MMgt_TShared ) + +#define USE_CASE_LABEL_ID "0:2" +#define AUTO_SAVE_GUID "128268A3-71C9-4036-89B1-F81BD6A4FCF2" +#define AUTO_SAVE_TAG "0:8" +#define AUTO_SAVE_TIME_OUT_IN_SECONDS 1200 + +static void SaveAttributes(Handle(SALOMEDSImpl_SObject) SO, HDFgroup *hdf_group_sobject); +static void ReadAttributes(const Handle(SALOMEDSImpl_Study)&, const Handle(SALOMEDSImpl_SObject)&, HDFdataset* ); +static void BuildTree (const Handle(SALOMEDSImpl_Study)&, HDFgroup*); +static void Translate_IOR_to_persistentID (const Handle(SALOMEDSImpl_SObject)&, + SALOMEDSImpl_Driver*, bool isMultiFile, bool isASCII); + +//============================================================================ +/*! Function : SALOMEDSImpl_StudyManager + * Purpose : SALOMEDSImpl_StudyManager constructor + */ +//============================================================================ +SALOMEDSImpl_StudyManager::SALOMEDSImpl_StudyManager() +{ + _errorCode = ""; + _OCAFApp = new SALOMEDSImpl_OCAFApplication(); + _IDcounter = 0; + _OCAFApp->NewDocument("SALOME_STUDY", _clipboard); +} + +//============================================================================ +/*! Function : ~SALOMEDSImpl_StudyManager + * Purpose : SALOMEDSImpl_StudyManager destructor + */ +//============================================================================ +SALOMEDSImpl_StudyManager::~SALOMEDSImpl_StudyManager() +{ + // Destroy OCAF application + _OCAFApp.Nullify(); +} + + +//============================================================================ +/*! Function : NewStudy + * Purpose : Create a New Study of name study_name + */ +//==================================================T========================== +Handle(SALOMEDSImpl_Study) SALOMEDSImpl_StudyManager::NewStudy(const TCollection_AsciiString& study_name) +{ + _errorCode = ""; + + Handle(TDocStd_Document) Doc; + _OCAFApp->NewDocument("SALOME_STUDY",Doc); + + Handle(SALOMEDSImpl_Study) Study = new SALOMEDSImpl_Study(Doc, study_name); + + _IDcounter++; + Study->StudyId( _IDcounter ); + + // set Study properties + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = Study->GetProperties(); + OSD_Process aProcess; + Quantity_Date aDate = aProcess.SystemDate(); + aProp->SetModification(aProcess.UserName().ToCString(), + aDate.Minute(), aDate.Hour(), aDate.Day(), aDate.Month(), aDate.Year()); + aProp->SetCreationMode(1); //"from scratch" + + return Study; +} + +//============================================================================ +/*! Function : Open + * Purpose : Open a Study from it's persistent reference + */ +//============================================================================ +Handle(SALOMEDSImpl_Study) SALOMEDSImpl_StudyManager::Open(const TCollection_AsciiString& aUrl) +{ + _errorCode = ""; + + // open the HDFFile + HDFfile *hdf_file =0; + HDFgroup *hdf_group_study_structure =0; + + char* aC_HDFUrl; + TCollection_AsciiString aHDFUrl; + bool isASCII = false; + if (HDFascii::isASCII(aUrl.ToCString())) { + isASCII = true; + char* aResultPath = HDFascii::ConvertFromASCIIToHDF(aUrl.ToCString()); + aC_HDFUrl = new char[strlen(aResultPath) + 19]; + sprintf(aC_HDFUrl, "%shdf_from_ascii.hdf", aResultPath); + delete(aResultPath); + aHDFUrl = aC_HDFUrl; + delete aC_HDFUrl; + } else { + aHDFUrl = aUrl; + } + + hdf_file = new HDFfile((char*)aHDFUrl.ToCString()); + try { + hdf_file->OpenOnDisk(HDF_RDONLY);// mpv: was RDWR, but opened file can be write-protected too + } + catch (HDFexception) + { +#ifndef WNT + char eStr[strlen(aUrl.ToCString())+17]; +#else + char *eStr; + eStr = new char[strlen(aUrl.ToCString())+17]; +#endif + sprintf(eStr,"Can't open file %s",aUrl.ToCString()); +#ifdef WNT + delete [] eStr; +#endif + _errorCode = TCollection_AsciiString(eStr); + return NULL; + } + + // Temporary aStudyUrl in place of study name + Handle(TDocStd_Document) Doc; + _OCAFApp->NewDocument("SALOME_STUDY",Doc); + + Handle(SALOMEDSImpl_Study) Study = new SALOMEDSImpl_Study(Doc, aUrl); + + _IDcounter++; + Study->StudyId( _IDcounter ); + + // Assign the value of the URL in the study object + Study->URL (aUrl); + + SALOMEDSImpl_AttributePersistentRef::Set(Doc->Main(), aUrl); + + if (!hdf_file->ExistInternalObject("STUDY_STRUCTURE")) { + _errorCode = "Study is empty"; + return Study; + } + + //Create the Structure of the OCAF Document + hdf_group_study_structure = new HDFgroup("STUDY_STRUCTURE",hdf_file); + + Handle(TDF_Data) DF = Doc->GetData(); + try { + BuildTree (Study, hdf_group_study_structure); + } + catch (HDFexception) + { +#ifndef WNT + char eStr[strlen(aUrl.ToCString())+17]; +#else + char *eStr = new char [strlen(aUrl.ToCString())+17]; +#endif + sprintf(eStr,"Can't open file %s", aUrl.ToCString()); + _errorCode = TCollection_AsciiString(eStr); + return NULL; + } + + hdf_file->CloseOnDisk(); + + if (isASCII) { + Handle(TColStd_HSequenceOfAsciiString) aFilesToRemove = new TColStd_HSequenceOfAsciiString; + aFilesToRemove->Append(aHDFUrl); + SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true); + } + + delete hdf_file; // all related hdf objects will be deleted + + return Study; +} + + + +//============================================================================ +/*! Function : Close + * Purpose : Close a study. + * If the study hasn't been saved, ask the user to confirm the + * close action without saving + */ + +//============================================================================ +void SALOMEDSImpl_StudyManager::Close(const Handle(SALOMEDSImpl_Study)& aStudy) +{ + _errorCode = ""; + + if(aStudy.IsNull()) { + _errorCode = "Study is null"; + return; + } + + aStudy->Close(); +} + +//============================================================================ +/*! Function : Save + * Purpose : Save a Study to it's persistent reference + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::Save(const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile) +{ + _errorCode = ""; + + TCollection_AsciiString url = aStudy->URL(); + if (url.IsEmpty()) { + _errorCode = "No path specified to save the study. Nothing done"; + return false; + } + else { + return Impl_SaveAs(url,aStudy, aFactory, theMultiFile, false); + } + + return false; +} + +bool SALOMEDSImpl_StudyManager::SaveASCII(const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile) +{ + _errorCode = ""; + + TCollection_AsciiString url = aStudy->URL(); + if (url.IsEmpty()) { + _errorCode = "No path specified to save the study. Nothing done"; + return false; + } + else { + return Impl_SaveAs(url,aStudy, aFactory, theMultiFile, true); + } + + return false; +} + +//============================================================================= +/*! Function : SaveAs + * Purpose : Save a study to the persistent reference aUrl + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::SaveAs(const TCollection_AsciiString& aUrl, + const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile) +{ + _errorCode = ""; + return Impl_SaveAs(aUrl,aStudy, aFactory, theMultiFile, false); +} + +bool SALOMEDSImpl_StudyManager::SaveAsASCII(const TCollection_AsciiString& aUrl, + const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile) +{ + _errorCode = ""; + return Impl_SaveAs(aUrl,aStudy, aFactory, theMultiFile, true); +} + +//============================================================================ +/*! Function : GetOpenStudies + * Purpose : Get name list of open studies in the session + */ +//============================================================================ +Handle(TColStd_HSequenceOfTransient) SALOMEDSImpl_StudyManager::GetOpenStudies() +{ + _errorCode = ""; + Handle(TColStd_HSequenceOfTransient) aList = new TColStd_HSequenceOfTransient; + + int nbDocs = _OCAFApp->NbDocuments(); + + if(nbDocs == 0) { + _errorCode = "No active study in this session"; + return aList; + } + else { + Handle(SALOMEDSImpl_Study) aStudy; + Handle(CDF_Session) S = CDF_Session::CurrentSession(); + CDF_DirectoryIterator it (S->Directory()); + for (;it.MoreDocument();it.NextDocument()) { + Handle(TDocStd_Document) D = Handle(TDocStd_Document)::DownCast(it.Document()); + if(D == _clipboard) continue; + aStudy = SALOMEDSImpl_Study::GetStudy(D->Main()); + if(aStudy.IsNull()) continue; + aList->Append(aStudy); + } + } + + return aList; +} + +//============================================================================ +/*! Function : GetStudyByName + * Purpose : Get a study from its name + */ +//============================================================================ +Handle(SALOMEDSImpl_Study) SALOMEDSImpl_StudyManager::GetStudyByName + (const TCollection_AsciiString& aStudyName) +{ + _errorCode = ""; + int nbDocs = _OCAFApp->NbDocuments(); + + if (nbDocs == 0) { + _errorCode = "No active study in this session"; + return NULL; + } + else { + Handle(SALOMEDSImpl_Study) aStudy; + Handle(CDF_Session) S = CDF_Session::CurrentSession(); + CDF_DirectoryIterator it (S->Directory()); + for (; it.MoreDocument(); it.NextDocument()) { + Handle(TDocStd_Document) D = Handle(TDocStd_Document)::DownCast(it.Document()); + if (D == _clipboard) continue; + aStudy = SALOMEDSImpl_Study::GetStudy(D->Main()); + if (aStudy.IsNull()) continue; + if (aStudy->Name() == aStudyName) return aStudy; + } + } + + _errorCode = TCollection_AsciiString("Found no study with the name ") + aStudyName; + return NULL; +} + +//============================================================================ +/*! Function : GetStudyByID + * Purpose : Get a study from its ID + */ +//============================================================================ +Handle(SALOMEDSImpl_Study) SALOMEDSImpl_StudyManager::GetStudyByID(int aStudyID) +{ + _errorCode = ""; + int nbDocs = _OCAFApp->NbDocuments(); + + if (nbDocs == 0) { + _errorCode = "No active study in this session"; + return NULL; + } + else { + Handle(SALOMEDSImpl_Study) aStudy; + Handle(CDF_Session) S = CDF_Session::CurrentSession(); + CDF_DirectoryIterator it (S->Directory()); + for (; it.MoreDocument(); it.NextDocument()) { + Handle(TDocStd_Document) D = Handle(TDocStd_Document)::DownCast(it.Document()); + if (D == _clipboard) continue; + aStudy = SALOMEDSImpl_Study::GetStudy(D->Main()); + if (aStudy.IsNull()) continue; + if (aStudy->StudyId() == aStudyID) return aStudy; + } + } + + _errorCode = "Found no study with the given ID"; + return NULL; +} + +//============================================================================= +/*! Function : _SaveProperties + * Purpose : save the study properties in HDF file + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::Impl_SaveProperties(const Handle(SALOMEDSImpl_Study)& aStudy, + HDFgroup *hdf_group) +{ + _errorCode = ""; + + HDFdataset *hdf_dataset = 0; + hdf_size size[1]; + hdf_int32 name_len; + + // add modifications list (user and date of save) + Handle(SALOMEDSImpl_AttributeStudyProperties) aProp = aStudy->GetProperties(); + Handle(SALOMEDSImpl_StudyBuilder) SB= aStudy->NewBuilder(); + int aLocked = aProp->IsLocked(); + if (aLocked) aProp->SetLocked(Standard_False); + + OSD_Process aProcess; + Quantity_Date aDate = aProcess.SystemDate(); + aProp->SetModification(aProcess.UserName().ToCString(), + aDate.Minute(), aDate.Hour(), aDate.Day(), aDate.Month(), aDate.Year()); + + if (aLocked) aProp->SetLocked(Standard_True); + + Handle(TColStd_HSequenceOfExtendedString) aNames; + Handle(TColStd_HSequenceOfInteger) aMinutes, aHours, aDays, aMonths, aYears; + + aProp->GetModifications(aNames, aMinutes, aHours, aDays, aMonths, aYears); + + int aLength = 0, anIndex, i; + for(i=1; i<=aNames->Length(); i++) + aLength += aNames->Value(i).Length() + 1; + + //string length: 1 byte = locked flag, 1 byte = modified flag, (12 + name length + 1) for each name and date, "zero" byte + char* aProperty = new char[3 + aLength + 12 * aNames->Length()]; + + + sprintf(aProperty,"%c%c", (char)aProp->GetCreationMode(), (aProp->IsLocked())?'l':'u'); + + aLength = aNames->Length(); + int a = 2; + for(anIndex = 1; anIndex <= aLength; anIndex++) { + sprintf(&(aProperty[a]),"%2d%2d%2d%2d%4d%s", + (int)(aMinutes->Value(anIndex)), + (int)(aHours->Value(anIndex)), + (int)(aDays->Value(anIndex)), + (int)(aMonths->Value(anIndex)), + (int)(aYears->Value(anIndex)), + TCollection_AsciiString(aNames->Value(anIndex)).ToCString()); + a = strlen(aProperty); + aProperty[a++] = 1; + } + aProperty[a] = 0; + + name_len = (hdf_int32) a; + size[0] = name_len + 1 ; + hdf_dataset = new HDFdataset("AttributeStudyProperties",hdf_group,HDF_STRING,size,1); + hdf_dataset->CreateOnDisk(); + hdf_dataset->WriteOnDisk(aProperty); + hdf_dataset->CloseOnDisk(); + hdf_dataset=0; //will be deleted by hdf_sco_group destructor + delete [] aProperty; + + aProp->SetModified(0); + return true; +} + +//============================================================================= +/*! Function : _SaveAs + * Purpose : save the study in HDF file + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::Impl_SaveAs(const TCollection_AsciiString& aUrl, + const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile, + bool theASCII) +{ + // HDF File will be composed of differents part : + // * For each ComponentDataType, all data created by the component + // Informations in data group hdf_group_datacomponent + // * Study Structure -> Exactly what is contained in OCAF document + // Informations in data group hdf_group_study_structure + + _errorCode = ""; + + HDFfile *hdf_file=0; + HDFgroup *hdf_group_study_structure =0; + HDFgroup *hdf_sco_group =0; + HDFgroup *hdf_sco_group2 =0; + + HDFgroup *hdf_group_datacomponent =0; + HDFdataset *hdf_dataset =0; + hdf_size size[1]; + hdf_int32 name_len = 0; + char *component_name = 0; + + int aLocked = aStudy->GetProperties()->IsLocked(); + if (aLocked) aStudy->GetProperties()->SetLocked(false); + + Handle(SALOMEDSImpl_StudyBuilder) SB= aStudy->NewBuilder(); + map aMapTypeDriver; + + if(aStudy.IsNull()) { + _errorCode = "Study is null"; + return false; + } + + try + { + // mpv 15.12.2003: for saving components we have to load all data from all modules + SALOMEDSImpl_SComponentIterator itcomponent1 = aStudy->NewComponentIterator(); + for (; itcomponent1.More(); itcomponent1.Next()) + { + Handle(SALOMEDSImpl_SComponent) sco = itcomponent1.Value(); + + // if there is an associated Engine call its method for saving + TCollection_AsciiString IOREngine; + try { + if (!sco->ComponentIOR(IOREngine)) { + TCollection_AsciiString aCompType = sco->GetComment(); + if (!aCompType.IsEmpty()) { + + SALOMEDSImpl_Driver* aDriver = aFactory->GetDriverByType(aCompType); + aMapTypeDriver[aCompType.ToCString()] = aDriver; + + if (aDriver != NULL) { + if(!SB->LoadWith(sco, aDriver)) { + _errorCode = SB->GetErrorCode(); + return false; + } + } + } + } + } catch(...) { + _errorCode = "Can not restore information to resave it"; + return false; + } + } + + TCollection_AsciiString anOldName = aStudy->Name(); + aStudy->URL(aUrl); + + // To change for Save + // Do not have to do a new file but just a Open??? Rewrite all informations after erasing evrything?? + hdf_file = new HDFfile(aUrl.ToCString()); + hdf_file->CreateOnDisk(); + + //----------------------------------------------------------------------- + // 1 - Create a groupe for each SComponent and Update the PersistanceRef + //----------------------------------------------------------------------- + hdf_group_datacomponent = new HDFgroup("DATACOMPONENT",hdf_file); + hdf_group_datacomponent->CreateOnDisk(); + + SALOMEDSImpl_SComponentIterator itcomponent = aStudy->NewComponentIterator(); + + //SRN: Added 17 Nov, 2003 + Handle(SALOMEDSImpl_SObject) anAutoSaveSO = aStudy->FindObjectID(AUTO_SAVE_TAG); + //SRN: End + for (; itcomponent.More(); itcomponent.Next()) + { + Handle(SALOMEDSImpl_SComponent) sco = itcomponent.Value(); + + TCollection_AsciiString scoid = sco->GetID(); + hdf_sco_group = new HDFgroup(scoid.ToCString(), hdf_group_datacomponent); + hdf_sco_group->CreateOnDisk(); + + TCollection_AsciiString componentDataType = sco->ComponentDataType(); + + //SRN: Added 17 Nov 2003: If there is a specified attribute, the component peforms a special save + if(!anAutoSaveSO.IsNull() && SB->IsGUID(sco, AUTO_SAVE_GUID)) { + + Handle(SALOMEDSImpl_AttributeTableOfString) aTable; + if(anAutoSaveSO->GetLabel().FindAttribute(SALOMEDSImpl_AttributeTableOfString::GetID(), aTable)) { + Standard_Integer nbRows = aTable->GetNbRows(), k, aTimeOut = 0; + if(nbRows > 0 && aTable->GetNbColumns() > 1) { + + Handle(TColStd_HSequenceOfExtendedString) aRow; + for(k=1; k<=nbRows; k++) { + aRow = aTable->GetRowData(k); + if (aRow->Value(1) == componentDataType) { + TCollection_AsciiString anEntry = TCollection_AsciiString(aRow->Value(2)); + Handle(SALOMEDSImpl_SObject) aCompSpecificSO = aStudy->FindObjectID(anEntry); + if(!aCompSpecificSO.IsNull()) { + Handle(SALOMEDSImpl_AttributeInteger) anInteger; + if(aCompSpecificSO->GetLabel().FindAttribute(SALOMEDSImpl_AttributeInteger::GetID(), anInteger)) { + anInteger->SetValue(-1); + while(anInteger->Value() < 0) { +#ifndef WNT + sleep(2); +#else + Sleep(2); +#endif + if(++aTimeOut > AUTO_SAVE_TIME_OUT_IN_SECONDS) + break; + } + } // if(aCompSpecificSO->FindAttribute(anInteger, "AttributeInteger")) + } // if(!CORBA::is_nil(aCompSpecificSO)) + } // if (strcmp(aRow[0], componentDataType) == 0) + } // for + + } // if(nbRows > 0 && aTable->GetNbColumns() > 1) + + } // if(anAutoSaveSO->FindAttribute(aTable, "AttributeTableOfString") + + } // if(SB->IsGUID(AUTO_SAVE_GUID) + + //SRN: End + TCollection_AsciiString IOREngine; + if (sco->ComponentIOR(IOREngine)) + { + SALOMEDSImpl_Driver* Engine = NULL; + if(aMapTypeDriver.find(componentDataType.ToCString()) != aMapTypeDriver.end()) { + // we have found the associated engine to write the data + Engine = aMapTypeDriver[componentDataType.ToCString()]; + } + else { + Engine = aFactory->GetDriverByIOR(IOREngine); + } + + if (Engine != NULL) + { + unsigned char* aStream; + long length; + + if (theASCII) aStream = Engine->SaveASCII(sco, + SALOMEDSImpl_Tool::GetDirFromPath(aUrl), + length, + theMultiFile); + else aStream = Engine->Save(sco, + SALOMEDSImpl_Tool::GetDirFromPath(aUrl), + length, + theMultiFile); + HDFdataset *hdf_dataset; + hdf_size aHDFSize[1]; + if(length > 0) { //The component saved some auxiliary files, then put them into HDF file + + aHDFSize[0] = length; + + HDFdataset *hdf_dataset = new HDFdataset("FILE_STREAM", hdf_sco_group, HDF_STRING, aHDFSize, 1); + hdf_dataset->CreateOnDisk(); + hdf_dataset->WriteOnDisk(aStream); //Save the stream in the HDF file + hdf_dataset->CloseOnDisk(); + } + + // store multifile state + aHDFSize[0] = 2; + hdf_dataset = new HDFdataset("MULTIFILE_STATE", hdf_sco_group, HDF_STRING, aHDFSize, 1); + hdf_dataset->CreateOnDisk(); + hdf_dataset->WriteOnDisk((void*)(theMultiFile?"M":"S")); // save: multi or single + hdf_dataset->CloseOnDisk(); + hdf_dataset=0; //will be deleted by hdf_sco_AuxFiles destructor + // store ASCII state + aHDFSize[0] = 2; + hdf_dataset = new HDFdataset("ASCII_STATE", hdf_sco_group, HDF_STRING, aHDFSize, 1); + hdf_dataset->CreateOnDisk(); + hdf_dataset->WriteOnDisk((void*)(theASCII?"A":"B")); // save: ASCII or BINARY + hdf_dataset->CloseOnDisk(); + hdf_dataset=0; //will be deleted by hdf_sco_AuxFiles destructor + // Creation of the persistance reference attribute + Translate_IOR_to_persistentID (sco, Engine, theMultiFile, theASCII); + + if(aStream != NULL) delete [] aStream; + } + } + hdf_sco_group->CloseOnDisk(); + hdf_sco_group=0; // will be deleted by hdf_group_datacomponent destructor + } + hdf_group_datacomponent->CloseOnDisk(); + hdf_group_datacomponent =0; // will be deleted by hdf_file destructor + + //----------------------------------------------------------------------- + //3 - Write the Study Structure + //----------------------------------------------------------------------- + hdf_group_study_structure = new HDFgroup("STUDY_STRUCTURE",hdf_file); + hdf_group_study_structure->CreateOnDisk(); + // save component attributes + SALOMEDSImpl_SComponentIterator itcomp = aStudy->NewComponentIterator(); + for (; itcomp.More(); itcomp.Next()) + { + Handle(SALOMEDSImpl_SComponent) SC = itcomp.Value(); + TCollection_AsciiString scid = SC->GetID(); + hdf_sco_group2 = new HDFgroup(scid.ToCString(), hdf_group_study_structure); + hdf_sco_group2->CreateOnDisk(); + SaveAttributes(SC, hdf_sco_group2); + // ComponentDataType treatment + component_name = SC->ComponentDataType().ToCString(); + name_len = (hdf_int32)strlen(component_name); + size[0] = name_len +1 ; + hdf_dataset = new HDFdataset("COMPONENTDATATYPE",hdf_sco_group2,HDF_STRING,size,1); + hdf_dataset->CreateOnDisk(); + hdf_dataset->WriteOnDisk(component_name); + hdf_dataset->CloseOnDisk(); + hdf_dataset=0; //will be deleted by hdf_sco_group destructor + Impl_SaveObject(SC, hdf_sco_group2); + hdf_sco_group2->CloseOnDisk(); + hdf_sco_group2=0; // will be deleted by hdf_group_study_structure destructor + } + + //----------------------------------------------------------------------- + //4 - Write the Study UseCases Structure + //----------------------------------------------------------------------- + Handle(SALOMEDSImpl_SObject) aSO = aStudy->FindObjectID(USE_CASE_LABEL_ID); + if (!aSO.IsNull()) { + HDFgroup *hdf_soo_group = new HDFgroup(USE_CASE_LABEL_ID,hdf_group_study_structure); + hdf_soo_group->CreateOnDisk(); + SaveAttributes(aSO, hdf_soo_group); + Impl_SaveObject(aSO, hdf_soo_group); + hdf_soo_group->CloseOnDisk(); + hdf_soo_group=0; // will be deleted by hdf_group_study_structure destructor + } + + if (aLocked) aStudy->GetProperties()->SetLocked(true); + //----------------------------------------------------------------------- + //5 - Write the Study Properties + //----------------------------------------------------------------------- + name_len = (hdf_int32) aStudy->Name().Length(); + size[0] = name_len +1 ; + hdf_dataset = new HDFdataset("STUDY_NAME",hdf_group_study_structure,HDF_STRING,size,1); + hdf_dataset->CreateOnDisk(); + char* studid = aStudy->Name().ToCString(); + hdf_dataset->WriteOnDisk(studid); + hdf_dataset->CloseOnDisk(); + hdf_dataset=0; // will be deleted by hdf_group_study_structure destructor + + Impl_SaveProperties(aStudy, hdf_group_study_structure); + + hdf_group_study_structure->CloseOnDisk(); + hdf_file->CloseOnDisk(); + + aStudy->IsSaved(true); + hdf_group_study_structure =0; // will be deleted by hdf_file destructor + delete hdf_file; // recursively deletes all hdf objects... + } + catch (HDFexception) + { + _errorCode = "HDFexception ! "; + return false; + } + if (theASCII) { // save file in ASCII format + HDFascii::ConvertFromHDFToASCII(aUrl.ToCString(), true); + } + + return true; +} + +//============================================================================ +/*! Function : Impl_SaveObject + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::Impl_SaveObject(const Handle(SALOMEDSImpl_SObject)& SC, + HDFgroup *hdf_group_datatype) +{ + _errorCode = ""; + + // Write in group hdf_group_datatype all informations of SObject SC + // Iterative function to parse all SObjects under a SComponent + + HDFgroup *hdf_group_sobject = 0; + + TDF_ChildIterator itchild(SC->GetLabel()); + for (; itchild.More(); itchild.Next()) + { + + // mpv: don't save empty labels + TDF_AttributeIterator AI1(itchild.Value()); + if (!AI1.More()) { //No attributes on the label + TDF_ChildIterator subchild(SC->GetLabel()); + if (!subchild.More()) { + continue; + } + subchild.Initialize(SC->GetLabel(), true); + bool anEmpty = true; + for (; subchild.More() && anEmpty; subchild.Next()) { + TDF_AttributeIterator AI2(subchild.Value()); + if (AI2.More()) anEmpty = false; //There are attributes on the child label + } + if (anEmpty) continue; + } + + Handle(SALOMEDSImpl_SObject) SO = SALOMEDSImpl_Study::SObject(itchild.Value()); + + char* scoid = (char*) SO->GetID().ToCString(); + hdf_group_sobject = new HDFgroup(scoid, hdf_group_datatype); + hdf_group_sobject->CreateOnDisk(); + SaveAttributes(SO, hdf_group_sobject); + Impl_SaveObject(SO, hdf_group_sobject); + hdf_group_sobject->CloseOnDisk(); + hdf_group_sobject =0; // will be deleted by father hdf object destructor + } + + return true; +} + +//============================================================================ +/*! Function : Impl_SubstituteSlash + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_StudyManager::Impl_SubstituteSlash(const TCollection_AsciiString& aUrl) +{ + _errorCode = ""; + + TCollection_ExtendedString theUrl(aUrl); + Standard_ExtCharacter val1 = ToExtCharacter('/'); + Standard_ExtCharacter val2 = ToExtCharacter(':'); + theUrl.ChangeAll(val1,val2); + return theUrl; +} + +//============================================================================ +/*! Function : GetDocumentOfStudy + * Purpose : + */ +//============================================================================ +Handle(TDocStd_Document) SALOMEDSImpl_StudyManager::GetDocumentOfStudy(const Handle(SALOMEDSImpl_Study)& theStudy) +{ + _errorCode = ""; + return theStudy->_doc; +} + +//============================================================================ +/*! Function : CanCopy + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::CanCopy(const Handle(SALOMEDSImpl_SObject)& theObject, + SALOMEDSImpl_Driver* theEngine) +{ + _errorCode = ""; + Handle(SALOMEDSImpl_SComponent) aComponent = theObject->GetFatherComponent(); + if (aComponent.IsNull()) return false; + if (aComponent->GetLabel() == theObject->GetLabel()) return false; + TCollection_AsciiString IOREngine; + if (!aComponent->ComponentIOR(IOREngine)) return false; + if (theEngine == NULL) return false; + return theEngine->CanCopy(theObject); +} + +//============================================================================ +/*! Function : CopyLabel + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::CopyLabel(const Handle(SALOMEDSImpl_Study)& theSourceStudy, + SALOMEDSImpl_Driver* theEngine, + const Standard_Integer theSourceStartDepth, + const TDF_Label& theSource, + const TDF_Label& theDestinationMain) +{ + _errorCode = ""; + + int a; + TDF_Label aTargetLabel = theDestinationMain; + TDF_Label aAuxTargetLabel = theDestinationMain.Father().FindChild(2); + for(a = theSource.Depth() - theSourceStartDepth; a > 0 ; a--) { + TDF_Label aSourceLabel = theSource; + for(int aNbFather = 1; aNbFather < a; aNbFather++) aSourceLabel = aSourceLabel.Father(); + aTargetLabel = aTargetLabel.FindChild(aSourceLabel.Tag()); + aAuxTargetLabel = aAuxTargetLabel.FindChild(aSourceLabel.Tag()); + } + // iterate attributes + TDF_AttributeIterator anAttrIterator(theSource); + Handle(TDF_RelocationTable) aRT = new TDF_RelocationTable(); + for(; anAttrIterator.More(); anAttrIterator.Next()) { + Handle(TDF_Attribute) anAttr = anAttrIterator.Value(); + if (!Handle(SALOMEDSImpl_AttributeTreeNode)::DownCast(anAttr).IsNull()) continue; // never copy tree node attribute + if (!Handle(SALOMEDSImpl_AttributeTarget)::DownCast(anAttr).IsNull()) continue; // and target attribute + + if (!Handle(SALOMEDSImpl_AttributeReference)::DownCast(anAttr).IsNull()) { // reference copied as Comment in aux tree + TDF_Label aReferenced = Handle(SALOMEDSImpl_AttributeReference)::DownCast(anAttr)->Get(); + TCollection_AsciiString anEntry; + TDF_Tool::Entry(aReferenced, anEntry); + // store the value of name attribute of referenced label + Handle(SALOMEDSImpl_AttributeName) aNameAttribute; + if (aReferenced.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aNameAttribute)) { + anEntry += " "; + anEntry += aNameAttribute->Value(); + } + SALOMEDSImpl_AttributeComment::Set(aAuxTargetLabel, TCollection_ExtendedString(anEntry)); + continue; + } + + if (!Handle(SALOMEDSImpl_AttributeIOR)::DownCast(anAttr).IsNull()) { // IOR => ID and TMPFile of Engine + TCollection_AsciiString anEntry; + TDF_Tool::Entry(theSource, anEntry); + Handle(SALOMEDSImpl_SObject) aSO = theSourceStudy->FindObjectID(anEntry.ToCString()); + int anObjID; + long aLen; + unsigned char* aStream = theEngine->CopyFrom(aSO, anObjID, aLen); + TCollection_ExtendedString aResStr(""); + for(a = 0; a < aLen; a++) { + aResStr += TCollection_ExtendedString(ToExtCharacter((Standard_Character)aStream[a])); + } + if(aStream != NULL) delete [] aStream; + SALOMEDSImpl_AttributeInteger::Set(aAuxTargetLabel, anObjID); + SALOMEDSImpl_AttributeName::Set(aAuxTargetLabel, aResStr); + continue; + } + Handle(TDF_Attribute) aNewAttribute = anAttr->NewEmpty(); + aTargetLabel.AddAttribute(aNewAttribute); + anAttr->Paste(aNewAttribute, aRT); + } + + return true; +} + +//============================================================================ +/*! Function : Copy + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::Copy(const Handle(SALOMEDSImpl_SObject)& theObject, + SALOMEDSImpl_Driver* theEngine) +{ + _errorCode = ""; + + // adoptation for alliances datamodel copy: without IOR attributes !!! + bool aStructureOnly; // copy only SObjects and attributes without component help + aStructureOnly = !theObject->GetLabel().IsAttribute(SALOMEDSImpl_AttributeIOR::GetID()); + + // get component-engine + Handle(SALOMEDSImpl_Study) aStudy = theObject->GetStudy(); + + // CAF document of current study usage + Handle(TDocStd_Document) aDocument = GetDocumentOfStudy(aStudy); + if (aDocument.IsNull()) { + _errorCode = "OCAF document is null"; + return false; + } + + //Clear the clipboard + _clipboard->Main().Root().ForgetAllAttributes(Standard_True); + _OCAFApp->Close(_clipboard); + Handle(TDocStd_Document) aDoc; + _OCAFApp->NewDocument("SALOME_STUDY", aDoc); + _clipboard = aDoc; + + // set component data type to the name attribute of root label + if (!aStructureOnly) { + SALOMEDSImpl_AttributeComment::Set(_clipboard->Main().Root(), + TCollection_ExtendedString(theEngine->ComponentDataType())); + } + // set to the Root label integer attribute: study id + SALOMEDSImpl_AttributeInteger::Set(_clipboard->Main().Root(), aStudy->StudyId()); + // iterate all theObject's label children + TDF_Label aStartLabel = theObject->GetLabel(); + Standard_Integer aSourceStartDepth = aStartLabel.Depth(); + + // copy main source label + CopyLabel(aStudy, theEngine, aSourceStartDepth, aStartLabel, _clipboard->Main()); + + // copy all subchildren of the main source label (all levels) + TDF_ChildIterator anIterator(aStartLabel, Standard_True); + for(; anIterator.More(); anIterator.Next()) { + CopyLabel(aStudy, theEngine, aSourceStartDepth, anIterator.Value(), _clipboard->Main()); + } + + return true; +} +//============================================================================ +/*! Function : CanPaste + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_StudyManager::CanPaste(const Handle(SALOMEDSImpl_SObject)& theObject, + SALOMEDSImpl_Driver* theEngine) +{ + _errorCode = ""; + + if (_clipboard.IsNull()) { + _errorCode = "Clipboard is null"; + return false; + } + + Handle(SALOMEDSImpl_AttributeComment) aCompName; + if (!_clipboard->Main().Root().FindAttribute(SALOMEDSImpl_AttributeComment::GetID(), aCompName)) { + _errorCode = "Clipboard has no component type"; + return false; + } + Handle(SALOMEDSImpl_AttributeInteger) anObjID; + if (!_clipboard->Main().Father().FindChild(2).FindAttribute(SALOMEDSImpl_AttributeInteger::GetID(), anObjID)) { + _errorCode = "Clipboard has no object id"; + return false; + } + Handle(SALOMEDSImpl_SComponent) aComponent = theObject->GetFatherComponent(); + if (aComponent.IsNull()) { + _errorCode = "Object doesn't belong to component"; + return false; + } + + TCollection_AsciiString IOREngine; + if (!aComponent->ComponentIOR(IOREngine)) { + _errorCode = "component has no IOR"; + return false; + } + return theEngine->CanPaste(aCompName->Value(), anObjID->Value()); +} + +//============================================================================ +/*! Function : PasteLabel + * Purpose : + */ +//============================================================================ +TDF_Label SALOMEDSImpl_StudyManager::PasteLabel(const Handle(SALOMEDSImpl_Study)& theDestinationStudy, + SALOMEDSImpl_Driver* theEngine, + const TDF_Label& theSource, + const TDF_Label& theDestinationStart, + const int theCopiedStudyID, + const bool isFirstElement) +{ + _errorCode = ""; + + // get corresponding source, target and auxiliary labels + TDF_Label aTargetLabel = theDestinationStart; + + TDF_Label aAuxSourceLabel = theSource.Root().FindChild(2); + int a; + if (!isFirstElement) { + for(a = theSource.Depth() - 1; a > 0 ; a--) { + TDF_Label aSourceLabel = theSource; + for(int aNbFather = 1; aNbFather < a; aNbFather++) aSourceLabel = aSourceLabel.Father(); + aTargetLabel = aTargetLabel.FindChild(aSourceLabel.Tag()); + aAuxSourceLabel = aAuxSourceLabel.FindChild(aSourceLabel.Tag()); + } + } + + // check auxiliary label for TMPFile => IOR + Handle(SALOMEDSImpl_AttributeName) aNameAttribute; + if (aAuxSourceLabel.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aNameAttribute)) { + Handle(SALOMEDSImpl_AttributeInteger) anObjID; + + aAuxSourceLabel.FindAttribute(SALOMEDSImpl_AttributeInteger::GetID(), anObjID); + Handle(SALOMEDSImpl_AttributeComment) aComponentName; + theSource.Root().FindAttribute(SALOMEDSImpl_AttributeComment::GetID(), aComponentName); + TCollection_AsciiString aCompName = aComponentName->Value(); + + if (theEngine->CanPaste(aCompName, anObjID->Value())) { + TCollection_ExtendedString aTMPStr = aNameAttribute->Value(); + int aLen = aTMPStr.Length(); + unsigned char* aStream = NULL; + if(aLen > 0) { + aStream = new unsigned char[aLen+10]; + for(a = 0; a < aLen; a++) { + aStream[a] = ToCharacter(aTMPStr.Value(a+1)); + } + } + + TCollection_AsciiString anEntry; + TDF_Tool::Entry(aTargetLabel, anEntry); + Handle(SALOMEDSImpl_SObject) aPastedSO = theDestinationStudy->FindObjectID(anEntry); + + if (isFirstElement) { + TCollection_AsciiString aDestEntry = theEngine->PasteInto(aStream, + aLen, + anObjID->Value(), + aPastedSO->GetFatherComponent()); + TDF_Tool::Label(theDestinationStart.Data(), aDestEntry, aTargetLabel); + } else + theEngine->PasteInto(aStream, aLen, anObjID->Value(), aPastedSO); + + if(aStream != NULL) delete []aStream; + } + } + + // iterate attributes + TDF_AttributeIterator anAttrIterator(theSource); + Handle(TDF_RelocationTable) aRT = new TDF_RelocationTable(); + for(; anAttrIterator.More(); anAttrIterator.Next()) { + Handle(TDF_Attribute) anAttr = anAttrIterator.Value(); + if (aTargetLabel.FindAttribute(anAttr->ID(), anAttr)) { + aTargetLabel.ForgetAttribute(anAttr->ID()); + anAttr = anAttrIterator.Value(); + } + Handle(TDF_Attribute) aNewAttribute = anAttr->NewEmpty(); + aTargetLabel.AddAttribute(aNewAttribute); + anAttr->Paste(aNewAttribute, aRT); + } + + // check auxiliary label for Comment => reference or name attribute of the referenced object + Handle(SALOMEDSImpl_AttributeComment) aCommentAttribute; + if (aAuxSourceLabel.FindAttribute(SALOMEDSImpl_AttributeComment::GetID(), aCommentAttribute)) { + char * anEntry = new char[aCommentAttribute->Value().Length() + 1]; + strcpy(anEntry, TCollection_AsciiString(aCommentAttribute->Value()).ToCString()); + char* aNameStart = strchr(anEntry, ' '); + if (aNameStart) { + *aNameStart = '\0'; + aNameStart++; + } + if (theCopiedStudyID == theDestinationStudy->StudyId()) { // if copy to the same study, reanimate reference + TDF_Label aRefLabel; + TDF_Tool::Label(aTargetLabel.Data(), anEntry, aRefLabel); + SALOMEDSImpl_AttributeReference::Set(aTargetLabel, aRefLabel); + // target attributes structure support + SALOMEDSImpl_AttributeTarget::Set(aRefLabel)->Add(SALOMEDSImpl_Study::SObject(aTargetLabel)); + } else { + if (aNameStart) SALOMEDSImpl_AttributeName::Set(aTargetLabel, aNameStart); + else SALOMEDSImpl_AttributeName::Set(aTargetLabel, TCollection_ExtendedString("Reference to:")+anEntry); + } + delete [] anEntry; + } + + return aTargetLabel; +} + +//============================================================================ +/*! Function : Paste + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_StudyManager::Paste(const Handle(SALOMEDSImpl_SObject)& theObject, + SALOMEDSImpl_Driver* theEngine) +{ + _errorCode = ""; + + Handle(SALOMEDSImpl_Study) aStudy = theObject->GetStudy(); + + // if study is locked, then paste can't be done + if (aStudy->GetProperties()->IsLocked()) { + _errorCode = "LockProtection"; + throw LockProtection("LockProtection"); + } + + // if there is no component name, then paste only SObjects and attributes: without component help + Handle(SALOMEDSImpl_AttributeComment) aComponentName; + bool aStructureOnly = !_clipboard->Main().Root().FindAttribute(SALOMEDSImpl_AttributeComment::GetID(), aComponentName); + + // get copied study ID + Handle(SALOMEDSImpl_AttributeInteger) aStudyIDAttribute; + if (!_clipboard->Main().Root().FindAttribute(SALOMEDSImpl_AttributeInteger::GetID(), aStudyIDAttribute)) { + _errorCode = "No study ID was found"; + return NULL; + } + int aCStudyID = aStudyIDAttribute->Value(); + + // CAF document of current study usage + Handle(TDocStd_Document) aDocument = GetDocumentOfStudy(aStudy); + if (aDocument.IsNull()) { + _errorCode = "OCAF document is null"; + return NULL; + } + + Handle(SALOMEDSImpl_SComponent) aComponent = theObject->GetFatherComponent(); + + // fill root inserted SObject + TDF_Label aStartLabel; + if (aStructureOnly) { + TDF_Label anObjectLabel; + TDF_Tool::Label(aDocument->GetData(), theObject->GetID(), anObjectLabel); + aStartLabel = PasteLabel(aStudy, theEngine, _clipboard->Main(), anObjectLabel, aCStudyID, false); + } else { + TDF_Label aComponentLabel; + TDF_Tool::Label(aDocument->GetData(), aComponent->GetID(), aComponentLabel); + aStartLabel = PasteLabel(aStudy, theEngine, _clipboard->Main(), aComponentLabel, aCStudyID, true); + } + + // paste all sublebels + TDF_ChildIterator anIterator(_clipboard->Main(), Standard_True); + for(; anIterator.More(); anIterator.Next()) { + PasteLabel(aStudy, theEngine, anIterator.Value(), aStartLabel, aCStudyID, false); + } + + return SALOMEDSImpl_Study::SObject(aStartLabel); +} + +//####################################################################################################### +//# STATIC PRIVATE FUNCTIONS +//####################################################################################################### + +//============================================================================ +/*! Function : SaveAttributes + * Purpose : Save attributes for object + */ +//============================================================================ +static void SaveAttributes(Handle(SALOMEDSImpl_SObject) aSO, HDFgroup *hdf_group_sobject) +{ + hdf_size size[1]; + TDF_AttributeIterator Itr(aSO->GetLabel()); + Handle(TDF_Attribute) anAttr; + for(; Itr.More(); Itr.Next()) { + anAttr = Itr.Value(); + //The following attributes are not supposed to be written to the file + if(anAttr->DynamicType() == STANDARD_TYPE(SALOMEDSImpl_AttributeIOR)) continue; //IOR attribute is not saved + Handle(SALOMEDSImpl_GenericAttribute) ga = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(anAttr); + TCollection_AsciiString aSaveStr = ga->Save(); + //cout << "Saving: " << aSO->GetID() << " "<< ga->Type() << " value: " << aSaveStr << endl; + size[0] = (hdf_int32) strlen(aSaveStr.ToCString()) + 1; + HDFdataset *hdf_dataset = new HDFdataset((char*)ga->Type().ToCString(), hdf_group_sobject,HDF_STRING,size,1); + hdf_dataset->CreateOnDisk(); + hdf_dataset->WriteOnDisk((char*)aSaveStr.ToCString()); + hdf_dataset->CloseOnDisk(); + hdf_dataset=0; //will be deleted by hdf_sco_group destructor + } +} + +//=========================================================================== +//Function : ReadAttributes +//=========================================================================== +static void ReadAttributes(const Handle(SALOMEDSImpl_Study)& theStudy, + const Handle(SALOMEDSImpl_SObject)& aSO, + HDFdataset* hdf_dataset) +{ + hdf_dataset->OpenOnDisk(); + + Handle(TDF_Attribute) anAttr; + + char* current_string = new char[hdf_dataset->GetSize()]; + hdf_dataset->ReadFromDisk(current_string); + + if (!strcmp(hdf_dataset->GetName(),"COMPONENTDATATYPE")) { + anAttr = theStudy->NewBuilder()->FindOrCreateAttribute(aSO, "AttributeComment"); + } else if (!strcmp(hdf_dataset->GetName(),"AttributeReference")) { + theStudy->NewBuilder()->Addreference(aSO, theStudy->CreateObjectID(current_string)); + delete(current_string); + hdf_dataset->CloseOnDisk(); + return; + } else { + anAttr = theStudy->NewBuilder()->FindOrCreateAttribute(aSO, hdf_dataset->GetName()); + } + + if (!anAttr.IsNull()) { + + Handle(SALOMEDSImpl_GenericAttribute) ga = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(anAttr); + ga->Load(current_string); + //cout << "Reading: " << aSO->GetID() << " "<< ga->Type() << " value: " << current_string << endl; + } + + delete(current_string); + hdf_dataset->CloseOnDisk(); +} + +//============================================================================ +//Function : BuildlTree +//============================================================================ +static void BuildTree (const Handle(SALOMEDSImpl_Study)& theStudy, HDFgroup* hdf_current_group) +{ + hdf_current_group->OpenOnDisk(); + Handle(SALOMEDSImpl_SObject) aSO; + char* Entry = hdf_current_group->GetName(); + if (strcmp(Entry,"STUDY_STRUCTURE") == 0) { + aSO = theStudy->CreateObjectID("0:1"); + } + else { + aSO = theStudy->CreateObjectID(Entry); + } + + char name[HDF_NAME_MAX_LEN+1]; + Standard_Integer nbsons = hdf_current_group->nInternalObjects(); + for (Standard_Integer i=0; iInternalObjectIndentify(i,name); + if (strncmp(name, "INTERNAL_COMPLEX",16) == 0) continue; + hdf_object_type type = hdf_current_group->InternalObjectType(name); + + if (type == HDF_DATASET) { + HDFdataset* new_dataset = new HDFdataset(name,hdf_current_group); + ReadAttributes(theStudy,aSO,new_dataset); + new_dataset = 0; // will be deleted by father destructor + + } + else if (type == HDF_GROUP) { + HDFgroup* new_group = new HDFgroup(name,hdf_current_group); + BuildTree (theStudy, new_group); + new_group = 0; // will be deleted by father destructor + } + } + hdf_current_group->CloseOnDisk(); +} + + +//============================================================================ +//Function : Translate_IOR_to_persistentID +//============================================================================ +static void Translate_IOR_to_persistentID (const Handle(SALOMEDSImpl_SObject)& so, + SALOMEDSImpl_Driver* engine, + bool isMultiFile, + bool isASCII) +{ + TDF_ChildIterator itchild(so->GetLabel()); + TCollection_AsciiString ior_string, persistent_string, curid; + + for (; itchild.More(); itchild.Next()) { + Handle(SALOMEDSImpl_SObject) current = SALOMEDSImpl_Study::SObject(itchild.Value()); + Handle(SALOMEDSImpl_AttributeIOR) IOR; + if (current->GetLabel().FindAttribute(SALOMEDSImpl_AttributeIOR::GetID(), IOR)) { + ior_string = IOR->Value(); + + persistent_string = engine->IORToLocalPersistentID (current, ior_string, isMultiFile, isASCII); + SALOMEDSImpl_AttributePersistentRef::Set(current->GetLabel(), persistent_string); + } + Translate_IOR_to_persistentID (current, engine, isMultiFile, isASCII); + } +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.hxx new file mode 100644 index 000000000..23fea1903 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.hxx @@ -0,0 +1,129 @@ +// File : SALOMEDSImpl_StudyManager.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSImpl_STUDYMANAGER_I_H__ +#define __SALOMEDSImpl_STUDYMANAGER_I_H__ + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_StudyManager, MMgt_TShared ) + +// std C++ headers +#include + +// Cascade headers +#include "SALOMEDSImpl_OCAFApplication.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_Driver.hxx" +#include +#include +#include +#include +#include + +class HDFgroup; + +class SALOMEDSImpl_StudyManager : public MMgt_TShared +{ + +private: + + Handle (SALOMEDSImpl_OCAFApplication) _OCAFApp; + int _IDcounter; + Handle(TDocStd_Document) _clipboard; + TCollection_AsciiString _errorCode; + +public: + + //! standard constructor + Standard_EXPORT SALOMEDSImpl_StudyManager(); + + //! standard destructor + Standard_EXPORT virtual ~SALOMEDSImpl_StudyManager(); + + //! method to Create a New Study of name study_name + Standard_EXPORT virtual Handle(SALOMEDSImpl_Study) NewStudy(const TCollection_AsciiString& study_name); + + //! method to Open a Study from it's persistent reference + Standard_EXPORT virtual Handle(SALOMEDSImpl_Study) Open(const TCollection_AsciiString& aStudyUrl); + + //! method to close a Study + Standard_EXPORT virtual void Close(const Handle(SALOMEDSImpl_Study)& aStudy); + + //! method to save a Study + Standard_EXPORT virtual bool Save(const Handle(SALOMEDSImpl_Study)& aStudy, SALOMEDSImpl_DriverFactory* aFactory, bool theMultiFile); + + Standard_EXPORT virtual bool SaveASCII(const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile); + + //! method to save a Study to the persistent reference aUrl + Standard_EXPORT virtual bool SaveAs(const TCollection_AsciiString& aUrl, + const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile); + + Standard_EXPORT virtual bool SaveAsASCII(const TCollection_AsciiString& aUrl, + const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile); + + //! method to Get name list of open studies in the session + Standard_EXPORT virtual Handle(TColStd_HSequenceOfTransient) GetOpenStudies(); + + //! method to get a Study from it's name + Standard_EXPORT virtual Handle(SALOMEDSImpl_Study) GetStudyByName(const TCollection_AsciiString& aStudyName) ; + + //! method to get a Study from it's ID + Standard_EXPORT virtual Handle(SALOMEDSImpl_Study) GetStudyByID(int aStudyID) ; + + + Standard_EXPORT Handle(TDocStd_Document) GetDocumentOfStudy(const Handle(SALOMEDSImpl_Study)& theStudy); + + Standard_EXPORT Handle(TDocStd_Document) GetClipboard() { return _clipboard; } + + Standard_EXPORT bool CopyLabel(const Handle(SALOMEDSImpl_Study)& theSourceStudy, + SALOMEDSImpl_Driver* theEngine, + const int theSourceStartDepth, + const TDF_Label& theSource, + const TDF_Label& theDestinationMain); + + Standard_EXPORT TDF_Label PasteLabel(const Handle(SALOMEDSImpl_Study)& theDestinationStudy, + SALOMEDSImpl_Driver* theEngine, + const TDF_Label& theSource, + const TDF_Label& theDestinationStart, + const int theCopiedStudyID, + const bool isFirstElement); + + Standard_EXPORT virtual bool CanCopy(const Handle(SALOMEDSImpl_SObject)& theObject, SALOMEDSImpl_Driver* Engine); + Standard_EXPORT virtual bool Copy(const Handle(SALOMEDSImpl_SObject)& theObject, SALOMEDSImpl_Driver* Engine); + Standard_EXPORT virtual bool CanPaste(const Handle(SALOMEDSImpl_SObject)& theObject, SALOMEDSImpl_Driver* Engine); + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) Paste(const Handle(SALOMEDSImpl_SObject)& theObject, SALOMEDSImpl_Driver* Engine); + + // _SaveAs private function called by Save and SaveAs + Standard_EXPORT virtual bool Impl_SaveAs(const TCollection_AsciiString& aUrl, + const Handle(SALOMEDSImpl_Study)& aStudy, + SALOMEDSImpl_DriverFactory* aFactory, + bool theMultiFile, + bool theASCII); + + // _SaveObject private function called by _SaveAs + Standard_EXPORT virtual bool Impl_SaveObject(const Handle(SALOMEDSImpl_SObject)& SC, HDFgroup *hdf_group_datatype); + + // _SubstituteSlash function called by Open and GetStudyByName + Standard_EXPORT virtual TCollection_AsciiString Impl_SubstituteSlash(const TCollection_AsciiString& aUrl); + + Standard_EXPORT virtual bool Impl_SaveProperties(const Handle(SALOMEDSImpl_Study)& aStudy, HDFgroup *hdf_group); + + Standard_EXPORT TCollection_AsciiString GetErrorCode() { return _errorCode; } + Standard_EXPORT virtual bool IsError() { return _errorCode != ""; } + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_StudyManager ) + +}; + +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_Tool.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_Tool.cxx new file mode 100644 index 000000000..1751be62f --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_Tool.cxx @@ -0,0 +1,155 @@ +// File : SALOMEDSImpl_Tool.cxx +// Created : Mon Oct 21 16:24:34 2002 +// Author : Sergey RUIN + +// Project : SALOME +// Module : SALOMEDSImpl +// Copyright : Open CASCADE + +#include "SALOMEDSImpl_Tool.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WNT +#include +#else +#include +#endif +#include + +using namespace std; + + +//============================================================================ +// function : GetTempDir +// purpose : Return a temp directory to store created files like "/tmp/sub_dir/" +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Tool::GetTmpDir() +{ + //Find a temporary directory to store a file + + TCollection_AsciiString aTmpDir; + + char *Tmp_dir = getenv("SALOME_TMP_DIR"); + if(Tmp_dir != NULL) { + aTmpDir = TCollection_AsciiString(Tmp_dir); +#ifdef WIN32 + if(aTmpDir.Value(aTmpDir.Length()) != '\\') aTmpDir+='\\'; +#else + if(aTmpDir.Value(aTmpDir.Length()) != '/') aTmpDir+='/'; +#endif + } + else { +#ifdef WIN32 + aTmpDir = TCollection_AsciiString("C:\\"); +#else + aTmpDir = TCollection_AsciiString("/tmp/"); +#endif + } + + srand((unsigned int)time(NULL)); + int aRND = 999 + (int)(100000.0*rand()/(RAND_MAX+1.0)); //Get a random number to present a name of a sub directory + TCollection_AsciiString aSubDir(aRND); + if(aSubDir.Length() <= 1) aSubDir = TCollection_AsciiString("123409876"); + + aTmpDir += aSubDir; //Get RND sub directory + +#ifdef WIN32 + if(aTmpDir.Value(aTmpDir.Length()) != '\\') aTmpDir+='\\'; +#else + if(aTmpDir.Value(aTmpDir.Length()) != '/') aTmpDir+='/'; +#endif + + OSD_Path aPath(aTmpDir); + OSD_Directory aDir(aPath); + + for(aRND = 0; aDir.Exists(); aRND++) { + aTmpDir.Insert((aTmpDir.Length() - 1), TCollection_AsciiString(aRND)); //Build a unique directory name + aPath = OSD_Path(aTmpDir); + aDir = OSD_Directory(aPath); + } + + OSD_Protection aProtection(OSD_RW, OSD_RWX, OSD_RX, OSD_RX); + aDir.Build(aProtection); + + return aTmpDir; +} + +//============================================================================ +// function : RemoveTemporaryFiles +// purpose : Removes files listed in theFileList +//============================================================================ +void SALOMEDSImpl_Tool::RemoveTemporaryFiles(const TCollection_AsciiString& theDirectory, + const Handle(TColStd_HSequenceOfAsciiString)& theFiles, + const bool IsDirDeleted) +{ + TCollection_AsciiString aDirName = theDirectory; + + int i, aLength = theFiles->Length(); + for(i=1; i<=aLength; i++) { + TCollection_AsciiString aFile(aDirName); + aFile += theFiles->Value(i); + OSD_Path anOSDPath(aFile); + OSD_File anOSDFile(anOSDPath); + if(!anOSDFile.Exists()) continue; + + OSD_Protection aProtection = anOSDFile.Protection(); + aProtection.SetUser(OSD_RW); + anOSDFile.SetProtection(aProtection); + + anOSDFile.Remove(); + } + + if(IsDirDeleted) { + OSD_Path aPath(aDirName); + OSD_Directory aDir(aPath); + OSD_FileIterator anIterator(aPath, '*'); + + if(aDir.Exists() && !anIterator.More()) aDir.Remove(); + } + +} + +//============================================================================ +// function : GetNameFromPath +// purpose : Returns the name by the path +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Tool::GetNameFromPath(const TCollection_AsciiString& thePath) { + if (thePath.IsEmpty()) return ""; + OSD_Path aPath = OSD_Path(thePath); + TCollection_AsciiString aNameString(aPath.Name()); + return aNameString; +} + +//============================================================================ +// function : GetDirFromPath +// purpose : Returns the dir by the path +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_Tool::GetDirFromPath(const TCollection_AsciiString& thePath) { + if (thePath.IsEmpty()) return ""; + OSD_Path aPath = OSD_Path(thePath); + TCollection_AsciiString aDirString(aPath.Trek()); + aDirString.ChangeAll('|','/'); + return aDirString; +} + + + + + + + + + + + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_Tool.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_Tool.hxx new file mode 100644 index 000000000..f842370cd --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_Tool.hxx @@ -0,0 +1,62 @@ +// File : SALOMEDSImpl_Tool.hxx +// Created : Mon Oct 21 16:24:50 2002 +// Author : Sergey RUIN + +// Project : SALOME +// Module : SALOMEDSImpl +// Copyright : Open CASCADE + + +#ifndef __SALOMEDSIMPL_TOOL_H__ +#define __SALOMEDSIMPL_TOOL_H__ + +#include +#include +#include + +class SALOMEDSImpl_Tool +{ + +public: + + // Returns the unique temporary directory, that is defined in SALOME_TMP_DIR if this variable is set + // otherwise return /tmp/something/ for Unix or c:\something\ for WNT + static TCollection_AsciiString GetTmpDir(); + + + // Removes files which are in , the files for deletion are listed in + // if is true is also deleted if it is empty + static void RemoveTemporaryFiles(const TCollection_AsciiString& theDirectory, + const Handle(TColStd_HSequenceOfAsciiString)& theFiles, + const bool IsDirDeleted); + + // Returns the name by the path + // for an example: if thePath = "/tmp/aaa/doc1.hdf" the function returns "doc1" + static TCollection_AsciiString GetNameFromPath(const TCollection_AsciiString& thePath); + + // Returns the directory by the path + // for an example: if thePath = "/tmp/aaa/doc1.hdf" the function returns "/tmp/aaa" + static TCollection_AsciiString GetDirFromPath(const TCollection_AsciiString& thePath); + +}; +#endif + + + + + + + + + + + + + + + + + + + + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.cxx new file mode 100644 index 000000000..36700675a --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.cxx @@ -0,0 +1,391 @@ +// File : SALOMEDSImpl_UseCaseBuilder.cxx +// Author : Sergey RUIN +// Module : SALOME + + +#include "SALOMEDSImpl_UseCaseBuilder.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_Attributes.hxx" + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_UseCaseBuilder, MMgt_TShared ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_UseCaseBuilder, MMgt_TShared ) + + +#define USE_CASE_LABEL_TAG 2 +#define USE_CASE_GUID "AA43BB12-D9CD-11d6-945D-0050DA506788" + + +//============================================================================ +/*! Function : constructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_UseCaseBuilder::SALOMEDSImpl_UseCaseBuilder(const Handle(TDocStd_Document)& theDocument) +:_doc(theDocument) +{ + if(_doc.IsNull()) return; + + TDF_Label aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); //Iterate all use cases + if(!aLabel.FindAttribute(Standard_GUID(USE_CASE_GUID), _root)) { + _root = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, Standard_GUID(USE_CASE_GUID)); + } + + Handle(SALOMEDSImpl_AttributeReference) aRef; + if(!_root->FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aRef)) { + aRef = SALOMEDSImpl_AttributeReference::Set(_root->Label(), _root->Label()); + } + + Handle(SALOMEDSImpl_AttributeName) aNameAttr; + if(!aLabel.FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aNameAttr)) { + aNameAttr = SALOMEDSImpl_AttributeName::Set(aLabel, "Use cases"); + } +} + +//============================================================================ +/*! Function : destructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_UseCaseBuilder::~SALOMEDSImpl_UseCaseBuilder() +{ +} + + +//============================================================================ +/*! Function : Append + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::Append(const Handle(SALOMEDSImpl_SObject)& theObject) +{ + if(_root.IsNull() || theObject.IsNull()) return false; + + TDF_Label aLabel = theObject->GetLabel(); + if(aLabel.IsNull()) return false; + + Handle(SALOMEDSImpl_AttributeTreeNode) aNode, aCurrentNode; + aNode = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, _root->ID()); + aNode->Remove(); + + Handle(SALOMEDSImpl_AttributeReference) aRef; + if(!_root->FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aRef)) { + aRef = SALOMEDSImpl_AttributeReference::Set(_root->Label(), _root->Label()); + } + + TDF_Label aCurrent = aRef->Get(); + if(aCurrent.IsNull() || !aCurrent.FindAttribute(_root->ID(), aCurrentNode)) + aCurrentNode = _root; + + aCurrentNode->Append(aNode); + + return true; +} + + //============================================================================ +/*! Function : Remove + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::Remove(const Handle(SALOMEDSImpl_SObject)& theObject) +{ + if(_root.IsNull() || theObject.IsNull()) return false; + + TDF_Label aLabel = theObject->GetLabel(); + if(aLabel.IsNull()) return false; + + Handle(SALOMEDSImpl_AttributeTreeNode) aNode; + if(!aLabel.FindAttribute(_root->ID(), aNode)) return false; + + aNode->Remove(); + + TDF_AttributeList aList; + aList.Append(aNode); + + Handle(SALOMEDSImpl_AttributeReference) aRef; + if(!_root->FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aRef)) { + aRef = SALOMEDSImpl_AttributeReference::Set(_root->Label(), _root->Label()); + } + TDF_Label aCurrent = aRef->Get(); + + SALOMEDSImpl_ChildNodeIterator aChildItr(aNode, Standard_True); + for(; aChildItr.More(); aChildItr.Next()) + aList.Append(aChildItr.Value()); + + TDF_ListIteratorOfAttributeList anIterator(aList); + for(; anIterator.More(); anIterator.Next()) { + if(anIterator.Value()->Label() == aCurrent) { //The current node is removed + aRef->Set(_root->Label()); //Reset the current node to the root + } + anIterator.Value()->Label().ForgetAttribute(_root->ID()); + } + + return true; +} + + +//============================================================================ +/*! Function : AppendTo + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::AppendTo(const Handle(SALOMEDSImpl_SObject)& theFather, + const Handle(SALOMEDSImpl_SObject)& theObject) +{ + if(_root.IsNull() || theFather.IsNull() || theObject.IsNull()) return false; + + TDF_Label aFatherLabel = theFather->GetLabel(), aLabel = theObject->GetLabel(); + Handle(SALOMEDSImpl_AttributeTreeNode) aFather, aNode; + + if(aFatherLabel.IsNull()) return false; + if(!aFatherLabel.FindAttribute(_root->ID(), aFather)) return false; + + if(aLabel.IsNull()) return false; + if(!aLabel.FindAttribute(_root->ID(), aNode)) { + aNode = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, _root->ID()); + } + + aNode->Remove(); + + return aFather->Append(aNode); +} + +//============================================================================ +/*! Function : InsertBefore + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::InsertBefore(const Handle(SALOMEDSImpl_SObject)& theFirst, + const Handle(SALOMEDSImpl_SObject)& theNext) +{ + if(_root.IsNull() || theFirst.IsNull() || theNext.IsNull()) return false; + + TDF_Label aFirstLabel = theFirst->GetLabel(), aLabel= theNext->GetLabel(); + Handle(SALOMEDSImpl_AttributeTreeNode) aFirstNode, aNode; + + if(aFirstLabel.IsNull()) return false; + if(aFirstLabel.FindAttribute(_root->ID(), aFirstNode)) { + aFirstNode->Remove(); + aFirstLabel.ForgetAttribute(aFirstNode->ID()); + } + + aFirstNode = SALOMEDSImpl_AttributeTreeNode::Set(aFirstLabel, _root->ID()); + + if(aLabel.IsNull()) return false; + if(!aLabel.FindAttribute(_root->ID(), aNode)) return false; + + aFirstNode->Remove(); + + return aNode->InsertBefore(aFirstNode); +} + + +//============================================================================ +/*! Function : SetCurrentObject + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::SetCurrentObject(const Handle(SALOMEDSImpl_SObject)& theObject) +{ + if(_root.IsNull() || theObject.IsNull()) return false; + + TDF_Label aLabel = theObject->GetLabel(); + Handle(SALOMEDSImpl_AttributeTreeNode) aNode; + if(aLabel.IsNull()) return false; + if(!aLabel.FindAttribute(_root->ID(), aNode)) return false; + + + Handle(SALOMEDSImpl_AttributeReference) aRef; + if(!_root->FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aRef)) { + aRef = SALOMEDSImpl_AttributeReference::Set(_root->Label(), aNode->Label()); + } + + aRef->Set(aNode->Label()); + + return true; +} + +//============================================================================ +/*! Function : SetRootCurrent + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::SetRootCurrent() +{ + if(_root.IsNull()) return false; + + Handle(SALOMEDSImpl_AttributeReference) aRef; + if(!_root->FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aRef)) + aRef = SALOMEDSImpl_AttributeReference::Set(_root->Label(), _root->Label()); + + aRef->Set(_root->Label()); + return true; +} + +//============================================================================ +/*! Function : HasChildren + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::HasChildren(const Handle(SALOMEDSImpl_SObject)& theObject) +{ + if(_root.IsNull()) return false; + + TDF_Label aLabel; + if (theObject.IsNull()) aLabel = _root->Label(); + else + aLabel = theObject->GetLabel(); + if(aLabel.IsNull()) return false; + + Handle(SALOMEDSImpl_AttributeTreeNode) aNode; + if(!aLabel.FindAttribute(_root->ID(), aNode)) return false; + + return !(aNode->GetFirst().IsNull()); +} + +//============================================================================ +/*! Function : SetName + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::SetName(const TCollection_AsciiString& theName) { + if(_root.IsNull()) return false; + + Handle(SALOMEDSImpl_AttributeName) aNameAttrib; + + if (!_root->FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aNameAttrib)) + aNameAttrib = SALOMEDSImpl_AttributeName::Set(_root->Label(), theName); + else + aNameAttrib->SetValue(theName); + + return true; +} + + +//============================================================================ +/*! Function : GetCurrentObject + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_UseCaseBuilder::GetCurrentObject() +{ + if(_root.IsNull()) return NULL; + + Handle(SALOMEDSImpl_AttributeReference) aRef; + if(!_root->FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aRef)) { + aRef = SALOMEDSImpl_AttributeReference::Set(_root->Label(), _root->Label()); + } + TDF_Label aCurrent = aRef->Get(); + if(aCurrent.IsNull()) return NULL; + + return SALOMEDSImpl_Study::SObject(aCurrent); +} + +//============================================================================ +/*! Function : GetName + * Purpose : + */ +//============================================================================ +TCollection_AsciiString SALOMEDSImpl_UseCaseBuilder::GetName() +{ + TCollection_AsciiString aString; + if(_root.IsNull()) return aString; + + Handle(SALOMEDSImpl_AttributeName) aName; + if (!_root->FindAttribute(SALOMEDSImpl_AttributeName::GetID(), aName)) return aString; + aString = TCollection_AsciiString(aName->Value()); + return aString; +} + +//============================================================================ +/*! Function : IsUseCase + * Purpose : + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseBuilder::IsUseCase(const Handle(SALOMEDSImpl_SObject)& theObject) +{ + if(theObject.IsNull()) return false; + TDF_Label aFather, aLabel = theObject->GetLabel(); + aFather = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); + if(aLabel.Father() == aFather) return true; + return false; +} + +//============================================================================ +/*! Function : NewUseCase + * Purpose : + */ +//============================================================================ +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_UseCaseBuilder::AddUseCase(const TCollection_AsciiString& theName) +{ + Standard_GUID aBasicGUID(USE_CASE_GUID); + + //Create a use cases structure if it not exists + + Handle(SALOMEDSImpl_AttributeTreeNode) aFatherNode, aNode; + Handle(SALOMEDSImpl_AttributeInteger) anInteger; + Handle(SALOMEDSImpl_AttributeReference) aRef; + + TDF_Label aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); + + if(!_root->FindAttribute(SALOMEDSImpl_AttributeReference::GetID(), aRef)) { + aRef = SALOMEDSImpl_AttributeReference::Set(aLabel, aLabel); + } + + if(!aRef->Get().FindAttribute(aBasicGUID, aFatherNode)) { + aFatherNode = SALOMEDSImpl_AttributeTreeNode::Set(aRef->Get(), aBasicGUID); + } + + if(!_root->FindAttribute(SALOMEDSImpl_AttributeInteger::GetID(), anInteger)) { + anInteger = SALOMEDSImpl_AttributeInteger::Set(aLabel, 0); + } + + //Create a new use case + anInteger->SetValue(anInteger->Value()+1); + TDF_Label aChild = aLabel.FindChild(anInteger->Value()); + aNode = SALOMEDSImpl_AttributeTreeNode::Set(aChild, aBasicGUID); + aNode->Remove(); + aFatherNode->Append(aNode); + SALOMEDSImpl_AttributeName::Set(aChild, theName); + + return SALOMEDSImpl_Study::SObject(aChild); +} + +//============================================================================ +/*! Function : GetUseCaseIterator + * Purpose : Creates a new UseCase iterator, if anObject is null all use cases are iterated + */ +//============================================================================ +Handle(SALOMEDSImpl_UseCaseIterator) +SALOMEDSImpl_UseCaseBuilder::GetUseCaseIterator(const Handle(SALOMEDSImpl_SObject)& theObject) +{ + TDF_Label aLabel; + + if(!theObject.IsNull()) { + aLabel = theObject->GetLabel(); //Iterate only sub tree in the use case + } + else { + aLabel = _doc->Main().Root().FindChild(USE_CASE_LABEL_TAG); //Iterate all use cases + } + + return new SALOMEDSImpl_UseCaseIterator(aLabel, USE_CASE_GUID, false); +} + + +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_UseCaseBuilder::GetSObject(const TCollection_AsciiString& theEntry) +{ + TDF_Label aLabel; + TDF_Tool::Label(_doc->GetData(), theEntry, aLabel); + return SALOMEDSImpl_Study::SObject(aLabel); +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.hxx new file mode 100644 index 000000000..a0a0d938b --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.hxx @@ -0,0 +1,67 @@ +// File : SALOMEDSImpl_UseCaseBuilder.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSIMPL_USECaseBuilder_H__ +#define __SALOMEDSIMPL_USECaseBuilder_H__ + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_UseCaseBuilder, MMgt_TShared ) + +// Cascade headers +#include +#include +#include +#include + +#include "SALOMEDSImpl_UseCaseIterator.hxx" + +class SALOMEDSImpl_UseCaseBuilder : public MMgt_TShared +{ +private: + + Handle(SALOMEDSImpl_AttributeTreeNode) _root; + Handle(TDocStd_Document) _doc; + +public: + + //! standard constructor + Standard_EXPORT SALOMEDSImpl_UseCaseBuilder(const Handle(TDocStd_Document)& theDocument); + + //! standard destructor + Standard_EXPORT ~SALOMEDSImpl_UseCaseBuilder(); + + Standard_EXPORT virtual bool Append(const Handle(SALOMEDSImpl_SObject)& theObject); + + Standard_EXPORT virtual bool Remove(const Handle(SALOMEDSImpl_SObject)& theObject); + + Standard_EXPORT virtual bool AppendTo(const Handle(SALOMEDSImpl_SObject)& theFather, const Handle(SALOMEDSImpl_SObject)& theObject); + + Standard_EXPORT virtual bool InsertBefore(const Handle(SALOMEDSImpl_SObject)& theFirst, const Handle(SALOMEDSImpl_SObject)& theNext); + + Standard_EXPORT virtual bool SetCurrentObject(const Handle(SALOMEDSImpl_SObject)& theObject); + + Standard_EXPORT virtual bool SetRootCurrent(); + + Standard_EXPORT virtual bool HasChildren(const Handle(SALOMEDSImpl_SObject)& theObject); + + Standard_EXPORT virtual bool IsUseCase(const Handle(SALOMEDSImpl_SObject)& theObject); + + Standard_EXPORT virtual bool SetName(const TCollection_AsciiString& theName); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) GetCurrentObject(); + + Standard_EXPORT virtual TCollection_AsciiString GetName(); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_SObject) AddUseCase(const TCollection_AsciiString& theName); + + Standard_EXPORT virtual Handle(SALOMEDSImpl_UseCaseIterator) GetUseCaseIterator(const Handle(SALOMEDSImpl_SObject)& anObject); + + Standard_EXPORT Handle(SALOMEDSImpl_SObject) GetSObject(const TCollection_AsciiString& theEntry); + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_UseCaseBuilder ) +}; +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseIterator.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseIterator.cxx new file mode 100644 index 000000000..7c32150d2 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseIterator.cxx @@ -0,0 +1,80 @@ +// File : SALOMEDSImpl_UseCaseIterator.cxx +// Author : Serge RUIN +// Module : SALOME + +#include "SALOMEDSImpl_UseCaseIterator.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_Study.hxx" + +using namespace std; + +IMPLEMENT_STANDARD_HANDLE( SALOMEDSImpl_UseCaseIterator, MMgt_TShared ) +IMPLEMENT_STANDARD_RTTIEXT( SALOMEDSImpl_UseCaseIterator, MMgt_TShared ) + +//============================================================================ +/*! Function : constructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_UseCaseIterator::SALOMEDSImpl_UseCaseIterator(const TDF_Label& theLabel, + const Standard_GUID& theGUID, + const bool allLevels) +:_guid(theGUID), _levels(allLevels) +{ + if(theLabel.FindAttribute(_guid, _node)) { + _it.Initialize (_node, _levels); + } +} + +//============================================================================ +/*! Function : destructor + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_UseCaseIterator::~SALOMEDSImpl_UseCaseIterator() +{ +} + +//============================================================================ +/*! Function :Init + * + */ +//============================================================================ +void SALOMEDSImpl_UseCaseIterator::Init(bool allLevels) +{ + _it.Initialize (_node, allLevels); +} + +//============================================================================ +/*! Function : More + * + */ +//============================================================================ +bool SALOMEDSImpl_UseCaseIterator::More() +{ + return _it.More(); +} + + //============================================================================ +/*! Function : Next + * + */ +//============================================================================ +void SALOMEDSImpl_UseCaseIterator::Next() +{ + _it.Next(); +} + + +//============================================================================ +/*! Function : + * Purpose : + */ +//============================================================================ + +Handle(SALOMEDSImpl_SObject) SALOMEDSImpl_UseCaseIterator::Value() +{ + TDF_Label L = _it.Value()->Label(); + return SALOMEDSImpl_Study::SObject(L); +} + diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseIterator.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseIterator.hxx new file mode 100644 index 000000000..171bcc571 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_UseCaseIterator.hxx @@ -0,0 +1,47 @@ +// File : SALOMEDSImpl_UseCaseIterator.hxx +// Author : Sergey RUIN +// Module : SALOME + +#ifndef __SALOMEDSIMPL_USECASEITERATOR_H__ +#define __SALOMEDSIMPL_USECASEITERATOR_H__ + +//Handle definition +#include +#include +DEFINE_STANDARD_HANDLE( SALOMEDSImpl_UseCaseIterator, MMgt_TShared ) + +#include "SALOMEDSImpl_SObject.hxx" + +// Cascade headers +#include +#include +#include + +class SALOMEDSImpl_UseCaseIterator : public MMgt_TShared +{ + +private: + Standard_GUID _guid; + bool _levels; + Handle(SALOMEDSImpl_AttributeTreeNode) _node; + SALOMEDSImpl_ChildNodeIterator _it; + +public: + + //! standard constructor + SALOMEDSImpl_UseCaseIterator(const TDF_Label& theLabel, + const Standard_GUID& theGUID, + const bool allLevels); + + //! standard destructor + ~SALOMEDSImpl_UseCaseIterator(); + + virtual void Init(bool); + virtual bool More(); + virtual void Next(); + virtual Handle(SALOMEDSImpl_SObject) Value(); + +public: + DEFINE_STANDARD_RTTI( SALOMEDSImpl_UseCaseIterator ) +}; +#endif diff --git a/src/SALOMEDSImpl/testDS.cxx b/src/SALOMEDSImpl/testDS.cxx new file mode 100644 index 000000000..ddc1bfd1e --- /dev/null +++ b/src/SALOMEDSImpl/testDS.cxx @@ -0,0 +1,78 @@ +//File: testDS.cxx +//Author: Sergey RUIN + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "SALOMEDSImpl_Attributes.hxx" +#include "SALOMEDSImpl_StudyManager.hxx" +#include "SALOMEDSImpl_Study.hxx" +#include "SALOMEDSImpl_StudyBuilder.hxx" +#include "SALOMEDSImpl_SObject.hxx" +#include "SALOMEDSImpl_SComponent.hxx" +//#include "SALOMEDSImpl_.hxx" + +int main (int argc, char * argv[]) +{ + cout << "Test started " << endl; + + Handle(SALOMEDSImpl_StudyManager) aSM = new SALOMEDSImpl_StudyManager(); + cout << "Manager is created " << endl; + Handle(SALOMEDSImpl_Study) aStudy = aSM->NewStudy("SRN"); + cout << "Study with id = " << aStudy->StudyId() << " is created " << endl; + Handle(SALOMEDSImpl_StudyBuilder) aBuilder = aStudy->NewBuilder(); + cout << "StudyBuilder is created " << endl; + Handle(SALOMEDSImpl_SComponent) aSC = aBuilder->NewComponent("TEST"); + cout << "New component with type " << aSC->ComponentDataType() << " is created " << endl; + Handle(SALOMEDSImpl_SObject) aSO = aBuilder->NewObject(aSC); + cout << "New SObject with ID = " << aSO->GetID() << " is created" << endl; + TCollection_AsciiString anEntry; + TDF_Tool::Entry(aSO->GetLabel(), anEntry); + cout << "An entry of newly created SO is " << anEntry << endl; + Handle(SALOMEDSImpl_AttributeIOR) aIORA = SALOMEDSImpl_AttributeIOR::Set(aSO->GetLabel(), "ior1234"); + cout << "New AttributeIOR is created, it contains " << aIORA->Value() << endl; + Handle(SALOMEDSImpl_GenericAttribute) ga = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(aIORA); + cout << "Attribute has type: " << ga->Type() << " and value: " << ga->Save() << endl; + cout << "Just another way to create an attribute: official one :) " << endl; + Handle(TDF_Attribute) aTDFAttr = aBuilder->FindOrCreateAttribute(aSO, "AttributeName"); + Handle(SALOMEDSImpl_AttributeName) aRN = Handle(SALOMEDSImpl_AttributeName)::DownCast(aTDFAttr); + aRN->SetValue("name_attribute"); + cout << " The type = " << aRN->Type() << endl; + ga = Handle(SALOMEDSImpl_GenericAttribute)::DownCast(aRN); + cout << "Attribute has type: " << ga->Type() << " and value: " << ga->Save() << endl; + cout << "Check GetObjectPath: " << aStudy->GetObjectPath(aSO) << endl; + + Handle(SALOMEDSImpl_SObject) aSubSO = aBuilder->NewObject(aSO); + aTDFAttr = aBuilder->FindOrCreateAttribute(aSubSO, "AttributeIOR"); + Handle(SALOMEDSImpl_AttributeIOR) aIOR2 = Handle(SALOMEDSImpl_AttributeIOR)::DownCast(aTDFAttr); + aIOR2->SetValue("some ior"); + aBuilder->Addreference(aSubSO, aSO); + Handle(SALOMEDSImpl_SObject) aRefObject; + aSubSO->ReferencedObject(aRefObject); + cout << "Check reference : ReferencedObject is " << aRefObject->GetID() << endl; + cout << "Check : Remove object: " << endl; + aBuilder->RemoveObject(aSubSO); + cout << "Remove: done" << endl; + + cout << "Check the attributes on SObject" << endl; + Handle(TColStd_HSequenceOfTransient) aSeq = aSO->GetAllAttributes(); + for(int i = 1; i <= aSeq->Length(); i++) + cout << "Found: " << Handle(SALOMEDSImpl_GenericAttribute)::DownCast(aSeq->Value(i))->Type() << endl; + + cout << "Check AttributeTreeNode " << endl; + aTDFAttr = aBuilder->FindOrCreateAttribute(aSO, "AttributeTreeNode"); + cout << Handle(SALOMEDSImpl_GenericAttribute)::DownCast(aTDFAttr)->Type() << endl; + cout << "Check AttributeTreeNode : done " << endl; + + cout << "Test finished " << endl; + return 0; +} + diff --git a/src/SALOMELocalTrace/BaseTraceCollector.cxx b/src/SALOMELocalTrace/BaseTraceCollector.cxx new file mode 100644 index 000000000..de6121897 --- /dev/null +++ b/src/SALOMELocalTrace/BaseTraceCollector.cxx @@ -0,0 +1,68 @@ +// Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BaseTraceCollector.cxx +// Author : Paul RASCLE (EDF) +// Module : KERNEL +// $Header$ + +#include +#include +#include +#include + +using namespace std; + +#include "BaseTraceCollector.hxx" +#include "LocalTraceBufferPool.hxx" + +// Class attributes initialisation, for class method BaseTraceCollector::run + +BaseTraceCollector* BaseTraceCollector::_singleton = 0; +pthread_mutex_t BaseTraceCollector::_singletonMutex; +sem_t BaseTraceCollector::_sem; +int BaseTraceCollector::_threadToClose = 0; +pthread_t* BaseTraceCollector::_threadId = 0; // used to control single run + +// ============================================================================ +/*! + * Destructor: virtual, implemented in derived classes. + * Wait until printing thread ends (BaseTraceCollector::run) + */ +// ============================================================================ + +BaseTraceCollector:: ~BaseTraceCollector() +{ +} + +// ============================================================================ +/*! + * Constructor: no need of LocalTraceBufferPool object initialization here, + * thread safe singleton used in LocalTraceBufferPool::instance() + * See derived classes. + */ +// ============================================================================ + +BaseTraceCollector::BaseTraceCollector() +{ +} + + diff --git a/src/SALOMELocalTrace/BaseTraceCollector.hxx b/src/SALOMELocalTrace/BaseTraceCollector.hxx new file mode 100644 index 000000000..dad4d9e0b --- /dev/null +++ b/src/SALOMELocalTrace/BaseTraceCollector.hxx @@ -0,0 +1,66 @@ +// Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : BaseTraceCollector.hxx +// Author : Paul RASCLE (EDF) +// Module : KERNEL +// $Header$ + +#ifndef _BASETRACECOLLECTOR_HXX_ +#define _BASETRACECOLLECTOR_HXX_ + +#include +#include + + +#if defined SALOMELOCALTRACE_EXPORTS +#if defined WIN32 +#define SALOMELOCALTRACE_EXPORT __declspec( dllexport ) +#else +#define SALOMELOCALTRACE_EXPORT +#endif +#else +#if defined WNT +#define SALOMELOCALTRACE_EXPORT __declspec( dllimport ) +#else +#define SALOMELOCALTRACE_EXPORT +#endif +#endif + +//! See derived Classes in SALOMELocalTrace for usage without CORBA, +//! see derived Classes in SALOMETraceCollector for usage with CORBA. + +class SALOMELOCALTRACE_EXPORT BaseTraceCollector +{ + public: + virtual ~BaseTraceCollector(); + + protected: + BaseTraceCollector(); + + static int _threadToClose; + static BaseTraceCollector* _singleton; + static pthread_mutex_t _singletonMutex; + static pthread_t* _threadId; + static sem_t _sem; +}; + +#endif diff --git a/src/SALOMELocalTrace/FileTraceCollector.cxx b/src/SALOMELocalTrace/FileTraceCollector.cxx new file mode 100644 index 000000000..ce198400f --- /dev/null +++ b/src/SALOMELocalTrace/FileTraceCollector.cxx @@ -0,0 +1,202 @@ +// Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : FileTraceCollector.cxx +// Author : Paul RASCLE (EDF) +// Module : KERNEL +// $Header$ + +#include +#include +#include +#include + +using namespace std; + +#include "FileTraceCollector.hxx" + +// Class attributes initialisation, for class method FileTraceCollector::run + +std::string FileTraceCollector::_fileName = ""; + +// ============================================================================ +/*! + * This class is for use without CORBA, inside or outside SALOME. + * SALOME uses SALOMETraceCollector, to allow trace collection via CORBA. + * Type of trace (and corresponding class) is choosen in LocalTraceBufferPool. + * + * Guarantees a unique object instance of the class (singleton thread safe) + * a separate thread for loop to print traces is launched. + */ +// ============================================================================ + +BaseTraceCollector* FileTraceCollector::instance(const char *fileName) +{ + if (_singleton == 0) // no need of lock when singleton already exists + { + int ret; + ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone + if (_singleton == 0) // another thread may have got + { // the lock after the first test + DEVTRACE("FileTraceCollector:: instance()"); + _singleton = new FileTraceCollector(); + _fileName = fileName; + DEVTRACE(" _fileName: " << _fileName); + + sem_init(&_sem,0,0); // to wait until run thread is initialized + pthread_t traceThread; + int bid; + int re2 = pthread_create(&traceThread, NULL, + FileTraceCollector::run, (void *)bid); + sem_wait(&_sem); + DEVTRACE("FileTraceCollector:: instance()-end"); + } + ret = pthread_mutex_unlock(&_singletonMutex); // release lock + } + return _singleton; +} + +// ============================================================================ +/*! + * In a separate thread, loop to print traces. + * Mutex garantees intialisation on instance method is done and only one run + * allowed (double check ...) + * Loop until there is no more buffer to print, + * and no ask for end from destructor. + * Get a buffer. If type = ABORT then exit application with message. + */ +// ============================================================================ + +void* FileTraceCollector::run(void *bid) +{ + _threadId = new pthread_t; + *_threadId = pthread_self(); + sem_post(&_sem); // unlock instance + + LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance(); + LocalTrace_TraceInfo myTrace; + + // --- opens a file with append mode + // so, several processes can share the same file + + ofstream traceFile; + const char *theFileName = _fileName.c_str(); + traceFile.open(theFileName, ios::out | ios::app); + if (!traceFile) + { + cerr << "impossible to open trace file "<< theFileName << endl; + exit (1); + } + + // --- Loop until there is no more buffer to print, + // and no ask for end from destructor. + + while ((!_threadToClose) || myTraceBuffer->toCollect() ) + { + if (_threadToClose) + { + DEVTRACE("FileTraceCollector _threadToClose"); + //break; + } + + int fullBuf = myTraceBuffer->retrieve(myTrace); + if (myTrace.traceType == ABORT_MESS) + { +#ifndef WNT + traceFile << "INTERRUPTION from thread " << myTrace.threadId + << " : " << myTrace.trace; +#else + traceFile << "INTERRUPTION from thread " + << (void*)(&myTrace.threadId) + << " : " << myTrace.trace; +#endif + traceFile.close(); + cout << flush ; +#ifndef WNT + cerr << "INTERRUPTION from thread " << myTrace.threadId + << " : " << myTrace.trace; +#else + cerr << "INTERRUPTION from thread " << (void*)(&myTrace.threadId) + << " : " << myTrace.trace; +#endif + cerr << flush ; + exit(1); + } + else + { +#ifndef WNT + traceFile << "th. " << myTrace.threadId + << " " << myTrace.trace; +#else + traceFile << "th. " << (void*)(&myTrace.threadId) + << " " << myTrace.trace; +#endif + } + } + DEVTRACE("traceFile.close()"); + traceFile.close(); + DEVTRACE("traceFile.close()_end"); + pthread_exit(NULL); +} + +// ============================================================================ +/*! + * Destructor: wait until printing thread ends (FileTraceCollector::run) + */ +// ============================================================================ + +FileTraceCollector:: ~FileTraceCollector() +{ + int ret; + ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone + if (_singleton) + { + DEVTRACE("FileTraceCollector:: ~FileTraceCollector()"); + LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance(); + _threadToClose = 1; + myTraceBuffer->insert(NORMAL_MESS,"end of trace\n"); // to wake up thread + if (_threadId) + { + int ret = pthread_join(*_threadId, NULL); + if (ret) cerr << "error close FileTraceCollector : "<< ret << endl; + else DEVTRACE("FileTraceCollector destruction OK"); + _threadId = 0; + _threadToClose = 0; + } + _singleton = 0; + ret = pthread_mutex_unlock(&_singletonMutex); // release lock + } +} + +// ============================================================================ +/*! + * Constructor: no need of LocalTraceBufferPool object initialization here, + * thread safe singleton used in LocalTraceBufferPool::instance() + */ +// ============================================================================ + +FileTraceCollector::FileTraceCollector() +{ + _threadId=0; + _threadToClose = 0; +} + + diff --git a/src/SALOMELocalTrace/FileTraceCollector.hxx b/src/SALOMELocalTrace/FileTraceCollector.hxx new file mode 100644 index 000000000..e25a3a182 --- /dev/null +++ b/src/SALOMELocalTrace/FileTraceCollector.hxx @@ -0,0 +1,50 @@ +// Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// +// File : FileTraceCollector.hxx +// Author : Paul RASCLE (EDF) +// Module : KERNEL +// $Header$ + +#ifndef _FILETRACECOLLECTOR_HXX_ +#define _FILETRACECOLLECTOR_HXX_ + +#include +#include "LocalTraceBufferPool.hxx" +#include "BaseTraceCollector.hxx" + +//! See also other derived Classes in SALOMELocalTrace for usage without CORBA, +//! see also derived Classes in SALOMETraceCollector for usage with CORBA. + +class SALOMELOCALTRACE_EXPORT FileTraceCollector : public BaseTraceCollector +{ + public: + static BaseTraceCollector* instance(const char *fileName); + static void *run(void *bid); + ~FileTraceCollector(); + + protected: + FileTraceCollector(); + + static std::string _fileName; +}; + +#endif diff --git a/src/SALOMELocalTrace/LocalTraceBufferPool.cxx b/src/SALOMELocalTrace/LocalTraceBufferPool.cxx index 8a997221a..d875fe5be 100644 --- a/src/SALOMELocalTrace/LocalTraceBufferPool.cxx +++ b/src/SALOMELocalTrace/LocalTraceBufferPool.cxx @@ -26,22 +26,51 @@ #include #include +#include + +#ifndef WNT +#include +#else +#endif #include "LocalTraceBufferPool.hxx" +#include "BaseTraceCollector.hxx" +#include "LocalTraceCollector.hxx" +#include "FileTraceCollector.hxx" +#include "BasicsGenericDestructor.hxx" #include "utilities.h" using namespace std; // In case of truncated message, end of trace contains "...\n\0" + #define TRUNCATED_MESSAGE "...\n" #define MAXMESS_LENGTH MAX_TRACE_LENGTH-5 +// Class static attributes initialisation + LocalTraceBufferPool* LocalTraceBufferPool::_singleton = 0; +#ifndef WNT pthread_mutex_t LocalTraceBufferPool::_singletonMutex; +#else +pthread_mutex_t LocalTraceBufferPool::_singletonMutex = + PTHREAD_MUTEX_INITIALIZER; +#endif +BaseTraceCollector *LocalTraceBufferPool::_myThreadTrace = 0; // ============================================================================ /*! - * guarantees a unique object instance of the class (singleton thread safe) + * Guarantees a unique object instance of the class (singleton thread safe). + * When the LocalTraceBufferPool instance is created, the trace collector is + * also created (singleton). Type of trace collector to create depends on + * environment variable "SALOME_trace": + * - "local" implies standard err trace, LocalTraceCollector is launched. + * - "file" implies trace in /tmp/tracetest.log + * - "file:pathname" implies trace in file pathname + * - anything else like "other" : try to load dynamically a library named + * otherTraceCollector, and invoque C method instance() to start a singleton + * instance of the trace collector. Example: with_loggerTraceCollector, for + * CORBA Log. */ // ============================================================================ @@ -54,6 +83,63 @@ LocalTraceBufferPool* LocalTraceBufferPool::instance() if (_singleton == 0) // another thread may have got { // the lock after the first test _singleton = new LocalTraceBufferPool(); + + DESTRUCTOR_OF *ptrDestroy = + new DESTRUCTOR_OF (*_singleton); + + // --- start a trace Collector + + char* traceKind = getenv("SALOME_trace"); + assert(traceKind); + //cerr<<"SALOME_trace="< strlen("file")) + fileName = &traceKind[strlen("file")+1]; + else + fileName = "/tmp/tracetest.log"; + + _myThreadTrace = FileTraceCollector::instance(fileName); + } + else // --- try a dynamic library + { + void* handle; +#ifndef WNT + string impl_name = string ("lib") + traceKind + + string("TraceCollector.so"); + handle = dlopen( impl_name.c_str() , RTLD_LAZY ) ; +#else + string impl_name = string ("lib") + traceKind + string(".dll"); + handle = dlopen( impl_name.c_str() , 0 ) ; +#endif + if ( handle ) + { + typedef BaseTraceCollector * (*FACTORY_FUNCTION) (void); + FACTORY_FUNCTION TraceCollectorFactory = + (FACTORY_FUNCTION) dlsym(handle, "SingletonInstance"); + char *error ; + if ( (error = dlerror() ) != NULL) + { + cerr << "Can't resolve symbol: SingletonInstance" < #include +#include "BaseTraceCollector.hxx" +#include "BasicsGenericDestructor.hxx" #define ABORT_MESS 1 // for traceType field in struct LocalTrace_TraceInfo #define NORMAL_MESS 0 -struct LocalTrace_TraceInfo +struct SALOMELOCALTRACE_EXPORT LocalTrace_TraceInfo { char trace[MAX_TRACE_LENGTH]; pthread_t threadId; @@ -42,22 +44,24 @@ struct LocalTrace_TraceInfo int position; // to check sequence }; -class LocalTraceBufferPool +class SALOMELOCALTRACE_EXPORT LocalTraceBufferPool : public PROTECTED_DELETE { public: static LocalTraceBufferPool* instance(); int insert(int traceType, const char* msg); int retrieve(LocalTrace_TraceInfo& aTrace); unsigned long toCollect(); - ~LocalTraceBufferPool(); protected: LocalTraceBufferPool(); + virtual ~LocalTraceBufferPool(); unsigned long lockedIncrement(unsigned long& pos); private: static LocalTraceBufferPool* _singleton; static pthread_mutex_t _singletonMutex; + static BaseTraceCollector *_myThreadTrace; + LocalTrace_TraceInfo _myBuffer[TRACE_BUFFER_SIZE]; sem_t _freeBufferSemaphore; // to wait until there is a free buffer sem_t _fullBufferSemaphore; // to wait until there is a buffer to print @@ -65,7 +69,6 @@ class LocalTraceBufferPool unsigned long _position; unsigned long _insertPos; unsigned long _retrievePos; - pthread_t _threadId; }; #endif diff --git a/src/SALOMELocalTrace/LocalTraceCollector.cxx b/src/SALOMELocalTrace/LocalTraceCollector.cxx index e150db6d9..36f4fea93 100644 --- a/src/SALOMELocalTrace/LocalTraceCollector.cxx +++ b/src/SALOMELocalTrace/LocalTraceCollector.cxx @@ -33,31 +33,18 @@ using namespace std; #include "LocalTraceCollector.hxx" -// Class attributes initialisation, for class method LocalTraceCollector::run - -LocalTraceCollector* LocalTraceCollector::_singleton = 0; -pthread_mutex_t LocalTraceCollector::_singletonMutex; -int LocalTraceCollector::_threadToClose = 0; -pthread_t LocalTraceCollector::_threadId = 0; // used to control single run -int LocalTraceCollector::_toFile = 0; -std::string LocalTraceCollector::_fileName = ""; - // ============================================================================ /*! - * This class is for use without CORBA, outside SALOME. + * This class is for use without CORBA, inside or outside SALOME. * SALOME uses SALOMETraceCollector, to allow trace collection via CORBA. + * Type of trace (and corresponding class) is choosen in LocalTraceBufferPool. * - * guarantees a unique object instance of the class (singleton thread safe) + * Guarantees a unique object instance of the class (singleton thread safe) * a separate thread for loop to print traces is launched. - * \param typeTrace 0=standard out, 1=file(/tmp/tracetest.log) - * If typeTrace=0, checks environment for "SALOME_trace". Test values in - * the following order: - * - "local" standard out - * - anything else is kept as a file name */ // ============================================================================ -LocalTraceCollector* LocalTraceCollector::instance(int typeTrace) +BaseTraceCollector* LocalTraceCollector::instance() { if (_singleton == 0) // no need of lock when singleton already exists { @@ -67,32 +54,12 @@ LocalTraceCollector* LocalTraceCollector::instance(int typeTrace) { // the lock after the first test _singleton = new LocalTraceCollector(); - _fileName = "/tmp/tracetest.log"; - _toFile=0; - - if (typeTrace) // caller sets a value different from default=0 - _toFile = typeTrace; - else // check environment - { - char* traceKind = getenv("SALOME_trace"); - //cout<<"SALOME_trace="<toCollect() ) + { + if (_threadToClose) { - case 1 : // --- trace to file - { - const char *fileName = _fileName.c_str(); - traceFile.open(fileName, ios::out | ios::app); - if (!traceFile) - { - cerr << "impossible to open trace file "<< fileName << endl; - exit (1); - } - } - break; - - case 0 : ; // --- trace to standard output - default : // --- on standard output, too - break; + DEVTRACE("FileTraceCollector _threadToClose"); + //break; } - // Loop until there is no more buffer to print, - // and no ask for end from destructor. - - while ((!_threadToClose) || myTraceBuffer->toCollect() ) + int fullBuf = myTraceBuffer->retrieve(myTrace); + if (myTrace.traceType == ABORT_MESS) { - int fullBuf = myTraceBuffer->retrieve(myTrace); - if (myTrace.traceType == ABORT_MESS) - { - switch (_toFile) - { - case 1 : // --- trace to file - traceFile << "INTERRUPTION from thread " << myTrace.threadId - << " : " << myTrace.trace; - traceFile.close(); - // no break here ! - case 0 : // --- trace to standard output - default : // --- on standard output, too - cout << flush ; - cerr << "INTERRUPTION from thread " << myTrace.threadId - << " : " << myTrace.trace; - cerr << flush ; - exit(1); - break; - } - } - else - { - switch (_toFile) - { - case 1 : // --- trace to file - traceFile << "th. " << myTrace.threadId - << " " << myTrace.trace; - break; - case 0 : // --- trace to standard output - default : // --- on standard output, too - cout << "th. " << myTrace.threadId << " " << myTrace.trace; - break; - } - } + cout << flush ; +#ifndef WNT + cerr << "INTERRUPTION from thread " << myTrace.threadId + << " : " << myTrace.trace; +#else + cerr << "INTERRUPTION from thread " << (void*)(&myTrace.threadId) + << " : " << myTrace.trace; +#endif + cerr << flush ; + exit(1); + } + else + { + cout << flush ; +#ifndef WNT + cerr << "th. " << myTrace.threadId << " " << myTrace.trace; +#else + cerr << "th. " << (void*)(&myTrace.threadId) + << " " << myTrace.trace; +#endif + cerr << flush ; } - - if (_toFile==1) traceFile.close(); } pthread_exit(NULL); + return NULL; } // ============================================================================ @@ -207,16 +135,25 @@ void* LocalTraceCollector::run(void *bid) LocalTraceCollector:: ~LocalTraceCollector() { - LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance(); - _threadToClose = 1; - myTraceBuffer->insert(NORMAL_MESS,"end of trace "); //needed to wake up thread - if (_threadId) + int ret; + ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone + if (_singleton) { - int ret = pthread_join(_threadId, NULL); - if (ret) cout << "error close LocalTraceCollector : "<< ret << endl; - else cout << "LocalTraceCollector destruction OK" << endl; + DEVTRACE("LocalTraceCollector:: ~LocalTraceCollector()"); + LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance(); + _threadToClose = 1; + myTraceBuffer->insert(NORMAL_MESS,"end of trace\n"); // to wake up thread + if (_threadId) + { + int ret = pthread_join(*_threadId, NULL); + if (ret) cerr << "error close LocalTraceCollector : "<< ret << endl; + else DEVTRACE("LocalTraceCollector destruction OK"); + _threadId = 0; + _threadToClose = 0; + } + _singleton = 0; + ret = pthread_mutex_unlock(&_singletonMutex); // release lock } - delete myTraceBuffer; } // ============================================================================ @@ -229,6 +166,7 @@ LocalTraceCollector:: ~LocalTraceCollector() LocalTraceCollector::LocalTraceCollector() { _threadId=0; + _threadToClose = 0; } diff --git a/src/SALOMELocalTrace/LocalTraceCollector.hxx b/src/SALOMELocalTrace/LocalTraceCollector.hxx index d9ce36f5f..610e40f03 100644 --- a/src/SALOMELocalTrace/LocalTraceCollector.hxx +++ b/src/SALOMELocalTrace/LocalTraceCollector.hxx @@ -29,26 +29,20 @@ #include #include "LocalTraceBufferPool.hxx" +#include "BaseTraceCollector.hxx" -//! See SALOMETraceCollector instead of LocalTraceCollector for SALOME usage +//! See also other derived Classes in SALOMELocalTrace for usage without CORBA, +//! see also derived Classes in SALOMETraceCollector for usage with CORBA. -class LocalTraceCollector +class SALOMELOCALTRACE_EXPORT LocalTraceCollector : public BaseTraceCollector { public: - static LocalTraceCollector* instance(int typeTrace=0); + static BaseTraceCollector* instance(); static void *run(void *bid); ~LocalTraceCollector(); protected: LocalTraceCollector(); - - private: - static int _threadToClose; - static int _toFile; - static LocalTraceCollector* _singleton; - static pthread_mutex_t _singletonMutex; - static pthread_t _threadId; - static std::string _fileName; }; #endif diff --git a/src/SALOMELocalTrace/Makefile.in b/src/SALOMELocalTrace/Makefile.in index 7894a23c0..daf7c9d19 100644 --- a/src/SALOMELocalTrace/Makefile.in +++ b/src/SALOMELocalTrace/Makefile.in @@ -37,18 +37,20 @@ VPATH=.:@srcdir@:@top_srcdir@/idl # header files EXPORT_HEADERS= utilities.h \ LocalTraceBufferPool.hxx \ - LocalTraceCollector.hxx + BaseTraceCollector.hxx EXPORT_PYSCRIPTS = # Libraries targets LIB = libSALOMELocalTrace.la -LIB_SRC = LocalTraceCollector.cxx \ +LIB_SRC = BaseTraceCollector.cxx \ + LocalTraceCollector.cxx \ + FileTraceCollector.cxx \ LocalTraceBufferPool.cxx LIBS= @LIBS@ -#LDFLAGS+= +LDFLAGS+= -lSALOMEBasics @CONCLUDE@ diff --git a/src/SALOMELocalTrace/Test/Makefile.in b/src/SALOMELocalTrace/Test/Makefile.in new file mode 100644 index 000000000..172313ee3 --- /dev/null +++ b/src/SALOMELocalTrace/Test/Makefile.in @@ -0,0 +1,62 @@ +# SALOMELocalTrace : log on local machine +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE (EDF) +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS= SALOMELocalTraceTest.hxx + +EXPORT_PYSCRIPTS = TestSALOMELocalTrace.py + +# Libraries targets + +LIB = libSALOMELocalTraceTest.la +LIB_SRC = SALOMELocalTraceTest.cxx + +# Executables targets + +BIN = TestSALOMELocalTrace +BIN_SRC = + +CXXFLAGS += @CPPUNIT_INCLUDES@ +CPPFLAGS += @CPPUNIT_INCLUDES@ + +LIBS= @LIBS@ @CPPUNIT_LIBS@ + +LDFLAGS+= -lSALOMELocalTrace + +LDFLAGSFORBIN+= \ + -lSALOMELocalTraceTest -lSALOMELocalTrace -lSALOMEBasics + +@CONCLUDE@ diff --git a/src/SALOMELocalTrace/Test/SALOMELocalTraceTest.cxx b/src/SALOMELocalTrace/Test/SALOMELocalTraceTest.cxx new file mode 100644 index 000000000..087ef940c --- /dev/null +++ b/src/SALOMELocalTrace/Test/SALOMELocalTraceTest.cxx @@ -0,0 +1,169 @@ + +#include "SALOMELocalTraceTest.hxx" + +#include +#include +#include +#include +#include "LocalTraceBufferPool.hxx" +#include "utilities.h" + +using namespace std; + + +// ============================================================================ +/*! + * + */ +// ============================================================================ + +void +SALOMELocalTraceTest::setUp() +{ +} + +// ============================================================================ +/*! + * + */ +// ============================================================================ + +void +SALOMELocalTraceTest::tearDown() +{ +} + +#define TRACEFILE "/tmp/traceUnitTest.log" + +// ============================================================================ +/*! + * Open and close a trace on a file, test singleton + */ +// ============================================================================ + +void +SALOMELocalTraceTest::testSingletonBufferPool() +{ + // --- trace on file + char *theFileName = TRACEFILE; + + string s = "file:"; + s += theFileName; + CPPUNIT_ASSERT(! setenv("SALOME_trace",s.c_str(),1)); // 1: overwrite + + ofstream traceFile; + traceFile.open(theFileName, ios::out | ios::app); + CPPUNIT_ASSERT(traceFile); // file created empty, then closed + traceFile.close(); + + LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance(); + CPPUNIT_ASSERT(bp1); + LocalTraceBufferPool* bp2 = LocalTraceBufferPool::instance(); + CPPUNIT_ASSERT(bp1 == bp2); + bp1->deleteInstance(bp1); +} + + + +#define NUM_THREADS 2 +#define NUM_MESSAGES 5 +void *PrintHello(void *threadid); + +// ============================================================================ +/*! + * open a trace on console, multithread writing on file, close + */ +// ============================================================================ + +void +SALOMELocalTraceTest::testLoadBufferPoolLocal() +{ + string s = "local"; + CPPUNIT_ASSERT(! setenv("SALOME_trace",s.c_str(),1)); // 1: overwrite + + // --- numThread thread creation for trace generation. + int numThread = 2; + pthread_t threads[numThread]; + int rc, t; + for(t=0;tdeleteInstance(bp1); +} + +// ============================================================================ +/*! + * open a trace on a file, multithread writing on file, close + */ +// ============================================================================ + +void +SALOMELocalTraceTest::testLoadBufferPoolFile() +{ + char *theFileName = TRACEFILE; + + string s = "file:"; + s += theFileName; + //s = "local"; + CPPUNIT_ASSERT(! setenv("SALOME_trace",s.c_str(),1)); // 1: overwrite + + ofstream traceFile; + traceFile.open(theFileName, ios::out | ios::trunc); + CPPUNIT_ASSERT(traceFile); // file created empty, then closed + traceFile.close(); + + // --- NUM_THREADS thread creation for trace generation. + + pthread_t threads[NUM_THREADS]; + int rc, t; + for(t=0;tdeleteInstance(bp1); +} + +// ============================================================================ +/*! + * NUM_THREAD are created with function PrintHello, + * which produces NUM_MESSAGES traces. + */ +// ============================================================================ + +void *PrintHello(void *threadid) +{ + int id_thread = (int)threadid; + for (int i=0; i + +class SALOMELocalTraceTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( SALOMELocalTraceTest ); + CPPUNIT_TEST( testSingletonBufferPool ); + CPPUNIT_TEST( testLoadBufferPoolLocal ); + CPPUNIT_TEST( testLoadBufferPoolFile ); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp(); + void tearDown(); + + void testSingletonBufferPool(); + void testLoadBufferPoolLocal(); + void testLoadBufferPoolFile(); +}; + +#endif diff --git a/src/SALOMELocalTrace/Test/TestSALOMELocalTrace.cxx b/src/SALOMELocalTrace/Test/TestSALOMELocalTrace.cxx new file mode 100644 index 000000000..3af9746b6 --- /dev/null +++ b/src/SALOMELocalTrace/Test/TestSALOMELocalTrace.cxx @@ -0,0 +1,12 @@ + +// --- include all Unit Test from basics until the present directory + +#include "SALOMELocalTraceTest.hxx" + +// --- Registers the fixture into the 'registry' + +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMELocalTraceTest ); + +// --- generic Main program from Basic/Test + +#include "BasicMainTest.hxx" diff --git a/src/SALOMELocalTrace/Test/TestSALOMELocalTrace.py b/src/SALOMELocalTrace/Test/TestSALOMELocalTrace.py new file mode 100644 index 000000000..b909fa482 --- /dev/null +++ b/src/SALOMELocalTrace/Test/TestSALOMELocalTrace.py @@ -0,0 +1,16 @@ + +import sys, os,signal,string,commands +import runSalome + +# get SALOME environment : +# here we need KERNEL_ROOT_DIR, PATH, LD_LIBRARY_PATH + +args, modules_list, modules_root_dir = runSalome.get_config() +runSalome.set_env(args, modules_list, modules_root_dir) + +# execute Unit Test + +command = ['TestSALOMELocalTrace'] +ret = os.spawnvp(os.P_WAIT, command[0], command) + +# no process to kill diff --git a/src/SALOMELocalTrace/utilities.h b/src/SALOMELocalTrace/utilities.h index 40238630f..654f61506 100644 --- a/src/SALOMELocalTrace/utilities.h +++ b/src/SALOMELocalTrace/utilities.h @@ -52,18 +52,25 @@ #define MESS_INIT(deb) std::ostringstream os; os<insert(NORMAL_MESS, os.str().c_str()); -#define MESS_ABORT endl; LocalTraceBufferPool::instance()->insert(ABORT_MESS, os.str().c_str()); +#define MESS_END std::endl; LocalTraceBufferPool::instance()->insert(NORMAL_MESS, os.str().c_str()); +#define MESS_ABORT std::endl; LocalTraceBufferPool::instance()->insert(ABORT_MESS, os.str().c_str()); // --- Some macros are always defined (without _DEBUG_): for use with release version #define INFOS(msg) {MESS_BEGIN("- Trace ") << msg << MESS_END} #define PYSCRIPT(msg) {MESS_INIT("---PYSCRIPT--- ") << msg << MESS_END} #define INTERRUPTION(msg) {MESS_BEGIN("- INTERRUPTION: ")<< msg << MESS_ABORT} -#define IMMEDIATE_ABORT(code) {cout < #include CORBA_CLIENT_HEADER(Logger) // Class attributes initialisation, for class method SALOMETraceCollector::run -SALOMETraceCollector* SALOMETraceCollector::_singleton = 0; -pthread_mutex_t SALOMETraceCollector::_singletonMutex; -int SALOMETraceCollector::_threadToClose = 0; -pthread_t SALOMETraceCollector::_threadId = 0; // used to control single run -int SALOMETraceCollector::_toFile = 0; -std::string SALOMETraceCollector::_fileName = ""; CORBA::ORB_ptr SALOMETraceCollector::_orb = 0; // ============================================================================ /*! - * This class replaces LocalTraceCollector, which is to use outside SALOME, - * without CORBA. + * This class is for use with CORBA, inside SALOME. + * Type of trace (and corresponding class) is choosen in LocalTraceBufferPool. * - * guarantees a unique object instance of the class (singleton thread safe) + * Guarantees a unique object instance of the class (singleton thread safe) * a separate thread for loop to print traces is launched. - * \param typeTrace 0=standard out, 1=file(/tmp/tracetest.log), 2=CORBA log - * If typeTrace=0, checks environment for "SALOME_trace". Test values in - * the following order: - * - "local" standard out - * - "with_logger" CORBA log - * - anything else is kept as a file name */ // ============================================================================ -SALOMETraceCollector* SALOMETraceCollector::instance(CORBA::ORB_ptr theOrb, - int typeTrace) +BaseTraceCollector* SALOMETraceCollector::instance() { if (_singleton == 0) // no need of lock when singleton already exists { @@ -74,33 +60,17 @@ SALOMETraceCollector* SALOMETraceCollector::instance(CORBA::ORB_ptr theOrb, if (_singleton == 0) // another thread may have got { // the lock after the first test _singleton = new SALOMETraceCollector(); + int argc=0; + char *_argv=0; + char ** argv = &_argv; + _orb = CORBA::ORB_init (argc, argv); - _fileName = "/tmp/tracetest.log"; - _toFile=0; - _orb = theOrb; - if (typeTrace) // caller sets a value different from default=0 - _toFile = typeTrace; - else // check environment - { - char* traceKind = getenv("SALOME_trace"); - //cout<<"SALOME_trace="<putMessage(LogMsg); + DEVTRACE("Logger server found"); + } - switch (_toFile) + // --- Loop until there is no more buffer to print, + // and no ask for end from destructor. + + while ((!_threadToClose) || myTraceBuffer->toCollect() ) + { + if (_threadToClose) { - case 1 : // --- trace to file - { - const char *fileName = _fileName.c_str(); - traceFile.open(fileName, ios::out | ios::app); - if (!traceFile) - { - cerr << "impossible to open trace file "<< fileName << endl; - exit (1); - } - } - break; - case 2 : // --- trace collection via CORBA - obj = TraceCollector_WaitForServerReadiness(_orb,"Logger"); - if (!CORBA::is_nil(obj)) - m_pInterfaceLogger = SALOME_Logger::Logger::_narrow(obj); - if (CORBA::is_nil(m_pInterfaceLogger)) - { - cerr << "Logger server not found ! Abort" << endl; - cerr << flush ; - exit(1); - } - else - { - CORBA::String_var LogMsg = - CORBA::string_dup("\n---Init logger trace---\n"); - m_pInterfaceLogger->putMessage(LogMsg); - //cout << " Logger server found" << endl; - } - break; - case 0 : ; // --- trace to standard output - default : // --- on standard output, too - break; + DEVTRACE("SALOMETraceCollector _threadToClose"); + //break; } - // Loop until there is no more buffer to print, - // and no ask for end from destructor. - - while ((!_threadToClose) || myTraceBuffer->toCollect() ) + int fullBuf = myTraceBuffer->retrieve(myTrace); + if (!CORBA::is_nil(_orb)) { - int fullBuf = myTraceBuffer->retrieve(myTrace); if (myTrace.traceType == ABORT_MESS) { - switch (_toFile) - { - case 2 : // --- trace collection via CORBA - { - stringstream abortMessage(""); - abortMessage << "INTERRUPTION from thread " - << myTrace.threadId << " : " << myTrace.trace; - CORBA::String_var LogMsg = - CORBA::string_dup(abortMessage.str().c_str()); - m_pInterfaceLogger->putMessage(LogMsg); - exit(1); - } - break; - case 1 : // --- trace to file - traceFile << "INTERRUPTION from thread " << myTrace.threadId - << " : " << myTrace.trace; - traceFile.close(); - // no break here ! - case 0 : // --- trace to standard output - default : // --- on standard output, too - cout << flush ; - cerr << "INTERRUPTION from thread " << myTrace.threadId - << " : " << myTrace.trace; - cerr << flush ; - exit(1); - break; - } + stringstream abortMessage(""); +#ifndef WNT + abortMessage << "INTERRUPTION from thread " + << myTrace.threadId << " : " << myTrace.trace; +#else + abortMessage << "INTERRUPTION from thread " + << (void*)&myTrace.threadId + << " : " << myTrace.trace; +#endif + CORBA::String_var LogMsg = + CORBA::string_dup(abortMessage.str().c_str()); + m_pInterfaceLogger->putMessage(LogMsg); + exit(1); } else { - switch (_toFile) - { - case 2 : // --- trace collection via CORBA - { - stringstream aMessage(""); - aMessage << "th. " << myTrace.threadId - << " " << myTrace.trace; - CORBA::String_var LogMsg = - CORBA::string_dup(aMessage.str().c_str()); - m_pInterfaceLogger->putMessage(LogMsg); - } - break; - case 1 : // --- trace to file - traceFile << "th. " << myTrace.threadId - << " " << myTrace.trace; - break; - case 0 : // --- trace to standard output - default : // --- on standard output, too - cout << "th. " << myTrace.threadId << " " << myTrace.trace; - break; - } + stringstream aMessage(""); +#ifndef WNT + aMessage << "th. " << myTrace.threadId +#else + aMessage << "th. " << (void*)&myTrace.threadId +#endif + << " " << myTrace.trace; + CORBA::String_var LogMsg = + CORBA::string_dup(aMessage.str().c_str()); + m_pInterfaceLogger->putMessage(LogMsg); } } - - if (_toFile==1) traceFile.close(); } pthread_exit(NULL); + return NULL; } // ============================================================================ @@ -255,16 +174,25 @@ void* SALOMETraceCollector::run(void *bid) SALOMETraceCollector:: ~SALOMETraceCollector() { - LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance(); - _threadToClose = 1; - myTraceBuffer->insert(NORMAL_MESS,"end of trace "); //needed to wake up thread - if (_threadId) + int ret; + ret = pthread_mutex_lock(&_singletonMutex); // acquire lock to be alone + if (_singleton) { - int ret = pthread_join(_threadId, NULL); - if (ret) cout << "error close SALOMETraceCollector : "<< ret << endl; - else cout << "SALOMETraceCollector destruction OK" << endl; + DEVTRACE("SALOMETraceCollector:: ~SALOMETraceCollector()"); + LocalTraceBufferPool* myTraceBuffer = LocalTraceBufferPool::instance(); + _threadToClose = 1; + myTraceBuffer->insert(NORMAL_MESS,"end of trace\n"); // to wake up thread + if (_threadId) + { + int ret = pthread_join(*_threadId, NULL); + if (ret) cerr << "error close SALOMETraceCollector : "<< ret << endl; + else DEVTRACE("SALOMETraceCollector destruction OK"); + _threadId = 0; + _threadToClose = 0; + } + _singleton = 0; + ret = pthread_mutex_unlock(&_singletonMutex); // release lock } - delete myTraceBuffer; } // ============================================================================ @@ -277,6 +205,20 @@ SALOMETraceCollector:: ~SALOMETraceCollector() SALOMETraceCollector::SALOMETraceCollector() { _threadId=0; + _threadToClose = 0; } +// ============================================================================ +/*! + * + */ +// ============================================================================ +extern "C" +{ + BaseTraceCollector *SingletonInstance(void) + { + BaseTraceCollector *instance = SALOMETraceCollector::instance(); + return instance; + } +} diff --git a/src/SALOMETraceCollector/SALOMETraceCollector.hxx b/src/SALOMETraceCollector/SALOMETraceCollector.hxx index 7d1b4bbb8..35139f6b6 100644 --- a/src/SALOMETraceCollector/SALOMETraceCollector.hxx +++ b/src/SALOMETraceCollector/SALOMETraceCollector.hxx @@ -29,14 +29,31 @@ #include #include +#include "BaseTraceCollector.hxx" #include "LocalTraceBufferPool.hxx" -//! See LocalTraceCollector instead of SALOMETraceCollector for usage without CORBA +//! See LocalTraceCollector instead of SALOMETraceCollector, +//! for usage without CORBA -class SALOMETraceCollector +#if defined SALOMETRACECOLLECTOR_EXPORTS +#if defined WIN32 +#define SALOMETRACECOLLECTOR_EXPORT __declspec( dllexport ) +#else +#define SALOMETRACECOLLECTOR_EXPORT +#endif +#else +#if defined WNT +#define SALOMETRACECOLLECTOR_EXPORT __declspec( dllimport ) +#else +#define SALOMETRACECOLLECTOR_EXPORT +#endif +#endif + +class SALOMETRACECOLLECTOR_EXPORT SALOMETraceCollector: + public BaseTraceCollector { public: - static SALOMETraceCollector* instance(CORBA::ORB_ptr theOrb, int typeTrace=0); + static BaseTraceCollector* instance(); static void *run(void *bid); ~SALOMETraceCollector(); @@ -44,12 +61,6 @@ class SALOMETraceCollector SALOMETraceCollector(); private: - static int _threadToClose; - static int _toFile; - static SALOMETraceCollector* _singleton; - static pthread_mutex_t _singletonMutex; - static pthread_t _threadId; - static std::string _fileName; static CORBA::ORB_ptr _orb; }; diff --git a/src/SALOMETraceCollector/Test/Makefile.in b/src/SALOMETraceCollector/Test/Makefile.in new file mode 100644 index 000000000..ddc7c53ca --- /dev/null +++ b/src/SALOMETraceCollector/Test/Makefile.in @@ -0,0 +1,64 @@ +# SALOMELocalTrace : log on local machine +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE (EDF) +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS= SALOMETraceCollectorTest.hxx + +EXPORT_PYSCRIPTS = TestSALOMETraceCollector.py + +# Libraries targets + +LIB = libSALOMETraceCollectorTest.la +LIB_SRC = SALOMETraceCollectorTest.cxx + +# Executables targets + +BIN = TestSALOMETraceCollector +BIN_SRC = + + +CXXFLAGS += @CPPUNIT_INCLUDES@ +CPPFLAGS += @CPPUNIT_INCLUDES@ + +LIBS= @LIBS@ @CPPUNIT_LIBS@ + +LDFLAGS+= + +LDFLAGSFORBIN+= \ + -lSALOMELocalTraceTest -lSALOMELocalTrace -lSALOMEBasics \ + -lSALOMETraceCollectorTest + +@CONCLUDE@ diff --git a/src/SALOMETraceCollector/Test/SALOMETraceCollectorTest.cxx b/src/SALOMETraceCollector/Test/SALOMETraceCollectorTest.cxx new file mode 100644 index 000000000..2a84b4b41 --- /dev/null +++ b/src/SALOMETraceCollector/Test/SALOMETraceCollectorTest.cxx @@ -0,0 +1,90 @@ + +#include "SALOMETraceCollectorTest.hxx" + +#include +#include +#include +#include +#include "LocalTraceBufferPool.hxx" +#include "utilities.h" + +using namespace std; + +// ============================================================================ +/*! + * + */ +// ============================================================================ + +void +SALOMETraceCollectorTest::setUp() +{ +} + +// ============================================================================ +/*! + * + */ +// ============================================================================ + +void +SALOMETraceCollectorTest::tearDown() +{ +} + +#define NUM_THREADS 20 +#define NUM_MESSAGES 20 +void *PrintHello(void *threadid); + +// ============================================================================ +/*! + * open a trace on a CORBA, multithread writing on file, close + */ +// ============================================================================ + +void +SALOMETraceCollectorTest::testLoadBufferPoolCORBA() +{ + string s = "with_logger"; + CPPUNIT_ASSERT(! setenv("SALOME_trace",s.c_str(),1)); // 1: overwrite + + // --- NUM_THREADS thread creation for trace generation. + + pthread_t threads[NUM_THREADS]; + int rc, t; + for(t=0;tdeleteInstance(bp1); +} + +// ============================================================================ +/*! + * NUM_THREAD are created with function PrintHello, + * which produces NUM_MESSAGES traces. + */ +// ============================================================================ + +void *PrintHello(void *threadid) +{ + int id_thread = (int)threadid; + for (int i=0; i + +class SALOMETraceCollectorTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( SALOMETraceCollectorTest ); + CPPUNIT_TEST( testLoadBufferPoolCORBA ); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp(); + void tearDown(); + + void testLoadBufferPoolCORBA(); +}; + +#endif diff --git a/src/SALOMETraceCollector/Test/TestSALOMETraceCollector.cxx b/src/SALOMETraceCollector/Test/TestSALOMETraceCollector.cxx new file mode 100644 index 000000000..2be9c0c42 --- /dev/null +++ b/src/SALOMETraceCollector/Test/TestSALOMETraceCollector.cxx @@ -0,0 +1,14 @@ + +// --- include all Unit Test from basics until the present directory + +#include "SALOMELocalTraceTest.hxx" +#include "SALOMETraceCollectorTest.hxx" + +// --- Registers the fixture into the 'registry' + +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMELocalTraceTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMETraceCollectorTest ); + +// --- generic Main program from Basic/Test + +#include "BasicMainTest.hxx" diff --git a/src/SALOMETraceCollector/Test/TestSALOMETraceCollector.py b/src/SALOMETraceCollector/Test/TestSALOMETraceCollector.py new file mode 100644 index 000000000..2ae9f8de4 --- /dev/null +++ b/src/SALOMETraceCollector/Test/TestSALOMETraceCollector.py @@ -0,0 +1,29 @@ + +import sys, os,signal,string,commands +import runSalome +import orbmodule +import TestKiller + +# get SALOME environment : + +args, modules_list, modules_root_dir = runSalome.get_config() +runSalome.set_env(args, modules_list, modules_root_dir) + +# launch CORBA naming server + +clt=orbmodule.client() + +# launch CORBA logger server + +myServer=runSalome.LoggerServer(args) +myServer.run() +clt.waitLogger("Logger") + +# execute Unit Test + +command = ['TestSALOMETraceCollector'] +ret = os.spawnvp(os.P_WAIT, command[0], command) + +# kill Test process + +TestKiller.killProcess(runSalome.process_id) diff --git a/src/SALOMETraceCollector/TraceCollector_WaitForServerReadiness.cxx b/src/SALOMETraceCollector/TraceCollector_WaitForServerReadiness.cxx index 9e91b71d9..56321a047 100644 --- a/src/SALOMETraceCollector/TraceCollector_WaitForServerReadiness.cxx +++ b/src/SALOMETraceCollector/TraceCollector_WaitForServerReadiness.cxx @@ -28,6 +28,10 @@ #include #include +#ifdef WNT +#include +#endif + using namespace std; // ============================================================================ @@ -79,10 +83,10 @@ CORBA::Object_ptr TraceCollector_WaitForServerReadiness(CORBA::ORB_ptr orb, if (!CORBA::is_nil(theObj)) inc = CosNaming::NamingContext::_narrow(theObj); } - catch( CORBA::COMM_FAILURE& ) + catch( CORBA::SystemException& ) { cout << "TraceCollector_WaitForServerReadiness: " - << "CORBA::COMM_FAILURE: " + << "CORBA::SystemException: " << "Unable to contact the Naming Service" << endl; } catch(...) @@ -99,8 +103,8 @@ CORBA::Object_ptr TraceCollector_WaitForServerReadiness(CORBA::ORB_ptr orb, obj = inc->resolve(name); if (!CORBA::is_nil(obj)) { - cout << "TraceCollector_WaitForServerReadiness: " - << serverName << " found in CORBA Name Service" << endl; + //cout << "TraceCollector_WaitForServerReadiness: " + // << serverName << " found in CORBA Name Service" << endl; break; } } @@ -109,7 +113,11 @@ CORBA::Object_ptr TraceCollector_WaitForServerReadiness(CORBA::ORB_ptr orb, cout << "Caught exception: Naming Service can't found Logger"; } } +#ifndef WNT int a = nanosleep(&ts_req,&ts_rem); +#else + Sleep(TIMESleep / 1000000); +#endif cout << "TraceCollector_WaitForServerReadiness: retry look for" << serverName << endl; } diff --git a/src/TOOLSDS/Makefile.in b/src/TOOLSDS/Makefile.in index a3d0a4fdc..866f491f1 100644 --- a/src/TOOLSDS/Makefile.in +++ b/src/TOOLSDS/Makefile.in @@ -23,12 +23,12 @@ LIB_SRC = \ # Executables targets BIN = BIN_SRC = -LIB_SERVER_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl +LIB_SERVER_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_GenericObj.idl BIN_SERVER_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl BIN_CLIENT_IDL = -CPPFLAGS+=$(OCC_INCLUDES) $(HDF5_INCLUDES) -CXXFLAGS+=$(OCC_CXXFLAGS) +CPPFLAGS+=$(OCC_INCLUDES) $(HDF5_INCLUDES) $(BOOST_CPPFLAGS) +CXXFLAGS+=$(OCC_CXXFLAGS) $(BOOST_CPPFLAGS) LDFLAGS+= -lOpUtil $(CAS_LDPATH) -lTKernel @CONCLUDE@ diff --git a/src/TOOLSDS/SALOMEDS_Tool.cxx b/src/TOOLSDS/SALOMEDS_Tool.cxx index e250257af..8c292d493 100644 --- a/src/TOOLSDS/SALOMEDS_Tool.cxx +++ b/src/TOOLSDS/SALOMEDS_Tool.cxx @@ -11,9 +11,7 @@ #include "utilities.h" #include -#include -#include -#include + #include #include #include @@ -23,7 +21,13 @@ #include #include +#ifndef WNT +#include +#include +#include #include +#else +#endif #include #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) @@ -62,8 +66,6 @@ std::string SALOMEDS_Tool::GetTmpDir() TCollection_AsciiString aSubDir(aRND); if(aSubDir.Length() <= 1) aSubDir = TCollection_AsciiString("123409876"); - MESSAGE("#### RND " << aRND); - aTmpDir += aSubDir; //Get RND sub directory #ifdef WIN32 @@ -409,11 +411,3 @@ void SALOMEDS_Tool::GetAllChildren( SALOMEDS::Study_var theStudy, - - - - - - - - diff --git a/src/TOOLSDS/SALOMEDS_Tool.hxx b/src/TOOLSDS/SALOMEDS_Tool.hxx index e3d1d3993..517a1daa4 100644 --- a/src/TOOLSDS/SALOMEDS_Tool.hxx +++ b/src/TOOLSDS/SALOMEDS_Tool.hxx @@ -13,11 +13,18 @@ #include #include + // IDL headers #include "SALOMEconfig.h" #include CORBA_SERVER_HEADER(SALOMEDS) -class SALOMEDS_Tool +#ifdef WNT +#include +#else +#define SALOME_WNT_EXPORT +#endif + +class SALOME_WNT_EXPORT SALOMEDS_Tool { public: diff --git a/src/TestContainer/Makefile.in b/src/TestContainer/Makefile.in index c5b22b104..40a5e8e62 100644 --- a/src/TestContainer/Makefile.in +++ b/src/TestContainer/Makefile.in @@ -39,14 +39,14 @@ EXPORT_PYSCRIPTS = SALOME_TestComponentPy.py TestComponentPy.py LIB = libSalomeTestComponentEngine.la LIB_SRC = SALOME_TestComponent_i.cxx -LIB_CLIENT_IDL = SALOME_Component.idl SALOME_TestComponent.idl +LIB_CLIENT_IDL = SALOME_Component.idl SALOME_TestComponent.idl SALOME_Exception.idl # Executables targets BIN = TestContainer TestLogger BIN_SRC = LDFLAGS+= -lSalomeNotification -lSalomeNS -lSalomeContainer -lRegistry -lOpUtil -lSALOMELocalTrace -lSalomeResourcesManager -LDFLAGSFORBIN= $(LDFLAGS) -lSALOMETraceCollector +LDFLAGSFORBIN+= -lSalomeNotification -lSalomeNS -lSalomeContainer -lRegistry -lOpUtil -lSALOMELocalTrace -lSalomeResourcesManager -lSALOMEBasics @CONCLUDE@ diff --git a/src/TestContainer/SALOME_TestComponent_i.cxx b/src/TestContainer/SALOME_TestComponent_i.cxx index 413fd2fa0..64772b14e 100644 --- a/src/TestContainer/SALOME_TestComponent_i.cxx +++ b/src/TestContainer/SALOME_TestComponent_i.cxx @@ -26,6 +26,7 @@ // Module : SALOME // $Header$ +#define private protected #include "utilities.h" #include "SALOME_TestComponent_i.hxx" #include @@ -40,10 +41,10 @@ Engines_TestComponent_i::Engines_TestComponent_i(CORBA::ORB_ptr orb, const char *interfaceName) : Engines_Component_i(orb, poa, contId, instanceName, interfaceName) { - MESSAGE("activate object") + MESSAGE("activate object"); _thisObj = this ; _id = _poa->activate_object(_thisObj); - //SCRUTE(this) + SCRUTE(pd_refCount); } Engines_TestComponent_i::Engines_TestComponent_i() @@ -52,12 +53,14 @@ Engines_TestComponent_i::Engines_TestComponent_i() Engines_TestComponent_i::~Engines_TestComponent_i() { + MESSAGE("~Engines_TestComponent_i()"); } char* Engines_TestComponent_i::Coucou(CORBA::Long L) { char s[100]; sprintf(s, "TestComponent_i : L = %ld", (long) L); + SCRUTE(pd_refCount); return CORBA::string_dup(s); } diff --git a/src/TestContainer/TestComponentPy.py b/src/TestContainer/TestComponentPy.py index b6c248463..2dacf6dbb 100755 --- a/src/TestContainer/TestComponentPy.py +++ b/src/TestContainer/TestComponentPy.py @@ -34,7 +34,6 @@ import string from omniORB import CORBA import CosNaming import Engines -from Utils_Identity import getShortHostName #initialise the ORB @@ -49,7 +48,8 @@ if rootContext is None: sys.exit(1) #resolve the name /Containers.dir/FactoryServerPy.object -machineName= getShortHostName() +myMachine=string.split(os.getenv( "HOSTNAME" ),'.') +machineName= myMachine[0] containerName = "FactoryServerPy" name = [CosNaming.NameComponent("Containers","dir"), CosNaming.NameComponent(machineName,"dir"), diff --git a/src/TestContainer/TestContainer.cxx b/src/TestContainer/TestContainer.cxx index e8492fb6e..de2de52a0 100644 --- a/src/TestContainer/TestContainer.cxx +++ b/src/TestContainer/TestContainer.cxx @@ -34,6 +34,7 @@ #include CORBA_CLIENT_HEADER(SALOME_TestComponent) #include "SALOME_NamingService.hxx" +#include "NamingService_WaitForServerReadiness.hxx" #include "OpUtil.hxx" #include "Utils_ORB_INIT.hxx" #include "Utils_SINGLETON.hxx" @@ -59,126 +60,56 @@ static ostream& operator<<(ostream& os, const CORBA::Exception& e) return os; } +Engines::TestComponent_ptr create_instance(Engines::Container_ptr iGenFact, + string componenttName) +{ + bool isLib = + iGenFact->load_component_Library(componenttName.c_str()); + // iGenFact->load_component_Library("SalomeTestComponent"); + ASSERT(isLib); + CORBA::Object_var obj = + // iGenFact->create_component_instance("SalomeTestComponent", + iGenFact->create_component_instance(componenttName.c_str(), + 0); + Engines::TestComponent_var anInstance = Engines::TestComponent::_narrow(obj); + MESSAGE("create anInstance"); + SCRUTE(anInstance->instanceName()); + return anInstance._retn(); +} int main (int argc, char * argv[]) { - // Initializing omniORB ORB_INIT &init = *SINGLETON_::Instance() ; CORBA::ORB_var &orb = init( argc , argv ) ; - SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); + // LocalTraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); try { - - - - // use IOR to find container - //if (argc != 2) { return 1; } - //CORBA::Object_var obj = orb->string_to_object(argv[1]); - //Engines::Container_var iGenFact = Engines::Container::_narrow(obj); - - // Obtain a reference to the root POA - // - long TIMESleep = 250000000; - int NumberOfTries = 40; - int a; - timespec ts_req; - ts_req.tv_nsec=TIMESleep; - ts_req.tv_sec=0; - timespec ts_rem; - ts_rem.tv_nsec=0; - ts_rem.tv_sec=0; - CosNaming::NamingContext_var inc; - PortableServer::POA_var poa; - CORBA::Object_var theObj; - CORBA::Object_var obj; - CORBA::Object_var object; - SALOME_NamingService &naming = *SINGLETON_::Instance() ; - int TEST_CONTAINER=0; - const char * Env = getenv("USE_LOGGER"); - int EnvL =0; - if ((Env!=NULL) && (strlen(Env))) - EnvL=1; - CosNaming::Name name; - name.length(1); - name[0].id=CORBA::string_dup("Logger"); - PortableServer::POAManager_var manager; - for (int i = 1; i<=NumberOfTries; i++) - { - if (i!=1) - a=nanosleep(&ts_req,&ts_rem); - try - { - obj = orb->resolve_initial_references("RootPOA"); - if(!CORBA::is_nil(obj)) - poa = PortableServer::POA::_narrow(obj); - if(!CORBA::is_nil(poa)) - manager = poa->the_POAManager(); - if(!CORBA::is_nil(orb)) - theObj = orb->resolve_initial_references("NameService"); - if (!CORBA::is_nil(theObj)) - inc = CosNaming::NamingContext::_narrow(theObj); - } - catch( CORBA::COMM_FAILURE& ) - { - INFOS( "Test Container: CORBA::COMM_FAILURE: Unable to contact the Naming Service" ) - } - if(!CORBA::is_nil(inc)) - { - MESSAGE( "Test Container: Naming Service was found" ) - if(EnvL==1) - { - for(int j=1; j<=NumberOfTries; j++) - { - if (j!=1) - a=nanosleep(&ts_req, &ts_rem); - try - { - object = inc->resolve(name); - } - catch(CosNaming::NamingContext::NotFound) - { - INFOS( "Test Container: Logger Server wasn't found" ); - } - catch(...) - { - INFOS( "Test Container: Unknown exception" ); - } - if (!CORBA::is_nil(object)) - { - MESSAGE( "Test Container: Loger Server was found" ); - TEST_CONTAINER=1; - break; - } - } - } - } - if ((TEST_CONTAINER==1)||((EnvL==0)&&(!CORBA::is_nil(inc)))) - break; - } - - // Use Name Service to find container SALOME_NamingService _NS(orb) ; string containerName = "/Containers/" ; string hostName = GetHostname(); containerName += hostName + "/FactoryServer"; + NamingService_WaitForServerReadiness(&_NS,containerName); - obj = _NS.Resolve(containerName.c_str()) ; + CORBA::Object_var obj = _NS.Resolve(containerName.c_str()) ; Engines::Container_var iGenFact = Engines::Container::_narrow(obj); - Engines::TestComponent_var m1; + int nbInstances = 5; + + vector instances(nbInstances); - for (int iter = 0; iter < 3 ; iter++) + MESSAGE("------------------------------- create instances "); + for (int iter = 0; iter < nbInstances ; iter++) { - MESSAGE("----------------------------------------------------" << iter); - string dirn = getenv("KERNEL_ROOT_DIR"); - dirn += "/lib/salome/libSalomeTestComponentEngine.so"; - obj = iGenFact->load_impl("SalomeTestComponent",dirn.c_str()); - m1 = Engines::TestComponent::_narrow(obj); - MESSAGE("recup m1"); - SCRUTE(m1->instanceName()); + instances[iter] = create_instance(iGenFact,"SalomeTestComponent"); + } + MESSAGE("------------------------------ set env instances "); + for (int iter = 0; iter < nbInstances ; iter++) + { + Engines::TestComponent_var anInstance = instances[iter]; + SCRUTE(anInstance->instanceName()); Engines::FieldsDict_var dico = new Engines::FieldsDict; dico->length(3); dico[0].key=CORBA::string_dup("key_0"); @@ -186,14 +117,18 @@ int main (int argc, char * argv[]) dico[1].key=CORBA::string_dup("key_1"); dico[1].value <<=(CORBA::UShort)72; dico[2].key=CORBA::string_dup("key_2"); - dico[2].value <<="value_2"; - m1->setProperties(dico); - - MESSAGE("Coucou " << m1->Coucou(1L)); - - m1->Setenv(); + dico[2].value <<=(CORBA::ULong)iter; + anInstance->setProperties(dico); + MESSAGE("Coucou " << anInstance->Coucou(iter)); + anInstance->Setenv(); + } - Engines::FieldsDict_var dico2 = m1->getProperties(); + MESSAGE("---------------------------------- get instances "); + for (int iter = 0; iter < nbInstances ; iter++) + { + Engines::TestComponent_var anInstance = instances[iter]; + SCRUTE(anInstance->instanceName()); + Engines::FieldsDict_var dico2 = anInstance->getProperties(); for (CORBA::ULong i=0; ilength(); i++) { MESSAGE("dico2["<instanceName()); + iGenFact->remove_impl(anInstance) ; //iGenFact->finalize_removal() ; // unpredictable results ... - sleep(5); - } + } + MESSAGE("------------------------------- PYTHON "); + { +// bool isLib = +// iGenFact->load_component_Library("SALOME_TestComponentPy"); +// ASSERT(isLib); +// CORBA::Object_var obj = +// iGenFact->create_component_instance("SALOME_TestComponentPy", +// 0); +// Engines::TestComponent_var anInstance = +// Engines::TestComponent::_narrow(obj); +// MESSAGE("create anInstance"); +// SCRUTE(anInstance->instanceName()); + MESSAGE("------------------------------- create instances "); + for (int iter = 0; iter < nbInstances ; iter++) + { + instances[iter] = create_instance(iGenFact,"SALOME_TestComponentPy"); + } + + MESSAGE("---------------------------------- get instances "); + for (int iter = 0; iter < nbInstances ; iter++) + { + Engines::TestComponent_var anInstance = instances[iter]; + SCRUTE(anInstance->instanceName()); + MESSAGE("Coucou " << anInstance->Coucou(iter)); + } + } + // Clean-up. iGenFact->finalize_removal() ; - orb->destroy(); + orb->shutdown(0); } catch(CORBA::COMM_FAILURE& ex) { INFOS("Caught system exception COMM_FAILURE -- unable to contact the object.") @@ -227,7 +194,7 @@ int main (int argc, char * argv[]) INFOS("Caught unknown exception.") } - delete myThreadTrace; + // delete myThreadTrace; return 0; } diff --git a/src/TestMPIContainer/Makefile.in b/src/TestMPIContainer/Makefile.in index b268fd20e..451d9d20f 100644 --- a/src/TestMPIContainer/Makefile.in +++ b/src/TestMPIContainer/Makefile.in @@ -31,7 +31,7 @@ BIN_SRC = BIN_CLIENT_IDL = Logger.idl SALOME_MPIObject.idl SALOME_MPIContainer.idl SALOME_TestMPIComponent.idl BIN_SERVER_IDL = -LDFLAGS+= -lSalomeNotification -lSalomeNS -lSalomeMPILifeCycleCORBA -lSalomeLifeCycleCORBA -lSalomeMPIContainer -lSalomeContainer -lRegistry -lOpUtil -lSALOMELocalTrace ${MPI_LIBS} +LDFLAGSFORBIN+= -lSalomeNotification -lSalomeNS -lSalomeLifeCycleCORBA -lSalomeMPIContainer -lSalomeContainer -lRegistry -lOpUtil -lSALOMELocalTrace -lSalomeResourcesManager ${MPI_LIBS} CXXFLAGS+=${MPI_INCLUDES} CXX_DEPEND_FLAG+=${MPI_INCLUDES} diff --git a/src/TestMPIContainer/TestMPIContainer.cxx b/src/TestMPIContainer/TestMPIContainer.cxx index 898007487..6ee329eae 100644 --- a/src/TestMPIContainer/TestMPIContainer.cxx +++ b/src/TestMPIContainer/TestMPIContainer.cxx @@ -20,7 +20,7 @@ # include "Utils_SINGLETON.hxx" #include "SALOME_NamingService.hxx" #include "OpUtil.hxx" -#include "LocalTraceCollector.hxx" +#include "SALOMETraceCollector.hxx" using namespace std; int main (int argc, char * argv[]) @@ -29,7 +29,7 @@ int main (int argc, char * argv[]) // Initializing omniORB ORB_INIT &init = *SINGLETON_::Instance() ; CORBA::ORB_var &orb = init( argc , argv ) ; - LocalTraceCollector *myThreadTrace = LocalTraceCollector::instance(orb); + // SALOMETraceCollector *myThreadTrace = SALOMETraceCollector::instance(orb); BEGIN_OF(argv[0]) try{ @@ -115,7 +115,7 @@ int main (int argc, char * argv[]) // // Clean-up. // // iGenFact->finalize_removal() ; // // sleep(5); - iGenFact->MPIShutdown(); + iGenFact->Shutdown(); // INFOS("shut down corba server for Test MPI Container"); // orb->destroy(); } @@ -133,6 +133,6 @@ int main (int argc, char * argv[]) } END_OF(argv[0]); - delete myThreadTrace; + // delete myThreadTrace; return 0 ; } diff --git a/src/UnitTests/Makefile.in b/src/UnitTests/Makefile.in new file mode 100644 index 000000000..a0c154083 --- /dev/null +++ b/src/UnitTests/Makefile.in @@ -0,0 +1,68 @@ +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE (EDF) +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS= + +EXPORT_PYSCRIPTS = UnitTests.py + +# Libraries targets + +LIB = +LIB_SRC = + +# Executables targets + +BIN = UnitTests +BIN_SRC = +BIN_CLIENT_IDL = SALOME_Component.idl SALOME_TestComponent.idl \ + SALOME_Exception.idl + +CXXFLAGS += @CPPUNIT_INCLUDES@ +CPPFLAGS += @CPPUNIT_INCLUDES@ + +LIBS= @LIBS@ @CPPUNIT_LIBS@ + +LDFLAGSFORBIN+= \ + -lSALOMELocalTraceTest -lSALOMELocalTrace -lSALOMEBasics \ + -lSALOMETraceCollectorTest \ + -lUtilsTest -lOpUtil \ + -lSalomeNS -lSalomeContainer -lSalomeResourcesManager \ + -lRegistry -lSalomeNotification \ + -lLifeCycleCORBATest -lSalomeLifeCycleCORBA \ + + + +@CONCLUDE@ diff --git a/src/UnitTests/UnitTests.cxx b/src/UnitTests/UnitTests.cxx new file mode 100644 index 000000000..987e3049c --- /dev/null +++ b/src/UnitTests/UnitTests.cxx @@ -0,0 +1,18 @@ + +// --- include all Unit Test from basics until the present directory + +#include "SALOMELocalTraceTest.hxx" +#include "SALOMETraceCollectorTest.hxx" +#include "UtilsTest.hxx" +#include "LifeCycleCORBATest.hxx" + +// --- Registers the fixture into the 'registry' + +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMELocalTraceTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMETraceCollectorTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( UtilsTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( LifeCycleCORBATest ); + +// --- generic Main program from Basic/Test + +#include "BasicMainTest.hxx" diff --git a/src/UnitTests/UnitTests.py b/src/UnitTests/UnitTests.py new file mode 100644 index 000000000..9731efcdb --- /dev/null +++ b/src/UnitTests/UnitTests.py @@ -0,0 +1,67 @@ + +import sys, os,signal,string,commands +import runSalome +import orbmodule +import TestKiller + +# get SALOME environment : + +args, modules_list, modules_root_dir = runSalome.get_config() +runSalome.set_env(args, modules_list, modules_root_dir) + +# set environment for trace in logger +# (with file, servers may be killed before the write to the file...) + +#os.environ["SALOME_trace"] = "file:/tmp/traceUnitTest.log" +#os.environ["SALOME_trace"] = "local" +os.environ["SALOME_trace"] = "with_logger" + +# launch CORBA naming server + +clt=orbmodule.client() + +# launch CORBA logger server + +myServer=runSalome.LoggerServer(args) +myServer.run() +clt.waitLogger("Logger") + +# launch notify server + +myServer=runSalome.NotifyServer(args,modules_root_dir) +myServer.run() + +# launch registry server + +myServer=runSalome.RegistryServer(args) +myServer.run() +clt.waitNS("/Registry") + +# launch module catalog server + +cataServer=runSalome.CatalogServer(args) +cataServer.setpath(modules_list,modules_root_dir) +cataServer.run() +clt.waitNS("/Kernel/ModulCatalog") + +# launch container manager server + +myCmServer = runSalome.ContainerManagerServer(args) +myCmServer.setpath(modules_list,modules_root_dir) +myCmServer.run() +clt.waitNS("/ContainerManager") + +# execute Unit Test + +command = ['UnitTests'] +ret = os.spawnvp(os.P_WAIT, command[0], command) + +# kill containers created by the Container Manager + +import Engines +containerManager = clt.waitNS("/ContainerManager",Engines.ContainerManager) +containerManager.Shutdown() + +# kill Test process + +TestKiller.killProcess(runSalome.process_id) diff --git a/src/Utils/Makefile.in b/src/Utils/Makefile.in index f7f5d5a65..c862428f3 100644 --- a/src/Utils/Makefile.in +++ b/src/Utils/Makefile.in @@ -46,7 +46,8 @@ EXPORT_HEADERS= \ Utils_SINGLETON.hxx \ Utils_DESTRUCTEUR_GENERIQUE.hxx \ Utils_ExceptHandlers.hxx \ - Utils_SignalsHandler.h + Utils_SignalsHandler.h \ + Utils_Mutex.hxx EXPORT_PYSCRIPTS = Utils_Identity.py SALOME_utilities.py # Libraries targets @@ -58,7 +59,8 @@ LIB_SRC = OpUtil.cxx Utils_Timer.cxx duplicate.cxx \ Utils_Identity.cxx Utils_ORB_INIT.cxx \ Utils_DESTRUCTEUR_GENERIQUE.cxx \ Utils_ExceptHandlers.cxx \ - Utils_SignalsHandler.cxx + Utils_SignalsHandler.cxx \ + Utils_Mutex.cxx LIB_SERVER_IDL = SALOME_Exception.idl diff --git a/src/Utils/OpUtil.cxx b/src/Utils/OpUtil.cxx index 00ed5a66d..28f95b660 100644 --- a/src/Utils/OpUtil.cxx +++ b/src/Utils/OpUtil.cxx @@ -26,19 +26,23 @@ #include "utilities.h" #include "OpUtil.hxx" -#include #include #include -using namespace std; -int gethostname(char *name, size_t len); +#ifndef WNT +#include +#else +#include +#endif +using namespace std; +//int gethostname(char *name, size_t len); -string GetHostname() +std::string GetHostname() { - int ls = 100, r = 0; + int ls = 100, r = 1; char *s; - while (ls < 10000) { + while (ls < 10000 && r) { ls *= 2; s = new char[ls]; r = gethostname(s, ls-1); diff --git a/src/Utils/OpUtil.hxx b/src/Utils/OpUtil.hxx index 086aa0040..7c3293b7c 100644 --- a/src/Utils/OpUtil.hxx +++ b/src/Utils/OpUtil.hxx @@ -27,9 +27,23 @@ #ifndef _OPUTIL_HXX #define _OPUTIL_HXX +#if defined UTILS_EXPORTS +#if defined WIN32 +#define UTILS_EXPORT __declspec( dllexport ) +#else +#define UTILS_EXPORT +#endif +#else +#if defined WNT +#define UTILS_EXPORT __declspec( dllimport ) +#else +#define UTILS_EXPORT +#endif +#endif + #include -std::string GetHostname(); -const char *duplicate(const char * const); +UTILS_EXPORT std::string GetHostname(); +UTILS_EXPORT const char *duplicate(const char * const); #endif diff --git a/src/Utils/Test/Makefile.in b/src/Utils/Test/Makefile.in new file mode 100644 index 000000000..c01a6a22e --- /dev/null +++ b/src/Utils/Test/Makefile.in @@ -0,0 +1,64 @@ +# SALOMELocalTrace : log on local machine +# +# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +# +# +# +# File : Makefile.in +# Author : Paul RASCLE (EDF) +# Module : SALOME +# $Header$ + +top_srcdir=@top_srcdir@ +top_builddir=../../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + + +@COMMENCE@ + +# header files +EXPORT_HEADERS= UtilsTest.hxx + +EXPORT_PYSCRIPTS = TestUtils.py + +# Libraries targets + +LIB = libUtilsTest.la +LIB_SRC = UtilsTest.cxx + +# Executables targets + +BIN = TestUtils +BIN_SRC = + +CXXFLAGS += @CPPUNIT_INCLUDES@ +CPPFLAGS += @CPPUNIT_INCLUDES@ + +LIBS= @LIBS@ @CPPUNIT_LIBS@ + +LDFLAGS+= + +LDFLAGSFORBIN+= \ + -lSALOMELocalTraceTest -lSALOMELocalTrace -lSALOMEBasics \ + -lSALOMETraceCollectorTest \ + -lUtilsTest -lOpUtil + +@CONCLUDE@ diff --git a/src/Utils/Test/TestUtils.cxx b/src/Utils/Test/TestUtils.cxx new file mode 100644 index 000000000..117e41790 --- /dev/null +++ b/src/Utils/Test/TestUtils.cxx @@ -0,0 +1,16 @@ + +// --- include all Unit Test from basics until the present directory + +#include "SALOMELocalTraceTest.hxx" +#include "SALOMETraceCollectorTest.hxx" +#include "UtilsTest.hxx" + +// --- Registers the fixture into the 'registry' + +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMELocalTraceTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( SALOMETraceCollectorTest ); +CPPUNIT_TEST_SUITE_REGISTRATION( UtilsTest ); + +// --- generic Main program from Basic/Test + +#include "BasicMainTest.hxx" diff --git a/src/Utils/Test/TestUtils.py b/src/Utils/Test/TestUtils.py new file mode 100644 index 000000000..226eba335 --- /dev/null +++ b/src/Utils/Test/TestUtils.py @@ -0,0 +1,29 @@ + +import sys, os,signal,string,commands +import runSalome +import orbmodule +import TestKiller + +# get SALOME environment : + +args, modules_list, modules_root_dir = runSalome.get_config() +runSalome.set_env(args, modules_list, modules_root_dir) + +# launch CORBA naming server + +clt=orbmodule.client() + +# launch CORBA logger server + +myServer=runSalome.LoggerServer(args) +myServer.run() +clt.waitLogger("Logger") + +# execute Unit Test + +command = ['TestUtils'] +ret = os.spawnvp(os.P_WAIT, command[0], command) + +# kill Test process + +TestKiller.killProcess(runSalome.process_id) diff --git a/src/Utils/Test/UtilsTest.cxx b/src/Utils/Test/UtilsTest.cxx new file mode 100644 index 000000000..a82e9d55e --- /dev/null +++ b/src/Utils/Test/UtilsTest.cxx @@ -0,0 +1,97 @@ + +#include "UtilsTest.hxx" + +#include +#include +#include +#include +#include "Utils_SALOME_Exception.hxx" +#include "utilities.h" + +using namespace std; + +#define TRACEFILE "/tmp/traceUnitTest.log" + +// ============================================================================ +/*! + * Set Trace mecanism + * - delete preexisting trace classes if any + * - set trace on file + */ +// ============================================================================ + +void +UtilsTest::setUp() +{ + LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance(); + CPPUNIT_ASSERT(bp1); + bp1->deleteInstance(bp1); + + // --- trace on file + char *theFileName = TRACEFILE; + + string s = "file:"; + s += theFileName; + CPPUNIT_ASSERT(! setenv("SALOME_trace",s.c_str(),1)); // 1: overwrite + + ofstream traceFile; + traceFile.open(theFileName, ios::out | ios::app); + CPPUNIT_ASSERT(traceFile); // file created empty, then closed + traceFile.close(); + + bp1 = LocalTraceBufferPool::instance(); + CPPUNIT_ASSERT(bp1); +} + +// ============================================================================ +/*! + * - delete trace classes + */ +// ============================================================================ + +void +UtilsTest::tearDown() +{ + LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance(); + CPPUNIT_ASSERT(bp1); + bp1->deleteInstance(bp1); +} + +int genExcept() +{ + throw SALOME_Exception("a message"); +}; + +// ============================================================================ +/*! + * Check basic SALOME_exception mecanism + */ +// ============================================================================ + +void +UtilsTest::testSALOME_ExceptionThrow() +{ + CPPUNIT_ASSERT_THROW(genExcept(), SALOME_Exception); +} + +// ============================================================================ +/*! + * Check message on catch + */ +// ============================================================================ + +void +UtilsTest::testSALOME_ExceptionMessage() +{ +#define EXAMPLE_EXCEPTION_MESSAGE "something for the end user" + try + { + throw SALOME_Exception(EXAMPLE_EXCEPTION_MESSAGE); + } + catch (const SALOME_Exception &ex) + { + string expectedMessage = EXAMPLE_EXCEPTION_MESSAGE; + string actualMessage = ex.what(); + CPPUNIT_ASSERT(actualMessage.find(expectedMessage) != string::npos); + } +} diff --git a/src/Utils/Test/UtilsTest.hxx b/src/Utils/Test/UtilsTest.hxx new file mode 100644 index 000000000..ffb23e190 --- /dev/null +++ b/src/Utils/Test/UtilsTest.hxx @@ -0,0 +1,23 @@ + +#ifndef _UTILSTEST_HXX_ +#define _UTILSTEST_HXX_ + +#include + +class UtilsTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( UtilsTest ); + CPPUNIT_TEST( testSALOME_ExceptionThrow ); + CPPUNIT_TEST( testSALOME_ExceptionMessage ); + CPPUNIT_TEST_SUITE_END(); + +public: + + void setUp(); + void tearDown(); + + void testSALOME_ExceptionThrow(); + void testSALOME_ExceptionMessage(); +}; + +#endif diff --git a/src/Utils/Utils_CommException.hxx b/src/Utils/Utils_CommException.hxx index c559355d4..388445bfc 100644 --- a/src/Utils/Utils_CommException.hxx +++ b/src/Utils/Utils_CommException.hxx @@ -31,7 +31,7 @@ # include "Utils_SALOME_Exception.hxx" -class CommException : public SALOME_Exception +class UTILS_EXPORT CommException : public SALOME_Exception { public : CommException( void ); diff --git a/src/Utils/Utils_CorbaException.hxx b/src/Utils/Utils_CorbaException.hxx index 5d6d5bf51..c05e8e50a 100644 --- a/src/Utils/Utils_CorbaException.hxx +++ b/src/Utils/Utils_CorbaException.hxx @@ -45,7 +45,7 @@ throw SALOME::SALOME_Exception(ExDescription); \ } -#include +#include //Dump the CORBA exception type. inline std::ostream& operator<<(std::ostream& os, const CORBA::Exception& e) diff --git a/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.cxx b/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.cxx index 62ce955ef..ff8c7e64a 100644 --- a/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.cxx +++ b/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.cxx @@ -35,9 +35,7 @@ extern "C" } # include "Utils_DESTRUCTEUR_GENERIQUE.hxx" -# include "utilities.h" -using namespace std; - +//# include "utilities.h" void Nettoyage(); #ifdef _DEBUG_ @@ -46,17 +44,19 @@ static int MYDEBUG = 0; static int MYDEBUG = 0; #endif -static list *Destructeurs=0 ; +using namespace std; + +std::list *DESTRUCTEUR_GENERIQUE_::Destructeurs=0 ; /*! \class ATEXIT_ * - * Mécanisme pour faire exécuter une seule fois DESTRUCTEUR_GENERIQUE_::Nettoyage - * à la fin du traitement : creation d'un singleton statique de l'objet + * Mecanisme pour faire executer une seule fois DESTRUCTEUR_GENERIQUE_::Nettoyage + * a la fin du traitement : creation d'un singleton statique de l'objet * tres specialise ATEXIT_. * - * La création d'un objet de type ATEXIT_ entraîne l'inscription de la fonction - * Nettoyage() par atexit(). Il suffit donc de créer un singleton statique du type ATEXIT_ - * pour effectuer cet enregistrement une seule fois indépendament de l'utilisateur. + * La creation d'un objet de type ATEXIT_ entraine l'inscription de la fonction + * Nettoyage() par atexit(). Il suffit donc de creer un singleton statique du type ATEXIT_ + * pour effectuer cet enregistrement une seule fois independament de l'utilisateur. */ //CCRT @@ -67,30 +67,31 @@ class ATEXIT_ { public : /*! - * Allocation dynamique de Destructeurs, une liste chaînée de DESTRUCTEUR_GENERIQUE_* et enregistrement + * Allocation dynamique de Destructeurs, une liste chainee de DESTRUCTEUR_GENERIQUE_* et enregistrement * de la fonction Nettoyage() par atexit(). * - * La liste chaînée Destructeurs est détruite dans la fonction Nettoyage. + * La liste chainee Destructeurs est detruite dans la fonction Nettoyage. */ - //CCRT ATEXIT_( void ) + //CCRT ATEXIT_( void ) ATEXIT_( bool Make_ATEXIT ) { //CCRT if ( Make_ATEXIT && !ATEXIT_Done ) { //CCRT - ASSERT (Destructeurs==0); - if(MYDEBUG) MESSAGE("Construction ATEXIT"); // message necessaire pour utiliser logger dans Nettoyage (cf.BUG KERNEL4561) - Destructeurs = new list ; // Destructeurs alloué dynamiquement (cf. ci-dessous) , - // il est utilisé puis détruit par la fonction Nettoyage - int cr = atexit( Nettoyage ); // exécute Nettoyage lors de exit, après la destruction des données statiques ! - ASSERT(cr==0) ; + assert (DESTRUCTEUR_GENERIQUE_::Destructeurs==0); + //cerr << "ATEXIT_::ATEXIT_ Construction ATEXIT" << endl;// message necessaire pour utiliser logger dans Nettoyage (cf.BUG KERNEL4561) + DESTRUCTEUR_GENERIQUE_::Destructeurs = + new std::list ; // Destructeur alloue dynamiquement (cf. ci-dessous) , + // il est utilise puis detruit par la fonction Nettoyage + int cr = atexit( Nettoyage ); // execute Nettoyage lors de exit, aprs la destruction des donnees statiques ! + assert(cr==0) ; ATEXIT_Done = true ; } } ~ATEXIT_( ) { - if(MYDEBUG) MESSAGE("Destruction ATEXIT") ; + //cerr << "ATEXIT_::~ATEXIT_ Destruction ATEXIT" << endl; } }; @@ -101,41 +102,42 @@ static ATEXIT_ nettoyage = ATEXIT_( false ); /* singleton statique */ /*! - * traitement effectué : - * -# exécution de tous les objets de type DESTRUCTEUR_DE_ stockés dans la liste Destructeurs (ce qui détruit les + * traitement effectue : + * -# execution de tous les objets de type DESTRUCTEUR_DE_ stockes dans la liste Destructeurs (ce qui detruit les * singletons correspondant) ; - * -# puis destruction de tous les objets de type DESTRUCTEUR_DE_ stockés dans la liste Destructeurs; + * -# puis destruction de tous les objets de type DESTRUCTEUR_DE_ stockes dans la liste Destructeurs; * -# destruction de la liste Destructeurs. */ void Nettoyage( void ) { - if(MYDEBUG) BEGIN_OF("Nettoyage( void )") ; - ASSERT(Destructeurs) ; - if(MYDEBUG) SCRUTE( Destructeurs->size() ) ; - if( Destructeurs->size() ) + //cerr << "Nettoyage()" << endl; + //if(MYDEBUG) BEGIN_OF("Nettoyage( void )") ; + assert(DESTRUCTEUR_GENERIQUE_::Destructeurs) ; + //if(MYDEBUG) SCRUTE( DESTRUCTEUR_GENERIQUE_::Destructeurs->size() ) ; + if( DESTRUCTEUR_GENERIQUE_::Destructeurs->size() ) { - list::iterator it = Destructeurs->end() ; + std::list::iterator it = DESTRUCTEUR_GENERIQUE_::Destructeurs->end() ; do { - if(MYDEBUG) MESSAGE( "DESTRUCTION d'un SINGLETON"); + //if(MYDEBUG) MESSAGE( "DESTRUCTION d'un SINGLETON"); it-- ; DESTRUCTEUR_GENERIQUE_* ptr = *it ; - //Destructeurs->remove( *it ) ; + //DESTRUCTEUR_GENERIQUE_::Destructeurs->remove( *it ) ; (*ptr)() ; delete ptr ; - }while( it!= Destructeurs->begin() ) ; + }while( it!= DESTRUCTEUR_GENERIQUE_::Destructeurs->begin() ) ; - Destructeurs->clear() ; - if(MYDEBUG) SCRUTE( Destructeurs->size() ) ; - ASSERT( Destructeurs->size()==0 ) ; - ASSERT( Destructeurs->empty() ) ; + DESTRUCTEUR_GENERIQUE_::Destructeurs->clear() ; + //if(MYDEBUG) SCRUTE( DESTRUCTEUR_GENERIQUE_::Destructeurs->size() ) ; + assert( DESTRUCTEUR_GENERIQUE_::Destructeurs->size()==0 ) ; + assert( DESTRUCTEUR_GENERIQUE_::Destructeurs->empty() ) ; } - delete Destructeurs; - Destructeurs=0; - if(MYDEBUG) END_OF("Nettoyage( void )") ; + delete DESTRUCTEUR_GENERIQUE_::Destructeurs; + DESTRUCTEUR_GENERIQUE_::Destructeurs=0; + //if(MYDEBUG) END_OF("Nettoyage( void )") ; return ; } @@ -155,7 +157,7 @@ const int DESTRUCTEUR_GENERIQUE_::Ajout( DESTRUCTEUR_GENERIQUE_ &objet ) nettoyage = ATEXIT_( true ) ; } //CCRT - ASSERT(Destructeurs) ; + assert(Destructeurs) ; Destructeurs->push_back( &objet ) ; return Destructeurs->size() ; } diff --git a/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx b/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx index 6cf3432c1..68fb9ce6e 100644 --- a/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx +++ b/src/Utils/Utils_DESTRUCTEUR_GENERIQUE.hxx @@ -29,8 +29,10 @@ # if !defined( __DESTRUCTEUR_GENERIQUE__H__ ) # define __DESTRUCTEUR_GENERIQUE__H__ +# include +#include # include -# include "utilities.h" +//# include "utilities.h" /*!\class DESTRUCTEUR_GENERIQUE_ * @@ -53,12 +55,28 @@ * -# an object method to execute the destruction : operator()(). */ +#if defined UTILS_EXPORTS +#if defined WIN32 +#define UTILS_EXPORT __declspec( dllexport ) +#else +#define UTILS_EXPORT +#endif +#else +#if defined WNT +#define UTILS_EXPORT __declspec( dllimport ) +#else +#define UTILS_EXPORT +#endif +#endif + class DESTRUCTEUR_GENERIQUE_ { public : + UTILS_EXPORT static std::list *Destructeurs; + virtual ~DESTRUCTEUR_GENERIQUE_() {}//!< virtual destructor - static const int Ajout( DESTRUCTEUR_GENERIQUE_ &objet );//!< adds a destruction object to the list of destructions - virtual void operator()( void )=0 ;//!< performs the destruction + UTILS_EXPORT static const int Ajout( DESTRUCTEUR_GENERIQUE_ &objet );//!< adds a destruction object to the list of destructions + UTILS_EXPORT virtual void operator()( void )=0 ;//!< performs the destruction } ; @@ -94,7 +112,7 @@ public : DESTRUCTEUR_DE_(TYPE &objet): _PtrObjet( &objet ) { - ASSERT(DESTRUCTEUR_GENERIQUE_::Ajout( *this ) >= 0) ; + assert(DESTRUCTEUR_GENERIQUE_::Ajout( *this ) >= 0) ; } /* Performs the destruction of the object. @@ -105,13 +123,13 @@ public : typedef PortableServer::ServantBase TServant; if(_PtrObjet){ if(TServant* aServant = dynamic_cast(_PtrObjet)){ - MESSAGE("deleting ServantBase's _PtrObjet"); + //cerr << "DESTRUCTEUR_GENERIQUE_::operator() deleting ServantBase's _PtrObjet" << endl; PortableServer::POA_var aPOA = aServant->_default_POA(); PortableServer::ObjectId_var anObjectId = aPOA->servant_to_id(aServant); aPOA->deactivate_object(anObjectId.in()); aServant->_remove_ref(); }else{ - MESSAGE("deleting _PtrObjet"); + //cerr << "DESTRUCTEUR_GENERIQUE_::operator() deleting _PtrObjet" << endl; TYPE* aPtr = static_cast(_PtrObjet); delete aPtr; } @@ -120,7 +138,7 @@ public : } virtual ~DESTRUCTEUR_DE_(){ - ASSERT(!_PtrObjet) ; + assert(!_PtrObjet) ; } private : diff --git a/src/Utils/Utils_ExceptHandlers.hxx b/src/Utils/Utils_ExceptHandlers.hxx index 7996ae922..61b588055 100644 --- a/src/Utils/Utils_ExceptHandlers.hxx +++ b/src/Utils/Utils_ExceptHandlers.hxx @@ -31,23 +31,49 @@ #include +#if defined UTILS_EXPORTS +#if defined WIN32 +#define UTILS_EXPORT __declspec( dllexport ) +#else +#define UTILS_EXPORT +#endif +#else +#if defined WNT +#define UTILS_EXPORT __declspec( dllimport ) +#else +#define UTILS_EXPORT +#endif +#endif + typedef void (*PVF)(); -class Unexpect { //save / retrieve unexpected exceptions treatment +class UTILS_EXPORT Unexpect { //save / retrieve unexpected exceptions treatment PVF old; public : +#ifndef WNT Unexpect( PVF f ) { old = std::set_unexpected(f); } ~Unexpect() { std::set_unexpected(old); } +#else + Unexpect( PVF f ) + { old = ::set_unexpected(f); } + ~Unexpect() { ::set_unexpected(old); } +#endif }; -class Terminate {//save / retrieve terminate function +class UTILS_EXPORT Terminate {//save / retrieve terminate function PVF old; public : +#ifndef WNT Terminate( PVF f ) { old = std::set_terminate(f); } ~Terminate() { std::set_terminate(old); } +#else + Terminate( PVF f ) + { old = ::set_terminate(f); } + ~Terminate() { ::set_terminate(old); } +#endif }; #define UNEXPECT_CATCH(FuncName, ExceptionConstructor) \ @@ -69,7 +95,7 @@ inline void FuncName () {\ //Definitions : -extern void SalomeException(); -extern void SALOME_SalomeException(); +UTILS_EXPORT extern void SalomeException(); +UTILS_EXPORT extern void SALOME_SalomeException(); #endif diff --git a/src/Utils/Utils_Identity.cxx b/src/Utils/Utils_Identity.cxx index 570839bfa..daa27b0ee 100644 --- a/src/Utils/Utils_Identity.cxx +++ b/src/Utils/Utils_Identity.cxx @@ -27,19 +27,25 @@ // $Header$ # include -# include -# include -# include -# include # include "utilities.h" # include "Utils_Identity.hxx" -using namespace std; + extern "C" { # include + +#ifndef WNT /* unix functionality */ # include +#endif } +#ifndef WNT /* unix functionality */ + +# include +# include +# include +# include + const char* duplicate( const char *const str ) ; const struct utsname get_uname( void ) @@ -67,6 +73,59 @@ const char* const get_pwname( void ) return papa->pw_name ; } +#else /* Windows functionality */ + +#include +#include +#include + +const char* duplicate( const char *const str ) ; + +const char* get_uname( void ) +{ + char* hostName = new char[256]; + DWORD nSize = 256; + ASSERT(GetComputerName(hostName, &nSize)); + return hostName; +} + +const char* get_adip( void ) +{ + return get_uname(); +} + +const char* const get_pwname( void ) +{ + DWORD dwSize = 256 + 1; + char* retVal = new char[256]; + ASSERT(GetUserName ( retVal, &dwSize )); + return retVal; +} + +PSID getuid() { + PSID retVal = NULL; + HANDLE hProcessToken = INVALID_HANDLE_VALUE; + PTOKEN_OWNER pTKowner = NULL; + LPVOID buffer = NULL; + DWORD dwsize = 0; + + if ( !OpenProcessToken ( GetCurrentProcess (), TOKEN_QUERY, &hProcessToken )) return 0; + if (!GetTokenInformation(hProcessToken, TokenOwner, buffer, dwsize, &dwsize)) return 0; + pTKowner = (PTOKEN_OWNER)buffer; + if ( pTKowner != NULL ) { + retVal = pTKowner->Owner; + } + if ( hProcessToken != INVALID_HANDLE_VALUE ) CloseHandle ( hProcessToken ); + + return retVal; +} + +#define getcwd _getcwd +#define getpid _getpid + +#endif /* WNT */ + + Identity::Identity( const char *name ): _name(duplicate(name)),\ _hostid(get_uname()),\ _adip(get_adip()),\ @@ -103,15 +162,29 @@ const char* const Identity::name (void) const { return _name ; } -const pid_t &Identity::pid(void) const +#ifndef WNT + const pid_t& Identity::pid(void) const +#else + const DWORD& Identity::pid(void) const +#endif { return _pid ; } -const struct utsname &Identity::hostid(void) const + +#ifndef WNT + const struct utsname &Identity::hostid(void) const +#else + const char* const Identity::hostid(void) const +#endif { - return _hostid ; + return _hostid ; } -const uid_t &Identity::uid(void) const + +#ifndef WNT + const uid_t& Identity::uid(void) const +#else + const PSID& Identity::uid(void) const +#endif { return _uid ; } @@ -138,7 +211,11 @@ const char* const Identity::adip (void) const const char* Identity::host_char( void ) const { - return _hostid.nodename; +#ifndef WNT + return _hostid.nodename; +#else + return _hostid; +#endif } const char* Identity::start_char(void) const @@ -146,18 +223,22 @@ const char* Identity::start_char(void) const return ctime(&_start) ; } -ostream & operator<< ( ostream& os , const Identity& monid ) +std::ostream & operator<< ( std::ostream& os , const Identity& monid ) { ASSERT(monid._name!=NULL) ; - os << "Identity :" << endl ; - os << '\t' << "Component name : " << monid._name << endl ; - os << '\t' << "Numero de PID : " << monid._pid << endl; - os << '\t' << "Uid utilisateur : " << monid._uid << endl; - os << '\t' << "nom utilisateur : " << monid._pwname << endl; - os << '\t' << "Nom de machine : " << (monid._hostid).nodename << endl; - os << '\t' << "Adresse IP : " << monid._adip << endl; + os << "Identity :" << std::endl ; + os << '\t' << "Component name : " << monid._name << std::endl ; + os << '\t' << "Numero de PID : " << monid._pid << std::endl; + os << '\t' << "Uid utilisateur : " << monid._uid << std::endl; + os << '\t' << "nom utilisateur : " << monid._pwname << std::endl; +#ifndef WNT + os << '\t' << "Nom de machine : " << monid._hostid.nodename << std::endl; +#else + os << '\t' << "Nom de machine : " << monid._hostid << std::endl; +#endif + os << '\t' << "Adresse IP : " << monid._adip << std::endl; os << '\t' << "Heure de lancement : " << monid._cstart ; //ctime(&monid._start) ; - os << '\t' << "Dans le repertoire : " << monid._dir << endl; + os << '\t' << "Dans le repertoire : " << monid._dir << std::endl; return os ; } diff --git a/src/Utils/Utils_Identity.hxx b/src/Utils/Utils_Identity.hxx index 78d4ab8e2..9dd4db080 100644 --- a/src/Utils/Utils_Identity.hxx +++ b/src/Utils/Utils_Identity.hxx @@ -32,41 +32,70 @@ extern "C" { # include -# include # include +#ifndef WNT +# include # include +#else +# include +#endif } -class Identity +#if defined UTILS_EXPORTS +#if defined WIN32 +#define UTILS_EXPORT __declspec( dllexport ) +#else +#define UTILS_EXPORT +#endif +#else +#if defined WNT +#define UTILS_EXPORT __declspec( dllimport ) +#else +#define UTILS_EXPORT +#endif +#endif +class UTILS_EXPORT Identity { protected : const char* const _name ; - const struct utsname _hostid; const char* const _adip; // Internet address + +#ifndef WNT + const struct utsname _hostid; + const pid_t _pid ; const uid_t _uid ; - const char* const _pwname ; +#else + const char* const _hostid; + const DWORD _pid ; + const PSID _uid ; +#endif + const char* const _pwname ; const char* const _dir ; - const pid_t _pid ; const time_t _start; const char* const _cstart ; - private : Identity( void ); Identity( const Identity &monid ); - public : Identity(const char *name); ~Identity(); friend std::ostream & operator<< ( std::ostream& os , const Identity& monid ); +#ifndef WNT + const pid_t& pid(void) const; + const struct utsname& hostid(void) const; + const uid_t& uid(void) const; +#else + const DWORD& pid(void) const; + const char* const hostid(void) const; + const PSID& uid(void) const; +#endif + const char* const name( void ) const; - const pid_t& pid(void) const; - const struct utsname& hostid(void) const; const char* const adip(void) const; - const uid_t& uid(void) const; const char* const pwname(void) const; const time_t& start(void) const; const char* const rep (void) const; diff --git a/src/Utils/Utils_Mutex.cxx b/src/Utils/Utils_Mutex.cxx new file mode 100644 index 000000000..ef5881212 --- /dev/null +++ b/src/Utils/Utils_Mutex.cxx @@ -0,0 +1,93 @@ +// SALOME Utils : general SALOME's definitions and tools +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// +// File: Utils_Mutex.cxx +// Author: Sergey ANIKIN +// Module : SALOME +// $Header$ + + +#include + +Utils_Mutex::Utils_Mutex() +: myCount( 0 ) +{ + pthread_mutex_init( &myMutex, 0 ); + pthread_mutex_init( &myHelperMutex, 0 ); +} + +Utils_Mutex::~Utils_Mutex() +{ + pthread_mutex_destroy( &myHelperMutex ); + pthread_mutex_destroy( &myMutex ); +} + +void Utils_Mutex::lock() +{ + pthread_mutex_lock( &myHelperMutex ); + +#ifndef WNT + if ( myCount > 0 && myThread == pthread_self() ) { +#else + if ( myCount > 0 && myThread.p == pthread_self().p ) { +#endif + myCount++; + } + else { + pthread_mutex_unlock( &myHelperMutex ); + pthread_mutex_lock( &myMutex ); + pthread_mutex_lock( &myHelperMutex ); + myCount = 1; + myThread = pthread_self(); + } + + pthread_mutex_unlock( &myHelperMutex ); +} + +void Utils_Mutex::unlock() +{ + pthread_mutex_lock( &myHelperMutex ); + +#ifndef WNT + if ( myThread == pthread_self() ) { +#else + if ( myThread.p == pthread_self().p ) { +#endif + if ( myCount && (--myCount) < 1 ) { + myCount = 0; + pthread_mutex_unlock( &myMutex ); + } + } + + pthread_mutex_unlock( &myHelperMutex ); +} + +Utils_Locker::Utils_Locker( Utils_Mutex* mutex ) +: myMutex( mutex ) +{ + if ( myMutex ) myMutex->lock(); +} + +Utils_Locker::~Utils_Locker() +{ + if ( myMutex ) myMutex->unlock(); +} diff --git a/src/Utils/Utils_Mutex.hxx b/src/Utils/Utils_Mutex.hxx new file mode 100644 index 000000000..0d692099d --- /dev/null +++ b/src/Utils/Utils_Mutex.hxx @@ -0,0 +1,73 @@ +// SALOME Utils : general SALOME's definitions and tools +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// +// File: Utils_Mutex.hxx +// Author: Sergey ANIKIN +// Module : SALOME +// $Header$ + + +#ifndef Utils_Mutex_HeaderFile +#define Utils_Mutex_HeaderFile + +#include + +#if defined UTILS_EXPORTS +#if defined WIN32 +#define UTILS_EXPORT __declspec( dllexport ) +#else +#define UTILS_EXPORT +#endif +#else +#if defined WNT +#define UTILS_EXPORT __declspec( dllimport ) +#else +#define UTILS_EXPORT +#endif +#endif + +class UTILS_EXPORT Utils_Mutex +{ +public: + Utils_Mutex(); + ~Utils_Mutex(); + + void lock(); + void unlock(); + +private: + pthread_mutex_t myMutex; + pthread_mutex_t myHelperMutex; + pthread_t myThread; + int myCount; +}; + +class UTILS_EXPORT Utils_Locker +{ +public: + Utils_Locker( Utils_Mutex* ); + virtual ~Utils_Locker(); + +private: + Utils_Mutex* myMutex; +}; + +#endif diff --git a/src/Utils/Utils_ORB_INIT.cxx b/src/Utils/Utils_ORB_INIT.cxx index 5ac639246..7c774711c 100644 --- a/src/Utils/Utils_ORB_INIT.cxx +++ b/src/Utils/Utils_ORB_INIT.cxx @@ -28,22 +28,22 @@ # include "Utils_ORB_INIT.hxx" # include "utilities.h" -using namespace std; + +# include "SALOMEconfig.h" ORB_INIT::ORB_INIT( void ): _orb( CORBA::ORB::_nil() ) { - ; } ORB_INIT::~ORB_INIT() { - if ( ! CORBA::is_nil( _orb ) ) - { - MESSAGE("appel _orb->destroy()") ; - _orb->destroy() ; - MESSAGE("retour _orb->destroy()") ; - } + if ( ! CORBA::is_nil( _orb ) ) + { + //std::cerr << "appel _orb->destroy()" << std::endl; + _orb->destroy() ; + //std::cerr << "retour _orb->destroy()" << std::endl; + } } diff --git a/src/Utils/Utils_ORB_INIT.hxx b/src/Utils/Utils_ORB_INIT.hxx index 1a5c822db..345e2a292 100644 --- a/src/Utils/Utils_ORB_INIT.hxx +++ b/src/Utils/Utils_ORB_INIT.hxx @@ -34,12 +34,26 @@ #include "Utils_CommException.hxx" +#if defined UTILS_EXPORTS +#if defined WIN32 +#define UTILS_EXPORT __declspec( dllexport ) +#else +#define UTILS_EXPORT +#endif +#else +#if defined WNT +#define UTILS_EXPORT __declspec( dllimport ) +#else +#define UTILS_EXPORT +#endif +#endif + /*! * Ce composant prend en charge la connexion et la deconnexion a l'orb * Il est souhaitable de l'utiliser dans un SINGLETON. */ -class ORB_INIT +class UTILS_EXPORT ORB_INIT { private : diff --git a/src/Utils/Utils_SALOME_Exception.cxx b/src/Utils/Utils_SALOME_Exception.cxx index 6db802be8..b8cb4267d 100644 --- a/src/Utils/Utils_SALOME_Exception.cxx +++ b/src/Utils/Utils_SALOME_Exception.cxx @@ -29,13 +29,17 @@ #include #include "Utils_SALOME_Exception.hxx" #include "utilities.h" -using namespace std; + +#ifndef WNT extern "C" { +#endif #include #include #include +#ifndef WNT } +#endif const char* duplicate( const char *const str ) ; @@ -89,8 +93,9 @@ SALOME_Exception::~SALOME_Exception() throw () { if ( _text ) { - delete [] _text ; - _text = 0 ; + delete [] ((char*)_text); + char** pRef = (char**)&_text; + *pRef = 0; } ASSERT(_text==NULL) ; } @@ -103,7 +108,7 @@ SALOME_Exception::SALOME_Exception( const SALOME_Exception &ex ): _text(duplicat } -ostream & operator<<( ostream &os , const SALOME_Exception &ex ) +std::ostream & operator<<( std::ostream &os , const SALOME_Exception &ex ) { os << ex._text ; return os ; diff --git a/src/Utils/Utils_SALOME_Exception.hxx b/src/Utils/Utils_SALOME_Exception.hxx index 9ab9c9c3c..c870618aa 100644 --- a/src/Utils/Utils_SALOME_Exception.hxx +++ b/src/Utils/Utils_SALOME_Exception.hxx @@ -34,8 +34,21 @@ # define LOCALIZED(message) #message , __FILE__ , __LINE__ +#if defined UTILS_EXPORTS +#if defined WIN32 +#define UTILS_EXPORT __declspec( dllexport ) +#else +#define UTILS_EXPORT +#endif +#else +#if defined WNT +#define UTILS_EXPORT __declspec( dllimport ) +#else +#define UTILS_EXPORT +#endif +#endif -class SALOME_Exception : public std::exception +class UTILS_EXPORT SALOME_Exception : public std::exception { private : diff --git a/src/Utils/Utils_SINGLETON.hxx b/src/Utils/Utils_SINGLETON.hxx index 79d484389..8921e17b7 100644 --- a/src/Utils/Utils_SINGLETON.hxx +++ b/src/Utils/Utils_SINGLETON.hxx @@ -140,32 +140,32 @@ template SINGLETON_::SINGLETON_( void ) template int SINGLETON_::Destruction( void ) { int k = - 1 ; - BEGIN_OF("SINGLETON_::Destruction( void )") ; + //BEGIN_OF("SINGLETON_::Destruction( void )") ; if ( PtrSingleton ) { - MESSAGE("Destruction du SINGLETON_") ; + //MESSAGE("Destruction du SINGLETON_") ; std::list::iterator k ; - for( k=DESTRUCTEUR_GENERIQUE_::Destructeurs.begin() ; k!=DESTRUCTEUR_GENERIQUE_::Destructeurs.end();k++) + for( k=DESTRUCTEUR_GENERIQUE_::Destructeurs->begin() ; k!=DESTRUCTEUR_GENERIQUE_::Destructeurs->end();k++) { if ( *k == PtrSingleton->_Instance ) { - DESTRUCTEUR_GENERIQUE_::Destructeurs.erase( k ) ; + DESTRUCTEUR_GENERIQUE_::Destructeurs->erase( k ) ; break ; } } delete PtrSingleton ; PtrSingleton = NULL ; } - END_OF("SINGLETON_::Destruction( void )") ; + //END_OF("SINGLETON_::Destruction( void )") ; return k ; } template SINGLETON_::~SINGLETON_() { - MESSAGE("passage dans SINGLETON_::~SINGLETON_( void )") ; + //MESSAGE("passage dans SINGLETON_::~SINGLETON_( void )") ; } # endif /* # if !defined( __SINGLETON__H__ ) */ diff --git a/src/Utils/Utils_SignalsHandler.cxx b/src/Utils/Utils_SignalsHandler.cxx index e0940bfda..c96747334 100644 --- a/src/Utils/Utils_SignalsHandler.cxx +++ b/src/Utils/Utils_SignalsHandler.cxx @@ -24,7 +24,6 @@ #include #include "Utils_SignalsHandler.h" -using namespace std; //============================================================================ @@ -78,12 +77,15 @@ static void RestoreSigHandler(TSigHandler theSigHandler, //======================================================================= Utils_SignalsHandler::Utils_SignalsHandler() { - StoreSignalHandler(mySigHandlerCont,SIGHUP); // end of leader process - StoreSignalHandler(mySigHandlerCont,SIGFPE); // floating point exception - - StoreSignalHandler(mySigHandlerCont,SIGINT); // interrupt + // asv 28.02.05 : some signals are not defined on Windows.. why? I don't know.. +#ifndef WNT + StoreSignalHandler(mySigHandlerCont,SIGHUP); // floating point exception StoreSignalHandler(mySigHandlerCont,SIGQUIT); // quit StoreSignalHandler(mySigHandlerCont,SIGBUS); // bus error + StoreSignalHandler(mySigHandlerCont,SIGSTKFLT); // stack fault. +#endif + StoreSignalHandler(mySigHandlerCont,SIGFPE); // floating point exception + StoreSignalHandler(mySigHandlerCont,SIGINT); // interrupt StoreSignalHandler(mySigHandlerCont,SIGILL); // illegal instruction StoreSignalHandler(mySigHandlerCont,SIGTERM); // termination StoreSignalHandler(mySigHandlerCont,SIGSEGV); // segmentation diff --git a/src/Utils/Utils_SignalsHandler.h b/src/Utils/Utils_SignalsHandler.h index 475dcf18e..44228ba87 100644 --- a/src/Utils/Utils_SignalsHandler.h +++ b/src/Utils/Utils_SignalsHandler.h @@ -22,11 +22,25 @@ #define _UTILS_SIGNALSHANDLER_H_ +#if defined UTILS_EXPORTS +#if defined WIN32 +#define UTILS_EXPORT __declspec( dllexport ) +#else +#define UTILS_EXPORT +#endif +#else +#if defined WNT +#define UTILS_EXPORT __declspec( dllimport ) +#else +#define UTILS_EXPORT +#endif +#endif + #include typedef void (*TSigHandler)(int); -class Utils_SignalsHandler{ +class UTILS_EXPORT Utils_SignalsHandler{ public: Utils_SignalsHandler(); ~Utils_SignalsHandler(); @@ -40,7 +54,7 @@ class Utils_SignalsHandler{ }; -class Utils_CASSignalsHandler: private Utils_SignalsHandler{ +class UTILS_EXPORT Utils_CASSignalsHandler: private Utils_SignalsHandler{ public: Utils_CASSignalsHandler(); }; diff --git a/src/Utils/Utils_Timer.cxx b/src/Utils/Utils_Timer.cxx index 67153429e..65325f103 100644 --- a/src/Utils/Utils_Timer.cxx +++ b/src/Utils/Utils_Timer.cxx @@ -25,23 +25,35 @@ // Module : SALOME # include "Utils_Timer.hxx" + # include #include "utilities.h" -using namespace std; +#ifndef WNT static struct timezone *tz=(struct timezone*) malloc(sizeof(struct timezone)); +#else +//timezone *tz=_timezone; +#endif #ifndef CLK_TCK # define CLK_TCK CLOCKS_PER_SEC #endif Utils_Timer::Utils_Timer() { +#ifndef WNT RefToInitialTMS = new tms; RefToCurrentTMS = new tms; RefToInitialTimeB = new timeval; RefToCurrentTimeB = new timeval; +#else + RefToInitialTMS = new FILETIME; + RefToCurrentTMS = new FILETIME; + + RefToInitialTimeB = new time_t; + RefToCurrentTimeB = new time_t; +#endif Cumul_user = Cumul_sys = 0.; Stopped = 1; @@ -58,22 +70,37 @@ Utils_Timer::~Utils_Timer() { void Utils_Timer::Start() { if (Stopped) { Stopped = 0; +#ifndef WNT times(RefToInitialTMS); gettimeofday(RefToInitialTimeB,tz); +#else + SYSTEMTIME st; + GetSystemTime(&st); + SystemTimeToFileTime(&st, RefToInitialTMS); + time(RefToCurrentTimeB); +#endif } } void Utils_Timer::Stop() { if (!Stopped) { +#ifndef WNT times(RefToCurrentTMS); int diffr_user = RefToCurrentTMS->tms_utime - RefToInitialTMS->tms_utime; int diffr_sys = RefToCurrentTMS->tms_stime - RefToInitialTMS->tms_stime; gettimeofday(RefToCurrentTimeB,tz); - + Cumul_user += (double) diffr_user / CLK_TCK ; Cumul_sys += (double) diffr_sys / CLK_TCK ; - - Stopped = 1; +#else + SYSTEMTIME st; + GetSystemTime(&st); + SystemTimeToFileTime(&st, RefToCurrentTMS); + Cumul_user += (int)(((ULARGE_INTEGER*)(RefToCurrentTMS))->QuadPart - ((ULARGE_INTEGER*)(RefToInitialTMS))->QuadPart) / 10000000; + Cumul_sys = Cumul_user; + time(RefToCurrentTimeB); +#endif + Stopped = 1; } } @@ -91,6 +118,10 @@ void Utils_Timer::Reset() { } void Utils_Timer::ShowAbsolute(){ +#ifndef WNT unsigned long Absolute_user = (unsigned long) ((timeval*)RefToCurrentTimeB)->tv_sec ; +#else + unsigned long Absolute_user = *RefToCurrentTimeB; +#endif MESSAGE("Absolute time: " << Absolute_user << " seconds "); } diff --git a/src/Utils/Utils_Timer.hxx b/src/Utils/Utils_Timer.hxx index 06e10671b..603323e4d 100644 --- a/src/Utils/Utils_Timer.hxx +++ b/src/Utils/Utils_Timer.hxx @@ -27,9 +27,16 @@ #include #include +#ifndef WNT # include # include # include +#else +# include +# include +# include +#define _POSIX_ +#endif class Utils_Timer { public: @@ -44,6 +51,11 @@ class Utils_Timer { double Cumul_user; double Cumul_sys; bool Stopped; +#ifndef WNT tms *RefToCurrentTMS, *RefToInitialTMS; timeval *RefToCurrentTimeB, *RefToInitialTimeB; +#else + FILETIME *RefToCurrentTMS, *RefToInitialTMS; + time_t *RefToCurrentTimeB, *RefToInitialTimeB; +#endif }; diff --git a/src/Utils/duplicate.cxx b/src/Utils/duplicate.cxx index fa6cff737..b611ba64c 100644 --- a/src/Utils/duplicate.cxx +++ b/src/Utils/duplicate.cxx @@ -31,11 +31,13 @@ * It is strongly (and only) used in the Registry environment * (RegistryService, RegistryConnexion, Identity, ...) */ - -#include -#include - +extern "C" +{ +#include +#include +} #include "utilities.h" +#include "OpUtil.hxx" using namespace std; -- 2.30.2