From: admin Date: Wed, 12 Oct 2005 11:17:22 +0000 (+0000) Subject: This commit was generated by cvs2git to create tag X-Git-Tag: BR-D5-38-2003_D2005-12-10 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=8f6b469e437674ec22ea3ee8a7304f5128ab7a05;p=modules%2Fsmesh.git This commit was generated by cvs2git to create tag 'BR-D5-38-2003_D2005-12-10'. Sprout from BR-D5-38-2003 2005-10-12 11:17:21 UTC apo 'Adjust to CVS HEAD modifications' Delete: ChangeLog LICENCE adm_local/unix/config_files/check_Geom.m4 adm_local/unix/config_files/check_Med.m4 adm_local/unix/make_conclude.in adm_local/unix/make_omniorb.in cvs-tags doc/Makefile.in doc/salome/AddNetgenInSalome2.pdf doc/salome/AddNetgenInSalome2.ps doc/salome/AddNetgenInSalome2.sxw doc/salome/PluginMeshers.txt doc/salome/gui/Makefile.in doc/salome/gui/SMESH/i_blue.jpg doc/salome/gui/SMESH/image22.gif doc/salome/gui/SMESH/image22.jpg doc/salome/gui/SMESH/image23.jpg doc/salome/gui/SMESH/image24.gif doc/salome/gui/SMESH/image25.gif doc/salome/gui/SMESH/image25.jpg doc/salome/gui/SMESH/image26.jpg doc/salome/gui/SMESH/image27.jpg doc/salome/gui/SMESH/image28.gif doc/salome/gui/SMESH/image30.jpg doc/salome/gui/SMESH/image31.jpg doc/salome/gui/SMESH/image32.gif doc/salome/gui/SMESH/image32.jpg doc/salome/gui/SMESH/image33.gif doc/salome/gui/SMESH/image34.gif doc/salome/gui/SMESH/image35.gif doc/salome/gui/SMESH/image36.gif doc/salome/gui/SMESH/image36.jpg doc/salome/gui/SMESH/image37.gif doc/salome/gui/SMESH/image38.gif doc/salome/gui/SMESH/image38.jpg doc/salome/gui/SMESH/image39.gif doc/salome/gui/SMESH/image40.gif doc/salome/gui/SMESH/image41.gif doc/salome/gui/SMESH/image46.gif doc/salome/gui/SMESH/image51.jpg doc/salome/gui/SMESH/image52.jpg doc/salome/gui/SMESH/image63.gif doc/salome/gui/SMESH/image64.gif doc/salome/gui/SMESH/image67.gif doc/salome/gui/SMESH/image70.gif doc/salome/gui/SMESH/image70.jpg doc/salome/gui/SMESH/image71.gif doc/salome/gui/SMESH/image71.jpg doc/salome/gui/SMESH/image73.gif doc/salome/gui/SMESH/image74.gif doc/salome/gui/SMESH/image76.jpg doc/salome/gui/SMESH/image77.jpg doc/salome/gui/SMESH/image78.jpg doc/salome/gui/SMESH/image79.gif doc/salome/gui/SMESH/image80.gif doc/salome/gui/SMESH/image82.gif doc/salome/gui/SMESH/image83.gif doc/salome/gui/SMESH/image84.gif doc/salome/gui/SMESH/image88.gif doc/salome/gui/SMESH/image91.gif doc/salome/gui/SMESH/image92.gif doc/salome/gui/SMESH/image94.gif doc/salome/gui/SMESH/image95.gif doc/salome/gui/SMESH/image96.gif doc/salome/gui/SMESH/image97.gif doc/salome/gui/SMESH/image98.gif doc/salome/gui/SMESH/note1.gif doc/salome/gui/SMESH/pics/exemple.gif doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg doc/salome/gui/SMESH/whestart.ico doc/salome/gui/SMESH/whgdata/whexpbar.gif doc/salome/gui/SMESH/whrstart.ico doc/salome/gui/SMESH/whstart.ico doc/salome/gui/SMESH/wht_fts_h.gif doc/salome/gui/SMESH/wht_fts_n.gif doc/salome/gui/SMESH/wht_glo_h.gif doc/salome/gui/SMESH/wht_glo_n.gif doc/salome/gui/SMESH/wht_go.gif doc/salome/gui/SMESH/wht_hide.gif doc/salome/gui/SMESH/wht_idx_h.gif doc/salome/gui/SMESH/wht_idx_n.gif doc/salome/gui/SMESH/wht_logo1.gif doc/salome/gui/SMESH/wht_logo2.gif doc/salome/gui/SMESH/wht_next.gif doc/salome/gui/SMESH/wht_next_g.gif doc/salome/gui/SMESH/wht_prev.gif doc/salome/gui/SMESH/wht_prev_g.gif doc/salome/gui/SMESH/wht_spac.gif doc/salome/gui/SMESH/wht_sync.gif doc/salome/gui/SMESH/wht_tab0.gif doc/salome/gui/SMESH/wht_tab1.gif doc/salome/gui/SMESH/wht_tab2.gif doc/salome/gui/SMESH/wht_tab3.gif doc/salome/gui/SMESH/wht_tab4.gif doc/salome/gui/SMESH/wht_tab5.gif doc/salome/gui/SMESH/wht_tab6.gif doc/salome/gui/SMESH/wht_tab7.gif doc/salome/gui/SMESH/wht_tab8.gif doc/salome/gui/SMESH/wht_toc1.gif doc/salome/gui/SMESH/wht_toc2.gif doc/salome/gui/SMESH/wht_toc3.gif doc/salome/gui/SMESH/wht_toc4.gif doc/salome/gui/SMESH/wht_toc_h.gif doc/salome/gui/SMESH/wht_toc_n.gif doc/salome/gui/SMESH/wht_ws.gif doc/salome/gui/SMESH/wht_ws_g.gif doc/salome/tui/Makefile.in doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html doc/salome/tui/SMESH/HTML/SMESH_Gen.html doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html doc/salome/tui/SMESH/HTML/SMESH_Mesh.html doc/salome/tui/SMESH/sources/Application-About.png doc/salome/tui/SMESH/sources/Application-About1.jpg doc/salome/tui/SMESH/sources/application.gif doc/salome/tui/SMESH/sources/application.jpg doc/salome/tui/SMESH/sources/bg_salome.gif doc/salome/tui/SMESH/sources/logocorp.gif doc/salome/tui/SMESH/sources/myheader.html doc/salome/tui/SMESH/sources/myheader_py2.html doc/salome/tui/SMESH/sources/occ.gif doc/salome/tui/SMESH/sources/static/PluginMeshers.html doc/salome/tui/SMESH/sources/static/doxygen.css doc/salome/tui/SMESH/sources/static/page2.html doc/salome/tui/SMESH/sources/static/treeview.js idl/Makefile.in idl/SMESH_Group.idl idl/SMESH_Hypothesis.idl idl/SMESH_Pattern.idl resources/ModuleMesh.png resources/SMESH.config resources/SMESH_en.xml resources/SMESH_fr.xml resources/advanced_mesh_info.png resources/delete.png resources/mesh.png resources/mesh_add.png resources/mesh_add_sub.png resources/mesh_algo_hexa.png resources/mesh_algo_mefisto.png resources/mesh_algo_netgen.png resources/mesh_algo_quad.png resources/mesh_algo_regular.png resources/mesh_algo_tetra.png resources/mesh_angle.png resources/mesh_area.png resources/mesh_aspect.png resources/mesh_aspect_3d.png resources/mesh_compute.png resources/mesh_connectivity.png resources/mesh_cutGroups.png resources/mesh_cutquad.png resources/mesh_deleteGroups.png resources/mesh_diagonal.png resources/mesh_edit.png resources/mesh_edit_group.png resources/mesh_extrusion.png resources/mesh_extrusionpath.png resources/mesh_free_edges.png resources/mesh_free_edges_2d.png resources/mesh_hexa.png resources/mesh_hexa_n.png resources/mesh_hypo_area.png resources/mesh_hypo_edit.png resources/mesh_hypo_length.png resources/mesh_hypo_segment.png resources/mesh_hypo_volume.png resources/mesh_info.png resources/mesh_init.png resources/mesh_intersectGroups.png resources/mesh_length.png resources/mesh_length_2d.png resources/mesh_line.png resources/mesh_line_n.png resources/mesh_make_group.png resources/mesh_merge_elements.png resources/mesh_merge_nodes.png resources/mesh_move_node.png resources/mesh_multi_edges.png resources/mesh_multi_edges_2d.png resources/mesh_orientation.png resources/mesh_pattern.png resources/mesh_points.png resources/mesh_polygon.png resources/mesh_polyhedron.png resources/mesh_pyramid.png resources/mesh_pyramid_n.png resources/mesh_quad.png resources/mesh_quad_n.png resources/mesh_rem_element.png resources/mesh_rem_node.png resources/mesh_remove.png resources/mesh_renumbering_elements.png resources/mesh_renumbering_nodes.png resources/mesh_revolution.png resources/mesh_rotation.png resources/mesh_set_algo.png resources/mesh_set_hypo.png resources/mesh_sew_bordertoside.png resources/mesh_sew_conform_freeborders.png resources/mesh_sew_freeborders.png resources/mesh_sew_sideelements.png resources/mesh_shading.png resources/mesh_shrink.png resources/mesh_skew.png resources/mesh_smoothing.png resources/mesh_symmetry_axis.png resources/mesh_symmetry_plane.png resources/mesh_symmetry_point.png resources/mesh_taper.png resources/mesh_tetra.png resources/mesh_tetra_n.png resources/mesh_translation_points.png resources/mesh_translation_vector.png resources/mesh_tree_algo.png resources/mesh_tree_algo_hexa.png resources/mesh_tree_algo_mefisto.png resources/mesh_tree_algo_netgen.png resources/mesh_tree_algo_quad.png resources/mesh_tree_algo_regular.png resources/mesh_tree_algo_tetra.png resources/mesh_tree_group.png resources/mesh_tree_hypo.png resources/mesh_tree_hypo_area.png resources/mesh_tree_hypo_length.png resources/mesh_tree_hypo_segment.png resources/mesh_tree_hypo_volume.png resources/mesh_tree_importedmesh.png resources/mesh_tree_mesh.png resources/mesh_tree_mesh_warn.png resources/mesh_triangle.png resources/mesh_triangle_n.png resources/mesh_union2tri.png resources/mesh_unionGroups.png resources/mesh_uniontri.png resources/mesh_update.png resources/mesh_vertex.png resources/mesh_vertex_n.png resources/mesh_wireframe.png resources/mesh_wrap.png resources/pattern_sample_2d.png resources/pattern_sample_3D.png resources/select1.png resources/standard_mesh_info.png src/Controls/SMESHControls.cxx src/Controls/SMESH_Controls.hxx src/Controls/SMESH_ControlsDef.hxx src/Driver/Driver_Document.cxx src/Driver/Driver_Document.h src/Driver/Driver_Mesh.cxx src/Driver/Driver_Mesh.h src/Driver/Driver_SMDS_Mesh.cxx src/Driver/Driver_SMDS_Mesh.h src/Driver/Driver_SMESHDS_Mesh.cxx src/Driver/Driver_SMESHDS_Mesh.h src/Driver/Makefile.in src/DriverDAT/DAT_Test.cxx src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx src/DriverDAT/DriverDAT_R_SMDS_Mesh.h src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx src/DriverDAT/DriverDAT_R_SMESHDS_Document.h src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx src/DriverDAT/DriverDAT_W_SMDS_Mesh.h src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx src/DriverDAT/DriverDAT_W_SMESHDS_Document.h src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h src/DriverMED/DriverMED_Family.cxx src/DriverMED/DriverMED_Family.h src/DriverMED/DriverMED_R_SMDS_Mesh.cxx src/DriverMED/DriverMED_R_SMDS_Mesh.h src/DriverMED/DriverMED_R_SMESHDS_Document.cxx src/DriverMED/DriverMED_R_SMESHDS_Document.h src/DriverMED/DriverMED_R_SMESHDS_Mesh.h src/DriverMED/DriverMED_W_SMDS_Mesh.cxx src/DriverMED/DriverMED_W_SMDS_Mesh.h src/DriverMED/DriverMED_W_SMESHDS_Document.cxx src/DriverMED/DriverMED_W_SMESHDS_Document.h src/DriverMED/DriverMED_W_SMESHDS_Mesh.h src/DriverMED/MED_Test.cxx src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx src/DriverSTL/DriverSTL_R_SMDS_Mesh.h src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx src/DriverSTL/DriverSTL_W_SMDS_Mesh.h src/DriverSTL/STL_Test.cxx src/DriverUNV/DriverUNV_R_SMDS_Mesh.h src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx src/DriverUNV/DriverUNV_R_SMESHDS_Document.h src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx src/DriverUNV/DriverUNV_W_SMDS_Mesh.h src/DriverUNV/DriverUNV_W_SMESHDS_Document.cxx src/DriverUNV/DriverUNV_W_SMESHDS_Document.h src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.h src/DriverUNV/UNV2411_Structure.cxx src/DriverUNV/UNV2411_Structure.hxx src/DriverUNV/UNV2412_Structure.cxx src/DriverUNV/UNV2412_Structure.hxx src/DriverUNV/UNV_Test.cxx src/DriverUNV/UNV_Utilities.cxx src/DriverUNV/UNV_Utilities.hxx src/MEFISTO2/Rn.h src/MEFISTO2/aptrte.cxx src/MEFISTO2/aptrte.h src/MEFISTO2/areteideale.f src/MEFISTO2/trte.f src/Makefile.in src/NETGEN/Makefile.in src/NETGEN/ReadMeForNgUsers src/NETGEN/netgen43ForSalome.patch src/NETGENPlugin/Makefile.in src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx src/NETGENPlugin/NETGENPlugin_i.cxx src/NETGENPlugin/NETGENPlugin_icons.po src/OBJECT/Makefile.in src/OBJECT/SMESH_Actor.cxx src/OBJECT/SMESH_Actor.h src/OBJECT/SMESH_ActorDef.h src/OBJECT/SMESH_ActorUtils.cxx src/OBJECT/SMESH_ActorUtils.h src/OBJECT/SMESH_DeviceActor.cxx src/OBJECT/SMESH_DeviceActor.h src/OBJECT/SMESH_ExtractGeometry.cxx src/OBJECT/SMESH_ExtractGeometry.h src/OBJECT/SMESH_Object.cxx src/OBJECT/SMESH_Object.h src/OBJECT/SMESH_ObjectDef.h src/SMDS/Makefile.in src/SMDS/SMDSAbs_ElementType.hxx src/SMDS/SMDS_EdgePosition.cxx src/SMDS/SMDS_EdgePosition.hxx src/SMDS/SMDS_ElemIterator.hxx src/SMDS/SMDS_FaceOfEdges.cxx src/SMDS/SMDS_FaceOfEdges.hxx src/SMDS/SMDS_FaceOfNodes.cxx src/SMDS/SMDS_FaceOfNodes.hxx src/SMDS/SMDS_FacePosition.cxx src/SMDS/SMDS_FacePosition.hxx src/SMDS/SMDS_Iterator.hxx src/SMDS/SMDS_IteratorOfElements.cxx src/SMDS/SMDS_IteratorOfElements.hxx src/SMDS/SMDS_Mesh.cxx src/SMDS/SMDS_Mesh.hxx src/SMDS/SMDS_MeshEdge.cxx src/SMDS/SMDS_MeshEdge.hxx src/SMDS/SMDS_MeshElement.cxx src/SMDS/SMDS_MeshElement.hxx src/SMDS/SMDS_MeshElementIDFactory.cxx src/SMDS/SMDS_MeshElementIDFactory.hxx src/SMDS/SMDS_MeshFace.cxx src/SMDS/SMDS_MeshFace.hxx src/SMDS/SMDS_MeshGroup.cxx src/SMDS/SMDS_MeshGroup.hxx src/SMDS/SMDS_MeshIDFactory.cxx src/SMDS/SMDS_MeshIDFactory.hxx src/SMDS/SMDS_MeshNode.cxx src/SMDS/SMDS_MeshNode.hxx src/SMDS/SMDS_MeshObject.cxx src/SMDS/SMDS_MeshObject.hxx src/SMDS/SMDS_MeshVolume.cxx src/SMDS/SMDS_MeshVolume.hxx src/SMDS/SMDS_PolygonalFaceOfNodes.cxx src/SMDS/SMDS_PolygonalFaceOfNodes.hxx src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx src/SMDS/SMDS_Position.cxx src/SMDS/SMDS_Position.hxx src/SMDS/SMDS_SpacePosition.cxx src/SMDS/SMDS_SpacePosition.hxx src/SMDS/SMDS_TypeOfPosition.hxx src/SMDS/SMDS_VertexPosition.cxx src/SMDS/SMDS_VertexPosition.hxx src/SMDS/SMDS_VolumeOfFaces.cxx src/SMDS/SMDS_VolumeOfFaces.hxx src/SMDS/SMDS_VolumeOfNodes.cxx src/SMDS/SMDS_VolumeOfNodes.hxx src/SMDS/SMDS_VolumeTool.hxx src/SMESH/SMESH_1D_Algo.cxx src/SMESH/SMESH_1D_Algo.hxx src/SMESH/SMESH_2D_Algo.cxx src/SMESH/SMESH_2D_Algo.hxx src/SMESH/SMESH_3D_Algo.cxx src/SMESH/SMESH_3D_Algo.hxx src/SMESH/SMESH_Block.cxx src/SMESH/SMESH_Block.hxx src/SMESH/SMESH_Group.cxx src/SMESH/SMESH_Group.hxx src/SMESH/SMESH_HypoFilter.cxx src/SMESH/SMESH_HypoFilter.hxx src/SMESH/SMESH_Hypothesis.cxx src/SMESH/SMESH_Hypothesis.hxx src/SMESH/SMESH_Mesh.cxx src/SMESH/SMESH_Mesh.hxx src/SMESH/SMESH_subMesh.hxx src/SMESHDS/Makefile.in src/SMESHDS/SMESHDS_Command.cxx src/SMESHDS/SMESHDS_Command.hxx src/SMESHDS/SMESHDS_CommandType.hxx src/SMESHDS/SMESHDS_Document.cxx src/SMESHDS/SMESHDS_Document.hxx src/SMESHDS/SMESHDS_Group.cxx src/SMESHDS/SMESHDS_Group.hxx src/SMESHDS/SMESHDS_GroupBase.cxx src/SMESHDS/SMESHDS_GroupBase.hxx src/SMESHDS/SMESHDS_GroupOnGeom.cxx src/SMESHDS/SMESHDS_GroupOnGeom.hxx src/SMESHDS/SMESHDS_Hypothesis.cxx src/SMESHDS/SMESHDS_Hypothesis.hxx src/SMESHDS/SMESHDS_Mesh.cxx src/SMESHDS/SMESHDS_Script.cxx src/SMESHDS/SMESHDS_Script.hxx src/SMESHDS/SMESHDS_SubMesh.cxx src/SMESHDS/SMESHDS_SubMesh.hxx src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx src/SMESHFiltersSelection/SMESH_TypeFilter.ixx src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx src/SMESHGUI/SMESHGUI_Filter.cxx src/SMESHGUI/SMESHGUI_Filter.h src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h src/SMESHGUI/SMESHGUI_FilterUtils.cxx src/SMESHGUI/SMESHGUI_FilterUtils.h src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx src/SMESHGUI/SMESHGUI_GEOMGenUtils.h src/SMESHGUI/SMESHGUI_GroupDlg.cxx src/SMESHGUI/SMESHGUI_GroupUtils.cxx src/SMESHGUI/SMESHGUI_GroupUtils.h src/SMESHGUI/SMESHGUI_IdValidator.h src/SMESHGUI/SMESHGUI_MeshUtils.cxx src/SMESHGUI/SMESHGUI_MeshUtils.h src/SMESHGUI/SMESHGUI_PatternUtils.cxx src/SMESHGUI/SMESHGUI_PatternUtils.h src/SMESHGUI/SMESHGUI_PatternWidget.cxx src/SMESHGUI/SMESHGUI_PatternWidget.h src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx src/SMESHGUI/SMESHGUI_PrecisionDlg.h src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx src/SMESHGUI/SMESHGUI_SMESHGenUtils.h src/SMESHGUI/SMESHGUI_SpinBox.cxx src/SMESHGUI/SMESHGUI_SpinBox.h src/SMESHGUI/SMESHGUI_Swig.cxx src/SMESHGUI/SMESHGUI_Swig.hxx src/SMESHGUI/SMESHGUI_Swig.i src/SMESHGUI/SMESH_icons.po src/SMESH_I/SMESH.hxx src/SMESH_I/SMESHEngine.cxx src/SMESH_I/SMESH_1D_Algo_i.cxx src/SMESH_I/SMESH_1D_Algo_i.hxx src/SMESH_I/SMESH_2D_Algo_i.cxx src/SMESH_I/SMESH_2D_Algo_i.hxx src/SMESH_I/SMESH_3D_Algo_i.cxx src/SMESH_I/SMESH_3D_Algo_i.hxx src/SMESH_I/SMESH_Algo_i.cxx src/SMESH_I/SMESH_Algo_i.hxx src/SMESH_I/SMESH_Gen_i_1.cxx src/SMESH_I/SMESH_Group_i.hxx src/SMESH_I/SMESH_Hypothesis_i.cxx src/SMESH_I/SMESH_Hypothesis_i.hxx src/SMESH_I/SMESH_MEDFamily_i.cxx src/SMESH_I/SMESH_MEDFamily_i.hxx src/SMESH_I/SMESH_MEDMesh_i.cxx src/SMESH_I/SMESH_MEDSupport_i.cxx src/SMESH_I/SMESH_MEDSupport_i.hxx src/SMESH_I/SMESH_Mesh_i.hxx src/SMESH_I/SMESH_Pattern_i.hxx src/SMESH_I/SMESH_subMesh_i.cxx src/SMESH_I/SMESH_subMesh_i.hxx src/SMESH_I/smeshpy.py src/SMESH_SWIG/Makefile.in src/SMESH_SWIG/PAL_MESH_041_mesh.py src/SMESH_SWIG/PAL_MESH_043_2D.py src/SMESH_SWIG/PAL_MESH_043_3D.py src/SMESH_SWIG/SMESH_BelongToGeom.py src/SMESH_SWIG/SMESH_GroupFromGeom.py src/SMESH_SWIG/SMESH_GroupFromGeom2.py src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py src/SMESH_SWIG/SMESH_Partition1_tetra.py src/SMESH_SWIG/SMESH_Sphere.py src/SMESH_SWIG/SMESH_blocks.py src/SMESH_SWIG/SMESH_box.py src/SMESH_SWIG/SMESH_box2_tetra.py src/SMESH_SWIG/SMESH_box3_tetra.py src/SMESH_SWIG/SMESH_box_tetra.py src/SMESH_SWIG/SMESH_controls.py src/SMESH_SWIG/SMESH_demo_hexa2_upd.py src/SMESH_SWIG/SMESH_fixation.py src/SMESH_SWIG/SMESH_fixation_hexa.py src/SMESH_SWIG/SMESH_fixation_tetra.py src/SMESH_SWIG/SMESH_freebord.py src/SMESH_SWIG/SMESH_hexaedre.py src/SMESH_SWIG/SMESH_mechanic.py src/SMESH_SWIG/SMESH_mechanic_editor.py src/SMESH_SWIG/SMESH_mechanic_tetra.py src/SMESH_SWIG/SMESH_shared_modules.py src/SMESH_SWIG/SMESH_test.py src/SMESH_SWIG/SMESH_test0.py src/SMESH_SWIG/SMESH_test1.py src/SMESH_SWIG/SMESH_test2.py src/SMESH_SWIG/SMESH_test3.py src/SMESH_SWIG/SMESH_test4.py src/SMESH_SWIG/batchmode_mefisto.py src/SMESH_SWIG/batchmode_smesh.py src/SMESH_SWIG/ex00_all.py src/SMESH_SWIG/ex01_cube2build.py src/SMESH_SWIG/ex02_cube2primitive.py src/SMESH_SWIG/ex03_cube2partition.py src/SMESH_SWIG/ex04_cube5tetraHexa.py src/SMESH_SWIG/ex05_hole1build.py src/SMESH_SWIG/ex06_hole1boolean.py src/SMESH_SWIG/ex07_hole1partition.py src/SMESH_SWIG/ex08_hole2build.py src/SMESH_SWIG/ex09_grid4build.py src/SMESH_SWIG/ex10_grid4geometry.py src/SMESH_SWIG/ex11_grid3partition.py src/SMESH_SWIG/ex12_grid17partition.py src/SMESH_SWIG/ex13_hole1partial.py src/SMESH_SWIG/ex14_cyl1holed.py src/SMESH_SWIG/ex15_cyl2geometry.py src/SMESH_SWIG/ex16_cyl2complementary.py src/SMESH_SWIG/ex17_dome1.py src/SMESH_SWIG/ex18_dome2.py src/SMESH_SWIG/ex19_sphereINcube.py src/SMESH_SWIG/libSMESH_Swig.i src/StdMeshers/StdMeshers_Arithmetic1D.cxx src/StdMeshers/StdMeshers_Arithmetic1D.hxx src/StdMeshers/StdMeshers_Deflection1D.cxx src/StdMeshers/StdMeshers_Deflection1D.hxx src/StdMeshers/StdMeshers_Hexa_3D.cxx src/StdMeshers/StdMeshers_Hexa_3D.hxx src/StdMeshers/StdMeshers_LengthFromEdges.cxx src/StdMeshers/StdMeshers_LengthFromEdges.hxx src/StdMeshers/StdMeshers_LocalLength.cxx src/StdMeshers/StdMeshers_LocalLength.hxx src/StdMeshers/StdMeshers_MEFISTO_2D.cxx src/StdMeshers/StdMeshers_MEFISTO_2D.hxx src/StdMeshers/StdMeshers_MaxElementArea.cxx src/StdMeshers/StdMeshers_MaxElementArea.hxx src/StdMeshers/StdMeshers_MaxElementVolume.cxx src/StdMeshers/StdMeshers_MaxElementVolume.hxx src/StdMeshers/StdMeshers_NotConformAllowed.cxx src/StdMeshers/StdMeshers_NotConformAllowed.hxx src/StdMeshers/StdMeshers_Penta_3D.cxx src/StdMeshers/StdMeshers_Penta_3D.hxx src/StdMeshers/StdMeshers_Propagation.cxx src/StdMeshers/StdMeshers_Propagation.hxx src/StdMeshers/StdMeshers_StartEndLength.cxx src/StdMeshers/StdMeshers_StartEndLength.hxx src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx src/StdMeshers_I/StdMeshers_LocalLength_i.hxx src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx src/StdMeshers_I/StdMeshers_Propagation_i.cxx src/StdMeshers_I/StdMeshers_Propagation_i.hxx src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx --- diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 46cf0c992..000000000 --- a/ChangeLog +++ /dev/null @@ -1,1811 +0,0 @@ -############################################################################### -#This is the SMESH change log. Do not modify because it is automatically -#created with : -#cvs2cl.pl -l "-b" -U users.cvs2cl --header header.cvs2cl -T -b --utc -############################################################################### - -2004-01-30 13:18 Nicolas Rejneri - - * doc/html/INPUT/: doxyfile, sources/static/tree.js: NRI : 1.4.0 - version - -2004-01-29 17:52 Jerome Robert - - * INSTALL, bin/VERSION: Upgrade to version 1.4.0. - -2004-01-29 17:33 Jerome Robert - - * src/: SMESHGUI/SMESHGUI_StudyAPI.cxx, SMESHGUI/SMESHGUI_Swig.cxx, - SMESH_I/SMESH_Gen_i.cxx: Merge branch merge_1_2_d - -2004-01-14 09:24 Nicolas Rejneri - - * doc/html/Makefile.in: NRI : bug KERNEL5014 fixed. - -2004-01-06 15:19 Nadir Bouhamou - - * src/SMESH_SWIG/SMESH_flight_skin.py: removing the call to the - tetrahedron generator NETGEN, because I did not yet manage to - make NETGEN running on the flight geometry. - -2004-01-06 15:16 Nadir Bouhamou - - * resources/SMESH_en.xml, resources/SMESH_fr.xml, - src/SMESHGUI/SMESHGUI.cxx: Mounting the hypothesis - LengthFromEdges in th GUI of SMESH. This functionality was only - in the C++ API, and in the CORBA API. - -2004-01-05 16:14 Jerome Robert - - * adm_local/unix/config_files/check_Netgen.m4: Fix a mispelled - environment variable for idl python - -2004-01-05 14:28 tag V1_3_1 - -2004-01-05 13:53 Jerome Robert - - * src/NETGEN/: ReadMeForNgUsers, netgen43ForSalome.patch: Add a - patch to make the build of netgen more user-friendly - -2004-01-05 13:52 Jerome Robert - - * src/NETGEN/Makefile.in: We do not need OCAF in Netgen - -2004-01-05 13:38 Jerome Robert - - * adm_local/unix/config_files/check_Netgen.m4: Fix some quotes - problems. - -2004-01-05 09:05 Jerome Robert - - * src/: SMDS/SMDS_Mesh.cxx, SMESHDS/SMESHDS_Document.cxx: [Bug - SMESH4830] bug in instal with gcc 2.95. Bug fixed. Note: SGI say - that is requiered to use set_intersection (see - http://www.sgi.com/tech/stl/set_intersection.html). - -2003-12-16 15:27 Nadir Bouhamou - - * adm_local/unix/config_files/check_Netgen.m4: Since there is an - idl precompilation directive in SMESH_BasicHypothesis.idl file, a - -DHAVE_NETGEN idl has to be added when compiling SMESH with - netgen to the idl c++ flags as well as to the idl python flags. - -2003-12-15 13:15 Nadir Bouhamou - - * src/SMESHDS/SMESHDS_Script.cxx: correct a small bug found by the - EDF developpement team (PN and AT) : AddVolume in the case of a - Tetrahedron. - -2003-12-11 09:51 Jerome Robert - - * src/SMESHGUI/SMESHGUI.cxx: [Bug SMESH4598] Crash of the session - when compute and update are not done in the same view. Bug fixed. - -2003-12-11 09:49 Jerome Robert - - * src/SMESH/SMESH_HypothesisFactory.cxx: HAVE_NETGEN (#define) to - remove an unresolved symbol when building without netgen - -2003-12-10 17:23 Jerome Robert - - * adm_local/unix/config_files/check_Netgen.m4, - idl/SMESH_BasicHypothesis.idl, - src/SMESH_I/SMESH_HypothesisFactory_i.cxx: Create and use - HAVE_NETGEN (#define) to avoid unresolved symbols in libraries. - -2003-12-10 16:05 Jerome Robert - - * src/SMESHGUI/SMESHGUI.cxx: Cosmetics - -2003-12-09 14:13 Nadir Bouhamou - - * src/SMESH/Makefile.in: Correcting a problem araising when - building the SMESH module whithout Netgen. - -2003-12-09 10:00 Nadir Bouhamou - - * doc/: AddNetgenInSalome2.pdf, AddNetgenInSalome2.ps, - AddNetgenInSalome2.sxw: updating or adding when merging in the - main trunk with the version in the branch nadir_1_2_2 !! Here a - document related to the integration of NETGEN in the SMESH module - has been added for future work in the integration of other - mesher. - -2003-12-08 15:30 Nadir Bouhamou - - * INSTALL, Makefile.in, configure.in.base, - adm_local/unix/make_commence.in, - adm_local/unix/config_files/check_Netgen.m4, bin/VERSION, - idl/SMESH_BasicHypothesis.idl, resources/SMESH_en.xml, - resources/SMESH_fr.xml, resources/flight_solid.brep, - resources/mesh_algo_netgen.png, resources/mesh_algo_tetra.png, - resources/mesh_tree_algo_netgen.png, - resources/mesh_tree_algo_tetra.png, src/Makefile.in, - src/DriverMED/DriverMED_R_SMDS_Mesh.cxx, - src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx, - src/DriverMED/DriverMED_W_SMDS_Mesh.cxx, - src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, - src/NETGEN/Makefile.in, src/NETGEN/ReadMeForNgUsers, - src/SMESH/Makefile.in, src/SMESH/SMESH_HypothesisFactory.cxx, - src/SMESH/SMESH_MEFISTO_2D.cxx, - src/SMESH/SMESH_MaxElementVolume.cxx, - src/SMESH/SMESH_MaxElementVolume.hxx, - src/SMESH/SMESH_NETGEN_3D.cxx, src/SMESH/SMESH_NETGEN_3D.hxx, - src/SMESH/SMESH_subMesh.cxx, src/SMESHGUI/SMESHGUI.cxx, - src/SMESHGUI/SMESHGUI.h, src/SMESHGUI/SMESHGUI_NbSegmentsDlg.cxx, - src/SMESHGUI/SMESHGUI_icons.po, src/SMESH_I/Makefile.in, - src/SMESH_I/SMESH_Gen_i.cxx, - src/SMESH_I/SMESH_HypothesisFactory_i.cxx, - src/SMESH_I/SMESH_LengthFromEdges_i.cxx, - src/SMESH_I/SMESH_LengthFromEdges_i.hxx, - src/SMESH_I/SMESH_MEDMesh_i.cxx, - src/SMESH_I/SMESH_MEDSupport_i.cxx, - src/SMESH_I/SMESH_MaxElementVolume_i.cxx, - src/SMESH_I/SMESH_MaxElementVolume_i.hxx, - src/SMESH_I/SMESH_NETGEN_3D_i.cxx, - src/SMESH_I/SMESH_NETGEN_3D_i.hxx, src/SMESH_SWIG/Makefile.in, - src/SMESH_SWIG/SMESH_Partition1_tetra.py, - src/SMESH_SWIG/SMESH_box2_tetra.py, - src/SMESH_SWIG/SMESH_box3_tetra.py, - src/SMESH_SWIG/SMESH_box_tetra.py, - src/SMESH_SWIG/SMESH_fixation_hexa.py, - src/SMESH_SWIG/SMESH_fixation_tetra.py, - src/SMESH_SWIG/SMESH_flight_skin.py, - src/SMESH_SWIG/SMESH_mechanic_tetra.py: updating or adding when - merging in the main trunk with the version in the branch - nadir_1_2_2 !! - -2003-12-05 14:49 Jerome Robert - - * src/MEFISTO2/trte.f: Remove "pause" primitive call. - -2003-11-27 11:45 Jerome Robert - - * resources/SMESH_en.xml, resources/SMESH_fr.xml, - src/SMESHGUI/SMESHGUI.cxx: [Bug SMESH839] Spelling: Hypotheses - - Hexa?edron (i,j,k). Bug Fixed. - -2003-11-25 08:52 tag V1_3_0 - -2003-11-25 08:52 Nicolas Rejneri - - * bin/VERSION, INSTALL: NRI: 1.3.0 version. - -2003-11-20 12:45 tag V1_3_0_b3 - -2003-11-20 12:45 Nicolas Rejneri - - * doc/html/INPUT/sources/static/: doxygen.css, page2.html, tree.js, - treeview.js: NRI : Add static documentation. - -2003-11-20 12:45 Nicolas Rejneri - - * doc/html/INPUT/sources/: Application-About.png, - Application-About1.jpg, application.gif, application.jpg, - bg_salome.gif, bg_salomepro.gif, doxygen.css: NRI : Update - images. - -2003-11-20 12:44 Nicolas Rejneri - - * doc/html/INPUT/doxyfile: NRI : Generate TreeView. - -2003-11-20 12:43 Nicolas Rejneri - - * doc/html/Makefile.in: NRI : Add static directory. - -2003-11-18 15:01 tag V1_3_0b2 - -2003-11-18 15:01 Jerome Robert - - * ChangeLog, INSTALL, cvs-tags: update for V1_3_0_b2 - -2003-11-18 09:19 Nadir Bouhamou - - * src/SMESH_I/: SMESH_MEDFamily_i.cxx, SMESH_MEDFamily_i.hxx, - SMESH_MEDMesh_i.cxx, SMESH_MEDMesh_i.hxx, SMESH_MEDSupport_i.cxx, - SMESH_MEDSupport_i.hxx: merge with the branch - nadir_update_MED_v1_3_0 (branch to build the V1_3_0 version of - the module. - -2003-11-12 13:20 tag V1_3_0_b1 - -2003-11-12 13:20 Jerome Robert - - * ChangeLog, INSTALL, cvs-tags, bin/VERSION: Update for V1.3.0b1 - -2003-11-12 11:40 Jerome Robert - - * src/OBJECT/SMESH_Actor.cxx: MergeV1_2c-1 - -2003-11-06 14:43 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI.cxx: NRI : MergeV1_2c-1. - -2003-11-06 14:34 Nicolas Rejneri - - * src/MEFISTO2/: areteideale.f, trte.f: NRI : Add licence header. - -2003-11-06 11:34 Nicolas Rejneri - - * LICENCE: NRI : add LICENCE file - -2003-11-03 15:50 Nicolas Rejneri - - * doc/html/Makefile.in: NRI : Relative path !!!! - -2003-10-22 15:28 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx: Fix/implement - removeNode, removeEdge, removeFace, removeVolume and - removeElement - -2003-10-20 16:26 Jerome Robert - - * src/SMESHGUI/SMESHGUI.cxx: When the main window was maximized - some dialogs were cropped at the bottom of the screen. It's now - fixed. - -2003-10-17 16:31 Jerome Robert - - * src/SMDS/SMDS_Mesh.cxx: Fix a bug. Quadrangles were added as - triangles. - -2003-10-06 10:50 tag MergeV1_2c-1 - -2003-10-06 10:50 Jerome Robert - - * cvs-tags: Update. Created a new branch for user nadir. - -2003-10-02 16:16 Nicolas Rejneri - - * build_configure: NRI : RedHat 9 compatibility (M. Tajchman). - -2003-09-26 15:14 tag V1_2_2 - -2003-09-26 15:14 Jerome Robert - - * INSTALL, cvs-tags: Add a tag file to track branch and tag. Update - INSTALL to prepare V1_2_2 tag. - -2003-09-26 14:21 tag V1_2_1 - -2003-09-26 14:21 Nicolas Rejneri - - * INSTALL: NRI : INSTALL file defined into SALOME2_PRODUCTION_CYCLE - document. - -2003-09-23 14:33 Jerome Robert - - * src/: SMDS/SMDS_FaceOfEdges.hxx, SMESHDS/SMESHDS_Mesh.hxx, - SMDS/SMDS_FaceOfNodes.hxx, SMDS/SMDS_MeshEdge.hxx, - SMDS/SMDS_MeshElement.hxx, SMDS/SMDS_Tria3OfNodes.hxx, - SMDS/SMDS_VolumeOfFaces.hxx: Keep compatible with gcc 2 - -2003-09-23 11:52 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : Display Component - UserName and Icon. - -2003-09-22 12:23 Jerome Robert - - * src/SMDS/SMDS_IteratorOfArray.hxx: Freshly added file - -2003-09-12 15:12 Jerome Robert - - * src/SMDS/: Makefile.in, SMDS_HexahedronOfNodes.cxx, - SMDS_HexahedronOfNodes.hxx, SMDS_Mesh.cxx, SMDS_Tria3OfNodes.cxx, - SMDS_Tria3OfNodes.hxx: Add HexahedronOfNodes and Tria3OfNodes to - improve performance - -2003-09-12 15:11 Jerome Robert - - * src/SMDS/SMDS_VolumeOfNodes.cxx: Fix bug. Was always printing 8 - nodes - -2003-09-08 15:04 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_VolumeOfNodes.cxx, - SMDS_VolumeOfNodes.hxx: Add support for tetra, pyramid and prism - -2003-09-08 13:41 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_MeshElement.cxx: Add some comments - -2003-09-05 12:19 Jerome Robert - - * src/SMDS/SMDS_MeshNode.cxx: Some forgotten return statments - -2003-09-05 11:45 Jerome Robert - - * src/: DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx, - DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, SMESH/SMESH_Hexa_3D.cxx: - Correct some memory leaks - -2003-09-05 10:31 Jerome Robert - - * src/: DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, - SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx, - SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx, - SMESH/SMESH_Quadrangle_2D.cxx, SMESH/SMESH_Quadrangle_2D.hxx, - SMESH/SMESH_Regular_1D.cxx, SMESH/SMESH_subMesh.cxx, - SMESHDS/SMESHDS_Mesh.cxx, SMESHDS/SMESHDS_Mesh.hxx, - SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx, - SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MeshEditor_i.cxx: - Use nodes and elements pointer instead on IDs - -2003-09-05 10:20 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx: Change API to use - pointer on elements and no longer ID of elements - -2003-09-04 15:04 Jerome Robert - - * src/SMESHDS/: Handle_SMESHDS_Command.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - Handle_SMESHDS_Document.hxx, - Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx, - Handle_SMESHDS_ListNodeOfListOfCommand.hxx, - Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - Handle_SMESHDS_Mesh.hxx, Handle_SMESHDS_Script.hxx, - Handle_SMESHDS_SubMesh.hxx, SMESHDS.cdl, SMESHDS_Command.cdl, - SMESHDS_Command.ixx, SMESHDS_Command.jxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx, - SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS_DataMapOfIntegerMesh.hxx, - SMESHDS_DataMapOfIntegerMesh_0.cxx, - SMESHDS_DataMapOfIntegerPtrHypothesis.hxx, - SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS_DataMapOfIntegerSubMesh.hxx, - SMESHDS_DataMapOfIntegerSubMesh_0.cxx, - SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS_DataMapOfShapeSubMesh.hxx, - SMESHDS_DataMapOfShapeSubMesh_0.cxx, SMESHDS_Document.cdl, - SMESHDS_Document.ixx, SMESHDS_Document.jxx, - SMESHDS_ListIteratorOfListOfAsciiString.hxx, - SMESHDS_ListIteratorOfListOfAsciiString_0.cxx, - SMESHDS_ListIteratorOfListOfCommand.hxx, - SMESHDS_ListIteratorOfListOfCommand_0.cxx, - SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx, - SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx, - SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS_ListNodeOfListOfAsciiString_0.cxx, - SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS_ListNodeOfListOfCommand_0.cxx, - SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx, - SMESHDS_ListOfAsciiString.hxx, SMESHDS_ListOfAsciiString_0.cxx, - SMESHDS_ListOfCommand.hxx, SMESHDS_ListOfCommand_0.cxx, - SMESHDS_ListOfPtrHypothesis.hxx, - SMESHDS_ListOfPtrHypothesis_0.cxx, SMESHDS_Mesh.cdl, - SMESHDS_Mesh.ixx, SMESHDS_Mesh.jxx, SMESHDS_PtrHypothesis.hxx, - SMESHDS_Script.cdl, SMESHDS_Script.ixx, SMESHDS_Script.jxx, - SMESHDS_SubMesh.cdl, SMESHDS_SubMesh.ixx, SMESHDS_SubMesh.jxx: - Remove no longer needed files - -2003-09-04 14:50 Jerome Robert - - * src/SMDS/: Handle_SMDSControl_BoundaryEdges.hxx, - Handle_SMDSControl_BoundaryFaces.hxx, - Handle_SMDSControl_MeshBoundary.hxx, - Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - Handle_SMDS_EdgePosition.hxx, Handle_SMDS_FacePosition.hxx, - Handle_SMDS_HSequenceOfMesh.hxx, - Handle_SMDS_ListNodeOfListOfMesh.hxx, - Handle_SMDS_ListNodeOfListOfMeshElement.hxx, - Handle_SMDS_ListNodeOfListOfMeshGroup.hxx, Handle_SMDS_Mesh.hxx, - Handle_SMDS_MeshEdge.hxx, Handle_SMDS_MeshElement.hxx, - Handle_SMDS_MeshElementIDFactory.hxx, Handle_SMDS_MeshFace.hxx, - Handle_SMDS_MeshGroup.hxx, Handle_SMDS_MeshHexahedron.hxx, - Handle_SMDS_MeshIDFactory.hxx, Handle_SMDS_MeshNode.hxx, - Handle_SMDS_MeshNodeIDFactory.hxx, Handle_SMDS_MeshObject.hxx, - Handle_SMDS_MeshPrism.hxx, Handle_SMDS_MeshPyramid.hxx, - Handle_SMDS_MeshQuadrangle.hxx, Handle_SMDS_MeshTetrahedron.hxx, - Handle_SMDS_MeshTriangle.hxx, Handle_SMDS_MeshVolume.hxx, - Handle_SMDS_Position.hxx, - Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx, - Handle_SMDS_SpacePosition.hxx, - Handle_SMDS_StdMapNodeOfExtendedMap.hxx, - Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - Handle_SMDS_VertexPosition.hxx, SMDS.cdl, SMDSAbs.cdl, - SMDSControl.cdl, SMDSControl.ixx, SMDSControl.jxx, - SMDSControl_BoundaryEdges.cdl, SMDSControl_BoundaryEdges.ixx, - SMDSControl_BoundaryEdges.jxx, SMDSControl_BoundaryFaces.cdl, - SMDSControl_BoundaryFaces.ixx, SMDSControl_BoundaryFaces.jxx, - SMDSControl_MeshBoundary.cdl, SMDSControl_MeshBoundary.ixx, - SMDSControl_MeshBoundary.jxx, SMDSEdit.cdl, - SMDSEdit_Transform.cdl, SMDSEdit_Transform.ixx, - SMDSEdit_Transform.jxx, SMDS_BasicMap.lxx, - SMDS_BasicMapIterator.lxx, - SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx, - SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx, - SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx, - SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx, - SMDS_DataMapOfIntegerMeshElement.hxx, - SMDS_DataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapOfPntInteger.hxx, SMDS_DataMapOfPntInteger_0.cxx, - SMDS_EdgePosition.cdl, SMDS_EdgePosition.ixx, - SMDS_EdgePosition.jxx, SMDS_EdgePosition.lxx, - SMDS_ExtendedMap.hxx, SMDS_ExtendedMap_0.cxx, - SMDS_ExtendedOrientedMap.hxx, SMDS_ExtendedOrientedMap_0.cxx, - SMDS_FacePosition.cdl, SMDS_FacePosition.ixx, - SMDS_FacePosition.jxx, SMDS_FacePosition.lxx, - SMDS_HSequenceOfMesh.hxx, SMDS_HSequenceOfMesh_0.cxx, - SMDS_ListIteratorOfListOfMesh.hxx, - SMDS_ListIteratorOfListOfMeshElement.hxx, - SMDS_ListIteratorOfListOfMeshElement_0.cxx, - SMDS_ListIteratorOfListOfMeshGroup.hxx, - SMDS_ListIteratorOfListOfMeshGroup_0.cxx, - SMDS_ListIteratorOfListOfMesh_0.cxx, - SMDS_ListNodeOfListOfMesh.hxx, - SMDS_ListNodeOfListOfMeshElement.hxx, - SMDS_ListNodeOfListOfMeshElement_0.cxx, - SMDS_ListNodeOfListOfMeshGroup.hxx, - SMDS_ListNodeOfListOfMeshGroup_0.cxx, - SMDS_ListNodeOfListOfMesh_0.cxx, SMDS_ListOfMesh.hxx, - SMDS_ListOfMeshElement.hxx, SMDS_ListOfMeshElement_0.cxx, - SMDS_ListOfMeshGroup.hxx, SMDS_ListOfMeshGroup_0.cxx, - SMDS_ListOfMesh_0.cxx, SMDS_Map.gxx, SMDS_MapHasher.gxx, - SMDS_MapIterator.gxx, SMDS_MapIteratorOfExtendedMap.hxx, - SMDS_MapIteratorOfExtendedMap_0.cxx, - SMDS_MapIteratorOfExtendedOrientedMap.hxx, - SMDS_MapIteratorOfExtendedOrientedMap_0.cxx, SMDS_MapNode.lxx, - SMDS_MapOfMeshElement.cdl, SMDS_MapOfMeshElement.cxx, - SMDS_MapOfMeshElement.hxx, SMDS_MapOfMeshElement.ixx, - SMDS_MapOfMeshElement.jxx, SMDS_MapOfMeshElement.lxx, - SMDS_MapOfMeshOrientedElement.cdl, - SMDS_MapOfMeshOrientedElement.cxx, - SMDS_MapOfMeshOrientedElement.hxx, - SMDS_MapOfMeshOrientedElement.ixx, - SMDS_MapOfMeshOrientedElement.jxx, - SMDS_MapOfMeshOrientedElement.lxx, SMDS_Mesh.cdl, SMDS_Mesh.ixx, - SMDS_Mesh.jxx, SMDS_Mesh.lxx, SMDS_MeshEdge.cdl, - SMDS_MeshEdge.ixx, SMDS_MeshEdge.jxx, SMDS_MeshEdge.lxx, - SMDS_MeshEdgesIterator.cdl, SMDS_MeshEdgesIterator.cxx, - SMDS_MeshEdgesIterator.hxx, SMDS_MeshEdgesIterator.ixx, - SMDS_MeshEdgesIterator.jxx, SMDS_MeshElement.cdl, - SMDS_MeshElement.ixx, SMDS_MeshElement.jxx, SMDS_MeshElement.lxx, - SMDS_MeshElementIDFactory.cdl, SMDS_MeshElementIDFactory.ixx, - SMDS_MeshElementIDFactory.jxx, SMDS_MeshElementIDFactory.lxx, - SMDS_MeshElementMapHasher.cdl, SMDS_MeshElementMapHasher.cxx, - SMDS_MeshElementMapHasher.hxx, SMDS_MeshElementMapHasher.ixx, - SMDS_MeshElementMapHasher.jxx, SMDS_MeshElementMapHasher.lxx, - SMDS_MeshElementsIterator.cdl, SMDS_MeshElementsIterator.cxx, - SMDS_MeshElementsIterator.hxx, SMDS_MeshElementsIterator.ixx, - SMDS_MeshElementsIterator.jxx, SMDS_MeshElementsIterator.lxx, - SMDS_MeshFace.cdl, SMDS_MeshFace.ixx, SMDS_MeshFace.jxx, - SMDS_MeshFace.lxx, SMDS_MeshFacesIterator.cdl, - SMDS_MeshFacesIterator.cxx, SMDS_MeshFacesIterator.hxx, - SMDS_MeshFacesIterator.ixx, SMDS_MeshFacesIterator.jxx, - SMDS_MeshGroup.cdl, SMDS_MeshGroup.ixx, SMDS_MeshGroup.jxx, - SMDS_MeshGroup.lxx, SMDS_MeshHexahedron.cdl, - SMDS_MeshHexahedron.ixx, SMDS_MeshHexahedron.jxx, - SMDS_MeshHexahedron.lxx, SMDS_MeshIDFactory.cdl, - SMDS_MeshIDFactory.ixx, SMDS_MeshIDFactory.jxx, - SMDS_MeshIDFactory.lxx, SMDS_MeshNode.cdl, SMDS_MeshNode.ixx, - SMDS_MeshNode.jxx, SMDS_MeshNode.lxx, SMDS_MeshNodeIDFactory.cdl, - SMDS_MeshNodeIDFactory.ixx, SMDS_MeshNodeIDFactory.jxx, - SMDS_MeshNodeIDFactory.lxx, SMDS_MeshNodesIterator.cdl, - SMDS_MeshNodesIterator.cxx, SMDS_MeshNodesIterator.hxx, - SMDS_MeshNodesIterator.ixx, SMDS_MeshNodesIterator.jxx, - SMDS_MeshObject.cdl, SMDS_MeshObject.ixx, SMDS_MeshObject.jxx, - SMDS_MeshOrientedElementMapHasher.cdl, - SMDS_MeshOrientedElementMapHasher.cxx, - SMDS_MeshOrientedElementMapHasher.hxx, - SMDS_MeshOrientedElementMapHasher.ixx, - SMDS_MeshOrientedElementMapHasher.jxx, - SMDS_MeshOrientedElementMapHasher.lxx, SMDS_MeshPrism.cdl, - SMDS_MeshPrism.ixx, SMDS_MeshPrism.jxx, SMDS_MeshPrism.lxx, - SMDS_MeshPyramid.cdl, SMDS_MeshPyramid.ixx, SMDS_MeshPyramid.jxx, - SMDS_MeshPyramid.lxx, SMDS_MeshQuadrangle.cdl, - SMDS_MeshQuadrangle.ixx, SMDS_MeshQuadrangle.jxx, - SMDS_MeshQuadrangle.lxx, SMDS_MeshTetrahedron.cdl, - SMDS_MeshTetrahedron.ixx, SMDS_MeshTetrahedron.jxx, - SMDS_MeshTetrahedron.lxx, SMDS_MeshTriangle.cdl, - SMDS_MeshTriangle.ixx, SMDS_MeshTriangle.jxx, - SMDS_MeshTriangle.lxx, SMDS_MeshVolume.cdl, SMDS_MeshVolume.ixx, - SMDS_MeshVolume.jxx, SMDS_MeshVolume.lxx, - SMDS_MeshVolumesIterator.cdl, SMDS_MeshVolumesIterator.cxx, - SMDS_MeshVolumesIterator.hxx, SMDS_MeshVolumesIterator.ixx, - SMDS_MeshVolumesIterator.jxx, SMDS_PntHasher.cdl, - SMDS_PntHasher.cxx, SMDS_PntHasher.hxx, SMDS_PntHasher.ixx, - SMDS_PntHasher.jxx, SMDS_PntHasher.lxx, SMDS_Position.cdl, - SMDS_Position.ixx, SMDS_Position.jxx, SMDS_Position.lxx, - SMDS_SequenceNodeOfSequenceOfMesh.hxx, - SMDS_SequenceNodeOfSequenceOfMesh_0.cxx, SMDS_SequenceOfMesh.hxx, - SMDS_SequenceOfMesh_0.cxx, SMDS_SpacePosition.cdl, - SMDS_SpacePosition.ixx, SMDS_SpacePosition.jxx, - SMDS_SpacePosition.lxx, SMDS_StdMapNode.gxx, SMDS_StdMapNode.lxx, - SMDS_StdMapNodeOfExtendedMap.hxx, - SMDS_StdMapNodeOfExtendedMap_0.cxx, - SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx, - SMDS_VertexPosition.cdl, SMDS_VertexPosition.ixx, - SMDS_VertexPosition.jxx: Remove no longer needed files - -2003-09-04 13:28 Jerome Robert - - * build_configure: It seems "make_omniorb" and "make_commence" need - to be before and after "envScript" - -2003-09-04 12:57 Jerome Robert - - * build_configure: make_commence and make_omniorb were detected - twice. Only one is requiered in AC_OUTPUT - -2003-09-04 12:03 Jerome Robert - - * src/: DriverDAT/DriverDAT_R_SMDS_Mesh.cxx, - DriverDAT/DriverDAT_R_SMDS_Mesh.h, - DriverDAT/DriverDAT_R_SMESHDS_Document.cxx, - DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx, - DriverDAT/DriverDAT_R_SMESHDS_Mesh.h, - DriverDAT/DriverDAT_W_SMDS_Mesh.cxx, - DriverDAT/DriverDAT_W_SMDS_Mesh.h, - DriverDAT/DriverDAT_W_SMESHDS_Document.cxx, - DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx, - DriverDAT/DriverDAT_W_SMESHDS_Mesh.h, - DriverMED/DriverMED_R_SMDS_Mesh.cxx, - DriverMED/DriverMED_R_SMDS_Mesh.h, - DriverMED/DriverMED_R_SMESHDS_Document.cxx, - DriverMED/DriverMED_R_SMESHDS_Mesh.cxx, - DriverMED/DriverMED_R_SMESHDS_Mesh.h, - DriverMED/DriverMED_W_SMDS_Mesh.cxx, - DriverMED/DriverMED_W_SMDS_Mesh.h, - DriverMED/DriverMED_W_SMESHDS_Document.cxx, - DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, - DriverMED/DriverMED_W_SMESHDS_Mesh.h, - DriverUNV/DriverUNV_R_SMDS_Mesh.cxx, - DriverUNV/DriverUNV_R_SMDS_Mesh.h, - DriverUNV/DriverUNV_R_SMESHDS_Document.cxx, - DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx, - DriverUNV/DriverUNV_R_SMESHDS_Mesh.h, - DriverUNV/DriverUNV_W_SMDS_Mesh.cxx, - DriverUNV/DriverUNV_W_SMDS_Mesh.h, - DriverUNV/DriverUNV_W_SMESHDS_Document.cxx, - DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx, - DriverUNV/DriverUNV_W_SMESHDS_Mesh.h: Update to match the changes - in SMDS - -2003-09-04 11:03 Jerome Robert - - * src/: DriverDAT/Makefile.in, DriverMED/Makefile.in, - DriverUNV/Makefile.in: Remove OCC_LIBS from LDFLAGS - -2003-09-04 10:56 Jerome Robert - - * src/Driver/: Document_Reader.cxx, Document_Reader.h, - Document_Writer.cxx, Document_Writer.h, Mesh_Reader.h, - Mesh_Writer.h: Update to mach the changes in SMDS - -2003-09-04 10:44 Jerome Robert - - * src/Driver/Makefile.in: Remove OCC_LIBS from LDFLAGS - -2003-09-04 10:41 Jerome Robert - - * src/SMESH_I/: SMESH_Gen_i.cxx, SMESH_MEDMesh_i.cxx, - SMESH_MEDMesh_i.hxx, SMESH_MEDSupport_i.cxx, - SMESH_MEDSupport_i.hxx, SMESH_MeshEditor_i.cxx, - SMESH_MeshEditor_i.hxx, SMESH_Mesh_i.cxx: Update to match the new - implementation of SMDS - -2003-09-04 10:10 Jerome Robert - - * src/SMESH/SMESH_MaxElementArea.cxx: make GetMaxArea const - -2003-09-04 10:10 Jerome Robert - - * src/SMESH/: SMESH_MEFISTO_2D.hxx, SMESH_Regular_1D.hxx: make - hypothesis const - -2003-09-04 09:55 Jerome Robert - - * src/SMESH/SMESH_Hexa_3D.hxx: Update to match the change of SMDS - (new DS). - -2003-09-04 09:51 Jerome Robert - - * src/SMESH_I/sstream: Use the file include in gcc instead of this - one - -2003-09-04 09:21 Jerome Robert - - * src/SMESH/: SMESH_Algo.cxx, SMESH_Algo.hxx, SMESH_Gen.cxx, - SMESH_Gen.hxx, SMESH_Hexa_3D.cxx, SMESH_MEFISTO_2D.cxx, - SMESH_MaxElementArea.hxx, SMESH_Mesh.cxx, SMESH_Mesh.hxx, - SMESH_Quadrangle_2D.cxx, SMESH_Regular_1D.cxx, SMESH_subMesh.cxx, - SMESH_subMesh.hxx: Update to match the change of SMDS (new DS). - -2003-09-04 09:13 Jerome Robert - - * src/SMESH/: SMESH_NumberOfSegments.cxx, - SMESH_NumberOfSegments.hxx: make GetNumberOfSegments and - GetScaleFactor const - -2003-09-04 09:10 Jerome Robert - - * src/SMESH/: SMESH_LocalLength.cxx, SMESH_LocalLength.hxx: make - GetLength const - -2003-09-04 08:09 Jerome Robert - - * src/SMESHFiltersSelection/Makefile.in: Change OCC_LIBS to - OCC_KERNEL_LIBS - -2003-09-04 07:55 Jerome Robert - - * src/SMESHGUI/Makefile.in: Change OCC_LIBS to OCC_KERNEL_LIBS - -2003-09-04 07:39 Jerome Robert - - * src/SMESHGUI/: SMESHGUI.cxx, SMESHGUI.h: Change - Handle(SMESHDS_Document) to SMESHDS_Document* - -2003-09-04 07:21 Jerome Robert - - * src/MEFISTO2/Makefile.in: Remove OCC_LIBS from LDFLAGS - -2003-09-04 07:14 Jerome Robert - - * src/SMESHDS/: Makefile.in, SMESHDS_Command.cxx, - SMESHDS_Command.hxx, SMESHDS_Document.cxx, SMESHDS_Document.hxx, - SMESHDS_Hypothesis.cxx, SMESHDS_Hypothesis.hxx, SMESHDS_Mesh.cxx, - SMESHDS_Mesh.hxx, SMESHDS_Script.cxx, SMESHDS_Script.hxx, - SMESHDS_SubMesh.cxx, SMESHDS_SubMesh.hxx: Remove Opencascade - dependencies. Change to STL. - -2003-09-03 17:31 Jerome Robert - - * src/OBJECT/Makefile.in: Change OCC_LIBS to OCC_KERNEL_LIBS - -2003-09-03 17:30 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx, SMDS_MeshEdge.cxx, - SMDS_MeshEdge.hxx, SMDS_MeshElement.cxx, SMDS_MeshElement.hxx, - SMDS_MeshNode.cxx, SMDS_MeshNode.hxx, SMDS_MeshVolume.cxx, - SMDS_MeshVolume.hxx, SMDS_MeshFace.cxx, SMDS_MeshFace.hxx: New DS - implementation - -2003-09-03 17:29 Jerome Robert - - * src/SMDS/: SMDS_EdgePosition.cxx, SMDS_EdgePosition.hxx, - SMDS_FacePosition.cxx, SMDS_FacePosition.hxx, - SMDS_MeshElementIDFactory.cxx, SMDS_MeshElementIDFactory.hxx, - SMDS_MeshGroup.cxx, SMDS_MeshGroup.hxx, SMDS_MeshIDFactory.cxx, - SMDS_MeshIDFactory.hxx, SMDS_MeshObject.cxx, SMDS_MeshObject.hxx, - SMDS_Position.cxx, SMDS_Position.hxx, SMDS_SpacePosition.cxx, - SMDS_SpacePosition.hxx, SMDS_TypeOfPosition.hxx, - SMDS_VertexPosition.cxx, SMDS_VertexPosition.hxx: Remove - Opencascade dependencies - -2003-09-03 17:21 Jerome Robert - - * src/SMDS/SMDSAbs_ElementType.hxx: comments - -2003-09-03 17:21 Jerome Robert - - * src/SMDS/: SMDS_Iterator.hxx, SMDS_IteratorOfElements.cxx, - SMDS_IteratorOfElements.hxx: Add iterator classes - -2003-09-03 17:16 Jerome Robert - - * src/SMDS/Makefile.in: Remove wok files. Comment no longer needed - files - -2003-09-03 17:09 Jerome Robert - - * src/SMDS/: SMDS_FaceOfEdges.cxx, SMDS_FaceOfEdges.hxx, - SMDS_FaceOfNodes.cxx, SMDS_FaceOfNodes.hxx, - SMDS_VolumeOfFaces.cxx, SMDS_VolumeOfFaces.hxx, - SMDS_VolumeOfNodes.cxx, SMDS_VolumeOfNodes.hxx: Add needed class - for the new DS - -2003-07-18 12:19 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : correction wrong merge. - -2003-07-11 07:32 Nicolas Rejneri - - * bin/VERSION, doc/html/Makefile.in, doc/html/INPUT/doxyfile: NRI : - Merge from V1_2. - -2003-07-10 17:51 Nicolas Rejneri - - * configure.in.base: NRI : Merge from V1_2. - -2003-07-10 16:31 Nicolas Rejneri - - * src/SMESHGUI/: SMESHGUI_Swig.cxx, SMESHGUI_Swig.i: NRI : Merge - from V1_2. - -2003-07-10 16:06 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI_Swig.cxx: NRI : Merge from V1_2. - -2003-07-10 15:36 Nicolas Rejneri - - * src/Driver/Makefile.in: NRI : Merge from V1_2. - -2003-07-10 15:03 Nicolas Rejneri - - * src/SMESH/Makefile.in, src/SMESH_I/Makefile.in, - idl/SMESH_BasicHypothesis.idl, idl/SMESH_Gen.idl, - idl/SMESH_Hypothesis.idl, idl/SMESH_Mesh.idl, - adm_local/unix/make_commence.in: NRI : Merge from V1_2. - -2003-07-10 14:47 Nicolas Rejneri - - * configure.in.base: NRI : Merge from V1_2. - -2003-07-10 14:31 Nicolas Rejneri - - * src/Driver/Makefile.in: NRI : Merge from V1_2. - -2003-07-10 13:35 Yves Fricaud - - * src/: SMESH_I/Makefile.in, SMESH_I/SMESH_1D_Algo_i.cxx, - SMESH_I/SMESH_1D_Algo_i.hxx, SMESH_I/SMESH_2D_Algo_i.cxx, - SMESH_I/SMESH_2D_Algo_i.hxx, SMESH_I/SMESH_3D_Algo_i.cxx, - SMESH_I/SMESH_3D_Algo_i.hxx, SMESH_I/SMESH_Algo_i.cxx, - SMESH_I/SMESH_Algo_i.hxx, SMESH_I/SMESH_Gen_i.cxx, - SMESH_I/SMESH_Gen_i.hxx, SMESH_I/SMESH_Hexa_3D_i.cxx, - SMESH_I/SMESH_Hexa_3D_i.hxx, - SMESH_I/SMESH_HypothesisFactory_i.cxx, - SMESH_I/SMESH_HypothesisFactory_i.hxx, - SMESH_I/SMESH_Hypothesis_i.cxx, SMESH_I/SMESH_Hypothesis_i.hxx, - SMESH_I/SMESH_LocalLength_i.cxx, SMESH_I/SMESH_LocalLength_i.hxx, - SMESH_I/SMESH_MEDFamily_i.cxx, SMESH_I/SMESH_MEDFamily_i.hxx, - SMESH_I/SMESH_MEDMesh_i.cxx, SMESH_I/SMESH_MEDMesh_i.hxx, - SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MEDSupport_i.hxx, - SMESH_I/SMESH_MEFISTO_2D_i.cxx, SMESH_I/SMESH_MEFISTO_2D_i.hxx, - SMESH_I/SMESH_MaxElementArea_i.cxx, - SMESH_I/SMESH_MaxElementArea_i.hxx, - SMESH_I/SMESH_MaxElementVolume_i.cxx, - SMESH_I/SMESH_MaxElementVolume_i.hxx, - SMESH_I/SMESH_MeshEditor_i.cxx, SMESH_I/SMESH_MeshEditor_i.hxx, - SMESH_I/SMESH_Mesh_i.cxx, SMESH_I/SMESH_Mesh_i.hxx, - SMESH_I/SMESH_NumberOfSegments_i.cxx, - SMESH_I/SMESH_NumberOfSegments_i.hxx, - SMESH_I/SMESH_Quadrangle_2D_i.cxx, - SMESH_I/SMESH_Quadrangle_2D_i.hxx, - SMESH_I/SMESH_Regular_1D_i.cxx, SMESH_I/SMESH_Regular_1D_i.hxx, - SMESH_I/SMESH_subMesh_i.cxx, SMESH_I/SMESH_subMesh_i.hxx, - SMESH_I/SMESH_test.py, SMESH_I/SMESH_topo.cxx, - SMESH_I/SMESH_topo.hxx, SMESH_I/smeshpy.py, - SMESH_SWIG/Makefile.in, SMESH_SWIG/SMESH_fixation.py, - SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py, - SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test2.py, - SMESH_SWIG/SMESH_test3.py, SMESH_SWIG/batchmode_smesh.py, - SMESH_SWIG/libSMESH_Swig.i: yfr : merge 1.2 - -2003-07-10 13:18 Yves Fricaud - - * src/SMESHGUI/: SMESHGUI.h, SMESHGUI_AddAlgorithmDlg.cxx, - SMESHGUI_AddAlgorithmDlg.h, SMESHGUI_AddEdgeDlg.cxx, - SMESHGUI_AddEdgeDlg.h, SMESHGUI_AddFaceDlg.cxx, - SMESHGUI_AddFaceDlg.h, SMESHGUI_AddHypothesisDlg.cxx, - SMESHGUI_AddHypothesisDlg.h, SMESHGUI_AddSubMeshDlg.cxx, - SMESHGUI_AddSubMeshDlg.h, SMESHGUI_AddVolumeDlg.cxx, - SMESHGUI_AddVolumeDlg.h, SMESHGUI_ComputeScalarValue.cxx, - SMESHGUI_ComputeScalarValue.h, SMESHGUI_DiagonalInversionDlg.cxx, - SMESHGUI_DiagonalInversionDlg.h, - SMESHGUI_EdgesConnectivityDlg.cxx, - SMESHGUI_EdgesConnectivityDlg.h, SMESHGUI_EditHypothesesDlg.cxx, - SMESHGUI_EditHypothesesDlg.h, SMESHGUI_EditScalarBarDlg.cxx, - SMESHGUI_EditScalarBarDlg.h, SMESHGUI_InitMeshDlg.cxx, - SMESHGUI_InitMeshDlg.h, SMESHGUI_LocalLengthDlg.cxx, - SMESHGUI_LocalLengthDlg.h, SMESHGUI_MaxElementAreaDlg.cxx, - SMESHGUI_MaxElementAreaDlg.h, SMESHGUI_MaxElementVolumeDlg.cxx, - SMESHGUI_MaxElementVolumeDlg.h, SMESHGUI_MeshInfosDlg.cxx, - SMESHGUI_MeshInfosDlg.h, SMESHGUI_MoveNodesDlg.cxx, - SMESHGUI_MoveNodesDlg.h, SMESHGUI_NbSegmentsDlg.cxx, - SMESHGUI_NbSegmentsDlg.h, SMESHGUI_NodesDlg.cxx, - SMESHGUI_NodesDlg.h, SMESHGUI_OrientationElementsDlg.cxx, - SMESHGUI_OrientationElementsDlg.h, - SMESHGUI_Preferences_ColorDlg.cxx, - SMESHGUI_Preferences_ColorDlg.h, - SMESHGUI_Preferences_ScalarBarDlg.cxx, - SMESHGUI_Preferences_ScalarBarDlg.h, - SMESHGUI_RemoveElementsDlg.cxx, SMESHGUI_RemoveElementsDlg.h, - SMESHGUI_RemoveNodesDlg.cxx, SMESHGUI_RemoveNodesDlg.h, - SMESHGUI_SpinBox.cxx, SMESHGUI_SpinBox.h, SMESHGUI_StudyAPI.cxx, - SMESHGUI_StudyAPI.h, SMESHGUI_Swig.cxx, SMESHGUI_Swig.hxx, - SMESHGUI_Swig.i, SMESHGUI_TransparencyDlg.cxx, - SMESHGUI_TransparencyDlg.h, SMESHGUI_aParameterDlg.cxx, - SMESHGUI_aParameterDlg.h: yfr : merge 1.2 - -2003-07-10 12:18 Yves Fricaud - - * src/SMESHGUI/: Makefile.in, SMESHGUI.cxx: yfr : Merge V1.2 - -2003-07-10 11:35 Yves Fricaud - - * src/SMESHFiltersSelection/Makefile.in: yfr : Merge with v1.2 - -2003-07-10 10:04 Yves Fricaud - - * src/: SMESHDS/Handle_SMESHDS_Command.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS/Handle_SMESHDS_Document.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_Mesh.hxx, - SMESHDS/Handle_SMESHDS_Script.hxx, - SMESHDS/Handle_SMESHDS_SubMesh.hxx, SMESHDS/Makefile.in, - SMESHDS/SMESHDS.cdl, SMESHDS/SMESHDS_Command.cdl, - SMESHDS/SMESHDS_Command.cxx, SMESHDS/SMESHDS_Command.hxx, - SMESHDS/SMESHDS_Command.ixx, SMESHDS/SMESHDS_Command.jxx, - SMESHDS/SMESHDS_CommandType.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_Document.cdl, SMESHDS/SMESHDS_Document.cxx, - SMESHDS/SMESHDS_Document.hxx, SMESHDS/SMESHDS_Document.ixx, - SMESHDS/SMESHDS_Document.jxx, SMESHDS/SMESHDS_Hypothesis.cxx, - SMESHDS/SMESHDS_Hypothesis.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfCommand.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_ListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListOfCommand.hxx, - SMESHDS/SMESHDS_ListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_Mesh.cdl, SMESHDS/SMESHDS_Mesh.cxx, - SMESHDS/SMESHDS_Mesh.hxx, SMESHDS/SMESHDS_Mesh.ixx, - SMESHDS/SMESHDS_Mesh.jxx, SMESHDS/SMESHDS_PtrHypothesis.hxx, - SMESHDS/SMESHDS_Script.cdl, SMESHDS/SMESHDS_Script.cxx, - SMESHDS/SMESHDS_Script.hxx, SMESHDS/SMESHDS_Script.ixx, - SMESHDS/SMESHDS_Script.jxx, SMESHDS/SMESHDS_SubMesh.cdl, - SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx, - SMESHDS/SMESHDS_SubMesh.ixx, SMESHDS/SMESHDS_SubMesh.jxx, - SMESH/Makefile.in, SMESH/SMESH_1D_Algo.cxx, - SMESH/SMESH_1D_Algo.hxx, SMESH/SMESH_2D_Algo.cxx, - SMESH/SMESH_2D_Algo.hxx, SMESH/SMESH_3D_Algo.cxx, - SMESH/SMESH_3D_Algo.hxx, SMESH/SMESH_Algo.cxx, - SMESH/SMESH_Algo.hxx, SMESH/SMESH_Gen.cxx, SMESH/SMESH_Gen.hxx, - SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx, - SMESH/SMESH_Hypothesis.cxx, SMESH/SMESH_Hypothesis.hxx, - SMESH/SMESH_HypothesisCreator.hxx, - SMESH/SMESH_HypothesisFactory.cxx, - SMESH/SMESH_HypothesisFactory.hxx, - SMESH/SMESH_LengthFromEdges.cxx, SMESH/SMESH_LengthFromEdges.hxx, - SMESH/SMESH_LocalLength.cxx, SMESH/SMESH_LocalLength.hxx, - SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx, - SMESH/SMESH_MaxElementArea.cxx, SMESH/SMESH_MaxElementArea.hxx, - SMESH/SMESH_MaxElementVolume.cxx, - SMESH/SMESH_MaxElementVolume.hxx, SMESH/SMESH_Mesh.cxx, - SMESH/SMESH_Mesh.hxx, SMESH/SMESH_NumberOfSegments.cxx, - SMESH/SMESH_NumberOfSegments.hxx, SMESH/SMESH_Quadrangle_2D.cxx, - SMESH/SMESH_Quadrangle_2D.hxx, SMESH/SMESH_Regular_1D.cxx, - SMESH/SMESH_Regular_1D.hxx, SMESH/SMESH_subMesh.cxx, - SMESH/SMESH_subMesh.hxx: yfr : Merge with v1.2 - -2003-07-10 09:49 Yves Fricaud - - * src/SMDS/: Handle_SMDSControl_BoundaryEdges.hxx, - Handle_SMDSControl_BoundaryFaces.hxx, - Handle_SMDSControl_MeshBoundary.hxx, - Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - Handle_SMDS_EdgePosition.hxx, Handle_SMDS_FacePosition.hxx, - Handle_SMDS_HSequenceOfMesh.hxx, - Handle_SMDS_ListNodeOfListOfMesh.hxx, - Handle_SMDS_ListNodeOfListOfMeshElement.hxx, - Handle_SMDS_ListNodeOfListOfMeshGroup.hxx, Handle_SMDS_Mesh.hxx, - Handle_SMDS_MeshEdge.hxx, Handle_SMDS_MeshElement.hxx, - Handle_SMDS_MeshElementIDFactory.hxx, Handle_SMDS_MeshFace.hxx, - Handle_SMDS_MeshGroup.hxx, Handle_SMDS_MeshHexahedron.hxx, - Handle_SMDS_MeshIDFactory.hxx, Handle_SMDS_MeshNode.hxx, - Handle_SMDS_MeshNodeIDFactory.hxx, Handle_SMDS_MeshObject.hxx, - Handle_SMDS_MeshPrism.hxx, Handle_SMDS_MeshPyramid.hxx, - Handle_SMDS_MeshQuadrangle.hxx, Handle_SMDS_MeshTetrahedron.hxx, - Handle_SMDS_MeshTriangle.hxx, Handle_SMDS_MeshVolume.hxx, - Handle_SMDS_Position.hxx, - Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx, - Handle_SMDS_SpacePosition.hxx, - Handle_SMDS_StdMapNodeOfExtendedMap.hxx, - Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - Handle_SMDS_VertexPosition.hxx, Makefile.in, SMDS.cdl, - SMDSAbs.cdl, SMDSAbs_ElementType.hxx, SMDSControl.cdl, - SMDSControl.cxx, SMDSControl.hxx, SMDSControl.ixx, - SMDSControl.jxx, SMDSControl_BoundaryEdges.cdl, - SMDSControl_BoundaryEdges.cxx, SMDSControl_BoundaryEdges.hxx, - SMDSControl_BoundaryEdges.ixx, SMDSControl_BoundaryEdges.jxx, - SMDSControl_BoundaryFaces.cdl, SMDSControl_BoundaryFaces.cxx, - SMDSControl_BoundaryFaces.hxx, SMDSControl_BoundaryFaces.ixx, - SMDSControl_BoundaryFaces.jxx, SMDSControl_MeshBoundary.cdl, - SMDSControl_MeshBoundary.cxx, SMDSControl_MeshBoundary.hxx, - SMDSControl_MeshBoundary.ixx, SMDSControl_MeshBoundary.jxx, - SMDSEdit.cdl, SMDSEdit_Transform.cdl, SMDSEdit_Transform.cxx, - SMDSEdit_Transform.hxx, SMDSEdit_Transform.ixx, - SMDSEdit_Transform.jxx, SMDS_BasicMap.lxx, - SMDS_BasicMapIterator.lxx, - SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx, - SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx, - SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx, - SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx, - SMDS_DataMapOfIntegerMeshElement.hxx, - SMDS_DataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapOfPntInteger.hxx, SMDS_DataMapOfPntInteger_0.cxx, - SMDS_EdgePosition.cdl, SMDS_EdgePosition.cxx, - SMDS_EdgePosition.hxx, SMDS_EdgePosition.ixx, - SMDS_EdgePosition.jxx, SMDS_EdgePosition.lxx, - SMDS_ExtendedMap.hxx, SMDS_ExtendedMap_0.cxx, - SMDS_ExtendedOrientedMap.hxx, SMDS_ExtendedOrientedMap_0.cxx, - SMDS_FacePosition.cdl, SMDS_FacePosition.cxx, - SMDS_FacePosition.hxx, SMDS_FacePosition.ixx, - SMDS_FacePosition.jxx, SMDS_FacePosition.lxx, - SMDS_HSequenceOfMesh.hxx, SMDS_HSequenceOfMesh_0.cxx, - SMDS_ListIteratorOfListOfMesh.hxx, - SMDS_ListIteratorOfListOfMeshElement.hxx, - SMDS_ListIteratorOfListOfMeshElement_0.cxx, - SMDS_ListIteratorOfListOfMeshGroup.hxx, - SMDS_ListIteratorOfListOfMeshGroup_0.cxx, - SMDS_ListIteratorOfListOfMesh_0.cxx, - SMDS_ListNodeOfListOfMesh.hxx, - SMDS_ListNodeOfListOfMeshElement.hxx, - SMDS_ListNodeOfListOfMeshElement_0.cxx, - SMDS_ListNodeOfListOfMeshGroup.hxx, - SMDS_ListNodeOfListOfMeshGroup_0.cxx, - SMDS_ListNodeOfListOfMesh_0.cxx, SMDS_ListOfMesh.hxx, - SMDS_ListOfMeshElement.hxx, SMDS_ListOfMeshElement_0.cxx, - SMDS_ListOfMeshGroup.hxx, SMDS_ListOfMeshGroup_0.cxx, - SMDS_ListOfMesh_0.cxx, SMDS_MapIteratorOfExtendedMap.hxx, - SMDS_MapIteratorOfExtendedMap_0.cxx, - SMDS_MapIteratorOfExtendedOrientedMap.hxx, - SMDS_MapIteratorOfExtendedOrientedMap_0.cxx, SMDS_MapNode.lxx, - SMDS_MapOfMeshElement.cdl, SMDS_MapOfMeshElement.cxx, - SMDS_MapOfMeshElement.hxx, SMDS_MapOfMeshElement.ixx, - SMDS_MapOfMeshElement.jxx, SMDS_MapOfMeshElement.lxx, - SMDS_MapOfMeshOrientedElement.cdl, - SMDS_MapOfMeshOrientedElement.cxx, - SMDS_MapOfMeshOrientedElement.hxx, - SMDS_MapOfMeshOrientedElement.ixx, - SMDS_MapOfMeshOrientedElement.jxx, - SMDS_MapOfMeshOrientedElement.lxx, SMDS_Mesh.cdl, SMDS_Mesh.cxx, - SMDS_Mesh.hxx, SMDS_Mesh.ixx, SMDS_Mesh.jxx, SMDS_Mesh.lxx, - SMDS_MeshEdge.cdl, SMDS_MeshEdge.cxx, SMDS_MeshEdge.hxx, - SMDS_MeshEdge.ixx, SMDS_MeshEdge.jxx, SMDS_MeshEdge.lxx, - SMDS_MeshEdgesIterator.cdl, SMDS_MeshEdgesIterator.cxx, - SMDS_MeshEdgesIterator.hxx, SMDS_MeshEdgesIterator.ixx, - SMDS_MeshEdgesIterator.jxx, SMDS_MeshElement.cdl, - SMDS_MeshElement.cxx, SMDS_MeshElement.hxx, SMDS_MeshElement.ixx, - SMDS_MeshElement.jxx, SMDS_MeshElement.lxx, - SMDS_MeshElementIDFactory.cdl, SMDS_MeshElementIDFactory.cxx, - SMDS_MeshElementIDFactory.hxx, SMDS_MeshElementIDFactory.ixx, - SMDS_MeshElementIDFactory.jxx, SMDS_MeshElementIDFactory.lxx, - SMDS_MeshElementMapHasher.cdl, SMDS_MeshElementMapHasher.cxx, - SMDS_MeshElementMapHasher.hxx, SMDS_MeshElementMapHasher.ixx, - SMDS_MeshElementMapHasher.jxx, SMDS_MeshElementMapHasher.lxx, - SMDS_MeshElementsIterator.cdl, SMDS_MeshElementsIterator.cxx, - SMDS_MeshElementsIterator.hxx, SMDS_MeshElementsIterator.ixx, - SMDS_MeshElementsIterator.jxx, SMDS_MeshElementsIterator.lxx, - SMDS_MeshFace.cdl, SMDS_MeshFace.cxx, SMDS_MeshFace.hxx, - SMDS_MeshFace.ixx, SMDS_MeshFace.jxx, SMDS_MeshFace.lxx, - SMDS_MeshFacesIterator.cdl, SMDS_MeshFacesIterator.cxx, - SMDS_MeshFacesIterator.hxx, SMDS_MeshFacesIterator.ixx, - SMDS_MeshFacesIterator.jxx, SMDS_MeshGroup.cdl, - SMDS_MeshGroup.cxx, SMDS_MeshGroup.hxx, SMDS_MeshGroup.ixx, - SMDS_MeshGroup.jxx, SMDS_MeshGroup.lxx, SMDS_MeshHexahedron.cdl, - SMDS_MeshHexahedron.cxx, SMDS_MeshHexahedron.hxx, - SMDS_MeshHexahedron.ixx, SMDS_MeshHexahedron.jxx, - SMDS_MeshHexahedron.lxx, SMDS_MeshIDFactory.cdl, - SMDS_MeshIDFactory.cxx, SMDS_MeshIDFactory.hxx, - SMDS_MeshIDFactory.ixx, SMDS_MeshIDFactory.jxx, - SMDS_MeshIDFactory.lxx, SMDS_MeshNode.cdl, SMDS_MeshNode.cxx, - SMDS_MeshNode.hxx, SMDS_MeshNode.ixx, SMDS_MeshNode.jxx, - SMDS_MeshNode.lxx, SMDS_MeshNodeIDFactory.cdl, - SMDS_MeshNodeIDFactory.cxx, SMDS_MeshNodeIDFactory.hxx, - SMDS_MeshNodeIDFactory.ixx, SMDS_MeshNodeIDFactory.jxx, - SMDS_MeshNodeIDFactory.lxx, SMDS_MeshNodesIterator.cdl, - SMDS_MeshNodesIterator.cxx, SMDS_MeshNodesIterator.hxx, - SMDS_MeshNodesIterator.ixx, SMDS_MeshNodesIterator.jxx, - SMDS_MeshObject.cdl, SMDS_MeshObject.cxx, SMDS_MeshObject.hxx, - SMDS_MeshObject.ixx, SMDS_MeshObject.jxx, - SMDS_MeshOrientedElementMapHasher.cdl, - SMDS_MeshOrientedElementMapHasher.cxx, - SMDS_MeshOrientedElementMapHasher.hxx, - SMDS_MeshOrientedElementMapHasher.ixx, - SMDS_MeshOrientedElementMapHasher.jxx, - SMDS_MeshOrientedElementMapHasher.lxx, SMDS_MeshPrism.cdl, - SMDS_MeshPrism.cxx, SMDS_MeshPrism.hxx, SMDS_MeshPrism.ixx, - SMDS_MeshPrism.jxx, SMDS_MeshPrism.lxx, SMDS_MeshPyramid.cdl, - SMDS_MeshPyramid.cxx, SMDS_MeshPyramid.hxx, SMDS_MeshPyramid.ixx, - SMDS_MeshPyramid.jxx, SMDS_MeshPyramid.lxx, - SMDS_MeshQuadrangle.cdl, SMDS_MeshQuadrangle.cxx, - SMDS_MeshQuadrangle.hxx, SMDS_MeshQuadrangle.ixx, - SMDS_MeshQuadrangle.jxx, SMDS_MeshQuadrangle.lxx, - SMDS_MeshTetrahedron.cdl, SMDS_MeshTetrahedron.cxx, - SMDS_MeshTetrahedron.hxx, SMDS_MeshTetrahedron.ixx, - SMDS_MeshTetrahedron.jxx, SMDS_MeshTetrahedron.lxx, - SMDS_MeshTriangle.cdl, SMDS_MeshTriangle.cxx, - SMDS_MeshTriangle.hxx, SMDS_MeshTriangle.ixx, - SMDS_MeshTriangle.jxx, SMDS_MeshTriangle.lxx, - SMDS_MeshVolume.cdl, SMDS_MeshVolume.cxx, SMDS_MeshVolume.hxx, - SMDS_MeshVolume.ixx, SMDS_MeshVolume.jxx, SMDS_MeshVolume.lxx, - SMDS_MeshVolumesIterator.cdl, SMDS_MeshVolumesIterator.cxx, - SMDS_MeshVolumesIterator.hxx, SMDS_MeshVolumesIterator.ixx, - SMDS_MeshVolumesIterator.jxx, SMDS_PntHasher.cdl, - SMDS_PntHasher.cxx, SMDS_PntHasher.hxx, SMDS_PntHasher.ixx, - SMDS_PntHasher.jxx, SMDS_PntHasher.lxx, SMDS_Position.cdl, - SMDS_Position.cxx, SMDS_Position.hxx, SMDS_Position.ixx, - SMDS_Position.jxx, SMDS_Position.lxx, - SMDS_SequenceNodeOfSequenceOfMesh.hxx, - SMDS_SequenceNodeOfSequenceOfMesh_0.cxx, SMDS_SequenceOfMesh.hxx, - SMDS_SequenceOfMesh_0.cxx, SMDS_SpacePosition.cdl, - SMDS_SpacePosition.cxx, SMDS_SpacePosition.hxx, - SMDS_SpacePosition.ixx, SMDS_SpacePosition.jxx, - SMDS_SpacePosition.lxx, SMDS_StdMapNode.lxx, - SMDS_StdMapNodeOfExtendedMap.hxx, - SMDS_StdMapNodeOfExtendedMap_0.cxx, - SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx, - SMDS_TypeOfPosition.hxx, SMDS_VertexPosition.cdl, - SMDS_VertexPosition.cxx, SMDS_VertexPosition.hxx, - SMDS_VertexPosition.ixx, SMDS_VertexPosition.jxx: yfr : Merge - with v1.2 - -2003-07-10 09:32 Yves Fricaud - - * src/: DriverDAT/Makefile.in, DriverUNV/Makefile.in, - MEFISTO2/Makefile.in, OBJECT/Makefile.in, OBJECT/SMESH_Actor.cxx, - OBJECT/SMESH_Actor.h, OBJECT/SMESH_Grid.cxx, OBJECT/SMESH_Grid.h: - yfr : Merge with v1.2 - -2003-07-10 09:14 Yves Fricaud - - * src/Makefile.in: yfr : Merge with v1.2 - -2003-07-10 09:00 Yves Fricaud - - * src/: Driver/Document_Reader.cxx, Driver/Document_Reader.h, - Driver/Document_Writer.cxx, Driver/Document_Writer.h, - Driver/Driver_dl.cxx, Driver/Makefile.in, Driver/Mesh_Reader.cxx, - Driver/Mesh_Reader.h, Driver/Mesh_Writer.cxx, - Driver/Mesh_Writer.h, Driver/SMESHDriver.cxx, - Driver/SMESHDriver.h, DriverDAT/DriverDAT_R_SMDS_Mesh.cxx, - DriverDAT/DriverDAT_R_SMDS_Mesh.h, - DriverDAT/DriverDAT_R_SMESHDS_Document.cxx, - DriverDAT/DriverDAT_R_SMESHDS_Document.h, - DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx, - DriverDAT/DriverDAT_R_SMESHDS_Mesh.h, - DriverDAT/DriverDAT_W_SMDS_Mesh.cxx, - DriverDAT/DriverDAT_W_SMDS_Mesh.h, - DriverDAT/DriverDAT_W_SMESHDS_Document.cxx, - DriverDAT/DriverDAT_W_SMESHDS_Document.h, - DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx, - DriverDAT/DriverDAT_W_SMESHDS_Mesh.h, DriverDAT/Makefile.in, - DriverMED/DriverMED_R_SMDS_Mesh.cxx, - DriverMED/DriverMED_R_SMESHDS_Document.cxx, - DriverMED/DriverMED_R_SMESHDS_Mesh.cxx, - DriverMED/DriverMED_W_SMDS_Mesh.cxx, - DriverMED/DriverMED_W_SMESHDS_Document.cxx, - DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, DriverMED/Makefile.in, - MEFISTO2/Makefile.in, MEFISTO2/Rn.h, MEFISTO2/aptrte.cxx, - MEFISTO2/aptrte.h: yfr : Merge with v1.2 - -2003-07-10 08:12 Yves Fricaud - - * src/SMESHGUI/SMESHGUI_icons.po: Initial revision - -2003-07-10 08:09 tag V1_2 - -2003-07-10 08:09 Yves Fricaud - - * src/: DriverMED/DriverMED_R_SMESHDS_Document.h, - DriverMED/DriverMED_W_SMESHDS_Document.h, - SMESHGUI/SMESHGUI_msg_en.po: sources v1.2 - -2003-06-29 13:17 Paul Rascle - - * src/SMESH_SWIG/: Makefile.in, SMESH_shared_modules.py: PR: needed - by merge C. CAREMOLI branch CCAR_br1 - -2003-06-12 10:37 Paul Rascle - - * Makefile.in: PR: avoids unnecessary compilation after - regeneration of SALOMEconfig.h, with gcc3.2 - -2003-06-12 10:34 Paul Rascle - - * src/SMESH_SWIG/SMESH_fixation.py: PR: bug on subshapes not sorted - -2003-05-28 16:42 Nicolas Rejneri - - * adm_local/unix/make_commence.in: NRI : Add path fro GEOM and MED - idls. - -2003-05-28 16:26 Nicolas Rejneri - - * idl/Makefile.in, adm_local/unix/make_commence.in, - adm_local/unix/make_omniorb.in, build_configure, - configure.in.base: NRI : Update IDL Dependancies. - -2003-05-28 07:20 Nicolas Rejneri - - * bin/VERSION, Makefile.in: NRI : Add MODULE version info. - -2003-05-28 07:16 Nicolas Rejneri - - * configure.in.base, adm_local/unix/config_files/check_Med.m4: NRI - : Add Check of MED. - -2003-05-26 14:21 Nicolas Rejneri - - * adm_local/unix/config_files/check_Geom.m4, configure.in.base: NRI - : Add GEOM check local. - -2003-05-26 14:00 Nicolas Rejneri - - * build_configure: NRI : updated aclocal. - -2003-05-23 11:40 tag Start-v1_1a - -2003-05-23 11:40 Nicolas Rejneri - - * src/SMESHGUI/: SMESHGUI_AddAlgorithmDlg.cxx, - SMESHGUI_AddEdgeDlg.cxx, SMESHGUI_AddFaceDlg.cxx, - SMESHGUI_AddHypothesisDlg.cxx, SMESHGUI_AddSubMeshDlg.cxx, - SMESHGUI_AddVolumeDlg.cxx, SMESHGUI_DiagonalInversionDlg.cxx, - SMESHGUI_EdgesConnectivityDlg.cxx, - SMESHGUI_EditHypothesesDlg.cxx, SMESHGUI_InitMeshDlg.cxx, - SMESHGUI_LocalLengthDlg.cxx, SMESHGUI_MaxElementAreaDlg.cxx, - SMESHGUI_MaxElementVolumeDlg.cxx, SMESHGUI_MoveNodesDlg.cxx, - SMESHGUI_NbSegmentsDlg.cxx, SMESHGUI_NodesDlg.cxx, - SMESHGUI_OrientationElementsDlg.cxx, - SMESHGUI_RemoveElementsDlg.cxx, SMESHGUI_RemoveNodesDlg.cxx: NRI - : loadPixmap( "SMESH", ...) instead of "SMESHGUI". - -2003-05-22 09:52 Nicolas Rejneri - - * doc/: Makefile.in, html/Makefile.in, html/INPUT/doxyfile, - html/INPUT/sources/Application-About.png, - html/INPUT/sources/Application-About1.jpg, - html/INPUT/sources/application.gif, - html/INPUT/sources/application.jpg, - html/INPUT/sources/bg_salomepro.gif, - html/INPUT/sources/doxygen.css, html/INPUT/sources/logocorp.gif, - html/INPUT/sources/myheader.html, html/INPUT/sources/occ.gif, - html/INPUT/HTML/SMESH_BasicHypothesis.html, - html/INPUT/HTML/SMESH_Gen.html, - html/INPUT/HTML/SMESH_Hypothesis.html, - html/INPUT/HTML/SMESH_Mesh.html: NRI : Add documentation. - -2003-05-22 09:51 Nicolas Rejneri - - * configure.in.base: NRI : Add check HTML generators. - -2003-05-20 07:17 Nicolas Rejneri - - * src/: SMESH_I/SMESH_Gen_i.cxx, SMESH_I/SMESH_test.py, - SMESH_I/smeshpy.py, SMESH_SWIG/SMESH_fixation.py, - SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py, - SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test3.py, - SMESHGUI/SMESHGUI.cxx: NRI : Use GEOM instead of Geometry. - -2003-05-20 07:16 Nicolas Rejneri - - * resources/SMESHCatalog.xml: NRI : Add component-username tag. - -2003-05-20 07:15 Nicolas Rejneri - - * Makefile.in: NRI : Add SMESHCatalog.xml - -2003-05-19 14:50 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : Add QAD_Desktop.h. - -2003-05-19 14:49 Nicolas Rejneri - - * src/SMESHGUI/Makefile.in: NRI : Add GEOM includes and libs. - -2003-05-19 14:38 Nicolas Rejneri - - * src/SMESHFiltersSelection/Makefile.in: NRI : Add KERNEL includes. - -2003-05-19 14:34 Nicolas Rejneri - - * src/SMESH_I/Makefile.in: NRI : Change lGeometryClient by - lGEOMClient. - -2003-05-19 14:32 Nicolas Rejneri - - * src/SMESH_I/Makefile.in: NRI : Add GEOM includes and libs. - -2003-05-19 14:11 Nicolas Rejneri - - * src/: SMESH/Makefile.in, SMESHDS/Makefile.in: NRI : Add KERNEL - includes and libs. - -2003-05-19 14:09 Nicolas Rejneri - - * src/: DriverDAT/Makefile.in, DriverMED/Makefile.in, - DriverUNV/Makefile.in: NRI : Add KERNEL includes. - -2003-05-19 14:08 Nicolas Rejneri - - * idl/Makefile.in: NRI : Add MED.idl - -2003-05-19 14:01 Nicolas Rejneri - - * src/: SMESH_SWIG/Makefile.in, SMESH_SWIG/SMESH_fixation.py, - SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py, - SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test2.py, - SMESH_SWIG/SMESH_test3.py, SMESH_SWIG/batchmode_smesh.py, - SMESH_SWIG/libSMESH_Swig.i, Makefile.in, - SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx, - SMESHFiltersSelection/Makefile.in, - SMESHFiltersSelection/SMESH_Type.h, - SMESHFiltersSelection/SMESH_TypeFilter.cxx, - SMESHFiltersSelection/SMESH_TypeFilter.hxx, - SMESHFiltersSelection/SMESH_TypeFilter.ixx, - SMESHFiltersSelection/SMESH_TypeFilter.jxx, MEFISTO2/Makefile.in, - MEFISTO2/Rn.h, MEFISTO2/aptrte.cxx, MEFISTO2/aptrte.h, - MEFISTO2/areteideale.f, MEFISTO2/trte.f, OBJECT/Makefile.in, - OBJECT/SMESH_Actor.cxx, OBJECT/SMESH_Actor.h, - OBJECT/SMESH_Grid.cxx, OBJECT/SMESH_Grid.h, - Driver/Document_Reader.cxx, Driver/Document_Reader.h, - Driver/Document_Writer.cxx, Driver/Document_Writer.h, - Driver/Driver_dl.cxx, Driver/Makefile.in, Driver/Mesh_Reader.cxx, - Driver/Mesh_Reader.h, Driver/Mesh_Writer.cxx, - Driver/Mesh_Writer.h, Driver/SMESHDriver.cxx, - Driver/SMESHDriver.h: NRI : First integration. - -2003-05-19 13:48 Nicolas Rejneri - - * src/: SMDS/Handle_SMDSControl_BoundaryEdges.hxx, - SMDS/Handle_SMDSControl_BoundaryFaces.hxx, - SMDS/Handle_SMDSControl_MeshBoundary.hxx, - SMDS/Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - SMDS/Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - SMDS/Handle_SMDS_EdgePosition.hxx, - SMDS/Handle_SMDS_FacePosition.hxx, - SMDS/Handle_SMDS_HSequenceOfMesh.hxx, - SMDS/Handle_SMDS_ListNodeOfListOfMesh.hxx, - SMDS/Handle_SMDS_ListNodeOfListOfMeshElement.hxx, - SMDS/Handle_SMDS_ListNodeOfListOfMeshGroup.hxx, - SMDS/Handle_SMDS_Mesh.hxx, SMDS/Handle_SMDS_MeshEdge.hxx, - SMDS/Handle_SMDS_MeshElement.hxx, - SMDS/Handle_SMDS_MeshElementIDFactory.hxx, - SMDS/Handle_SMDS_MeshFace.hxx, SMDS/Handle_SMDS_MeshGroup.hxx, - SMDS/Handle_SMDS_MeshHexahedron.hxx, - SMDS/Handle_SMDS_MeshIDFactory.hxx, - SMDS/Handle_SMDS_MeshNode.hxx, - SMDS/Handle_SMDS_MeshNodeIDFactory.hxx, - SMDS/Handle_SMDS_MeshObject.hxx, SMDS/Handle_SMDS_MeshPrism.hxx, - SMDS/Handle_SMDS_MeshPyramid.hxx, - SMDS/Handle_SMDS_MeshQuadrangle.hxx, - SMDS/Handle_SMDS_MeshTetrahedron.hxx, - SMDS/Handle_SMDS_MeshTriangle.hxx, - SMDS/Handle_SMDS_MeshVolume.hxx, SMDS/Handle_SMDS_Position.hxx, - SMDS/Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx, - SMDS/Handle_SMDS_SpacePosition.hxx, - SMDS/Handle_SMDS_StdMapNodeOfExtendedMap.hxx, - SMDS/Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - SMDS/Handle_SMDS_VertexPosition.hxx, SMDS/Makefile.in, - SMDS/SMDS.cdl, SMDS/SMDSAbs.cdl, SMDS/SMDSAbs_ElementType.hxx, - SMDS/SMDSControl.cdl, SMDS/SMDSControl.cxx, SMDS/SMDSControl.hxx, - SMDS/SMDSControl.ixx, SMDS/SMDSControl.jxx, - SMDS/SMDSControl_BoundaryEdges.cdl, - SMDS/SMDSControl_BoundaryEdges.cxx, - SMDS/SMDSControl_BoundaryEdges.hxx, - SMDS/SMDSControl_BoundaryEdges.ixx, - SMDS/SMDSControl_BoundaryEdges.jxx, - SMDS/SMDSControl_BoundaryFaces.cdl, - SMDS/SMDSControl_BoundaryFaces.cxx, - SMDS/SMDSControl_BoundaryFaces.hxx, - SMDS/SMDSControl_BoundaryFaces.ixx, - SMDS/SMDSControl_BoundaryFaces.jxx, - SMDS/SMDSControl_MeshBoundary.cdl, - SMDS/SMDSControl_MeshBoundary.cxx, - SMDS/SMDSControl_MeshBoundary.hxx, - SMDS/SMDSControl_MeshBoundary.ixx, - SMDS/SMDSControl_MeshBoundary.jxx, SMDS/SMDSEdit.cdl, - SMDS/SMDSEdit_Transform.cdl, SMDS/SMDSEdit_Transform.cxx, - SMDS/SMDSEdit_Transform.hxx, SMDS/SMDSEdit_Transform.ixx, - SMDS/SMDSEdit_Transform.jxx, SMDS/SMDS_BasicMap.lxx, - SMDS/SMDS_BasicMapIterator.lxx, - SMDS/SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx, - SMDS/SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx, - SMDS/SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx, - SMDS/SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx, - SMDS/SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - SMDS/SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx, - SMDS/SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - SMDS/SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx, - SMDS/SMDS_DataMapOfIntegerMeshElement.hxx, - SMDS/SMDS_DataMapOfIntegerMeshElement_0.cxx, - SMDS/SMDS_DataMapOfPntInteger.hxx, - SMDS/SMDS_DataMapOfPntInteger_0.cxx, SMDS/SMDS_EdgePosition.cdl, - SMDS/SMDS_EdgePosition.cxx, SMDS/SMDS_EdgePosition.hxx, - SMDS/SMDS_EdgePosition.ixx, SMDS/SMDS_EdgePosition.jxx, - SMDS/SMDS_EdgePosition.lxx, SMDS/SMDS_ExtendedMap.hxx, - SMDS/SMDS_ExtendedMap_0.cxx, SMDS/SMDS_ExtendedOrientedMap.hxx, - SMDS/SMDS_ExtendedOrientedMap_0.cxx, SMDS/SMDS_FacePosition.cdl, - SMDS/SMDS_FacePosition.cxx, SMDS/SMDS_FacePosition.hxx, - SMDS/SMDS_FacePosition.ixx, SMDS/SMDS_FacePosition.jxx, - SMDS/SMDS_FacePosition.lxx, SMDS/SMDS_HSequenceOfMesh.hxx, - SMDS/SMDS_HSequenceOfMesh_0.cxx, - SMDS/SMDS_ListIteratorOfListOfMesh.hxx, - SMDS/SMDS_ListIteratorOfListOfMeshElement.hxx, - SMDS/SMDS_ListIteratorOfListOfMeshElement_0.cxx, - SMDS/SMDS_ListIteratorOfListOfMeshGroup.hxx, - SMDS/SMDS_ListIteratorOfListOfMeshGroup_0.cxx, - SMDS/SMDS_ListIteratorOfListOfMesh_0.cxx, - SMDS/SMDS_ListNodeOfListOfMesh.hxx, - SMDS/SMDS_ListNodeOfListOfMeshElement.hxx, - SMDS/SMDS_ListNodeOfListOfMeshElement_0.cxx, - SMDS/SMDS_ListNodeOfListOfMeshGroup.hxx, - SMDS/SMDS_ListNodeOfListOfMeshGroup_0.cxx, - SMDS/SMDS_ListNodeOfListOfMesh_0.cxx, SMDS/SMDS_ListOfMesh.hxx, - SMDS/SMDS_ListOfMeshElement.hxx, - SMDS/SMDS_ListOfMeshElement_0.cxx, SMDS/SMDS_ListOfMeshGroup.hxx, - SMDS/SMDS_ListOfMeshGroup_0.cxx, SMDS/SMDS_ListOfMesh_0.cxx, - SMDS/SMDS_Map.gxx, SMDS/SMDS_MapHasher.gxx, - SMDS/SMDS_MapIterator.gxx, - SMDS/SMDS_MapIteratorOfExtendedMap.hxx, - SMDS/SMDS_MapIteratorOfExtendedMap_0.cxx, - SMDS/SMDS_MapIteratorOfExtendedOrientedMap.hxx, - SMDS/SMDS_MapIteratorOfExtendedOrientedMap_0.cxx, - SMDS/SMDS_MapNode.lxx, SMDS/SMDS_MapOfMeshElement.cdl, - SMDS/SMDS_MapOfMeshElement.cxx, SMDS/SMDS_MapOfMeshElement.hxx, - SMDS/SMDS_MapOfMeshElement.ixx, SMDS/SMDS_MapOfMeshElement.jxx, - SMDS/SMDS_MapOfMeshElement.lxx, - SMDS/SMDS_MapOfMeshOrientedElement.cdl, - SMDS/SMDS_MapOfMeshOrientedElement.cxx, - SMDS/SMDS_MapOfMeshOrientedElement.hxx, - SMDS/SMDS_MapOfMeshOrientedElement.ixx, - SMDS/SMDS_MapOfMeshOrientedElement.jxx, - SMDS/SMDS_MapOfMeshOrientedElement.lxx, SMDS/SMDS_Mesh.cdl, - SMDS/SMDS_Mesh.cxx, SMDS/SMDS_Mesh.hxx, SMDS/SMDS_Mesh.ixx, - SMDS/SMDS_Mesh.jxx, SMDS/SMDS_Mesh.lxx, SMDS/SMDS_MeshEdge.cdl, - SMDS/SMDS_MeshEdge.cxx, SMDS/SMDS_MeshEdge.hxx, - SMDS/SMDS_MeshEdge.ixx, SMDS/SMDS_MeshEdge.jxx, - SMDS/SMDS_MeshEdge.lxx, SMDS/SMDS_MeshEdgesIterator.cdl, - SMDS/SMDS_MeshEdgesIterator.cxx, SMDS/SMDS_MeshEdgesIterator.hxx, - SMDS/SMDS_MeshEdgesIterator.ixx, SMDS/SMDS_MeshEdgesIterator.jxx, - SMDS/SMDS_MeshElement.cdl, SMDS/SMDS_MeshElement.cxx, - SMDS/SMDS_MeshElement.hxx, SMDS/SMDS_MeshElement.ixx, - SMDS/SMDS_MeshElement.jxx, SMDS/SMDS_MeshElement.lxx, - SMDS/SMDS_MeshElementIDFactory.cdl, - SMDS/SMDS_MeshElementIDFactory.cxx, - SMDS/SMDS_MeshElementIDFactory.hxx, - SMDS/SMDS_MeshElementIDFactory.ixx, - SMDS/SMDS_MeshElementIDFactory.jxx, - SMDS/SMDS_MeshElementIDFactory.lxx, - SMDS/SMDS_MeshElementMapHasher.cdl, - SMDS/SMDS_MeshElementMapHasher.cxx, - SMDS/SMDS_MeshElementMapHasher.hxx, - SMDS/SMDS_MeshElementMapHasher.ixx, - SMDS/SMDS_MeshElementMapHasher.jxx, - SMDS/SMDS_MeshElementMapHasher.lxx, - SMDS/SMDS_MeshElementsIterator.cdl, - SMDS/SMDS_MeshElementsIterator.cxx, - SMDS/SMDS_MeshElementsIterator.hxx, - SMDS/SMDS_MeshElementsIterator.ixx, - SMDS/SMDS_MeshElementsIterator.jxx, - SMDS/SMDS_MeshElementsIterator.lxx, SMDS/SMDS_MeshFace.cdl, - SMDS/SMDS_MeshFace.cxx, SMDS/SMDS_MeshFace.hxx, - SMDS/SMDS_MeshFace.ixx, SMDS/SMDS_MeshFace.jxx, - SMDS/SMDS_MeshFace.lxx, SMDS/SMDS_MeshFacesIterator.cdl, - SMDS/SMDS_MeshFacesIterator.cxx, SMDS/SMDS_MeshFacesIterator.hxx, - SMDS/SMDS_MeshFacesIterator.ixx, SMDS/SMDS_MeshFacesIterator.jxx, - SMDS/SMDS_MeshGroup.cdl, SMDS/SMDS_MeshGroup.cxx, - SMDS/SMDS_MeshGroup.hxx, SMDS/SMDS_MeshGroup.ixx, - SMDS/SMDS_MeshGroup.jxx, SMDS/SMDS_MeshGroup.lxx, - SMDS/SMDS_MeshHexahedron.cdl, SMDS/SMDS_MeshHexahedron.cxx, - SMDS/SMDS_MeshHexahedron.hxx, SMDS/SMDS_MeshHexahedron.ixx, - SMDS/SMDS_MeshHexahedron.jxx, SMDS/SMDS_MeshHexahedron.lxx, - SMDS/SMDS_MeshIDFactory.cdl, SMDS/SMDS_MeshIDFactory.cxx, - SMDS/SMDS_MeshIDFactory.ixx, SMDS/SMDS_MeshIDFactory.jxx, - SMDS/SMDS_MeshIDFactory.lxx, SMDS/SMDS_MeshNode.cdl, - SMDS/SMDS_MeshNode.cxx, SMDS/SMDS_MeshNode.hxx, - SMDS/SMDS_MeshNode.ixx, SMDS/SMDS_MeshNode.jxx, - SMDS/SMDS_MeshNode.lxx, SMDS/SMDS_MeshNodeIDFactory.cdl, - SMDS/SMDS_MeshNodeIDFactory.cxx, SMDS/SMDS_MeshNodeIDFactory.hxx, - SMDS/SMDS_MeshNodeIDFactory.ixx, SMDS/SMDS_MeshNodeIDFactory.jxx, - SMDS/SMDS_MeshNodeIDFactory.lxx, SMDS/SMDS_MeshNodesIterator.cdl, - SMDS/SMDS_MeshNodesIterator.cxx, SMDS/SMDS_MeshNodesIterator.hxx, - SMDS/SMDS_MeshNodesIterator.ixx, SMDS/SMDS_MeshNodesIterator.jxx, - SMDS/SMDS_MeshObject.cdl, SMDS/SMDS_MeshObject.cxx, - SMDS/SMDS_MeshObject.hxx, SMDS/SMDS_MeshObject.ixx, - SMDS/SMDS_MeshObject.jxx, - SMDS/SMDS_MeshOrientedElementMapHasher.cdl, - SMDS/SMDS_MeshOrientedElementMapHasher.cxx, - SMDS/SMDS_MeshOrientedElementMapHasher.hxx, - SMDS/SMDS_MeshOrientedElementMapHasher.ixx, - SMDS/SMDS_MeshOrientedElementMapHasher.jxx, - SMDS/SMDS_MeshOrientedElementMapHasher.lxx, - SMDS/SMDS_MeshPrism.cdl, SMDS/SMDS_MeshPrism.cxx, - SMDS/SMDS_MeshPrism.hxx, SMDS/SMDS_MeshPrism.ixx, - SMDS/SMDS_MeshPrism.jxx, SMDS/SMDS_MeshPrism.lxx, - SMDS/SMDS_MeshPyramid.cdl, SMDS/SMDS_MeshPyramid.cxx, - SMDS/SMDS_MeshPyramid.hxx, SMDS/SMDS_MeshPyramid.ixx, - SMDS/SMDS_MeshPyramid.jxx, SMDS/SMDS_MeshPyramid.lxx, - SMDS/SMDS_MeshQuadrangle.cdl, SMDS/SMDS_MeshQuadrangle.cxx, - SMDS/SMDS_MeshQuadrangle.hxx, SMDS/SMDS_MeshQuadrangle.ixx, - SMDS/SMDS_MeshQuadrangle.jxx, SMDS/SMDS_MeshQuadrangle.lxx, - SMDS/SMDS_MeshTetrahedron.cdl, SMDS/SMDS_MeshTetrahedron.cxx, - SMDS/SMDS_MeshTetrahedron.hxx, SMDS/SMDS_MeshTetrahedron.ixx, - SMDS/SMDS_MeshTetrahedron.jxx, SMDS/SMDS_MeshTetrahedron.lxx, - SMDS/SMDS_MeshTriangle.cdl, SMDS/SMDS_MeshTriangle.cxx, - SMDS/SMDS_MeshTriangle.hxx, SMDS/SMDS_MeshTriangle.ixx, - SMDS/SMDS_MeshTriangle.jxx, SMDS/SMDS_MeshTriangle.lxx, - SMDS/SMDS_MeshVolume.cdl, SMDS/SMDS_MeshVolume.cxx, - SMDS/SMDS_MeshVolume.hxx, SMDS/SMDS_MeshVolume.ixx, - SMDS/SMDS_MeshVolume.jxx, SMDS/SMDS_MeshVolume.lxx, - SMDS/SMDS_MeshVolumesIterator.cdl, - SMDS/SMDS_MeshVolumesIterator.cxx, - SMDS/SMDS_MeshVolumesIterator.hxx, - SMDS/SMDS_MeshVolumesIterator.ixx, - SMDS/SMDS_MeshVolumesIterator.jxx, SMDS/SMDS_PntHasher.cdl, - SMDS/SMDS_PntHasher.cxx, SMDS/SMDS_PntHasher.hxx, - SMDS/SMDS_PntHasher.ixx, SMDS/SMDS_PntHasher.jxx, - SMDS/SMDS_PntHasher.lxx, SMDS/SMDS_Position.cdl, - SMDS/SMDS_Position.cxx, SMDS/SMDS_Position.hxx, - SMDS/SMDS_Position.ixx, SMDS/SMDS_Position.jxx, - SMDS/SMDS_Position.lxx, - SMDS/SMDS_SequenceNodeOfSequenceOfMesh.hxx, - SMDS/SMDS_SequenceNodeOfSequenceOfMesh_0.cxx, - SMDS/SMDS_SequenceOfMesh.hxx, SMDS/SMDS_SequenceOfMesh_0.cxx, - SMDS/SMDS_SpacePosition.cdl, SMDS/SMDS_SpacePosition.cxx, - SMDS/SMDS_SpacePosition.hxx, SMDS/SMDS_SpacePosition.ixx, - SMDS/SMDS_SpacePosition.jxx, SMDS/SMDS_SpacePosition.lxx, - SMDS/SMDS_StdMapNode.gxx, SMDS/SMDS_StdMapNode.lxx, - SMDS/SMDS_StdMapNodeOfExtendedMap.hxx, - SMDS/SMDS_StdMapNodeOfExtendedMap_0.cxx, - SMDS/SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - SMDS/SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx, - SMDS/SMDS_TypeOfPosition.hxx, SMDS/SMDS_VertexPosition.cdl, - SMDS/SMDS_VertexPosition.cxx, SMDS/SMDS_VertexPosition.hxx, - SMDS/SMDS_VertexPosition.ixx, SMDS/SMDS_VertexPosition.jxx, - SMDS/SMDS_MeshIDFactory.hxx, SMESH_I/Makefile.in, - SMESH_I/SMESH_1D_Algo_i.cxx, SMESH_I/SMESH_1D_Algo_i.hxx, - SMESH_I/SMESH_2D_Algo_i.cxx, SMESH_I/SMESH_2D_Algo_i.hxx, - SMESH_I/SMESH_3D_Algo_i.cxx, SMESH_I/SMESH_3D_Algo_i.hxx, - SMESH_I/SMESH_Algo_i.cxx, SMESH_I/SMESH_Algo_i.hxx, - SMESH_I/SMESH_Gen_i.cxx, SMESH_I/SMESH_Gen_i.hxx, - SMESH_I/SMESH_Hexa_3D_i.cxx, SMESH_I/SMESH_Hexa_3D_i.hxx, - SMESH_I/SMESH_HypothesisFactory_i.cxx, - SMESH_I/SMESH_HypothesisFactory_i.hxx, - SMESH_I/SMESH_Hypothesis_i.cxx, SMESH_I/SMESH_Hypothesis_i.hxx, - SMESH_I/SMESH_LocalLength_i.cxx, SMESH_I/SMESH_LocalLength_i.hxx, - SMESH_I/SMESH_MEDFamily_i.cxx, SMESH_I/SMESH_MEDFamily_i.hxx, - SMESH_I/SMESH_MEDMesh_i.cxx, SMESH_I/SMESH_MEDMesh_i.hxx, - SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MEDSupport_i.hxx, - SMESH_I/SMESH_MEFISTO_2D_i.cxx, SMESH_I/SMESH_MEFISTO_2D_i.hxx, - SMESH_I/SMESH_MaxElementArea_i.cxx, - SMESH_I/SMESH_MaxElementArea_i.hxx, - SMESH_I/SMESH_MaxElementVolume_i.cxx, - SMESH_I/SMESH_MaxElementVolume_i.hxx, - SMESH_I/SMESH_MeshEditor_i.cxx, SMESH_I/SMESH_MeshEditor_i.hxx, - SMESH_I/SMESH_Mesh_i.cxx, SMESH_I/SMESH_Mesh_i.hxx, - SMESH_I/SMESH_NumberOfSegments_i.cxx, - SMESH_I/SMESH_NumberOfSegments_i.hxx, - SMESH_I/SMESH_Quadrangle_2D_i.cxx, - SMESH_I/SMESH_Quadrangle_2D_i.hxx, - SMESH_I/SMESH_Regular_1D_i.cxx, SMESH_I/SMESH_Regular_1D_i.hxx, - SMESH_I/SMESH_subMesh_i.cxx, SMESH_I/SMESH_subMesh_i.hxx, - SMESH_I/SMESH_test.py, SMESH_I/SMESH_topo.cxx, - SMESH_I/SMESH_topo.hxx, SMESH_I/smeshpy.py, SMESH_I/sstream, - SMESHGUI/Makefile.in, SMESHGUI/SMESHGUI.cxx, SMESHGUI/SMESHGUI.h, - SMESHGUI/SMESHGUI_AddAlgorithmDlg.cxx, - SMESHGUI/SMESHGUI_AddAlgorithmDlg.h, - SMESHGUI/SMESHGUI_AddEdgeDlg.cxx, SMESHGUI/SMESHGUI_AddEdgeDlg.h, - SMESHGUI/SMESHGUI_AddFaceDlg.cxx, SMESHGUI/SMESHGUI_AddFaceDlg.h, - SMESHGUI/SMESHGUI_AddHypothesisDlg.cxx, - SMESHGUI/SMESHGUI_AddHypothesisDlg.h, - SMESHGUI/SMESHGUI_AddSubMeshDlg.cxx, - SMESHGUI/SMESHGUI_AddSubMeshDlg.h, - SMESHGUI/SMESHGUI_AddVolumeDlg.cxx, - SMESHGUI/SMESHGUI_AddVolumeDlg.h, - SMESHGUI/SMESHGUI_ComputeScalarValue.cxx, - SMESHGUI/SMESHGUI_ComputeScalarValue.h, - SMESHGUI/SMESHGUI_DiagonalInversionDlg.cxx, - SMESHGUI/SMESHGUI_DiagonalInversionDlg.h, - SMESHGUI/SMESHGUI_EdgesConnectivityDlg.cxx, - SMESHGUI/SMESHGUI_EdgesConnectivityDlg.h, - SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx, - SMESHGUI/SMESHGUI_EditHypothesesDlg.h, - SMESHGUI/SMESHGUI_EditScalarBarDlg.cxx, - SMESHGUI/SMESHGUI_EditScalarBarDlg.h, - SMESHGUI/SMESHGUI_InitMeshDlg.cxx, - SMESHGUI/SMESHGUI_InitMeshDlg.h, - SMESHGUI/SMESHGUI_LocalLengthDlg.cxx, - SMESHGUI/SMESHGUI_LocalLengthDlg.h, - SMESHGUI/SMESHGUI_MaxElementAreaDlg.cxx, - SMESHGUI/SMESHGUI_MaxElementAreaDlg.h, - SMESHGUI/SMESHGUI_MaxElementVolumeDlg.cxx, - SMESHGUI/SMESHGUI_MaxElementVolumeDlg.h, - SMESHGUI/SMESHGUI_MeshInfosDlg.cxx, - SMESHGUI/SMESHGUI_MeshInfosDlg.h, - SMESHGUI/SMESHGUI_MoveNodesDlg.cxx, - SMESHGUI/SMESHGUI_MoveNodesDlg.h, - SMESHGUI/SMESHGUI_NbSegmentsDlg.cxx, - SMESHGUI/SMESHGUI_NbSegmentsDlg.h, - SMESHGUI/SMESHGUI_NodesDlg.cxx, SMESHGUI/SMESHGUI_NodesDlg.h, - SMESHGUI/SMESHGUI_OrientationElementsDlg.cxx, - SMESHGUI/SMESHGUI_OrientationElementsDlg.h, - SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx, - SMESHGUI/SMESHGUI_Preferences_ColorDlg.h, - SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx, - SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h, - SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx, - SMESHGUI/SMESHGUI_RemoveElementsDlg.h, - SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx, - SMESHGUI/SMESHGUI_RemoveNodesDlg.h, - SMESHGUI/SMESHGUI_SpinBox.cxx, SMESHGUI/SMESHGUI_SpinBox.h, - SMESHGUI/SMESHGUI_StudyAPI.cxx, SMESHGUI/SMESHGUI_StudyAPI.h, - SMESHGUI/SMESHGUI_Swig.cxx, SMESHGUI/SMESHGUI_Swig.hxx, - SMESHGUI/SMESHGUI_Swig.i, SMESHGUI/SMESHGUI_TransparencyDlg.cxx, - SMESHGUI/SMESHGUI_TransparencyDlg.h, - SMESHGUI/SMESHGUI_aParameterDlg.cxx, - SMESHGUI/SMESHGUI_aParameterDlg.h, SMESHGUI/SMESH_icons.po, - SMESHGUI/SMESH_msg_en.po: NRI : First integration. - -2003-05-19 13:18 Nicolas Rejneri - - * src/: SMESH/Makefile.in, SMESH/SMESH_1D_Algo.cxx, - SMESH/SMESH_1D_Algo.hxx, SMESH/SMESH_2D_Algo.cxx, - SMESH/SMESH_2D_Algo.hxx, SMESH/SMESH_3D_Algo.cxx, - SMESH/SMESH_3D_Algo.hxx, SMESH/SMESH_Algo.cxx, - SMESH/SMESH_Algo.hxx, SMESH/SMESH_Gen.cxx, SMESH/SMESH_Gen.hxx, - SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx, - SMESH/SMESH_Hypothesis.cxx, SMESH/SMESH_Hypothesis.hxx, - SMESH/SMESH_HypothesisCreator.hxx, - SMESH/SMESH_HypothesisFactory.cxx, - SMESH/SMESH_HypothesisFactory.hxx, - SMESH/SMESH_LengthFromEdges.cxx, SMESH/SMESH_LengthFromEdges.hxx, - SMESH/SMESH_LocalLength.cxx, SMESH/SMESH_LocalLength.hxx, - SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx, - SMESH/SMESH_MaxElementArea.cxx, SMESH/SMESH_MaxElementArea.hxx, - SMESH/SMESH_MaxElementVolume.cxx, - SMESH/SMESH_MaxElementVolume.hxx, SMESH/SMESH_Mesh.cxx, - SMESH/SMESH_Mesh.hxx, SMESH/SMESH_NumberOfSegments.cxx, - SMESH/SMESH_NumberOfSegments.hxx, SMESH/SMESH_Quadrangle_2D.cxx, - SMESH/SMESH_Quadrangle_2D.hxx, SMESH/SMESH_Regular_1D.cxx, - SMESH/SMESH_Regular_1D.hxx, SMESH/SMESH_subMesh.cxx, - SMESH/SMESH_subMesh.hxx, SMESHDS/Handle_SMESHDS_Command.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS/Handle_SMESHDS_Mesh.hxx, - SMESHDS/Handle_SMESHDS_Script.hxx, SMESHDS/Makefile.in, - SMESHDS/SMESHDS_Command.cdl, SMESHDS/SMESHDS_Command.cxx, - SMESHDS/SMESHDS_Command.ixx, SMESHDS/SMESHDS_Command.jxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_Document.cdl, SMESHDS/SMESHDS_Document.hxx, - SMESHDS/SMESHDS_Document.ixx, SMESHDS/SMESHDS_Hypothesis.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfCommand.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListOfCommand.hxx, - SMESHDS/SMESHDS_ListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_Mesh.cdl, SMESHDS/SMESHDS_Mesh.hxx, - SMESHDS/SMESHDS_Script.cdl, SMESHDS/SMESHDS_Script.cxx, - SMESHDS/SMESHDS_Script.hxx, SMESHDS/SMESHDS_Script.ixx, - SMESHDS/SMESHDS_Script.jxx, SMESHDS/SMESHDS_SubMesh.cdl, - SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx, - SMESHDS/SMESHDS_SubMesh.ixx, SMESHDS/SMESHDS_SubMesh.jxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS/Handle_SMESHDS_Document.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_SubMesh.hxx, SMESHDS/SMESHDS.cdl, - SMESHDS/SMESHDS_Command.hxx, SMESHDS/SMESHDS_CommandType.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_Document.cxx, SMESHDS/SMESHDS_Document.jxx, - SMESHDS/SMESHDS_Hypothesis.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_ListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListOfCommand_0.cxx, SMESHDS/SMESHDS_Mesh.cxx, - SMESHDS/SMESHDS_Mesh.ixx, SMESHDS/SMESHDS_Mesh.jxx, - SMESHDS/SMESHDS_PtrHypothesis.hxx: NRI : First integration. - -2003-05-19 13:03 Nicolas Rejneri - - * Makefile.in, build_configure, configure.in.base, - resources/ModuleMesh.png, resources/SMESHCatalog.xml, - resources/SMESH_en.xml, resources/SMESH_fr.xml, - resources/delete.png, resources/mesh.png, - resources/mesh_add_sub.png, resources/mesh_algo_hexa.png, - resources/mesh_algo_mefisto.png, resources/mesh_algo_quad.png, - resources/mesh_algo_regular.png, resources/mesh_angle.png, - resources/mesh_area.png, resources/mesh_aspect.png, - resources/mesh_compute.png, resources/mesh_connectivity.png, - resources/mesh_diagonal.png, resources/mesh_edit.png, - resources/mesh_hexa.png, resources/mesh_hexa_n.png, - resources/mesh_hypo_area.png, resources/mesh_hypo_length.png, - resources/mesh_hypo_segment.png, resources/mesh_hypo_volume.png, - resources/mesh_info.png, resources/mesh_init.png, - resources/mesh_length.png, resources/mesh_line.png, - resources/mesh_line_n.png, resources/mesh_move_node.png, - resources/mesh_orientation.png, resources/mesh_pyramid.png, - resources/mesh_pyramid_n.png, resources/mesh_quad.png, - resources/mesh_quad_n.png, resources/mesh_rem_element.png, - resources/mesh_rem_node.png, resources/mesh_set_algo.png, - resources/mesh_set_hypo.png, resources/mesh_shading.png, - resources/mesh_shrink.png, resources/mesh_skew.png, - resources/mesh_taper.png, resources/mesh_tetra.png, - resources/mesh_tetra_n.png, resources/mesh_tree_algo.png, - resources/mesh_tree_algo_hexa.png, - resources/mesh_tree_algo_mefisto.png, - resources/mesh_tree_algo_quad.png, - resources/mesh_tree_algo_regular.png, - resources/mesh_tree_hypo.png, resources/mesh_tree_hypo_area.png, - resources/mesh_tree_hypo_length.png, - resources/mesh_tree_hypo_segment.png, - resources/mesh_tree_hypo_volume.png, - resources/mesh_tree_mesh.png, resources/mesh_tree_mesh_warn.png, - resources/mesh_triangle.png, resources/mesh_triangle_n.png, - resources/mesh_update.png, resources/mesh_vertex.png, - resources/mesh_vertex_n.png, resources/mesh_wireframe.png, - resources/mesh_wrap.png, resources/select1.png, idl/Makefile.in, - idl/SMESH_BasicHypothesis.idl, idl/SMESH_Gen.idl, - idl/SMESH_Hypothesis.idl, idl/SMESH_Mesh.idl, - src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx, - src/DriverDAT/DriverDAT_R_SMDS_Mesh.h, - src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx, - src/DriverDAT/DriverDAT_R_SMESHDS_Document.h, - src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx, - src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h, - src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx, - src/DriverDAT/DriverDAT_W_SMDS_Mesh.h, - src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx, - src/DriverDAT/DriverDAT_W_SMESHDS_Document.h, - src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx, - src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h, - src/DriverDAT/Makefile.in, - src/DriverMED/DriverMED_R_SMDS_Mesh.cxx, - src/DriverMED/DriverMED_R_SMESHDS_Document.cxx, - src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx, - src/DriverMED/DriverMED_W_SMDS_Mesh.cxx, - src/DriverMED/DriverMED_W_SMESHDS_Document.cxx, - src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, - src/DriverMED/Makefile.in, - src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx, - src/DriverUNV/DriverUNV_R_SMDS_Mesh.h, - src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx, - src/DriverUNV/DriverUNV_R_SMESHDS_Document.h, - src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx, - src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h, - src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx, - src/DriverUNV/DriverUNV_W_SMDS_Mesh.h, - src/DriverUNV/DriverUNV_W_SMESHDS_Document.cxx, - src/DriverUNV/DriverUNV_W_SMESHDS_Document.h, - src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx, - src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.h, - src/DriverUNV/Makefile.in: NRI : First integration. - -2003-03-07 14:55 tag V1 - -2003-03-07 14:55 cvsadmin - - * src/DriverMED/: DriverMED_R_SMESHDS_Document.h, - DriverMED_W_SMESHDS_Document.h: - Initialisation module SMESH_SRC de la base SMESH - -2003-03-07 14:55 cvsadmin - - * src/DriverMED/: DriverMED_R_SMDS_Mesh.cxx, - DriverMED_R_SMDS_Mesh.h, DriverMED_R_SMESHDS_Document.cxx, - DriverMED_R_SMESHDS_Mesh.cxx, DriverMED_R_SMESHDS_Mesh.h, - DriverMED_W_SMDS_Mesh.cxx, DriverMED_W_SMDS_Mesh.h, - DriverMED_W_SMESHDS_Document.cxx, DriverMED_W_SMESHDS_Mesh.cxx, - DriverMED_W_SMESHDS_Mesh.h, Makefile.in: Initial revision - diff --git a/LICENCE b/LICENCE deleted file mode 100644 index b1e3f5a26..000000000 --- a/LICENCE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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, or (at your option) any later version. - - 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 - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/adm_local/unix/config_files/check_Geom.m4 b/adm_local/unix/config_files/check_Geom.m4 deleted file mode 100644 index 13f3be40c..000000000 --- a/adm_local/unix/config_files/check_Geom.m4 +++ /dev/null @@ -1,45 +0,0 @@ -# Check availability of Geom binary distribution -# -# Author : Nicolas REJNERI (OPEN CASCADE, 2003) -# - -AC_DEFUN([CHECK_GEOM],[ - -AC_CHECKING(for Geom) - -Geom_ok=no - -AC_ARG_WITH(geom, - [ --with-geom=DIR root directory path of GEOM installation ], - GEOM_DIR="$withval",GEOM_DIR="") - -if test "x$GEOM_DIR" == "x" ; then - -# no --with-geom-dir option used - - if test "x$GEOM_ROOT_DIR" != "x" ; then - - # GEOM_ROOT_DIR environment variable defined - GEOM_DIR=$GEOM_ROOT_DIR - - fi -# -fi - -if test -f ${GEOM_DIR}/lib/salome/libGEOMClient.so ; then - Geom_ok=yes - AC_MSG_RESULT(Using Geom module distribution in ${GEOM_DIR}) - - if test "x$GEOM_ROOT_DIR" == "x" ; then - GEOM_ROOT_DIR=${GEOM_DIR} - fi - AC_SUBST(GEOM_ROOT_DIR) - -else - AC_MSG_WARN("Cannot find compiled Geom module distribution") -fi - -AC_MSG_RESULT(for Geom: $Geom_ok) - -])dnl - diff --git a/adm_local/unix/config_files/check_Med.m4 b/adm_local/unix/config_files/check_Med.m4 deleted file mode 100644 index 727bf4381..000000000 --- a/adm_local/unix/config_files/check_Med.m4 +++ /dev/null @@ -1,45 +0,0 @@ -# Check availability of Med binary distribution -# -# Author : Nicolas REJNERI (OPEN CASCADE, 2003) -# - -AC_DEFUN([CHECK_MED],[ - -AC_CHECKING(for Med) - -Med_ok=no - -AC_ARG_WITH(med, - [ --with-med=DIR root directory path of MED installation ], - MED_DIR="$withval",MED_DIR="") - -if test "x$MED_DIR" == "x" ; then - -# no --with-med-dir option used - - if test "x$MED_ROOT_DIR" != "x" ; then - - # MED_ROOT_DIR environment variable defined - MED_DIR=$MED_ROOT_DIR - - fi -# -fi - -if test -f ${MED_DIR}/idl/salome/MED.idl ; then - Med_ok=yes - AC_MSG_RESULT(Using Med module distribution in ${MED_DIR}) - - if test "x$MED_ROOT_DIR" == "x" ; then - MED_ROOT_DIR=${MED_DIR} - fi - AC_SUBST(MED_ROOT_DIR) - -else - AC_MSG_WARN("Cannot find Med module sources") -fi - -AC_MSG_RESULT(for Med: $Med_ok) - -])dnl - diff --git a/adm_local/unix/make_conclude.in b/adm_local/unix/make_conclude.in deleted file mode 100644 index f4827fd31..000000000 --- a/adm_local/unix/make_conclude.in +++ /dev/null @@ -1,342 +0,0 @@ -#======================================================================= -# This section of this makefile comes from the file -# 'adm/unix/make_conclude' which was generated with config.status -# from file adm/unix/make_conclude.in -#======================================================================= -# -* Makefile *- -# -# Authors : Patrick GOLDBRONN (CEA) - Marc Tajchman (CEA) -# Date : 6/07/2001 -# $Header$ -# - -# ORB Specifics rules -@CORBA@ - -# transform idl reference in appropriate obj file -LIB_CLIENT_SRC = $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_CXX)) -LIB_SERVER_SRC = $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_CXX)) -LIB_MOC_SRC = $(LIB_MOC:%.h=%_moc.cxx) -LIB_SRC+=$(LIB_MOC_SRC) -LIB_SWIG_SRC = $(SWIG_DEF:%.i=%_wrap.cxx) -LIB_DEP= $(LIB_SRC) $(LIB_CLIENT_SRC) $(LIB_SERVER_SRC) $(LIB_SWIG_SRC) - -LIB_CLIENT_OBJ = $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_OBJ)) -LIB_SERVER_OBJ = $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_OBJ)) - - -# transform c file in appropriate libtool obj file (.c, .cc and .cxx) -LIB_OBJ_C = $(patsubst %.c, %.lo, $(filter %.c, $(LIB_SRC))) -LIB_OBJ_CC = $(patsubst %.cc, %.lo, $(filter %.cc, $(LIB_SRC))) -LIB_OBJ_CXX = $(patsubst %.cxx, %.lo, $(filter %.cxx, $(LIB_SRC))) -LIB_SWIG_OBJ = $(LIB_SWIG_SRC:%.cxx=%.lo) -LIB_OBJ_F = $(patsubst %.f, %.lo, $(filter %.f, $(LIB_SRC))) - -# all libtool obj file in library -LIB_OBJ = $(LIB_OBJ_CXX) $(LIB_OBJ_CC) $(LIB_OBJ_C) $(LIB_CLIENT_OBJ:%.o=%.lo) $(LIB_SERVER_OBJ:%.o=%.lo) $(LIB_SWIG_OBJ) $(LIB_OBJ_F) - -# 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))) - -ifneq ($(findstring cmodule.la,$(filter %.la, $(LIB))),) -LIB_SWIG = $(patsubst %cmodule.la,%.so, $(filter %.la, $(LIB))) -else -LIB_SWIG = -endif - -lib: $(LIB_BUILD) $(LIB_CLIENT_PY) -# we don't build static library ! - -$(LIB_BUILD): $(top_builddir)/lib/salome/%.la: %.la - -$(RM) $@ - -$(RM) $(patsubst %.la, %.so, $@) - -$(RM) $(patsubst %.la, %.a, $@) - ln -sf $(CURDIR)/$< $@ || true - ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<) \ - $(patsubst %.la, %.so, $@) || true - ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<).0 \ - $(patsubst %.la, %.so, $@).0 || true - - if ! test -z $(LIB_SWIG) ; then \ - ln -sf $(patsubst %.la,%.so, $(CURDIR)/.libs/$<) $(top_builddir)/lib/salome/_$(LIB_SWIG) || true;\ - fi; - -$(LIB_BUILD_A): $(top_builddir)/lib/salome/%.a: %.a - -$(RM) $@ - ln -sf $(CURDIR)/$< $@ || true - -$(LIB): $(LIB_OBJ) - @$(LT) --mode=link $(CXX) -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)) -BIN_SERVER_SRC = $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_CXX)) -BIN_MOC_SRC = $(BIN_MOC:%.h=%_moc.cxx) -BIN_SRC+=$(BIN_MOC_SRC) -BIN_DEP=$(BIN:%=%.cxx) $(BIN_SRC) $(BIN_CLIENT_SRC) $(BIN_SERVER_SRC) - -BIN_CLIENT_OBJ = $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_OBJ)) -BIN_SERVER_OBJ = $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_OBJ)) -# transform c file in appropriate libtool obj file (.c) -BIN_OBJ_C = $(patsubst %.c, %.o, $(filter %.c, $(BIN_SRC))) -# transform c++ file in appropriate libtool obj file (.cc and .cxx) -BIN_OBJ_CC = $(patsubst %.cc, %.o, $(filter %.cc, $(BIN_SRC))) -BIN_OBJ_CXX = $(patsubst %.cxx, %.o, $(filter %.cxx, $(BIN_SRC))) -# all obj file in bin target -BIN_OBJ = $(BIN_OBJ_CC) $(BIN_OBJ_CXX) $(BIN_OBJ_C) $(BIN_CLIENT_OBJ) $(BIN_SERVER_OBJ) - -bin: $(BIN:%=$(top_builddir)/bin/salome/%) $(BIN) $(LIB) pyscripts sharedpyscripts - -BIN_LIB=$(LIB:lib%.la=-l%) - -$(BIN:%=$(top_builddir)/bin/salome/%) $(TEST_PROGS:%=$(top_builddir)/bin/salome/%): $(top_builddir)/bin/salome/%: % - -$(RM) $@ - ln -sf $(CURDIR)/$< $@ - -$(BIN) $(TEST_PROGS): %: %.lo $(BIN_OBJ) - $(CXX) $(CXXFLAGS) -o $@ $^ $(BIN_LIB) $(LDFLAGSFORBIN) $(LIBSFORBIN) - -# copy python scripts in $(top_builddir)/bin/salome -# -DEST_PYSCRIPTS = $(EXPORT_PYSCRIPTS:%=$(top_builddir)/bin/salome/%) -pyscripts: $(DEST_PYSCRIPTS) -$(DEST_PYSCRIPTS): $(top_builddir)/bin/salome/%: % - cp -f $< $@ - -# copy pyqt files in $(PYTHON_SHARED_SITE) -# -PYTHON_SHARED_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/salome/shared_modules - -$(PYTHON_SHARED_SITE): - $(INSTALL) -d $@ - -DEST_SHAREDPYSCRIPTS = $(EXPORT_SHAREDPYSCRIPTS:%=$(PYTHON_SHARED_SITE)/%) -sharedpyscripts: $(PYTHON_SHARED_SITE) $(DEST_SHAREDPYSCRIPTS) -$(DEST_SHAREDPYSCRIPTS): $(PYTHON_SHARED_SITE)/%: % - cp -f $< $@ - -check: test - -tests: test - -test: $(LIB) $(TEST_PROGS:%=$(top_builddir)/bin/salome/%) - - -# copy header file in $(inc_builddir) -# -DEST_HEADERS = $(EXPORT_HEADERS:%=$(inc_builddir)/%) -inc: $(DEST_HEADERS) -$(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) - -# 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 - @for f in X $(LIB); do \ - if test $$f != X; then \ - ($(LT_INSTALL_LIB) $$f $(libdir)/. || exit 1); \ - fi; \ - done - @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 \ - if test $$f != X; then \ - ($(LT_INSTALL_PROG) $$f $(bindir)/. || exit 1); \ - fi; \ - done -# Install tests programmes in bindir - @for f in X $(TEST_PROGS); do \ - if test $$f != X; then \ - ($(LT_INSTALL_PROG) $$f $(bindir)/. || exit 1); \ - fi; \ - done -# Install exported includes in includedir - @for f in X $(EXPORT_HEADERS:%=$(srcdir)/%); do \ - if test $$f != X; then \ - (cp -p -f $$f $(includedir) || exit 1); \ - fi; \ - done - -# Install python script in $(bindir) -install-python: $(bindir) $(EXPORT_PYSCRIPTS:%=install-%) - -$(EXPORT_PYSCRIPTS:%=install-%): install-%: % - $(INSTALL_PROGRAM) $< $(bindir)/. - -#install-python: $(bindir) $(EXPORT_PYSCRIPTS) -# @for f in X $(EXPORT_PYSCRIPTS); do \ -# if test $$f != X; then \ -# ($(INSTALL_PROGRAM) $$f $(bindir)/. || exit 1); \ -# fi; \ -# done - -# Install pyqt script in $(install-sharedpyqt) -install-sharedpyqt: $(sharedpydir) $(EXPORT_SHAREDPYSCRIPTS:%=install-%) - -$(EXPORT_SHAREDPYSCRIPTS:%=install-%): install-%: % - $(INSTALL_PROGRAM) $< $(sharedpydir)/. - - -# generic rule to install .qm files : -install-qm: resources - $(INSTALL) -d $(datadir)/resources - @for f in X $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm); 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 \ - for f in $(LIB); do \ - $(LT_UNINSTALL) $(libdir)/$$f; \ - done; \ - fi - @if test "X$(BIN)" != X; then \ - for f in $(BIN); do \ - $(LT_UNINSTALL) $(bindir)/$$f; \ - done; \ - fi - @for f in X $(TEST_PROGS); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(bindir)/$$f; \ - fi; \ - done -# Uninstall exported includes in includedir - @for f in X $(EXPORT_HEADERS); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(includedir)/$$f; \ - fi; \ - done -# Uninstall python script in $(bindir) - @for f in X $(EXPORT_PYSCRIPTS); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(bindir)/$$f ; \ - fi; \ - done - -# Uninstall pyqt script in $(sharedpydir) - @for f in X $(EXPORT_SHAREDPYSCRIPTS); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(sharedpydir)/$$f ; \ - fi; \ - done - -# Uninstall qm files - @for f in X $(PO_FILES:%.po=%.qm); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(datadir)/resources/$$f ; \ - fi; \ - done - -# remove all dependencies files -# -cleandep: - -$(RM) .dep* - -# Removes temporary files without removing the final target files. That is, -# remove things like object files but not libraries or executables. -# -mostlyclean: cleandep - -$(RM) $(LIB_OBJ) $(LIB_OBJ:.lo=.o) - -$(RM) $(BIN_OBJ) $(BIN:%=%.o) - -$(RM) $(TEST_OBJ) $(TEST_OBJ:.lo=.o) - -$(RM) $(PROG_OBJ) $(PROG_OBJ:.lo=.o) $(MOSTLYCLEAN) - -# Like `mostlyclean' except it also removes the final targets: things like -# libraries and executables. This target doesn't remove any file that -# is part of the SALOME distribution. -# -clean: mostlyclean - -$(RM) $(LIB) $(TEST_PROGS) $(BIN) $(CLEAN) - -$(RM) TAGS *~ *# core *.core - -$(RM) -r .libs - -$(RM) $(top_builddir)/lib/salome/$(LIB) - -$(RM) $(patsubst %,$(top_builddir)/bin/salome/%, $(BIN)) - -$(RM) $(patsubst %.la, %.so, $(top_builddir)/lib/salome/$(LIB)) - -$(RM) $(patsubst %.la, %.a, $(top_builddir)/lib/salome/$(LIB)) -# remove idl generated files (sources) - -$(RM) $(LIB_CLIENT_SRC) $(LIB_SERVER_SRC) $(BIN_CLIENT_SRC) $(BIN_SERVER_SRC) -# remove idl generated files (headers) - -$(RM) $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_H)) $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_H)) - -$(RM) $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_H)) $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_H)) - -$(RM) $(LIB_MOC_SRC) $(BIN_MOC_SRC) - -$(RM) $(LIB_SWIG_SRC) - -# Like `clean' except it also removes files that were created by running -# configure. If you've unpacked the source and built without creating -# any other files, then `make distclean' will leave only the files that were -# in the distribution. -# -distclean: clean - #remove qm file ! - -$(RM) $(PO_FILES:%.po=%.qm) $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm) - #remove include files - -$(RM) $(DEST_HEADERS) - -$(RM) $(DISTCLEAN) *.bak *.old *.new .dep* - @if test -f $(srcdir)/Makefile.in; then \ - (@SETX@; $(RM) Makefile); \ - fi - - -#implicits rules -.cc.o: - $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< - -.cc.lo: - $(LT) --mode=compile $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< - -.cxx.o: - $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< - -.cxx.lo: - $(LT) --mode=compile $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< - -.c.o: - $(CC) $(CFLAGS) $(CPPFLAGS) -c $< - -.c.lo: - $(LT_COMPILE) $(CFLAGS) $(CPPFLAGS) -c $< - -.f.o: - $(FC) $(FFLAGS) -c $< -o $@ - -.f.lo: - $(LT) --mode=compile $(FC) $(FFLAGS) -c $< - -.ui.h: - $(UIC) -o $@ $< - -.ui.cxx: - $(UIC) -o $@ -i $*.h $< - -#pattern rules -%_moc.cxx : %.h - $(MOC) $< -o $@ - -%_wrap.cxx : %.i - $(SWIG) $(SWIG_FLAGS) -o $@ $< - -$(top_builddir)/share/salome/resources/%.qm: %.po - $(MSG2QM) $< $@ ; \ - -#------------------------------------------------------------------------------ -# The following section of this makefile contains dependencies between the -# source files and the header files. If GNU make and GCC are being used then -# the dependencies are in the form of rules that cause the information to -# be kept updated automatically. Otherwise the dependencies are listed -# explicitly and come from the `.distdep' files in the various directories. -# These files are part of the distribution and are generated automatically on -# GNU/GCC systems. -#------------------------------------------------------------------------------ - -@DEPEND@ diff --git a/adm_local/unix/make_omniorb.in b/adm_local/unix/make_omniorb.in deleted file mode 100644 index 1299082fa..000000000 --- a/adm_local/unix/make_omniorb.in +++ /dev/null @@ -1,59 +0,0 @@ -#======================================================================= -# Begin specific part to omniorb -# (include from file adm/unix/make_omniorb generated by -# adm/unix/make_omniorb.in) -#======================================================================= -# -* Makefile *- -# -# Author : Patrick GOLDBRONN (CEA) -# Date : 29/06/2001 -# $Header$ -# - -# Client and server object are the same with omniorb -# There are one header file and one source file generate - -#IDLOBJ=$(IDLSRC:%.idl=%$(IDL_CLN_OBJ)) - -# dependancies between idl and it's generated files -%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${KERNEL_ROOT_DIR}/idl/salome/%.idl - $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< - -%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${GEOM_ROOT_DIR}/idl/salome/%.idl - $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< - -%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${MED_ROOT_DIR}/idl/salome/%.idl - $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< - -%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${top_srcdir}/idl/%.idl - $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< - -# dependncies between idl files -depend_idl: .depidl - -# we use cpp to generate dependencies between idl files. -# we change cpp output to keep only idl file and transform it to get a suitable rule -.depidl: $(IDL_FILES) - @touch $@ - @for dep in $? dummy; do \ - if [ $$dep != "dummy" ]; then \ - echo Building dependencies for $$dep; \ - basedep=`basename $$dep .idl`; \ - header="$$basedep"$(IDL_CLN_H); \ - sed '\%^'"$$header"':%,\%[^\\]$$%d' <$@ >$@- && mv $@- $@; \ - $(CPP) $(C_DEPEND_FLAG) -I$(srcdir) $$dep 2>/dev/null | \ - sed `echo "s%$$basedep\\.idl%$$header:%g"` | \ - sed 's% $(srcdir)/% %g' | \ - sed 's% $(top_srcdir)/% %g' | \ - sed 's% $(top_builddir)/% %g' | \ - sed 's%^.*:\.o: *%%' | sed 's%^ *\\ *%%'| sed 's%^ *\(.*\):%\1:%' | \ - sed 's/\.idl/$(IDL_CLN_H)/' >>$@; \ - echo '' >>$@; \ - fi; \ - done ; - --include .depidl - -#======================================================================= -# End specific part to omniorb -#======================================================================= diff --git a/cvs-tags b/cvs-tags deleted file mode 100644 index 6991d061f..000000000 --- a/cvs-tags +++ /dev/null @@ -1,35 +0,0 @@ -Start-v1_1a: ? - ? - -V1_2_1: ? - ? - -V1_2_2: 2003-09-26 17:00 - New data structure in SMDS. - -nadir_1_2_2: 2003-10-06 12:50 - Branch after V1_2_2. Developpement branch for user nadir - -merge_1_2_c__1_2_2: 2003-10-17 14:35 - Branch after V1_2_2. Branch to merge Salome 1.2c. Initiated by Paul Rascle. - -MergeV1_2c-1: 2003-10-19 13:49 - End of merge_1_2_c__1_2_2 branch. This branch is ready to be merge with the head. - -V1_3_0b1: 2003-11-12 - First pre-release of 1.3.0. Include the merge of 1.2c branch. - -nadir_update_MED_v1_3_0: 2003-11-17 10:22 - New branch for user nadir. Synchronization of API with MED 1.3. - -V1_3_0b2: 2003-11-18 - Second pre-release of 1.3.0. Synchronization of API with MED 1.3. - -V1_3_0: 2003-11-25 08:52 - Release 1.3.0. - -V1_3_1: 2004-01-05 14:28 - Release 1.3.1. Added Netgen. - -merge_1_2_d: 2003-01-20 11:25 - Branch to merge Release 1.2d of Salome Pro. diff --git a/doc/Makefile.in b/doc/Makefile.in deleted file mode 100644 index 7295ede75..000000000 --- a/doc/Makefile.in +++ /dev/null @@ -1,40 +0,0 @@ - -# -* Makefile *- -# -# Author : Patrick GOLDBRONN (CEA) -# Date : 30/11/2001 -# $Header$ -# -# source path -top_srcdir=@top_srcdir@ -top_builddir=.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - -SUBDIRS= salome - -@COMMENCE@ - -docs: - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done -clean: - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done - -distclean: clean - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done - -install: - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done - -uninstall: - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done diff --git a/doc/salome/AddNetgenInSalome2.pdf b/doc/salome/AddNetgenInSalome2.pdf deleted file mode 100644 index 34fd25204..000000000 Binary files a/doc/salome/AddNetgenInSalome2.pdf and /dev/null differ diff --git a/doc/salome/AddNetgenInSalome2.ps b/doc/salome/AddNetgenInSalome2.ps deleted file mode 100644 index a81aa9658..000000000 --- a/doc/salome/AddNetgenInSalome2.ps +++ /dev/null @@ -1,13935 +0,0 @@ -%!PS-Adobe-3.0 -%%BoundingBox: 0 0 595 842 -%%Creator: OpenOffice.org 1.0.2 -%%For: nadir -%%CreationDate: Tue Dec 9 10:49:18 2003 -%%Title: Proc?dure de rajout de DATA dans le produit SalomePro -%%LanguageLevel: 2 -%%DocumentData: Clean7Bit -%%Pages: (atend) -%%PageOrder: Ascend -%%EndComments -%%BeginProlog -/ISO1252Encoding [ -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.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 /unused -/Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl -/circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused -/unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash -/tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis -/space /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 - -/psp_definefont { exch dup findfont dup length dict begin { 1 index /FID ne -{ def } { pop pop } ifelse } forall /Encoding 3 -1 roll def -currentdict end exch pop definefont pop } def - -/pathdict dup 8 dict def load begin -/rcmd { { currentfile 1 string readstring pop 0 get dup 32 gt { exit } -{ pop } ifelse } loop dup 126 eq { pop exit } if 65 sub dup 16#3 and 1 -add exch dup 16#C and -2 bitshift 16#3 and 1 add exch 16#10 and 16#10 -eq 3 1 roll exch } def -/rhex { dup 1 sub exch currentfile exch string readhexstring pop dup 0 -get dup 16#80 and 16#80 eq dup 3 1 roll { 16#7f and } if 2 index 0 3 --1 roll put 3 1 roll 0 0 1 5 -1 roll { 2 index exch get add 256 mul } -for 256 div exch pop exch { neg } if } def -/xcmd { rcmd exch rhex exch rhex exch 5 -1 roll add exch 4 -1 roll add -1 index 1 index 5 -1 roll { moveto } { lineto } ifelse } def end -/readpath { 0 0 pathdict begin { xcmd } loop end pop pop } def - -systemdict /languagelevel known not { -/xshow { exch dup length 0 1 3 -1 roll 1 sub { dup 3 index exch get -exch 2 index exch get 1 string dup 0 4 -1 roll put currentpoint 3 -1 -roll show moveto 0 rmoveto } for pop pop } def -/rectangle { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 -rlineto closepath } def -/rectfill { rectangle fill } def -/rectstroke { rectangle stroke } def } if - -/psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def -/psp_ascii85filter { currentfile /ASCII85Decode filter } def -/psp_lzwstring { psp_lzwfilter 1024 string readstring } def -/psp_ascii85string { psp_ascii85filter 1024 string readstring } def -/psp_imagedict { -/psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def -/psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get } -def 7 dict dup -/ImageType 1 put dup -/Width 7 -1 roll put dup -/Height 5 index put dup -/BitsPerComponent 4 index psp_bitspercomponent put dup -/Decode 5 -1 roll psp_decodearray put dup -/ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup -/DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put -} def -%%EndProlog -%%Page: 0 0 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%BeginFeature: *PageSize A4 -<> setpagedevice -%%EndFeature -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Bold-iso1252 /Times-Bold ISO1252Encoding psp_definefont -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -253 283 moveto -0 0 0 setrgbcolor -/Times-Bold-iso1252 findfont 67 -67 matrix scale makefont setfont -<50726F63E9647572652064652072616A6F75742065742064652074657374206475206D61696C6C -6575722074E974726168E9647269717565204E657467656E> -show -403 361 moveto -<64616E73206C65206D6F64756C6520534D455348206465206C27656E7669726F6E6E656D656E74 -2053616C6F6D652032> -show -220 439 moveto -<202020202020> -show -220 508 moveto -/Times-Bold-iso1252 findfont 58 -58 matrix scale makefont setfont -<20202020205072E9616C61626C65733A> -show -295 566 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4F6E20737570706F736520717565204E657467656E206120E974E920696E7374616C6CE9206461 -6E73206C6120636F6E66696775726174696F6E2073756976616E7465> -show -1647 566 moveto -<20> -show -1659 566 moveto -<3A> -show -312 683 moveto -<6C732020206E657467656E5F696E7374616C6C6174696F6E5F706174682F696E636C756465> -show -312 739 moveto -<6E676C69622E68> -show -312 795 moveto -<6C73206E657467656E5F696E7374616C6C6174696F6E5F706174682F6C69622F4C494E5558> -show -312 851 moveto -<6C69626373672E61202020206C6962677072696D2E61202020206C69626D6573682E6120202020 -202020202020202020206C69626F7074692E61202020202020202020206C69627669732E61> -show -312 907 moveto -<6C696267656E2E61202020206C69626C612E61202020202020202020206C69626E67696E746572 -666163652E61202020206C696273746C67656F6D2E61> -show -312 963 moveto -<6C73206E657467656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E5558> -show -312 1019 moveto -<6469616C6F672E74636C20202020202020206D656E75737461742E74636C202020206E6768656C -702E74636C202020206E672E74636C2020202020202020202020202020706172616D65746572732E -74636C202020207661726961626C65732E74636C> -show -312 1075 moveto -<64726177696E672E74636C202020206E6720202020202020202020202020202020202020206E67 -69636F6E2E74636C202020206E6776697375616C2E74636C20202020737461727475702E74636C> -show -295 1191 moveto -<6FF9206E657467656E5F696E7374616C6C6174696F6E5F7061746820657374206C612064697265 -63746F7279206427696E7374616C6C6174696F6E206465204E657467656E2E204C65732066696368 -69657273> -show -295 1247 moveto -<6E657467656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E55582F2A2E7463 -6C20736F6E74206C657320666963686965727320646520636F6D6D616E642074636C20706F757220 -70696C6F746572206C65> -show -295 1303 moveto -<6D61696C6C657572204E657467656E20E0207472617665727320736F6E2049484D2E206E657467 -656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E55582F6E6720657374> -show -295 1359 moveto -<6C276578E963757461626C65206465204E657467656E206176656320736F6E2049484D20656D62 -61727175E9652E204C6573206C696272616972696573202A2E612064616E73> -show -295 1415 moveto -<6E657467656E5F696E7374616C6C6174696F6E5F706174682F6C69622F4C494E55582F20646F69 -76656E7420EA74726520636F6D70696CE97320656E20656E6C6576616E74206C276F7074696F6E> -show -295 1471 moveto -<2D444F50454E474C20717569206E27657374207574696C652071756520706F7572206C27484D20 -6465204E657467656E2E204C61206C6962726169726965206C69626E67696E746572666163652E61 -20646F6974> -show -295 1528 moveto -<636F6E74656E6972206C276F626A6574206E676C69622E6F206574206E6520646F697420706173 -20636F6E74656E6972206E676E657764656C6574652E6F2E> -show -295 1640 moveto -<4C612070726F63E96475726520E02061646F707465722065737420746F757420642761626F7264 -20646520636F6D70696C6572204E657467656E2028766F6972206C6520524541444D452E494E5354 -414C4C> -show -295 1696 moveto -<76656E616E742061766563206C6120646973747269627574696F6E293B20636520717569207072 -6F6475697261206C276578E963757461626C65206E6720206C696E6BE92073746174697175656D65 -6E742061766563206C6573> -show -295 1752 moveto -<6C696272616972696573202A2E612E205075697320617072E87320696C20666175647261697420 -6D6F646966696572206C657320646966666572656E7473204D616B6566696C6520706F757220656E -6C65766572206C276F7074696F6E20> -show -295 1808 moveto -<2D444F50454E474C2C202072616A6F75746572206C276F626A6574206E676C69622E6F2C206578 -636C757265206C276F626A657420206E676E657764656C6574652E6F20E0206C61206C6962726169 -726965> -show -295 1864 moveto -<6C69626E67696E746572666163652E6120657420656E66696E207265636F6D70696C6572207365 -756C656D656E74206C6573206C6962726169726965732E> -show -343 1984 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -418 1984 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4F6E206120E0206E6F74726520646973706F736974696F6E20286465206C612070617274206465 -204E616469722920756E652061726368697665204E657467656E2E74677A20636F6E74656E616E74 -206C6573> -show -295 2044 moveto -<2020202020202020202020736F757263657320646520534D45534820717569207772617070656E -74206C657320617070656C732061757820726F7574696E6573206465204E657467656E> -show -1779 2044 moveto -<20> -show -1791 2044 moveto -<706F7572206C65> -show -295 2100 moveto -<20202020202020202020206D61696C6C6575722074E974726168E96472697175653A> -show -294 2201 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<63642053414C4F4D45325F524F4F54> -show -294 2245 moveto -<746172207A787666204E657467656E2E74677A> -show -294 2289 moveto -<2E2F534D4553485F5352432F7372632F4E455447454E2F4D616B6566696C652E696E> -show -294 2333 moveto -<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4E455447454E5F33442E63 -7878> -show -294 2377 moveto -<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4E455447454E5F33442E68 -7878> -show -294 2421 moveto -<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4D6178456C656D656E7456 -6F6C756D652E637878> -show -294 2465 moveto -<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4D6178456C656D656E7456 -6F6C756D652E687878> -show -294 2509 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4E455447454E5F3344 -5F692E637878> -show -294 2553 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4E455447454E5F3344 -5F692E687878> -show -294 2597 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4D6178456C656D656E -74566F6C756D655F692E637878> -show -294 2641 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4D6178456C656D656E -74566F6C756D655F692E687878> -show -294 2685 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4C656E67746846726F -6D45646765735F692E637878> -show -294 2729 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4C656E67746846726F -6D45646765735F692E687878> -show -294 2773 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F785F7465 -7472612E7079> -show -294 2816 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F78325F74 -657472612E7079> -show -294 2860 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F78335F74 -657472612E7079> -show -294 2904 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666978617469 -6F6E5F74657472612E7079> -show -294 2948 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666978617469 -6F6E5F686578612E7079> -show -294 2992 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F506172746974 -696F6E315F74657472612E7079> -show -294 3036 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666C69676874 -5F736B696E2E7079> -show -294 3080 moveto -<2E2F> -show -344 3080 moveto -<534D4553485F5352432F> -show -596 3080 moveto -<61646D5F6C6F63616C2F756E69782F636F6E6669675F66696C65732F636865636B5F4E65746765 -6E2E6D34> -show -296 634 1 457 rectfill -2109 634 1 457 rectfill -296 634 1814 1 rectfill -296 1090 1814 1 rectfill -280 2167 1 924 rectfill -2125 2167 1 924 rectfill -280 2167 1846 1 rectfill -280 3090 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 1 1 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-ReguObli -%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular Oblique) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle -12.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-ReguObli def -/PaintType 0 def -/WMode 0 def -/FontBBox {-61 -237 774 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020947 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1 -94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211 -9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB -B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466 -AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1 -25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A -C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC -45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246 -D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566 -9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A -E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698 -53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736 -05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66 -5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341 -6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF -4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2 -4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482 -9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D -FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4 -DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3 -CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D -B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28 -7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A -1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68 -1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A -8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4 -16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365 -F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12 -41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22 -5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D -BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080 -65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827 -C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45 -EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559 -872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103 -AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF -8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E -1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A -7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A -DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610 -38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356 -A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F -67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5 -492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1 -5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD -A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551 -D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3 -C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252 -CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097 -60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A -F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA -37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8 -F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E -18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0 -9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118 -73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0 -837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D -9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E -9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC -85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3 -AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F -719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1 -496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88 -EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C -6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7 -37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB -F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C -D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2 -63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15 -565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE -18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E -2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841 -55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44 -58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551 -837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3 -0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE -9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C -155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8 -BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16 -8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879 -1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C -4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA -492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3 -155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704 -1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3 -5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0 -5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC -CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0 -BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E -DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311 -98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E -DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6 -F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C -93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504 -78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9 -F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F -9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4 -3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2 -52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A -A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0 -F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB -1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F -2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8 -D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD -879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319 -1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD -BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122 -007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C -5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F -013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D -BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA -6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338 -670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C -0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13 -C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172 -6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807 -91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600 -8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F -8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D -AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94 -202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E -DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68 -85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315 -70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF -80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581 -217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12 -E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA -9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519 -1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5 -3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED -B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4 -FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC -797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D -2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7 -E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364 -A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71 -8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C -BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0 -9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1 -3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B -E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75 -BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428 -4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B -69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6 -D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8 -FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387 -7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4 -A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF -51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A -DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515 -D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A -FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0 -5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A -96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB -92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF -37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812 -3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726 -62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3 -D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550 -7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752 -4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734 -B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363 -141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303 -86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83 -9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726 -B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B -737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43 -46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7 -0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9 -A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744 -69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8 -222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6 -855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF -F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1 -6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A -8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453 -3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6 -67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A -AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C -30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4 -29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04 -26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1 -3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B -667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177 -D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17 -070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180 -7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8 -C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D -E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD -E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51 -C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E -EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA -11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385 -1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C -FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8 -96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C -0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C -6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120 -835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C -5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC -7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A -78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21 -6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8 -2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099 -9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE -C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0 -DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054 -16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B -D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3 -984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA -B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33 -7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219 -1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26 -DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66 -1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA -4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27 -94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350 -45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915 -E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36 -6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5 -F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538 -B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2 -3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705 -796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8 -40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494 -44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5 -C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59 -6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14 -AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130 -6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68 -6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952 -35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7 -08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217 -4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218 -52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95 -41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C -77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8 -65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB -73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81 -234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F -982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9 -184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885 -A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD -0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34 -7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2 -E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC -AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB -8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09 -1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF -EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED -8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F -A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F -87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B -33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7 -B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559 -2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C -6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC -56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED -884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262 -348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1 -106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B -13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07 -E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30 -41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687 -F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604 -3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1 -467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95 -993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F -7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083 -4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3 -41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941 -2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F -BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F -486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8 -249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325 -D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D -4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4 -AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E -1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D -13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367 -DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020 -749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C -5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39 -0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1 -71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D -FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6 -F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4 -D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2 -182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137 -33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE -48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1 -5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA -5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C -4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173 -A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731 -5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938 -731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C -15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3 -D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E -E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7 -97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC -7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369 -DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171 -CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878 -B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343 -1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4 -7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A -FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93 -12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E -31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28 -8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35 -FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA -AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F -970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1 -837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080 -02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29 -3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E -57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5 -8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765 -EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB -43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE -5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F -7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C -39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2 -A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2 -56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158 -C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951 -23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34 -37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE -BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9 -2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9 -BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594 -6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6 -5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE -CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D -3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65 -77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B -DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7 -63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB -EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69 -B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB -438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D -7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245 -4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B -F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1 -8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2 -F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C -C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B -47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326 -6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1 -564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692 -C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24 -870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81 -1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211 -D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601 -196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0 -CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53 -41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4 -5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47 -B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD -B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947 -1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D -DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6 -A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED -5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3 -E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA -649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B -220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729 -E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7 -5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524 -4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01 -486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195 -CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2 -1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14 -50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6 -B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25 -B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F -58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7 -77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202 -42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2 -79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179 -08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101 -EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A -A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171 -0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC -50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16 -D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938 -A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B -A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476 -63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444 -5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E -4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598 -54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62 -3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C -1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC -1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269 -743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA -94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD -02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F -03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5 -403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006 -54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63 -8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67 -5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108 -DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C -2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB -197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4 -6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918 -0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C -F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D -05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC -E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E -4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC -7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717 -80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9 -4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158 -8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62 -0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF -540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6 -A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957 -270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911 -F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E -4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D -41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967 -6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654 -BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B -7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C -52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB -4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97 -146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B -D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD -52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559 -187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616 -F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174 -CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963 -4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D -0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5 -4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE -A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070 -169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72 -6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092 -402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C -EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B -77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0 -02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9 -73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421 -B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4 -D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806 -E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70 -BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A -79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7 -787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8 -88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F -F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52 -6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D -6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB -C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744 -1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296 -75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391 -26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A -0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379 -928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4 -77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806 -4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E -9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70 -89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E -E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17 -01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506 -FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735 -2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B -3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D -6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C -2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928 -C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA -35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67 -F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F -CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6 -4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714 -54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228 -603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB -2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9 -F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2 -106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC -32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA -60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431 -F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892 -370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950 -78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D -CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE -F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A -75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847 -C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A -41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1 -5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9 -5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441 -DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1 -639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A -3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464 -81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463 -DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6 -DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB -02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84 -E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54 -0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824 -16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D -F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320 -79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0 -F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF -74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8 -5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD -AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02 -DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E -7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC -0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119 -32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438 -DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97 -6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A -4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7 -A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA -ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693 -CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA -683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853 -BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3 -8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499 -907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D -403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49 -A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9 -4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C -EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2 -0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF -885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A -4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC -8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E -0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9 -8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF -E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC -2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09 -5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731 -28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1 -1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA -BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367 -4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD -E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956 -507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13 -24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35 -8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D -8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339 -E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE -0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D -25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1 -10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888 -4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2 -2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678 -9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55 -43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91 -3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E -EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E -D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B -B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2 -86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2 -376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB -76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A -5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490 -D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684 -8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842 -9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839 -0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688 -1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8 -D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674 -F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A -96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D -31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD -63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81 -0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF -DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88 -30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7 -835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E -115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A -9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C -80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63 -6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210 -C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE -CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED -8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37 -CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA -71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209 -8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA -BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E -722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C -4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC -52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2 -802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88 -A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE -43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2 -BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382 -5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3 -F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E -1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821 -4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E -34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44 -400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408 -999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E -8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436 -BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497 -5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09 -6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814 -E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F -D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8 -F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C -E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725 -EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB -009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9 -4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5 -5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5 -86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988 -A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847 -EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E -3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10 -324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E -FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495 -0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E -ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12 -8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD -4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF -CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D -DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD -B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD -D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8 -FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E -B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA -E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551 -98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9 -FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C -D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40 -19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C -2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0 -DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0 -ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B -2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C -4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C -BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C -46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E -690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A -BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399 -270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4 -9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268 -10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65 -95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3 -AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0 -9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B -D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754 -94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1 -67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8 -BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E -07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94 -D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4 -1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4 -95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA -91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D -30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE -C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B -3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7 -AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273 -38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F -9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1 -B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65 -89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B -163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2 -56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B -186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE -19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C -4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5 -03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28 -B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24 -4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34 -8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3 -71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1 -EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5 -083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31 -D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200 -458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0 -11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1 -0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C -397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560 -A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82 -0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591 -EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4 -4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C -1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033 -109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213 -18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2 -C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3 -47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605 -8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB -7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754 -E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D -AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D -5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89 -7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E -AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604 -388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C -540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2 -3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D -E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40 -61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA -73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921 -9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127 -4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A -4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6 -F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1 -BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0 -39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910 -B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314 -54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A -EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734 -EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079 -CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE -718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C -D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA -9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A -53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E -A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7 -7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237 -CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55 -311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357 -F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B -E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643 -15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C -001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0 -0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D -CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55 -AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A -ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E -77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252 -346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD -12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF -2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A -C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427 -AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B -61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0 -BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C -484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82 -94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2 -E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827 -A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE -5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12 -66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2 -B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72 -E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E -168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF -BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999 -4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA -252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B -87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C -0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074 -EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135 -ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912 -999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4 -C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA -4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152 -692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014 -69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F -F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840 -301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624 -B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E -86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1 -1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED -70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D -B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37 -5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803 -35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651 -C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A -D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A -C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528 -4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154 -02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492 -83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C -BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65 -64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738 -9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60 -7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694 -45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F -C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB -55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766 -2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1 -7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419 -5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB -1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E -17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3 -5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217 -F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A -9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120 -2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8 -ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8 -0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1 -1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006 -F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0 -000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9 -9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789 -ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B -02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963 -189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE -EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2 -C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268 -6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C -390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2 -922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8 -D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86 -70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962 -F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB -268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886 -B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9 -6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07 -A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649 -B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663 -AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F -A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA -0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816 -495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7 -E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA -D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE -B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C -0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C -7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B -6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86 -EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6 -08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6 -6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC -1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2 -E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D -3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C -122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2 -F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6 -154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954 -9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182 -B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8 -9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1 -85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47 -B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46 -E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED -839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A -9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5 -E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4 -FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D -D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A -1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278 -AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA -239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062 -3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02 -F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD -7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405 -77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA -BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C -80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09 -9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E -DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9 -703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D -F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F -6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76 -CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6 -EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A -B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306 -23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7 -3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB -01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E -93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80 -3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C -4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB -0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF -AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C -05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396 -06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB -87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA -A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69 -50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03 -AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024 -FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18 -C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777 -3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA -F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E -59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D -A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C -4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677 -206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071 -5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A -4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89 -18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6 -7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096 -84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5 -6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9 -C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9 -684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3 -70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297 -040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345 -7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37 -F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C -1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD -F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA -E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3 -3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8 -580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1 -D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6 -645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3 -7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905 -3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60 -670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0 -BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F -2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381 -1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB -CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5 -E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB -669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C -0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF -6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F -67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2 -5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657 -C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451 -CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6 -CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25 -B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C -76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1 -A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB -5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A -6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5 -AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3 -37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2 -631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639 -567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28 -47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6 -4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD -585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB -39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0 -D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF -4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F -C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B -1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2 -2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206 -CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568 -75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88 -114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B -F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338 -6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63 -9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77 -6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B -D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0 -BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49 -E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E -DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A -7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284 -89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4 -8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46 -BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8 -34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A -3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30 -43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A -D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5 -43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD -BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2 -9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7 -31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3 -5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9 -8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97 -E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1 -1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D -082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E -BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9 -3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0 -FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77 -312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2 -74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5 -B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4 -CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9 -BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1 -4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5 -9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33 -92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B -09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B -8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802 -7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0 -5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83 -4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547 -71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC -01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464 -76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76 -41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD -7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD -C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926 -E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7 -8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC -F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43 -29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5 -243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2 -1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75 -F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC -102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36 -45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20 -352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D -17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6 -6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D -EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7 -50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC -3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0 -011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5 -FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A -7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A -3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF -7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18 -218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6 -0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC -112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB -80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65 -05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5 -A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F -5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A -289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2 -F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315 -A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D -75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244 -C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B -C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B -479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8 -0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD -3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45 -1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401 -CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338 -D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A -AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1 -BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0 -DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37 -178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF -77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F -8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A -27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808 -488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D -A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D -321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A -7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB -F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE -922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526 -75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB -09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2 -BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB -B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373 -6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379 -59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62 -8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9 -21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30 -026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022 -C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E -E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF -44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1 -8A31BE4E82B384 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -295 321 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4C61> -show -362 321 moveto -<6469726563746F7279> -show -556 321 moveto -<53414C4F4D45325F524F4F54> -show -962 321 moveto -<657374> -show -1032 321 moveto -<737570706F73E965> -show -1230 321 moveto - -show -1318 321 moveto -<6C61> -show -1369 321 moveto -<6469726563746F7279> -show -1564 321 moveto -<636F6E74656E616E74> -show -1772 321 moveto -<746F7573> -show -1870 321 moveto -<6C6573> -show -1940 321 moveto -<6D6F64756C6573> -show -295 377 moveto -<6465> -show -358 377 moveto -<6C61> -show -411 377 moveto -<706C617465666F726D65> -show -644 377 moveto -<53414C4F4D45> -show -866 377 moveto -<322E> -show -920 377 moveto -<4C6573> -show -1009 377 moveto -<6669636869657273> -show -1175 377 moveto -<2A4D6178456C656D656E74566F6C756D652A> -show -1661 377 moveto -<736F6E74> -show -1761 377 moveto -<64E96AE0> -show -1861 377 moveto -<64616E73> -show -1969 377 moveto -<6C61> -show -2021 377 moveto -<62617365> -show -295 433 moveto -<6D616973206E6520636F6E7469656E6E656E74207269656E206465207369676E696669616E742E> -show -295 551 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 551 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -659 551 moveto -<6475> -show -738 551 moveto -<66696368696572> -show -896 551 moveto -1 0 0 setrgbcolor -/NimbusMonL-ReguObli-iso1252 findfont 50 -50 matrix scale makefont setfont -<636F6E6669677572652E696E2E62617365> -show -1434 551 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1553 551 moveto -<72616A6F75746572> -show -1737 551 moveto -<6C61> -show -1801 551 moveto -<76E972696669636174696F6E> -show -2060 551 moveto -<6475> -show -370 611 moveto -<66696368696572> -show -535 611 moveto -<696E636C756465> -show -716 611 moveto -<6E676C69622E68> -show -891 611 moveto -<6574> -show -962 611 moveto -<646573> -show -1063 611 moveto -<64696666E972656E746573> -show -1310 611 moveto -<6C696272616972696573> -show -1522 611 moveto -<4E657467656E2C> -show -1714 611 moveto -<766961> -show -1809 611 moveto -<6C65> -show -1880 611 moveto -<66696368696572> -show -2045 611 moveto -<6D34> -show -370 668 moveto -<636865636B5F4E657467656E2E6D342E> -show -309 769 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<6563686F2074657374696E67206E657467656E> -show -309 813 moveto -<6563686F202D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D -2D2D2D2D2D2D2D2D2D> -show -309 857 moveto -<6563686F> -show -309 901 moveto -<434845434B5F4E455447454E> -show -309 945 moveto -<6563686F> -show -309 989 moveto -<6563686F202D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D -2D2D2D2D2D2D2D2D2D> -show -295 1106 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1106 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E206475206669636869657220> -show -849 1106 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E20> -show -1087 1106 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<20> -show -1099 1106 moveto -0 0 0 setrgbcolor -<706F757220706F75766F6972207574696C69736572206C652064657373696E> -show -370 1166 moveto -<6D6573685F747265655F616C676F5F74657472612E706E672064616E73206C2749484D20646520 -534D4553482028766F6972206C61206D6F64696620E020666169726520737572> -show -370 1222 moveto -<20534D45534847554929206574206C61204272657020666C696768745F736F6C69642E62726570 -206461616E73206C65207465737420534D4553485F666C696768745F736B696E2E70792E> -show -294 1323 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<5245534F55524345535F46494C4553203D205C> -show -294 1367 moveto -<20202020202E> -show -294 1411 moveto -<20202020202E> -show -294 1455 moveto -<20202020202E> -show -294 1499 moveto -<6D6573685F747265655F616C676F5F74657472612E706E67205C> -show -294 1543 moveto -<666C696768745F736F6C69642E62726570> -show -295 1660 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1660 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4C65206669636869657220> -show -578 1660 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<61646D> -show -664 1660 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -677 1660 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<756E69782F6D616B655F636F6D6D656E63652E696E202020> -show -1207 1660 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<646F697420617573736920EA747265206D6F64696669E920E02063657474652066696E> -show -1862 1660 moveto -<20> -show -1874 1660 moveto -<3A> -show -309 1765 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<69666571202840574954484E455447454E402C79657329> -show -309 1809 moveto -<202041434C4F43414C5F535243202B3D20636865636B5F6E657467656E2E6D34> -show -309 1853 moveto -<656E646966> -show -295 1971 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1971 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -662 1971 moveto -<6475> -show -744 1971 moveto -<66696368696572> -show -905 1971 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F535243> -show -1178 1971 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1190 1971 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<737263> -show -1251 1971 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1264 1971 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E> -show -1552 1971 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1675 1971 moveto -<72616A6F75746572> -show -1861 1971 moveto -<6C61> -show -1928 1971 moveto -<6469726563746F7279> -show -370 2031 moveto -<4E455447454E> -show -592 2031 moveto -<6FF9> -show -664 2031 moveto -<6C61> -show -723 2031 moveto -<6C6962726169726965> -show -904 2031 moveto -<64796E616D69717565> -show -1149 2031 moveto -<6C69624E455447454E2E736F> -show -1481 2031 moveto -<7661> -show -1550 2031 moveto - -show -1648 2031 moveto -<636F6E73747275697465> -show -1868 2031 moveto - -show -1912 2031 moveto -<706172746972> -show -2043 2031 moveto -<646573> -show -370 2087 moveto -<6C69627261697269657320737461746963206465204E657467656E2E> -show -294 2188 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<69666571202840574954484E455447454E402C79657329> -show -294 2232 moveto -<2020534244495253203D204F424A45435420534D445320534D4553484453204472697665722044 -72697665724D45442044726976657244415420447269766572554E56205C> -show -294 2276 moveto -<20202020202020202020204D45464953544F204E455447454E20534D45534820534D4553485F49 -20534D45534846696C7465727353656C656374696F6E20534D455348475549205C> -show -294 2320 moveto -<2020202020202020202020534D4553485F53574947> -show -294 2364 moveto -<656E646966> -show -295 2481 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 2481 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -665 2481 moveto -<6475> -show -750 2481 moveto -<66696368696572> -show -915 2481 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F535243> -show -1187 2481 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1200 2481 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<737263> -show -1261 2481 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1274 2481 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D455348> -show -1432 2481 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1445 2481 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E> -show -1738 2481 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1864 2481 moveto -<72616A6F75746572> -show -2054 2481 moveto -<6C6573> -show -370 2541 moveto -<6669636869657273> -show -541 2541 moveto -<717569> -show -626 2541 moveto -<7772617070656E74> -show -834 2541 moveto -<6C6573> -show -910 2541 moveto -<617070656C73> -show -1059 2541 moveto -<6175> -show -1128 2541 moveto -<6D61696C6C657572> -show -1315 2541 moveto -<74E974726168E9647269717565> -show -1600 2541 moveto -<6465> -show -1669 2541 moveto -<4E657467656E> -show -1835 2541 moveto -<6574> -show -1893 2541 moveto -<6C6573> -show -1969 2541 moveto -<626F6E6E6573> -show -370 2597 moveto -<6F7074696F6E7320646520636F6D70696C6174696F6E2F6C696E6B6167652E> -show -294 2698 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<69666571202840574954484E455447454E402C79657329> -show -294 2742 moveto -<20204558504F52545F48454144455253202B3D20534D4553485F4E455447454E5F33442E687878> -show -294 2786 moveto -<20204C49425F535243202B3D20534D4553485F4E455447454E5F33442E637878> -show -294 2830 moveto -<20204E455447454E5F494E434C554445533D404E455447454E5F494E434C5544455340> -show -294 2874 moveto -<2020435050464C414753202B3D2024284E455447454E5F494E434C5544455329> -show -294 2918 moveto -<2020435858464C414753202B3D2024284E455447454E5F494E434C5544455329> -show -294 2962 moveto -<20204C44464C414753202B3D202D6C4E455447454E> -show -294 3006 moveto -<656E646966> -show -295 735 1 264 rectfill -2125 735 1 264 rectfill -295 735 1831 1 rectfill -295 998 1831 1 rectfill -280 1289 1 265 rectfill -2125 1289 1 265 rectfill -280 1289 1846 1 rectfill -280 1553 1846 1 rectfill -295 1732 1 132 rectfill -2125 1732 1 132 rectfill -295 1732 1831 1 rectfill -295 1863 1831 1 rectfill -280 2154 1 220 rectfill -2125 2154 1 220 rectfill -280 2154 1846 1 rectfill -280 2373 1846 1 rectfill -280 2665 1 352 rectfill -2125 2665 1 352 rectfill -280 2665 1846 1 rectfill -280 3016 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 2 2 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -295 271 moveto -0 0 0 setrgbcolor -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -653 271 moveto -<6475> -show -725 271 moveto -<66696368696572> -show -877 271 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F535243> -show -1149 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1162 271 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<737263> -show -1223 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1236 271 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F49> -show -1435 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1448 271 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E2C> -show -1708 271 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont - -show -1938 271 moveto -<434F524241> -show -370 331 moveto -<6465206C61207072E963E964656E7465206D6F64696669636174696F6E2E> -show -294 433 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<69666571202840574954484E455447454E402C79657329> -show -294 476 moveto -<20204C49425F535243202B3D20534D4553485F4E455447454E5F33445F692E637878> -show -294 520 moveto -<2020> -show -344 520 moveto -<4C44464C414753202B3D202D6C4E455447454E> -show -294 564 moveto -<656E646966> -show -295 682 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 682 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -657 682 moveto -<6475> -show -733 682 moveto -<66696368696572> -show -890 682 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<69646C2F534D4553485F42617369634879706F7468657369732E69646C> -show -1563 682 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1681 682 moveto -<72616A6F75746572> -show -1863 682 moveto -<6C92616C676F726974686D65> -show -370 742 moveto -<4E455447454E5F33442071756920636F72726573706F6E64206175206D61696C6C6575722074E9 -74726168E9647269717565206465204E657467656E2E> -show -294 887 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<2020> -show -344 887 moveto -<696E7465726661636520534D4553485F4E455447454E5F3344> -show -974 887 moveto -<20> -show -999 887 moveto -<3A20534D4553485F33445F416C676F> -show -294 931 moveto -<20207B> -show -294 975 moveto -<20207D3B> -show -295 1092 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1092 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -667 1092 moveto -<6475> -show -754 1092 moveto -<66696368696572> -show -921 1092 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553484755492F534D4553484755495F69636F6E732E70 -6F> -show -2019 1092 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -370 1152 moveto -<72616A6F75746572> -show -556 1152 moveto -<6C92616C676F726974686D65> -show -832 1152 moveto -<4E455447454E5F3344> -show -1149 1152 moveto -<717569> -show -1242 1152 moveto -<636F72726573706F6E64> -show -1495 1152 moveto -<6175> -show -1572 1152 moveto -<6D61696C6C657572> -show -1769 1152 moveto -<74E974726168E9647269717565> -show -2062 1152 moveto -<6465> -show -370 1208 moveto -<4E657467656E2064616E73206C612047554920646520534D4553482028626F75746F6E20646520 -73E96C656374696F6E292E> -show -294 1309 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<236D6573685F747265655F616C676F5F7465747261> -show -294 1353 moveto -<6D736769642049434F4E5F534D4553485F545245455F414C474F5F54657472615F3344> -show -294 1397 moveto -<6D7367737472206D6573685F747265655F616C676F5F74657472612E706E67> -show -295 1515 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1515 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -651 1515 moveto -<646573> -show -739 1515 moveto -<6669636869657273> -show -910 1515 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F726573736F75726365732F534D4553485F5B656E2C66725D2E786D6C> -show -1843 1515 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1955 1515 moveto -<72616A6F75746572> -show -370 1575 moveto -<6C6573> -show -445 1575 moveto -<636F6D6D656E746169726573> -show -744 1575 moveto -<737572> -show -824 1575 moveto -<6C6573> -show -898 1575 moveto -<626F75746F6E73> -show -1075 1575 moveto -<6465> -show -1142 1575 moveto -<6C61> -show -1196 1575 moveto -<475549> -show -1305 1575 moveto -<6465> -show -1370 1575 moveto -<534D4553482E> -show -1569 1575 moveto -<436573> -show -1663 1575 moveto -<626F75746F6E73> -show -1840 1575 moveto -<7065726D657474656E74> -show -2073 1575 moveto -<6C65> -show -370 1631 moveto -<63686F6978206475206D61696C6C6575722074E974726168E9647269717565206465204E657467 -656E206574206465206C61207461696C6C652064657320E96CE96D656E747320766F6C756D697175 -65732E> -show -294 1732 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<20202020> -show -394 1732 moveto -<3C> -show -419 1732 moveto -<706F7075702D6974656D206974656D2D69643D93353033339420706F732D69643D9494206C6162 -656C2D69643D944D61782E2048657861686564726F6E206F72> -show -294 1776 moveto -<5465747261686564726F6E20566F6C756D65942069636F6E2D69643D946D6573685F6879706F5F -766F6C756D652E706E679420746F6F6C7469702D69643D949420616363656C2D> -show -294 1820 moveto -<69643D949420746F67676C652D69643D949420657865637574652D616374696F6E3D9494202F> -show -1251 1820 moveto -<3E> -show -294 1864 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1908 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1952 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1996 moveto -<202020203C> -show -420 1996 moveto -<706F7075702D6974656D206974656D2D69643D93353032309420706F732D69643D9494206C6162 -656C2D69643D9448657861686564726F6E2028692C6A2C6B2994> -show -294 2040 moveto -<69636F6E2D69643D946D6573685F616C676F5F686578612E706E679420746F6F6C7469702D6964 -3D949420616363656C2D69643D949420746F67676C652D69643D9494> -show -294 2084 moveto -<657865637574652D616374696F6E3D9494202F> -show -772 2084 moveto -<3E> -show -294 2128 moveto -<202020203C> -show -420 2128 moveto -<706F7075702D6974656D206974656D2D69643D93353032319420706F732D69643D9494206C6162 -656C2D69643D945465747261686564726F6E20284E657467656E2994> -show -294 2171 moveto -<69636F6E2D69643D946D6573685F616C676F5F686578612E706E679420746F6F6C7469702D6964 -3D949420616363656C2D69643D949420746F67676C652D69643D9494> -show -294 2215 moveto -<657865637574652D616374696F6E3D9494202F> -show -772 2215 moveto -<3E> -show -294 2259 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2303 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2347 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2391 moveto -<202020203C746F6F6C627574746F6E> -show -672 2391 moveto -<2D6974656D206974656D2D69643D933530333394206C6162656C2D69643D944D61782E20486578 -61686564726F6E206F72> -show -294 2435 moveto -<5465747261686564726F6E20566F6C756D65942069636F6E2D69643D946D6573685F6879706F5F -766F6C756D652E706E679420746F6F6C7469702D69643D94204D61782E> -show -294 2479 moveto -<48657861686564726F6E206F72205465747261686564726F6E20566F6C756D65204879706F7468 -657369739420616363656C2D69643D949420746F67676C652D69643D9494> -show -294 2523 moveto -<657865637574652D616374696F6E3D9494202F> -show -772 2523 moveto -<3E> -show -294 2567 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2611 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2655 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2699 moveto -<202020203C> -show -420 2699 moveto -<746F6F6C627574746F6E2D6974656D206974656D2D69643D93353032309420706F732D69643D94 -94206C6162656C2D69643D9448657861686564726F6E> -show -294 2743 moveto -<28692C6A2C6B29942069636F6E2D69643D946D6573685F616C676F5F686578612E706E67942074 -6F6F6C7469702D69643D942048657861686564726F6E2028692C6A2C6B29> -show -294 2787 moveto -<416C676F726974686D9420616363656C2D69643D949420746F67676C652D69643D949420657865 -637574652D616374696F6E3D9494202F> -show -1680 2787 moveto -<3E> -show -294 2831 moveto -<202020203C746F6F6C627574746F6E> -show -672 2831 moveto -<2D6974656D206974656D2D69643D93353032319420706F732D69643D9494206C6162656C2D6964 -3D945465747261686564726F6E> -show -294 2875 moveto -<284E657467656E29942069636F6E2D69643D946D6573685F616C676F5F686578612E706E679420 -746F6F6C7469702D69643D94205465747261686564726F6E20284E657467656E29> -show -294 2919 moveto -<416C676F726974686D9420616363656C2D69643D949420746F67676C652D69643D949420657865 -637574652D616374696F6E3D9494202F> -show -1680 2919 moveto -<3E> -show -220 3030 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<417474656E74696F6E> -show -220 3035 188 3 rectfill -408 3030 moveto -<3A20756E2066696368696572202E706E6720206D6573685F616C676F5F74657472612E706E6720 -646F697420EA7472652070726F6475697420706F75722064697374696E67756572206C276963F46E -65206475> -show -220 3086 moveto -<6D61696C6C657572206865786168E96472697175652064652063656C7569206475206D61696C6C -6575722074E974726168E9647269717565202861637475656C6C656D656E7420632765737420756E -652073696D706C65> -show -280 399 1 176 rectfill -2125 399 1 176 rectfill -280 399 1846 1 rectfill -280 574 1846 1 rectfill -280 809 1 176 rectfill -2125 809 1 176 rectfill -280 809 1846 1 rectfill -280 984 1846 1 rectfill -280 1276 1 132 rectfill -2125 1276 1 132 rectfill -280 1276 1846 1 rectfill -280 1407 1846 1 rectfill -280 1698 1 1231 rectfill -2125 1698 1 1231 rectfill -280 1698 1846 1 rectfill -280 2928 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 3 3 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -%%BeginResource: font NimbusMonL-ReguObli -%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular Oblique) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle -12.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-ReguObli def -/PaintType 0 def -/WMode 0 def -/FontBBox {-61 -237 774 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020947 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1 -94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211 -9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB -B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466 -AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1 -25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A -C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC -45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246 -D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566 -9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A -E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698 -53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736 -05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66 -5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341 -6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF -4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2 -4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482 -9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D -FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4 -DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3 -CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D -B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28 -7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A -1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68 -1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A -8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4 -16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365 -F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12 -41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22 -5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D -BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080 -65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827 -C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45 -EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559 -872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103 -AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF -8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E -1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A -7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A -DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610 -38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356 -A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F -67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5 -492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1 -5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD -A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551 -D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3 -C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252 -CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097 -60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A -F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA -37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8 -F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E -18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0 -9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118 -73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0 -837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D -9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E -9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC -85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3 -AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F -719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1 -496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88 -EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C -6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7 -37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB -F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C -D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2 -63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15 -565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE -18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E -2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841 -55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44 -58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551 -837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3 -0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE -9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C -155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8 -BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16 -8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879 -1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C -4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA -492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3 -155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704 -1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3 -5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0 -5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC -CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0 -BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E -DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311 -98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E -DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6 -F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C -93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504 -78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9 -F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F -9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4 -3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2 -52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A -A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0 -F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB -1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F -2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8 -D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD -879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319 -1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD -BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122 -007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C -5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F -013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D -BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA -6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338 -670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C -0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13 -C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172 -6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807 -91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600 -8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F -8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D -AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94 -202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E -DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68 -85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315 -70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF -80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581 -217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12 -E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA -9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519 -1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5 -3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED -B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4 -FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC -797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D -2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7 -E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364 -A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71 -8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C -BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0 -9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1 -3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B -E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75 -BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428 -4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B -69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6 -D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8 -FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387 -7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4 -A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF -51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A -DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515 -D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A -FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0 -5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A -96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB -92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF -37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812 -3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726 -62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3 -D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550 -7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752 -4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734 -B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363 -141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303 -86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83 -9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726 -B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B -737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43 -46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7 -0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9 -A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744 -69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8 -222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6 -855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF -F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1 -6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A -8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453 -3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6 -67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A -AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C -30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4 -29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04 -26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1 -3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B -667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177 -D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17 -070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180 -7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8 -C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D -E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD -E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51 -C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E -EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA -11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385 -1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C -FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8 -96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C -0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C -6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120 -835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C -5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC -7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A -78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21 -6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8 -2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099 -9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE -C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0 -DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054 -16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B -D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3 -984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA -B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33 -7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219 -1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26 -DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66 -1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA -4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27 -94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350 -45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915 -E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36 -6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5 -F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538 -B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2 -3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705 -796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8 -40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494 -44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5 -C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59 -6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14 -AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130 -6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68 -6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952 -35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7 -08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217 -4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218 -52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95 -41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C -77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8 -65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB -73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81 -234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F -982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9 -184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885 -A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD -0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34 -7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2 -E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC -AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB -8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09 -1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF -EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED -8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F -A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F -87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B -33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7 -B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559 -2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C -6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC -56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED -884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262 -348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1 -106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B -13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07 -E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30 -41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687 -F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604 -3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1 -467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95 -993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F -7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083 -4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3 -41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941 -2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F -BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F -486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8 -249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325 -D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D -4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4 -AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E -1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D -13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367 -DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020 -749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C -5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39 -0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1 -71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D -FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6 -F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4 -D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2 -182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137 -33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE -48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1 -5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA -5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C -4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173 -A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731 -5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938 -731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C -15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3 -D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E -E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7 -97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC -7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369 -DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171 -CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878 -B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343 -1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4 -7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A -FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93 -12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E -31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28 -8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35 -FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA -AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F -970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1 -837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080 -02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29 -3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E -57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5 -8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765 -EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB -43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE -5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F -7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C -39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2 -A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2 -56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158 -C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951 -23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34 -37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE -BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9 -2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9 -BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594 -6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6 -5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE -CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D -3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65 -77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B -DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7 -63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB -EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69 -B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB -438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D -7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245 -4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B -F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1 -8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2 -F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C -C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B -47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326 -6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1 -564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692 -C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24 -870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81 -1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211 -D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601 -196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0 -CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53 -41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4 -5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47 -B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD -B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947 -1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D -DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6 -A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED -5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3 -E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA -649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B -220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729 -E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7 -5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524 -4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01 -486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195 -CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2 -1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14 -50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6 -B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25 -B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F -58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7 -77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202 -42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2 -79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179 -08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101 -EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A -A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171 -0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC -50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16 -D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938 -A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B -A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476 -63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444 -5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E -4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598 -54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62 -3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C -1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC -1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269 -743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA -94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD -02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F -03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5 -403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006 -54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63 -8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67 -5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108 -DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C -2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB -197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4 -6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918 -0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C -F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D -05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC -E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E -4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC -7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717 -80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9 -4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158 -8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62 -0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF -540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6 -A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957 -270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911 -F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E -4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D -41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967 -6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654 -BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B -7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C -52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB -4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97 -146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B -D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD -52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559 -187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616 -F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174 -CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963 -4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D -0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5 -4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE -A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070 -169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72 -6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092 -402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C -EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B -77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0 -02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9 -73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421 -B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4 -D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806 -E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70 -BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A -79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7 -787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8 -88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F -F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52 -6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D -6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB -C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744 -1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296 -75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391 -26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A -0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379 -928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4 -77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806 -4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E -9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70 -89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E -E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17 -01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506 -FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735 -2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B -3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D -6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C -2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928 -C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA -35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67 -F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F -CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6 -4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714 -54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228 -603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB -2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9 -F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2 -106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC -32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA -60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431 -F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892 -370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950 -78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D -CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE -F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A -75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847 -C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A -41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1 -5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9 -5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441 -DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1 -639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A -3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464 -81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463 -DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6 -DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB -02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84 -E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54 -0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824 -16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D -F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320 -79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0 -F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF -74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8 -5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD -AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02 -DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E -7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC -0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119 -32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438 -DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97 -6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A -4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7 -A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA -ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693 -CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA -683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853 -BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3 -8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499 -907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D -403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49 -A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9 -4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C -EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2 -0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF -885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A -4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC -8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E -0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9 -8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF -E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC -2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09 -5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731 -28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1 -1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA -BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367 -4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD -E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956 -507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13 -24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35 -8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D -8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339 -E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE -0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D -25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1 -10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888 -4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2 -2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678 -9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55 -43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91 -3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E -EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E -D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B -B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2 -86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2 -376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB -76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A -5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490 -D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684 -8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842 -9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839 -0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688 -1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8 -D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674 -F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A -96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D -31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD -63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81 -0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF -DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88 -30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7 -835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E -115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A -9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C -80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63 -6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210 -C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE -CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED -8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37 -CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA -71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209 -8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA -BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E -722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C -4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC -52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2 -802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88 -A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE -43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2 -BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382 -5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3 -F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E -1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821 -4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E -34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44 -400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408 -999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E -8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436 -BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497 -5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09 -6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814 -E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F -D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8 -F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C -E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725 -EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB -009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9 -4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5 -5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5 -86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988 -A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847 -EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E -3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10 -324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E -FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495 -0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E -ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12 -8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD -4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF -CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D -DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD -B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD -D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8 -FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E -B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA -E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551 -98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9 -FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C -D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40 -19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C -2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0 -DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0 -ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B -2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C -4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C -BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C -46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E -690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A -BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399 -270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4 -9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268 -10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65 -95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3 -AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0 -9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B -D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754 -94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1 -67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8 -BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E -07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94 -D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4 -1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4 -95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA -91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D -30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE -C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B -3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7 -AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273 -38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F -9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1 -B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65 -89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B -163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2 -56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B -186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE -19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C -4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5 -03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28 -B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24 -4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34 -8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3 -71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1 -EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5 -083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31 -D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200 -458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0 -11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1 -0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C -397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560 -A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82 -0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591 -EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4 -4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C -1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033 -109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213 -18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2 -C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3 -47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605 -8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB -7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754 -E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D -AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D -5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89 -7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E -AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604 -388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C -540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2 -3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D -E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40 -61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA -73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921 -9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127 -4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A -4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6 -F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1 -BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0 -39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910 -B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314 -54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A -EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734 -EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079 -CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE -718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C -D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA -9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A -53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E -A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7 -7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237 -CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55 -311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357 -F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B -E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643 -15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C -001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0 -0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D -CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55 -AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A -ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E -77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252 -346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD -12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF -2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A -C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427 -AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B -61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0 -BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C -484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82 -94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2 -E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827 -A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE -5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12 -66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2 -B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72 -E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E -168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF -BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999 -4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA -252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B -87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C -0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074 -EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135 -ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912 -999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4 -C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA -4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152 -692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014 -69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F -F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840 -301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624 -B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E -86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1 -1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED -70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D -B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37 -5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803 -35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651 -C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A -D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A -C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528 -4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154 -02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492 -83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C -BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65 -64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738 -9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60 -7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694 -45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F -C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB -55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766 -2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1 -7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419 -5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB -1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E -17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3 -5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217 -F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A -9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120 -2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8 -ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8 -0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1 -1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006 -F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0 -000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9 -9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789 -ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B -02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963 -189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE -EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2 -C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268 -6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C -390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2 -922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8 -D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86 -70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962 -F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB -268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886 -B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9 -6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07 -A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649 -B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663 -AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F -A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA -0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816 -495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7 -E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA -D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE -B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C -0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C -7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B -6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86 -EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6 -08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6 -6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC -1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2 -E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D -3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C -122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2 -F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6 -154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954 -9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182 -B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8 -9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1 -85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47 -B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46 -E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED -839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A -9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5 -E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4 -FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D -D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A -1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278 -AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA -239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062 -3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02 -F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD -7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405 -77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA -BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C -80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09 -9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E -DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9 -703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D -F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F -6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76 -CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6 -EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A -B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306 -23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7 -3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB -01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E -93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80 -3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C -4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB -0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF -AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C -05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396 -06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB -87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA -A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69 -50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03 -AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024 -FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18 -C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777 -3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA -F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E -59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D -A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C -4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677 -206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071 -5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A -4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89 -18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6 -7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096 -84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5 -6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9 -C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9 -684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3 -70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297 -040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345 -7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37 -F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C -1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD -F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA -E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3 -3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8 -580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1 -D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6 -645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3 -7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905 -3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60 -670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0 -BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F -2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381 -1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB -CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5 -E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB -669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C -0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF -6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F -67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2 -5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657 -C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451 -CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6 -CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25 -B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C -76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1 -A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB -5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A -6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5 -AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3 -37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2 -631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639 -567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28 -47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6 -4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD -585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB -39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0 -D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF -4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F -C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B -1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2 -2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206 -CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568 -75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88 -114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B -F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338 -6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63 -9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77 -6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B -D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0 -BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49 -E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E -DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A -7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284 -89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4 -8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46 -BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8 -34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A -3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30 -43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A -D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5 -43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD -BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2 -9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7 -31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3 -5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9 -8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97 -E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1 -1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D -082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E -BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9 -3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0 -FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77 -312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2 -74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5 -B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4 -CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9 -BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1 -4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5 -9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33 -92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B -09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B -8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802 -7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0 -5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83 -4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547 -71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC -01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464 -76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76 -41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD -7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD -C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926 -E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7 -8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC -F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43 -29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5 -243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2 -1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75 -F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC -102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36 -45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20 -352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D -17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6 -6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D -EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7 -50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC -3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0 -011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5 -FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A -7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A -3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF -7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18 -218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6 -0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC -112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB -80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65 -05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5 -A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F -5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A -289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2 -F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315 -A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D -75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244 -C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B -C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B -479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8 -0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD -3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45 -1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401 -CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338 -D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A -AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1 -BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0 -DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37 -178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF -77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F -8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A -27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808 -488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D -A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D -321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A -7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB -F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE -922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526 -75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB -09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2 -BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB -B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373 -6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379 -59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62 -8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9 -21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30 -026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022 -C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E -E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF -44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1 -8A31BE4E82B384 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont -220 265 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<636F706965292E> -show -295 383 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 383 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -671 383 moveto -<6475> -show -763 383 moveto -<66696368696572> -show -934 383 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553482F534D4553485F4879706F746865736973466163 -746F72792E637878> -show -370 443 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -479 443 moveto -<72616A6F75746572> -show -653 443 moveto -<6C6573> -show -726 443 moveto -<6E6F7576656C6C6573> -show -935 443 moveto -<6879706F7468E8736573> -show -1175 443 moveto -<636F6E6365726E616E74> -show -1411 443 moveto -<6C65> -show -1466 443 moveto -<63686F6978> -show -1595 443 moveto -<6475> -show -1662 443 moveto -<6D61696C6C657572> -show -1846 443 moveto -<74E974726168E9647269717565> -show -370 499 moveto -<6465204E657467656E206574206465206C61207461696C6C652064657320E96CE96D656E747320 -766F6C756D69717565732E> -show -294 601 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<23696E636C75646520> -show -520 601 moveto -<94534D4553485F4D6178456C656D656E74566F6C756D652E68787894> -show -294 645 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 689 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 733 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 776 moveto -<23696E636C7564652094534D4553485F4E455447454E5F332E68787894> -show -294 820 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 864 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 908 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 952 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<63726561746F724D61705B944D6178456C656D656E74566F6C756D65945D203D> -show -294 996 moveto -<20202020202020206E657720534D4553485F> -show -747 996 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4879706F74686573697343726561746F72> -show -1175 996 moveto -<3C534D4553485F4D6178456C656D656E74566F6C756D653E3B> -show -294 1040 moveto -<2020202020202020202020202020202020> -show -722 1040 moveto -<2E20202020202020202020202020202020202020202020202020202020202020202020202E> -show -294 1084 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1128 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1172 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<63726561746F724D61705B944E455447454E5F3344945D203D206E657720534D4553485F> -show -1201 1172 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4879706F74686573697343726561746F72> -show -1629 1172 moveto -<3C534D4553485F4E455447454E5F33443E3B> -show -295 1289 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1289 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E2064752066696368696572> -show -370 1349 moveto -<20> -show -382 1349 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553485F492F534D4553485F4879706F74686573697346 -6163746F72795F692E6378782C> -show -1651 1349 moveto -0 0 0 setrgbcolor -<20E971756976616C656E7420434F524241206465> -show -370 1405 moveto -<6C61206D6F64696669636174696F6E207072E963E964656E7465> -show -906 1405 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2E> -show -294 1507 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<23696E636C7564652094534D4553485F4D6178456C656D656E74566F6C756D655F692E68787894> -show -294 1551 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1595 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1639 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1683 moveto -<23696E636C7564652094534D4553485F4E455447454E5F335F692E68787894> -show -294 1726 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1770 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1814 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1858 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<63726561746F724D61705B944D6178456C656D656E74566F6C756D65945D203D> -show -294 1902 moveto -<20202020202020206E657720534D4553485F> -show -747 1902 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4879706F74686573697343726561746F725F69> -show -1225 1902 moveto -<3C534D4553485F4D6178456C656D656E74566F6C756D655F693E3B> -show -294 1946 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1990 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2034 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2078 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<63726561746F724D61705B944E455447454E5F3344945D203D> -show -294 2122 moveto -<20202020202020206E657720534D4553485F> -show -747 2122 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4879706F74686573697343726561746F725F69> -show -1225 2122 moveto -<3C534D4553485F4E455447454E5F33445F693E3B> -show -295 2239 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 2239 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -651 2239 moveto -<6475> -show -723 2239 moveto -<66696368696572> -show -874 2239 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553484755492F534D4553484755492E637878> -show -1843 2239 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1955 2239 moveto -<72616A6F75746572> -show -370 2299 moveto -<6C6573> -show -443 2299 moveto -<6E6F7576656C6C6573> -show -653 2299 moveto -<6879706F7468E8736573> -show -892 2299 moveto -<636F6E6365726E616E74> -show -1129 2299 moveto -<6C65> -show -1183 2299 moveto -<63686F6978> -show -1311 2299 moveto -<6475> -show -1380 2299 moveto -<6D61696C6C657572> -show -1564 2299 moveto -<74E974726168E9647269717565> -show -1845 2299 moveto -<6465> -show -1910 2299 moveto -<4E657467656E> -show -2073 2299 moveto -<6574> -show -370 2355 moveto -<6465206C61207461696C6C652064657320E96CE96D656E747320766F6C756D6971756573206461 -6E73206C612047554920646520534D4553482E> -show -294 2457 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<656C736520696620282054797065416C676F2E636F6D7061726528944E455447454E5F33449420 -3D3D203029> -show -294 2501 moveto -<2020487970203D206D79436F6D706F6E656E744D6573682D> -show -898 2501 moveto -<3E4372656174654879706F74686573697328> -show -1351 2501 moveto -<54797065416C676F2C206D795374756479496420293B> -show -294 2545 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2589 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2633 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2676 moveto -<20202020202020202020202020202020202020202020202020202020202074722894534D455348 -5F4D41585F454C454D454E545F564F4C554D455F4859504F54484553495394292C> -show -294 2720 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2764 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2808 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2852 moveto -<2020627265616B3B> -show -294 2896 moveto -<20207D> -show -294 2940 moveto -<6361736520353032313A> -show -294 2984 moveto -<20207B> -show -294 3028 moveto -<2020736D6573684755492D> -show -571 3028 moveto -<3E437265617465416C676F726974686D28> -show -999 3028 moveto -<944E455447454E5F3344942C94546574726168656472616C20284E657467656E2994> -show -1855 3028 moveto -<293B> -show -280 567 1 616 rectfill -2125 567 1 616 rectfill -280 567 1846 1 rectfill -280 1182 1846 1 rectfill -280 1473 1 660 rectfill -2125 1473 1 660 rectfill -280 1473 1846 1 rectfill -280 2132 1846 1 rectfill -280 2423 1 616 rectfill -2125 2423 1 616 rectfill -280 2423 1846 1 rectfill -280 3038 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 4 4 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -%%BeginResource: font NimbusMonL-ReguObli -%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular Oblique) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle -12.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-ReguObli def -/PaintType 0 def -/WMode 0 def -/FontBBox {-61 -237 774 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020947 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1 -94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211 -9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB -B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466 -AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1 -25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A -C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC -45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246 -D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566 -9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A -E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698 -53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736 -05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66 -5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341 -6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF -4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2 -4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482 -9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D -FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4 -DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3 -CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D -B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28 -7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A -1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68 -1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A -8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4 -16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365 -F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12 -41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22 -5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D -BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080 -65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827 -C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45 -EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559 -872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103 -AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF -8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E -1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A -7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A -DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610 -38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356 -A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F -67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5 -492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1 -5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD -A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551 -D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3 -C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252 -CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097 -60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A -F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA -37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8 -F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E -18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0 -9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118 -73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0 -837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D -9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E -9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC -85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3 -AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F -719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1 -496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88 -EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C -6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7 -37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB -F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C -D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2 -63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15 -565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE -18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E -2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841 -55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44 -58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551 -837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3 -0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE -9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C -155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8 -BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16 -8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879 -1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C -4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA -492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3 -155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704 -1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3 -5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0 -5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC -CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0 -BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E -DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311 -98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E -DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6 -F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C -93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504 -78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9 -F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F -9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4 -3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2 -52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A -A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0 -F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB -1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F -2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8 -D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD -879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319 -1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD -BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122 -007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C -5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F -013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D -BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA -6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338 -670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C -0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13 -C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172 -6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807 -91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600 -8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F -8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D -AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94 -202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E -DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68 -85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315 -70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF -80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581 -217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12 -E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA -9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519 -1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5 -3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED -B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4 -FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC -797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D -2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7 -E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364 -A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71 -8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C -BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0 -9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1 -3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B -E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75 -BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428 -4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B -69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6 -D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8 -FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387 -7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4 -A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF -51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A -DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515 -D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A -FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0 -5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A -96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB -92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF -37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812 -3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726 -62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3 -D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550 -7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752 -4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734 -B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363 -141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303 -86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83 -9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726 -B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B -737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43 -46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7 -0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9 -A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744 -69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8 -222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6 -855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF -F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1 -6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A -8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453 -3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6 -67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A -AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C -30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4 -29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04 -26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1 -3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B -667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177 -D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17 -070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180 -7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8 -C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D -E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD -E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51 -C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E -EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA -11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385 -1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C -FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8 -96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C -0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C -6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120 -835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C -5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC -7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A -78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21 -6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8 -2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099 -9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE -C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0 -DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054 -16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B -D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3 -984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA -B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33 -7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219 -1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26 -DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66 -1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA -4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27 -94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350 -45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915 -E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36 -6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5 -F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538 -B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2 -3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705 -796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8 -40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494 -44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5 -C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59 -6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14 -AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130 -6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68 -6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952 -35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7 -08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217 -4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218 -52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95 -41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C -77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8 -65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB -73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81 -234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F -982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9 -184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885 -A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD -0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34 -7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2 -E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC -AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB -8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09 -1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF -EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED -8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F -A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F -87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B -33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7 -B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559 -2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C -6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC -56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED -884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262 -348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1 -106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B -13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07 -E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30 -41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687 -F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604 -3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1 -467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95 -993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F -7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083 -4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3 -41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941 -2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F -BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F -486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8 -249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325 -D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D -4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4 -AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E -1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D -13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367 -DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020 -749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C -5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39 -0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1 -71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D -FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6 -F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4 -D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2 -182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137 -33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE -48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1 -5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA -5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C -4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173 -A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731 -5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938 -731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C -15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3 -D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E -E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7 -97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC -7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369 -DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171 -CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878 -B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343 -1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4 -7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A -FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93 -12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E -31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28 -8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35 -FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA -AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F -970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1 -837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080 -02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29 -3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E -57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5 -8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765 -EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB -43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE -5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F -7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C -39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2 -A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2 -56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158 -C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951 -23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34 -37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE -BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9 -2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9 -BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594 -6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6 -5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE -CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D -3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65 -77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B -DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7 -63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB -EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69 -B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB -438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D -7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245 -4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B -F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1 -8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2 -F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C -C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B -47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326 -6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1 -564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692 -C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24 -870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81 -1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211 -D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601 -196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0 -CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53 -41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4 -5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47 -B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD -B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947 -1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D -DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6 -A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED -5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3 -E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA -649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B -220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729 -E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7 -5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524 -4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01 -486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195 -CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2 -1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14 -50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6 -B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25 -B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F -58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7 -77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202 -42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2 -79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179 -08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101 -EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A -A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171 -0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC -50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16 -D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938 -A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B -A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476 -63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444 -5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E -4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598 -54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62 -3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C -1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC -1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269 -743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA -94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD -02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F -03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5 -403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006 -54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63 -8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67 -5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108 -DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C -2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB -197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4 -6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918 -0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C -F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D -05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC -E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E -4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC -7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717 -80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9 -4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158 -8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62 -0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF -540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6 -A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957 -270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911 -F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E -4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D -41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967 -6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654 -BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B -7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C -52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB -4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97 -146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B -D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD -52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559 -187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616 -F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174 -CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963 -4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D -0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5 -4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE -A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070 -169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72 -6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092 -402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C -EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B -77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0 -02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9 -73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421 -B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4 -D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806 -E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70 -BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A -79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7 -787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8 -88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F -F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52 -6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D -6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB -C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744 -1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296 -75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391 -26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A -0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379 -928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4 -77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806 -4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E -9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70 -89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E -E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17 -01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506 -FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735 -2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B -3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D -6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C -2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928 -C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA -35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67 -F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F -CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6 -4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714 -54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228 -603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB -2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9 -F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2 -106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC -32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA -60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431 -F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892 -370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950 -78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D -CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE -F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A -75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847 -C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A -41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1 -5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9 -5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441 -DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1 -639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A -3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464 -81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463 -DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6 -DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB -02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84 -E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54 -0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824 -16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D -F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320 -79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0 -F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF -74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8 -5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD -AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02 -DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E -7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC -0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119 -32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438 -DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97 -6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A -4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7 -A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA -ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693 -CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA -683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853 -BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3 -8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499 -907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D -403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49 -A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9 -4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C -EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2 -0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF -885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A -4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC -8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E -0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9 -8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF -E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC -2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09 -5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731 -28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1 -1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA -BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367 -4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD -E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956 -507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13 -24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35 -8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D -8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339 -E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE -0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D -25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1 -10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888 -4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2 -2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678 -9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55 -43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91 -3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E -EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E -D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B -B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2 -86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2 -376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB -76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A -5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490 -D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684 -8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842 -9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839 -0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688 -1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8 -D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674 -F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A -96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D -31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD -63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81 -0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF -DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88 -30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7 -835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E -115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A -9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C -80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63 -6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210 -C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE -CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED -8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37 -CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA -71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209 -8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA -BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E -722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C -4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC -52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2 -802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88 -A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE -43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2 -BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382 -5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3 -F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E -1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821 -4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E -34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44 -400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408 -999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E -8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436 -BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497 -5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09 -6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814 -E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F -D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8 -F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C -E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725 -EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB -009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9 -4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5 -5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5 -86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988 -A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847 -EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E -3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10 -324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E -FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495 -0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E -ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12 -8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD -4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF -CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D -DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD -B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD -D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8 -FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E -B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA -E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551 -98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9 -FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C -D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40 -19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C -2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0 -DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0 -ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B -2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C -4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C -BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C -46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E -690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A -BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399 -270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4 -9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268 -10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65 -95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3 -AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0 -9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B -D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754 -94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1 -67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8 -BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E -07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94 -D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4 -1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4 -95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA -91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D -30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE -C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B -3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7 -AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273 -38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F -9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1 -B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65 -89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B -163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2 -56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B -186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE -19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C -4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5 -03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28 -B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24 -4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34 -8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3 -71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1 -EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5 -083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31 -D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200 -458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0 -11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1 -0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C -397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560 -A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82 -0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591 -EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4 -4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C -1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033 -109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213 -18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2 -C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3 -47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605 -8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB -7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754 -E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D -AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D -5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89 -7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E -AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604 -388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C -540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2 -3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D -E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40 -61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA -73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921 -9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127 -4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A -4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6 -F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1 -BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0 -39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910 -B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314 -54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A -EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734 -EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079 -CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE -718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C -D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA -9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A -53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E -A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7 -7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237 -CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55 -311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357 -F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B -E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643 -15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C -001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0 -0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D -CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55 -AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A -ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E -77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252 -346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD -12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF -2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A -C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427 -AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B -61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0 -BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C -484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82 -94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2 -E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827 -A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE -5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12 -66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2 -B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72 -E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E -168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF -BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999 -4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA -252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B -87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C -0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074 -EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135 -ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912 -999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4 -C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA -4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152 -692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014 -69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F -F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840 -301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624 -B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E -86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1 -1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED -70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D -B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37 -5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803 -35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651 -C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A -D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A -C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528 -4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154 -02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492 -83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C -BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65 -64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738 -9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60 -7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694 -45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F -C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB -55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766 -2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1 -7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419 -5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB -1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E -17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3 -5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217 -F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A -9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120 -2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8 -ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8 -0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1 -1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006 -F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0 -000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9 -9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789 -ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B -02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963 -189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE -EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2 -C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268 -6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C -390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2 -922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8 -D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86 -70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962 -F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB -268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886 -B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9 -6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07 -A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649 -B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663 -AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F -A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA -0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816 -495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7 -E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA -D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE -B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C -0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C -7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B -6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86 -EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6 -08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6 -6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC -1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2 -E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D -3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C -122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2 -F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6 -154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954 -9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182 -B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8 -9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1 -85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47 -B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46 -E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED -839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A -9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5 -E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4 -FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D -D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A -1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278 -AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA -239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062 -3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02 -F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD -7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405 -77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA -BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C -80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09 -9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E -DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9 -703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D -F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F -6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76 -CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6 -EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A -B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306 -23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7 -3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB -01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E -93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80 -3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C -4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB -0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF -AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C -05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396 -06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB -87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA -A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69 -50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03 -AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024 -FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18 -C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777 -3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA -F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E -59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D -A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C -4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677 -206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071 -5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A -4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89 -18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6 -7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096 -84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5 -6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9 -C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9 -684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3 -70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297 -040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345 -7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37 -F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C -1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD -F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA -E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3 -3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8 -580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1 -D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6 -645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3 -7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905 -3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60 -670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0 -BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F -2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381 -1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB -CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5 -E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB -669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C -0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF -6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F -67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2 -5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657 -C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451 -CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6 -CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25 -B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C -76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1 -A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB -5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A -6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5 -AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3 -37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2 -631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639 -567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28 -47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6 -4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD -585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB -39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0 -D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF -4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F -C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B -1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2 -2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206 -CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568 -75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88 -114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B -F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338 -6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63 -9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77 -6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B -D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0 -BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49 -E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E -DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A -7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284 -89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4 -8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46 -BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8 -34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A -3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30 -43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A -D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5 -43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD -BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2 -9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7 -31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3 -5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9 -8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97 -E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1 -1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D -082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E -BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9 -3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0 -FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77 -312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2 -74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5 -B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4 -CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9 -BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1 -4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5 -9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33 -92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B -09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B -8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802 -7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0 -5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83 -4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547 -71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC -01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464 -76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76 -41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD -7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD -C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926 -E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7 -8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC -F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43 -29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5 -243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2 -1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75 -F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC -102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36 -45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20 -352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D -17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6 -6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D -EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7 -50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC -3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0 -011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5 -FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A -7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A -3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF -7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18 -218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6 -0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC -112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB -80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65 -05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5 -A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F -5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A -289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2 -F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315 -A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D -75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244 -C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B -C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B -479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8 -0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD -3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45 -1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401 -CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338 -D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A -AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1 -BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0 -DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37 -178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF -77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F -8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A -27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808 -488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D -A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D -321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A -7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB -F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE -922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526 -75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB -09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2 -BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB -B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373 -6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379 -59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62 -8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9 -21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30 -026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022 -C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E -E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF -44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1 -8A31BE4E82B384 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont -295 271 moveto -0 0 0 setrgbcolor -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -659 271 moveto -<6475> -show -738 271 moveto -<66696368696572> -show -897 271 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553485F492F534D4553485F47656E5F692E6378782C> -show -1898 271 moveto -0 0 0 setrgbcolor - -show -370 331 moveto -<434F52424120> -show -543 331 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572206C652067E96EE97261746575722E> -show -294 433 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<23696E636C7564652094534D4553485F4D6178456C656D656E74566F6C756D655F692E68787894> -show -294 476 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 520 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 564 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 608 moveto -<202020202020646F75626C65206C656E6774682C6D6178456C656D656E7473417265612C6D6178 -456C656D656E7473566F6C756D653B> -show -294 652 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 696 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 740 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 784 moveto -<2020202020202020656C73652069662028737472636D70286D794879702D> -show -1050 784 moveto -<3E4765744E616D652C> -show -1276 784 moveto -<944D6178456C656D656E74566F6C756D659429203D3D203029207B> -show -294 828 moveto -<20202020202020202020534D4553483A3A534D4553485F4D6178456C656D656E74566F6C756D65 -5F766172204D4556203D> -show -294 872 moveto -<202020202020202020202020202020202020534D4553483A3A534D4553485F4D6178456C656D65 -6E74566F6C756D653A3A5F6E6172726F7728206D7948797020293B> -show -294 916 moveto -<202020202020202020206D6178456C656D656E74566F6C756D65203D204D45562D> -show -1125 916 moveto -<3E4765744D6178456C656D656E74566F6C756D6528293B> -show -294 960 moveto -<20202020202020202020667072696E7466286465737446696C652C> -show -974 960 moveto -<9425665C6E942C6D6178456C656D656E74566F6C756D65> -show -1553 960 moveto -<293B> -show -294 1004 moveto -<20202020202020207D> -show -294 1048 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1092 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1136 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1180 moveto -<202020202020646F75626C65206C656E6774682C6D6178456C656D656E7473417265612C6D6178 -456C656D656E7473566F6C756D653B> -show -294 1224 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1268 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1312 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1356 moveto -<2020202020202020202020656C73652069662028737472636D7028614C696E65> -show -1100 1356 moveto -<2C> -show -1125 1356 moveto -<944D6178456C656D656E74566F6C756D659429203D3D203029207B> -show -294 1400 moveto -<2020202020202020534D4553483A3A534D4553485F4879706F7468657369735F766172206D7948 -7970203D> -show -294 1444 moveto -<2020202020202020202020202020202020746869732D> -show -848 1444 moveto -<3E4372656174654879706F74686573697328614C696E652C73747564794964293B> -show -294 1488 moveto -<2020202020202020534D4553483A3A534D4553485F4D6178456C656D656E74566F6C756D655F76 -6172204D4556203D> -show -294 1531 moveto -<202020202020202020202020202020202020534D4553483A3A534D4553485F4D6178456C656D65 -6E74566F6C756D653A3A5F6E6172726F7728206D7948797020293B> -show -294 1575 moveto -<2020202020202020667363616E66286C6F616446696C652C942573942C614C696E65293B> -show -294 1619 moveto -<20202020202020206D6178456C656D656E74566F6C756D65203D2061746F6628614C696E65293B> -show -294 1663 moveto -<20202020202020204D45562D> -show -596 1663 moveto -<3E5365744D6178456C656D656E74566F6C756D6528> -show -1125 1663 moveto -<6D6178456C656D656E74566F6C756D65> -show -1528 1663 moveto -<293B> -show -294 1707 moveto -<2020202020202020737472696E6720696F72537472696E67203D20> -show -974 1707 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<6F7262> -show -1049 1707 moveto -<2D> -show -1074 1707 moveto -<3E6F626A656374> -show -1250 1707 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<746F5F737472696E67284D4556293B> -show -294 1751 moveto -<2020202020202020737072696E7466286F626A65637449642C> -show -924 1751 moveto -<942564942C4D45562D> -show -1150 1751 moveto -<3E47657449642829293B> -show -294 1795 moveto -<2020202020202020534D455348436F7262614F626A5B737472696E6728> -show -1024 1795 moveto -<944879706F5F94> -show -1200 1795 moveto -<292B737472696E67286F626A6563744964295D203D20696F72537472696E673B> -show -294 1839 moveto -<2020202020202020> -show -495 1839 moveto -<7D> -show -295 1956 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1956 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E20646573206669636869657273> -show -370 2015 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F575F534D44 -535F4D6573682E63787820> -show -1672 2015 moveto -0 0 0 setrgbcolor -<6574> -show -370 2070 moveto -1 0 0 setrgbcolor -<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F575F534D45 -534844535F4D6573682E63787820> -show -1764 2070 moveto -0 0 0 setrgbcolor -<706F7572206C27E96372697475726520E0> -show -370 2125 moveto -<74726176657273> -show -551 2125 moveto -<6C65> -show -627 2125 moveto -<647269766572> -show -789 2125 moveto -<4D4544> -show -937 2125 moveto -<64616E73> -show -1072 2125 moveto -<6C61> -show -1150 2125 moveto -<737472756374757265> -show -1370 2125 moveto -<6465> -show -1458 2125 moveto -<646F6E6EE965> -show -1642 2125 moveto -<534D4453> -show -1809 2125 moveto -<6574> -show -1885 2125 moveto -<534D4553484453> -show -370 2180 moveto -<726573706563746976656D656E742028636573207374727563747572657320736F6E7420696E74 -65726E6573206175206D6F64756C6520534D455348292E> -show -294 2282 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<202020202020636173652034> -show -596 2282 moveto -<20> -show -621 2282 moveto -<3A> -show -294 2326 moveto -<2020202020202020656C656D5F49645B375D2E707573685F6261636B28656C656D2D> -show -1150 2326 moveto -<3E47657449442829293B> -show -294 2370 moveto -<20202020202020206E6D61696C6C65735B375D2B2B3B> -show -294 2414 moveto -<2020202020202020627265616B3B> -show -294 2458 moveto -<2020202020207D> -show -295 2575 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 2575 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E2064752066696368696572> -show -370 2634 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F525F534D44 -535F4D6573682E637878> -show -1712 2634 moveto -0 0 0 setrgbcolor -<706F7572> -show -1838 2634 moveto -<6C61> -show -1909 2634 moveto -<6C656374757265> -show -2080 2634 moveto - -show -370 2689 moveto -<74726176657273206C6520647269766572204D454420737572206C612073747275637475726520 -646520646F6E6EE965206475206D61696C6C61676520534D44532E> -show -280 399 1 1451 rectfill -2125 399 1 1451 rectfill -280 399 1846 1 rectfill -280 1849 1846 1 rectfill -280 2248 1 220 rectfill -2125 2248 1 220 rectfill -280 2248 1846 1 rectfill -280 2467 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 5 5 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -294 254 moveto -0 0 0 setrgbcolor -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<202020202020> -show -445 254 moveto -<63617365204D45445F544554524134> -show -823 254 moveto -<20> -show -848 254 moveto -<3A207B> -show -294 298 moveto -<202020202020202069662028696E75656C6529207B> -show -294 342 moveto -<20202020202020202020666F7220286A3D303B6A> -show -798 342 moveto -<3C6E6D61696C6C65735B695D3B6A2B2B29207B> -show -294 386 moveto -<202020202020202020202020656C656D5F69643D2A286E756D656C652B6A293B> -show -294 430 moveto -<2020202020202020202020206F6B203D206D794D657368> -show -873 430 moveto -<2D> -show -898 430 moveto -<3E416464566F6C756D65576974684944282A28636F6E6E65637469766974652B6A2A287461696C -6C6529292C> -show -294 474 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B31292C> -show -294 518 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B32292C> -show -294 562 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B33292C> -show -294 606 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -2020656C656D5F6964293B> -show -294 650 moveto -<202020202020202020207D> -show -294 694 moveto -<2020202020202020> -show -495 694 moveto -<7D> -show -294 738 moveto -<2020202020202020656C7365207B> -show -294 782 moveto -<20202020202020202020666F7220286A3D303B6A> -show -798 782 moveto -<3C6E6D61696C6C65735B695D3B6A2B2B29207B> -show -294 826 moveto -<202020202020202020202020> -show -596 826 moveto -<636D70743B> -show -294 870 moveto -<202020202020202020202020> -show -596 870 moveto -<6F6B203D206D794D657368> -show -874 870 moveto -<2D> -show -899 870 moveto -<3E416464566F6C756D65576974684944282A28636F6E6E65637469766974652B6A2A287461696C -6C6529292C> -show -294 914 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -2020> -show -1327 914 moveto -<2A28636F6E6E65637469766974652B6A2A287461696C6C65292B31292C> -show -294 958 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B32292C> -show -294 1002 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B33292C> -show -294 1046 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -2020636D7074293B> -show -294 1090 moveto -<20202020202020207D> -show -294 1134 moveto -<2020202020202020627265616B3B> -show -294 1178 moveto -<2020202020207D> -show -220 1289 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -507 1289 moveto -<6475> -show -583 1289 moveto -<66696368696572> -show -740 1289 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F525F534D45 -534844535F4D6573682E637878> -show -220 1344 moveto -0 0 0 setrgbcolor -<706F7572206C61206C65637475726520E02074726176657273206C6520647269766572204D4544 -20737572206C612073747275637475726520646520646F6E6EE965206475206D61696C6C61676520 -534D45534844532E> -show -294 1445 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<202020202020> -show -445 1445 moveto -<63617365204D45445F544554524134> -show -823 1445 moveto -<20> -show -848 1445 moveto -<3A207B> -show -294 1489 moveto -<202020202020202069662028696E75656C6529207B> -show -294 1533 moveto -<20202020202020202020666F7220286A3D303B6A> -show -798 1533 moveto -<3C6E6D61696C6C65735B695D3B6A2B2B29207B> -show -294 1577 moveto -<202020202020202020202020> -show -596 1577 moveto -<656C656D5F69643D2A286E756D656C652B6A293B> -show -294 1621 moveto -<2020202020202020202020206F6B203D206D79534D45534844534D657368> -show -1050 1621 moveto -<2D> -show -1075 1621 moveto -<3E416464566F6C756D6557697468494428> -show -294 1665 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C652D6E73757029292C> -show -294 1709 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C652D6E737570292B31292C> -show -294 1753 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C652D6E737570292B32292C> -show -294 1797 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C652D6E737570292B33292C> -show -294 1841 moveto -<2020202020202020202020202020202020202020202020202020202020202020> -show -1100 1841 moveto -<656C656D5F6964293B> -show -294 1885 moveto -<202020202020202020207D> -show -294 1929 moveto -<20202020202020207D> -show -294 1973 moveto -<2020202020202020656C7365207B> -show -294 2016 moveto -<20202020202020202020666F7220286A3D303B6A> -show -798 2016 moveto -<3C6E6D61696C6C65735B695D3B6A2B2B29207B> -show -294 2060 moveto -<202020202020202020202020636D70743B> -show -294 2104 moveto -<2020202020202020202020206F6B203D206D79534D45534844534D657368> -show -1050 2104 moveto -<2D> -show -1075 2104 moveto -<3E416464566F6C756D6557697468494428> -show -294 2148 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C6529292C> -show -294 2192 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C65292B31292C> -show -294 2236 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C65292B32292C> -show -294 2280 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C65292B33292C> -show -294 2324 moveto -<2020202020202020202020202020202020202020202020202020202020202020636D7074293B> -show -294 2368 moveto -<20202020202020207D> -show -294 2412 moveto -<2020202020202020627265616B3B> -show -294 2456 moveto -<2020202020207D> -show -295 2573 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 2573 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -656 2573 moveto -<6475> -show -733 2573 moveto -<66696368696572> -show -889 2573 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F535243> -show -1161 2573 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1174 2573 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<737263> -show -1235 2573 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1248 2573 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F53574947> -show -1550 2573 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1563 2573 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E2C> -show -1826 2573 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1943 2573 moveto -<6578706F72746572> -show -370 2633 moveto -<6C6573> -show -465 2633 moveto -<73637269707473> -show -635 2633 moveto -<707974686F6E> -show -813 2633 moveto -<6465> -show -900 2633 moveto -<7465737465> -show -1031 2633 moveto -<6475> -show -1119 2633 moveto -<6D61696C6C657572> -show -1326 2633 moveto -<74E974726168E9647269717565> -show -1589 2633 moveto -<20> -show -1601 2633 moveto -<3A> -show -1654 2633 moveto -<534D4553485F626F785F74657472612E70792C> -show -370 2689 moveto -<534D4553485F626F78325F74657472612E70792C20534D4553485F626F78335F74657472612E70 -792C20534D4553485F6D656368616E69635F74657472612E70792C> -show -370 2745 moveto -<534D4553485F6669786174696F6E5F74657472612E7079> -show -912 2745 moveto -<6574> -show -966 2745 moveto -<534D4553485F506172746974696F6E315F74657472612E70792E> -show -1581 2745 moveto -<534D4553485F6669786174696F6E5F686578612E7079> -show -370 2801 moveto -<657374> -show -468 2801 moveto -<756E> -show -560 2801 moveto -<6175747265> -show -703 2801 moveto -<736372697074> -show -856 2801 moveto -<707974686F6E> -show -1038 2801 moveto -<6465> -show -1127 2801 moveto -<7465737465> -show -1261 2801 moveto -<6475> -show -1354 2801 moveto -<6D61696C6C657572> -show -1563 2801 moveto -<6865786168E9647269717565> -show -1875 2801 moveto -<74616E646973> -show -2037 2801 moveto -<717565> -show -370 2858 moveto -<534D4553485F666C696768745F736B696E2E7079> -show -859 2858 moveto -<657374> -show -933 2858 moveto -<756E> -show -1001 2858 moveto -<6175747265> -show -1120 2858 moveto -<736372697074> -show -1249 2858 moveto -<707974686F6E> -show -1406 2858 moveto -<6465> -show -1472 2858 moveto -<7465737465> -show -1582 2858 moveto -<6475> -show -1650 2858 moveto -<6D61696C6C657572> -show -1835 2858 moveto -<73757266616369717565> -show -2061 2858 moveto -<656E> -show -370 2914 moveto -<747269616E676C65> -show -621 2914 moveto -<7574696C6973616E74> -show -880 2914 moveto -<4D45464953544F5F3244> -show -1279 2914 moveto -<61766563> -show -1469 2914 moveto -<6C276879706F7468E87365> -show -1792 2914 moveto -<6465> -show -1938 2914 moveto -<6D61696C6C616765> -show -370 2970 moveto -<534D4553485F4C656E67746846726F6D45646765732E> -show -1028 2970 moveto -<4427617574726573> -show -1275 2970 moveto -<6669636869657273> -show -1508 2970 moveto -<6465> -show -1637 2970 moveto -<7465737465> -show -1811 2970 moveto -<736F6E74> -show -1977 2970 moveto -<7072E9767573> -show -370 3026 moveto -<534D4553485F506172746974696F6E5B322C332C342C355D2E7079> -show -1000 3026 moveto -<6D616973> -show -1110 3026 moveto -<636575782D6369> -show -1273 3026 moveto -<6EE9636573736974656E74> -show -1509 3026 moveto -<756E> -show -1576 3026 moveto -<616A757374656D656E74> -show -1809 3026 moveto -<646573> -show -1891 3026 moveto -<706172616DE874726573> -show -370 3082 moveto -<6465206D61696C6C6167652E> -show -280 221 1 967 rectfill -2125 221 1 967 rectfill -280 221 1846 1 rectfill -280 1187 1846 1 rectfill -280 1411 1 1056 rectfill -2125 1411 1 1056 rectfill -280 1411 1846 1 rectfill -280 2466 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 6 6 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -294 310 moveto -0 0 0 setrgbcolor -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4558504F52545F505953435249505453202B3D20534D4553485F6669786174696F6E5F68657861 -2E70792C20534D4553485F666C696768745F736B696E2E7079> -show -294 398 moveto -<69666571202840574954484E455447454E402C79657329> -show -294 442 moveto -<20204558504F52545F505953435249505453202B3D20534D4553485F626F785F74657472612E70 -792C20534D4553485F626F78325F74657472612E70792C205C202020> -show -294 486 moveto -<20202020202020202020202020202020202020202020534D4553485F626F78335F74657472612E -70792C20534D4553485F6669786174696F6E5F74657472612E70792C205C> -show -294 530 moveto -<20202020202020202020202020202020202020202020534D4553485F506172746974696F6E315F -74657472612E7079> -show -294 574 moveto -<656E646966> -show -295 691 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 691 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<46696E616C656D656E74> -show -595 691 moveto -<20> -show -607 691 moveto -<3A> -show -294 797 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<2E2F6275696C645F636F6E666967757265> -show -294 841 moveto -<636420534D4553485F4255494C44> -show -294 885 moveto -<726D20636F6E6669672E2A> -show -294 929 moveto -<53414C4F4D45325F524F4F542F534D4553485F5352432F636F6E6669677572652096776974682D -6E657467656E3D6E657467656E5F696E7374616C6C6174696F6E5F70617468205C> -show -294 973 moveto -<967072656669783D736D6573685F696E7374616C6C5F70617468> -show -294 1016 moveto -<6D616B65> -show -220 1128 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<6FF920736D6573685F696E7374616C6C5F7061746820657374206C61206469726563746F727920 -6427696E7374616C6C6174696F6E206475206D6F64756C6520534D4553482E> -show -280 277 1 308 rectfill -2125 277 1 308 rectfill -280 277 1846 1 rectfill -280 584 1846 1 rectfill -280 763 1 264 rectfill -2125 763 1 264 rectfill -280 763 1846 1 rectfill -280 1026 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Trailer -%%Pages: 7 -%%EOF diff --git a/doc/salome/AddNetgenInSalome2.sxw b/doc/salome/AddNetgenInSalome2.sxw deleted file mode 100644 index 15381905d..000000000 Binary files a/doc/salome/AddNetgenInSalome2.sxw and /dev/null differ diff --git a/doc/salome/PluginMeshers.txt b/doc/salome/PluginMeshers.txt deleted file mode 100644 index 61bb0842b..000000000 --- a/doc/salome/PluginMeshers.txt +++ /dev/null @@ -1,188 +0,0 @@ -####################################################################################### -# File : PluginMeshers.txt -# Author : Julia DOROVSKIKH -# Module : SMESH -# $Header$ -####################################################################################### -# -# How to add your own mesher (as a set of hypotheses and algorithms) to the application -# -####################################################################################### - -1. Create mesher plugin package, e.g. MyMesher. - -2. Create XML file to describe all algorithms and hypotheses, provided by plugin package - (see SMESH_SRC/resources/SMESH_Meshers.xml for example). - - - - - - - - - - - Attributes of tag: - - - value of attribute is used to collect hypotheses/algoritms in groups; - you can also use this attribute for short description of your mesher plugin - - - value of attribute (MyResourceKey) is used to access resources - (messages and icons) from GUI (see paragraphs 4.2 and 5); - currently it should coincide with the name of plugin package; this limitation - will be eliminated in the further development. - - - value of attribute describes the name of your mesher's - server plugin library (See paragraph 3) - - - value of attribute describes the name of your mesher's - client plugin library (See paragraph 4) - - Attributes of tag: - - - value of attribute is an unique name of the hypothesis/algorithm - - * It is a value of _name field of your hypothesis class - (see paragraph 3, implementation of constructor of - StdMeshers_LocalLength class: _name = "LocalLength") - - * It is a key to each certain hypothesis class - (see paragraph 3, implementation of "GetHypothesisCreator()" method in StdMeshers_i.cxx) - - * It is a key to each certain hypothesis GUI - (see paragraph 4, implementation of "StdMeshersGUI_HypothesisCreator::CreateHypothesis()" - and "StdMeshersGUI_HypothesisCreator::EditHypothesis()" methods in StdMeshersGUI.cxx) - - * It is a key to each certain hypothesis icon in Object Browser - (see paragraph 4.2.1) - - - value of attribute is displayed in the GUI in the list - of available hypotheses/algorithms ("Create Hypothesis/Algorithm" dialog) - - - value of attribute is a name of icon file, which is displayed in GUI - in the list of available hypotheses/algorithms ("Create Hypothesis/Algorithm" dialog) - - Note: All attributes values are accessible in your GUI via HypothesisData class - (see paragraph 4.1) - - Note: The environment variable SMESH_MeshersList contains the list of plugins names, - separated by colon (":") symbol, e.g.: - - setenv SMESH_MeshersList StdMeshers:NETGENPlugin - - Please, pay attention that StdMeshers should also be included into this environment variable, - if you want to use standard hypotheses/algorithms, provided with SMESH module. - - The SALOME automatically locates XML files, searching them in the following directories: - - ${_ROOT_DIR}/share/salome/resources - ${SALOME_Resources} - ${HOME}/.salome/resources - ${KERNEL_ROOT_DIR}/share/salome/resources - - where is a name of each mesher plugin package - -3. Build server plugin library . - - 3.1. Define interface to your hypotheses and algorithms. - - Example: SMESH_SRC/idl/SMESH_BasicHypothesis.idl - NETGENPLUGIN_SRC/src/NETGENPlugin_Algorithm.idl - - 3.2. Implement functionality of your hypotheses and algorithms. - Inherit corresponding classes from SMESH. - - Example: SMESH_SRC/src/StdMeshers/StdMeshers_* - NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D - - 3.3. Implement interface to your hypotheses and algorithms. - Inherit corresponding classes from SMESH_I. - - Example: SMESH_SRC/src/StdMeshers_I/SMESH_*_i - NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D_i - - 3.4. Implement being exported method. - - GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypType) - - is a value of attribute in the XML-description file - - Example: SMESH_SRC/src/StdMeshers_I/StdMeshers_i.cxx - NETGENPLUGIN_SRC/src/NETGENPlugin_i.cxx - -4. Build client (GUI) plugin library . - This step is required only if your hypotheses/algorithms need specific GUI for their construction. - - 4.1. Implement the required GUI (e.g. construction dialog boxes). - - Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI_*Dlg - - Note: all data from XML-description files is accessible in your GUI via HypothesisData class - (mySMESHGUI->GetHypothesisData (aHypType), - see SMESHGUI_Hypotheses.h for HypothesisData definition) - - 4.2. Provide icons and messages for your GUI. - - 4.2.1. Implement resource files - MyResourceKey_icons.po and MyResourceKey_msg_en.po - - Example: SMESH_SRC/src/StdMeshersGUI/StdMeshers_*.po - NETGENPLUGIN_SRC/src/NETGENPlugin_icons.po - - Note: ICON_SMESH_TREE_HYPO_MyHypType1 is ID of icon for Object Browser - for hypothesis with type="MyHypType1". - - ICON_SMESH_TREE_ALGO_MyAlgType1 is ID of icon for Object Browser - for algorithm with type="MyAlgType1". - - See paragraph 2 for definition of MyResourceKey, MyHypType1, MyAlgType1. - - 4.2.2. Define environment variable SALOME_Resources to point to the - directory where resources are situated. - - Example: setenv SALOME_StdMeshersResources ${SMESH_ROOT_DIR}/share/salome/resources - - 4.3. Implement your Hypothesis Creator and being exported method - - SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator - (QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI) - - is to pass a value of attribute in XML-description file; - is to pass a value of attribute in XML-description file. - - Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI.cxx - -5. If your hypotheses/algorithms do not need specific GUI, - but you want to provide icons for object browser, see 4.2 paragrath - -6. Setup your SALOME environment. - - 6.1. Add your plugin to the LD_LIBRARY_PATH, PYTHONPATH (and maybe PATH) environment variables, e.g.: - - setenv PATH /bin/salome:${PATH} - setenv LD_LIBRARY_PATH /lib/salome:${LD_LIBRARY_PATH} - setenv PYTHONPATH /lib/python2.2/site-packages/salome:${PYTHONPATH} - - 6.2. Set mesher plugin resources environment variable (see 4.2.2 paragraph) - -Note: If you use runSalome.py script from KERNEL package to launch SALOME, you may not to set - environment variables, because this script sets them itself. All what you should do is - to add section to your ${HOME}/.salome/salome.launch file for SMESH module section: - - ... - - ... - - - - ... - - ... \ No newline at end of file diff --git a/doc/salome/gui/Makefile.in b/doc/salome/gui/Makefile.in deleted file mode 100644 index 883a053da..000000000 --- a/doc/salome/gui/Makefile.in +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) 2003 CEA/DEN, EDF R&D -# -# -# -# File : Makefile.in -# Author : Vasily Rusyaev (Open Cascade NN) -# Module : doc -# $Header: - -top_srcdir=@top_srcdir@ -top_builddir=../../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - -@COMMENCE@ - -docs: - cp -fr $(srcdir)/SMESH ./ - -find $(PWD) -name CVS -exec rm -rf {} \; - -clean: - rm -fr `ls | grep -v "Makefile"` - -distclean: clean - rm -fr SMESH - -install: - mkdir -p $(docdir)/gui - cp -rf SMESH $(docdir)/gui - -find $(PWD) -name CVS -exec rm -rf {} \; - -uninstall: - rm -rf $(docdir)/gui/SMESH diff --git a/doc/salome/gui/SMESH/i_blue.jpg b/doc/salome/gui/SMESH/i_blue.jpg deleted file mode 100755 index ed3acfac2..000000000 Binary files a/doc/salome/gui/SMESH/i_blue.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image22.gif b/doc/salome/gui/SMESH/image22.gif deleted file mode 100755 index 18b53bf4d..000000000 Binary files a/doc/salome/gui/SMESH/image22.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image22.jpg b/doc/salome/gui/SMESH/image22.jpg deleted file mode 100755 index b6a5e8db6..000000000 Binary files a/doc/salome/gui/SMESH/image22.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image23.jpg b/doc/salome/gui/SMESH/image23.jpg deleted file mode 100755 index 74f899b00..000000000 Binary files a/doc/salome/gui/SMESH/image23.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image24.gif b/doc/salome/gui/SMESH/image24.gif deleted file mode 100755 index 3d8032bf0..000000000 Binary files a/doc/salome/gui/SMESH/image24.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image25.gif b/doc/salome/gui/SMESH/image25.gif deleted file mode 100755 index cd7c967bc..000000000 Binary files a/doc/salome/gui/SMESH/image25.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image25.jpg b/doc/salome/gui/SMESH/image25.jpg deleted file mode 100755 index 4b2d4dfe4..000000000 Binary files a/doc/salome/gui/SMESH/image25.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image26.jpg b/doc/salome/gui/SMESH/image26.jpg deleted file mode 100755 index 3a02cb997..000000000 Binary files a/doc/salome/gui/SMESH/image26.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image27.jpg b/doc/salome/gui/SMESH/image27.jpg deleted file mode 100755 index d2f32b184..000000000 Binary files a/doc/salome/gui/SMESH/image27.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image28.gif b/doc/salome/gui/SMESH/image28.gif deleted file mode 100755 index 21f54bf45..000000000 Binary files a/doc/salome/gui/SMESH/image28.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image30.jpg b/doc/salome/gui/SMESH/image30.jpg deleted file mode 100755 index 997a36e35..000000000 Binary files a/doc/salome/gui/SMESH/image30.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image31.jpg b/doc/salome/gui/SMESH/image31.jpg deleted file mode 100755 index aa004031b..000000000 Binary files a/doc/salome/gui/SMESH/image31.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image32.gif b/doc/salome/gui/SMESH/image32.gif deleted file mode 100755 index a1ee2ee02..000000000 Binary files a/doc/salome/gui/SMESH/image32.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image32.jpg b/doc/salome/gui/SMESH/image32.jpg deleted file mode 100755 index 77d595dce..000000000 Binary files a/doc/salome/gui/SMESH/image32.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image33.gif b/doc/salome/gui/SMESH/image33.gif deleted file mode 100755 index ecdd47b0b..000000000 Binary files a/doc/salome/gui/SMESH/image33.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image34.gif b/doc/salome/gui/SMESH/image34.gif deleted file mode 100755 index 963095fe8..000000000 Binary files a/doc/salome/gui/SMESH/image34.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image35.gif b/doc/salome/gui/SMESH/image35.gif deleted file mode 100755 index 0e3b30fd0..000000000 Binary files a/doc/salome/gui/SMESH/image35.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image36.gif b/doc/salome/gui/SMESH/image36.gif deleted file mode 100755 index 7236ef8b9..000000000 Binary files a/doc/salome/gui/SMESH/image36.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image36.jpg b/doc/salome/gui/SMESH/image36.jpg deleted file mode 100755 index 9b44dc727..000000000 Binary files a/doc/salome/gui/SMESH/image36.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image37.gif b/doc/salome/gui/SMESH/image37.gif deleted file mode 100755 index edd5263d8..000000000 Binary files a/doc/salome/gui/SMESH/image37.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image38.gif b/doc/salome/gui/SMESH/image38.gif deleted file mode 100755 index 087f6e2be..000000000 Binary files a/doc/salome/gui/SMESH/image38.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image38.jpg b/doc/salome/gui/SMESH/image38.jpg deleted file mode 100755 index 29d5e716c..000000000 Binary files a/doc/salome/gui/SMESH/image38.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image39.gif b/doc/salome/gui/SMESH/image39.gif deleted file mode 100755 index b206af116..000000000 Binary files a/doc/salome/gui/SMESH/image39.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image40.gif b/doc/salome/gui/SMESH/image40.gif deleted file mode 100755 index becc12a47..000000000 Binary files a/doc/salome/gui/SMESH/image40.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image41.gif b/doc/salome/gui/SMESH/image41.gif deleted file mode 100755 index 2e132c239..000000000 Binary files a/doc/salome/gui/SMESH/image41.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image46.gif b/doc/salome/gui/SMESH/image46.gif deleted file mode 100755 index 0f00ea7cf..000000000 Binary files a/doc/salome/gui/SMESH/image46.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image51.jpg b/doc/salome/gui/SMESH/image51.jpg deleted file mode 100755 index dfe3bc606..000000000 Binary files a/doc/salome/gui/SMESH/image51.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image52.jpg b/doc/salome/gui/SMESH/image52.jpg deleted file mode 100755 index 1c83b35f8..000000000 Binary files a/doc/salome/gui/SMESH/image52.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image63.gif b/doc/salome/gui/SMESH/image63.gif deleted file mode 100755 index 6a9c2c86d..000000000 Binary files a/doc/salome/gui/SMESH/image63.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image64.gif b/doc/salome/gui/SMESH/image64.gif deleted file mode 100755 index 1d92c81f1..000000000 Binary files a/doc/salome/gui/SMESH/image64.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image67.gif b/doc/salome/gui/SMESH/image67.gif deleted file mode 100755 index 68bd3e383..000000000 Binary files a/doc/salome/gui/SMESH/image67.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image70.gif b/doc/salome/gui/SMESH/image70.gif deleted file mode 100755 index 120b8e8ef..000000000 Binary files a/doc/salome/gui/SMESH/image70.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image70.jpg b/doc/salome/gui/SMESH/image70.jpg deleted file mode 100755 index 0df360f68..000000000 Binary files a/doc/salome/gui/SMESH/image70.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image71.gif b/doc/salome/gui/SMESH/image71.gif deleted file mode 100755 index 0008354f6..000000000 Binary files a/doc/salome/gui/SMESH/image71.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image71.jpg b/doc/salome/gui/SMESH/image71.jpg deleted file mode 100755 index cb1223d38..000000000 Binary files a/doc/salome/gui/SMESH/image71.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image73.gif b/doc/salome/gui/SMESH/image73.gif deleted file mode 100755 index 504816a3c..000000000 Binary files a/doc/salome/gui/SMESH/image73.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image74.gif b/doc/salome/gui/SMESH/image74.gif deleted file mode 100755 index c66029e74..000000000 Binary files a/doc/salome/gui/SMESH/image74.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image76.jpg b/doc/salome/gui/SMESH/image76.jpg deleted file mode 100755 index 88ec89ffe..000000000 Binary files a/doc/salome/gui/SMESH/image76.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image77.jpg b/doc/salome/gui/SMESH/image77.jpg deleted file mode 100755 index c253eacae..000000000 Binary files a/doc/salome/gui/SMESH/image77.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image78.jpg b/doc/salome/gui/SMESH/image78.jpg deleted file mode 100755 index 80c2a1633..000000000 Binary files a/doc/salome/gui/SMESH/image78.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/image79.gif b/doc/salome/gui/SMESH/image79.gif deleted file mode 100755 index 9711ccbc9..000000000 Binary files a/doc/salome/gui/SMESH/image79.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image80.gif b/doc/salome/gui/SMESH/image80.gif deleted file mode 100755 index 399af0a9a..000000000 Binary files a/doc/salome/gui/SMESH/image80.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image82.gif b/doc/salome/gui/SMESH/image82.gif deleted file mode 100755 index 93c6c9b96..000000000 Binary files a/doc/salome/gui/SMESH/image82.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image83.gif b/doc/salome/gui/SMESH/image83.gif deleted file mode 100755 index 331b64a10..000000000 Binary files a/doc/salome/gui/SMESH/image83.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image84.gif b/doc/salome/gui/SMESH/image84.gif deleted file mode 100755 index ea8ec56bc..000000000 Binary files a/doc/salome/gui/SMESH/image84.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image88.gif b/doc/salome/gui/SMESH/image88.gif deleted file mode 100755 index b2d4b73fc..000000000 Binary files a/doc/salome/gui/SMESH/image88.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image91.gif b/doc/salome/gui/SMESH/image91.gif deleted file mode 100755 index a09ab9e76..000000000 Binary files a/doc/salome/gui/SMESH/image91.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image92.gif b/doc/salome/gui/SMESH/image92.gif deleted file mode 100755 index 9e0517f5d..000000000 Binary files a/doc/salome/gui/SMESH/image92.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image94.gif b/doc/salome/gui/SMESH/image94.gif deleted file mode 100755 index 7313f5deb..000000000 Binary files a/doc/salome/gui/SMESH/image94.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image95.gif b/doc/salome/gui/SMESH/image95.gif deleted file mode 100755 index 6491f27d4..000000000 Binary files a/doc/salome/gui/SMESH/image95.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image96.gif b/doc/salome/gui/SMESH/image96.gif deleted file mode 100755 index 1392ee705..000000000 Binary files a/doc/salome/gui/SMESH/image96.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image97.gif b/doc/salome/gui/SMESH/image97.gif deleted file mode 100755 index 480b584ed..000000000 Binary files a/doc/salome/gui/SMESH/image97.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/image98.gif b/doc/salome/gui/SMESH/image98.gif deleted file mode 100755 index 5f375b774..000000000 Binary files a/doc/salome/gui/SMESH/image98.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/note1.gif b/doc/salome/gui/SMESH/note1.gif deleted file mode 100755 index b53e21d0a..000000000 Binary files a/doc/salome/gui/SMESH/note1.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/pics/exemple.gif b/doc/salome/gui/SMESH/pics/exemple.gif deleted file mode 100755 index 6350d1737..000000000 Binary files a/doc/salome/gui/SMESH/pics/exemple.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg b/doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg deleted file mode 100755 index a10d494a5..000000000 Binary files a/doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg and /dev/null differ diff --git a/doc/salome/gui/SMESH/whestart.ico b/doc/salome/gui/SMESH/whestart.ico deleted file mode 100755 index 110f18356..000000000 Binary files a/doc/salome/gui/SMESH/whestart.ico and /dev/null differ diff --git a/doc/salome/gui/SMESH/whgdata/whexpbar.gif b/doc/salome/gui/SMESH/whgdata/whexpbar.gif deleted file mode 100755 index e677dc6f1..000000000 Binary files a/doc/salome/gui/SMESH/whgdata/whexpbar.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/whrstart.ico b/doc/salome/gui/SMESH/whrstart.ico deleted file mode 100755 index bffcd6eb9..000000000 Binary files a/doc/salome/gui/SMESH/whrstart.ico and /dev/null differ diff --git a/doc/salome/gui/SMESH/whstart.ico b/doc/salome/gui/SMESH/whstart.ico deleted file mode 100755 index 365eceac8..000000000 Binary files a/doc/salome/gui/SMESH/whstart.ico and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_fts_h.gif b/doc/salome/gui/SMESH/wht_fts_h.gif deleted file mode 100755 index feb79ae82..000000000 Binary files a/doc/salome/gui/SMESH/wht_fts_h.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_fts_n.gif b/doc/salome/gui/SMESH/wht_fts_n.gif deleted file mode 100755 index 8483be43c..000000000 Binary files a/doc/salome/gui/SMESH/wht_fts_n.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_glo_h.gif b/doc/salome/gui/SMESH/wht_glo_h.gif deleted file mode 100755 index 12223e5cc..000000000 Binary files a/doc/salome/gui/SMESH/wht_glo_h.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_glo_n.gif b/doc/salome/gui/SMESH/wht_glo_n.gif deleted file mode 100755 index 32803ebd9..000000000 Binary files a/doc/salome/gui/SMESH/wht_glo_n.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_go.gif b/doc/salome/gui/SMESH/wht_go.gif deleted file mode 100755 index 106f1d16b..000000000 Binary files a/doc/salome/gui/SMESH/wht_go.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_hide.gif b/doc/salome/gui/SMESH/wht_hide.gif deleted file mode 100755 index 6ec602dce..000000000 Binary files a/doc/salome/gui/SMESH/wht_hide.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_idx_h.gif b/doc/salome/gui/SMESH/wht_idx_h.gif deleted file mode 100755 index 2df1b16a2..000000000 Binary files a/doc/salome/gui/SMESH/wht_idx_h.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_idx_n.gif b/doc/salome/gui/SMESH/wht_idx_n.gif deleted file mode 100755 index fd193a0f7..000000000 Binary files a/doc/salome/gui/SMESH/wht_idx_n.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_logo1.gif b/doc/salome/gui/SMESH/wht_logo1.gif deleted file mode 100755 index 2ef5700f2..000000000 Binary files a/doc/salome/gui/SMESH/wht_logo1.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_logo2.gif b/doc/salome/gui/SMESH/wht_logo2.gif deleted file mode 100755 index 2ac62e868..000000000 Binary files a/doc/salome/gui/SMESH/wht_logo2.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_next.gif b/doc/salome/gui/SMESH/wht_next.gif deleted file mode 100755 index 8ea834d5e..000000000 Binary files a/doc/salome/gui/SMESH/wht_next.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_next_g.gif b/doc/salome/gui/SMESH/wht_next_g.gif deleted file mode 100755 index c0e975846..000000000 Binary files a/doc/salome/gui/SMESH/wht_next_g.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_prev.gif b/doc/salome/gui/SMESH/wht_prev.gif deleted file mode 100755 index b7eaba836..000000000 Binary files a/doc/salome/gui/SMESH/wht_prev.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_prev_g.gif b/doc/salome/gui/SMESH/wht_prev_g.gif deleted file mode 100755 index 864790916..000000000 Binary files a/doc/salome/gui/SMESH/wht_prev_g.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_spac.gif b/doc/salome/gui/SMESH/wht_spac.gif deleted file mode 100755 index fc2560981..000000000 Binary files a/doc/salome/gui/SMESH/wht_spac.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_sync.gif b/doc/salome/gui/SMESH/wht_sync.gif deleted file mode 100755 index 0ef174735..000000000 Binary files a/doc/salome/gui/SMESH/wht_sync.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab0.gif b/doc/salome/gui/SMESH/wht_tab0.gif deleted file mode 100755 index 955c42f47..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab0.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab1.gif b/doc/salome/gui/SMESH/wht_tab1.gif deleted file mode 100755 index b3ec41d6d..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab1.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab2.gif b/doc/salome/gui/SMESH/wht_tab2.gif deleted file mode 100755 index 08fb0ce4f..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab2.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab3.gif b/doc/salome/gui/SMESH/wht_tab3.gif deleted file mode 100755 index 1819c8e8f..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab3.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab4.gif b/doc/salome/gui/SMESH/wht_tab4.gif deleted file mode 100755 index 1a6fc4f4a..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab4.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab5.gif b/doc/salome/gui/SMESH/wht_tab5.gif deleted file mode 100755 index 934019260..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab5.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab6.gif b/doc/salome/gui/SMESH/wht_tab6.gif deleted file mode 100755 index fe312d238..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab6.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab7.gif b/doc/salome/gui/SMESH/wht_tab7.gif deleted file mode 100755 index 3b95ae24e..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab7.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_tab8.gif b/doc/salome/gui/SMESH/wht_tab8.gif deleted file mode 100755 index c80acc8d5..000000000 Binary files a/doc/salome/gui/SMESH/wht_tab8.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_toc1.gif b/doc/salome/gui/SMESH/wht_toc1.gif deleted file mode 100755 index 515c352de..000000000 Binary files a/doc/salome/gui/SMESH/wht_toc1.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_toc2.gif b/doc/salome/gui/SMESH/wht_toc2.gif deleted file mode 100755 index 2e3d6c8f0..000000000 Binary files a/doc/salome/gui/SMESH/wht_toc2.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_toc3.gif b/doc/salome/gui/SMESH/wht_toc3.gif deleted file mode 100755 index 330f3691c..000000000 Binary files a/doc/salome/gui/SMESH/wht_toc3.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_toc4.gif b/doc/salome/gui/SMESH/wht_toc4.gif deleted file mode 100755 index 3f9a03686..000000000 Binary files a/doc/salome/gui/SMESH/wht_toc4.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_toc_h.gif b/doc/salome/gui/SMESH/wht_toc_h.gif deleted file mode 100755 index fe20f6860..000000000 Binary files a/doc/salome/gui/SMESH/wht_toc_h.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_toc_n.gif b/doc/salome/gui/SMESH/wht_toc_n.gif deleted file mode 100755 index ce283101f..000000000 Binary files a/doc/salome/gui/SMESH/wht_toc_n.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_ws.gif b/doc/salome/gui/SMESH/wht_ws.gif deleted file mode 100755 index 563db8bf6..000000000 Binary files a/doc/salome/gui/SMESH/wht_ws.gif and /dev/null differ diff --git a/doc/salome/gui/SMESH/wht_ws_g.gif b/doc/salome/gui/SMESH/wht_ws_g.gif deleted file mode 100755 index 3056b7547..000000000 Binary files a/doc/salome/gui/SMESH/wht_ws_g.gif and /dev/null differ diff --git a/doc/salome/tui/Makefile.in b/doc/salome/tui/Makefile.in deleted file mode 100644 index 894cc0c6d..000000000 --- a/doc/salome/tui/Makefile.in +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2003 CEA/DEN, EDF R&D -# -# -# -# File : Makefile.in -# Author : Vasily Rusyaev (Open Cascade NN) -# Module : doc -# $Header: - -top_srcdir=@top_srcdir@ -top_builddir=../../.. -root_srcdir=@ROOT_SRCDIR@ -srcdir=@srcdir@ -VPATH=.:@srcdir@ -doxygen=@DOXYGEN@ - -@COMMENCE@ - -PYTHON_SCRIPTS = \ - smesh.py - -docs: - cp -fr $(srcdir)/SMESH ./INPUT; \ - cd INPUT; \ - sed 's|../../../share/salome|$(root_srcdir)|' ./doxyfile > ./doxyfile1; \ - mv -f doxyfile1 doxyfile; \ - $(doxygen) ./doxyfile; \ - mkdir py1; mkdir py2; \ - cd .. - for file in $(PYTHON_SCRIPTS) dummy; do \ - if [ $$file != "dummy" ]; then \ - cp $(root_srcdir)/src/SMESH_SWIG/$$file INPUT/py1/; \ - fi ; \ - done - cd INPUT; \ - python $(KERNEL_ROOT_DIR)/doc/salome/tui/KERNEL/pythfilter.py ./py1 ./py2; \ - sed 's|list_py_files_to_process|$(PYTHON_SCRIPTS)|' ./doxyfile_py > py2/doxyfile_py; \ - cd py2; \ - $(doxygen) ./doxyfile_py; \ - cd ../..; \ - cp -fr $(srcdir)/SMESH/sources/static/*.* ./SMESH/ - cp -fr $(srcdir)/SMESH/sources/ SMESH/ - cp -fr $(srcdir)/SMESH/HTML/ SMESH/ - rm -fr INPUT - -clean: - rm -fr SMESH - -distclean: clean - rm -fr INPUT - -install: - $(INSTALL) -d $(docdir); \ - mkdir -p $(docdir)/tui - cp -fr SMESH $(docdir)/tui - -uninstall: - rm -fr $(docdir)/tui/SMESH diff --git a/doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html b/doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html deleted file mode 100644 index 8007326bb..000000000 --- a/doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - -
interface StdMeshers_LocalLength
IDL file
Python
void SetLength ( in double length )
SetLength ( length )
double GetLength ( )
return_value = GetLength ( )

- - - - - - - - - - - - - - - - - - - - - - - -
interface StdMeshers_NumberOfSegments
IDL file
Python
void SetNumberOfSegments ( in long segmentsNumber )
SetNumberOfSegments ( segmentsNumber )
long GetNumberOfSegments ( )
return_value = GetNumberOfSegments ( )
void SetScaleFactor ( in double scaleFactor )
SetScaleFactor ( scaleFactor )
double GetScaleFactor ( )
return_value = GetScaleFactor ( )

- - - - - - - - - - - - - - - -
interface StdMeshers_Arithmetic1D
IDL file
Python
void SetLength ( in double length, in boolean isStartLength )
SetLength ( length, isStartLength )
double GetLength ( in boolean isStartLength )
return_value = GetLength ( isStartLength )

- - - - - - - - - - - - - - - -
interface StdMeshers_MaxElementArea
IDL file
Python
void SetMaxElementArea ( in double area )
SetMaxElementArea ( area )
double GetMaxElementArea ( )
return_value = GetMaxElementArea ( )

- - - - - - - - - - - - - - - -
interface StdMeshers_LengthFromEdges
IDL file
Python
void SetMode ( in long mode )
SetMode ( mode )
long GetMode ( )
return_value = GetMode ( )

- - - - - - - - - - - - - - - -
interface StdMeshers_StartEndLength
IDL file
Python
void SetLength ( in double length, in boolean isStartLength )
SetLength ( length, isStartLength )
double GetLength ( in boolean isStartLength )
return_value = GetLength ( isStartLength )

- - - - - - - - - - - - - - - -
interface StdMeshers_Deflection1D
IDL file
Python
void SetDeflection ( in double deflection )
SetDeflection ( deflection )
double GetDeflection ( )
return_value = GetDeflection ( )

- - - - - - - - - - - - - - - -
interface StdMeshers_MaxElementVolume
IDL file
Python
void SetMaxElementVolume ( in double volume )
SetMaxElementVolume ( volume )
double GetMaxElementVolume ( )
return_value = GetMaxElementVolume ( )

- - - - - - - -
interface StdMeshers_NotConformAllowed
IDL file
Python

- - - - - - - -
interface StdMeshers_Propagation
IDL file
Python

- - - - - - - -
interface StdMeshers_Regular_1D
IDL file
Python

- - - - - - - -
interface StdMeshers_MEFISTO_2D
IDL file
Python

- - - - - - - -
interface StdMeshers_Quadrangle_2D
IDL file
Python

- - - - - - - -
interface StdMeshers_Hexa_3D
IDL file
Python

-
diff --git a/doc/salome/tui/SMESH/HTML/SMESH_Gen.html b/doc/salome/tui/SMESH/HTML/SMESH_Gen.html deleted file mode 100644 index 8fdf3b2a6..000000000 --- a/doc/salome/tui/SMESH/HTML/SMESH_Gen.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface SMESH_Gen
IDL file
Python
FilterManager CreateFilterManager ( )
return_value = CreateFilterManager ( )
SMESH_Pattern GetPattern ( )
return_value = GetPattern ( )
void SetCurrentStudy ( in Study theStudy )
SetCurrentStudy ( theStudy )
Study GetCurrentStudy ( )
return_value = GetCurrentStudy ( )
SMESH_Hypothesis CreateHypothesis ( in string theHypName, in string theLibName )
return_value = CreateHypothesis ( theHypName, theLibName )
SMESH_Mesh CreateMesh ( in GEOM_Object theObject )
return_value = CreateMesh ( theObject )
SMESH_Mesh CreateMeshesFromUNV ( in string theFileName )
return_value = CreateMeshesFromUNV ( theFileName )
mesh_array CreateMeshesFromMED ( in string theFileName, out DriverMED_ReadStatus theStatus )
[ return_value, theStatus ] = CreateMeshesFromMED ( theFileName )
SMESH_Mesh CreateMeshesFromSTL ( in string theFileName )
return_value = CreateMeshesFromSTL ( theFileName )
boolean Compute ( in SMESH_Mesh theMesh, in GEOM_Object theSubObject )
return_value = Compute ( theMesh, theSubObject )
boolean IsReadyToCompute ( in SMESH_Mesh theMesh, in GEOM_Object theSubObject )
return_value = IsReadyToCompute ( theMesh, theSubObject )
long_array GetSubShapesId ( in GEOM_Object theMainObject, in object_array theListOfSubObjects )
return_value = GetSubShapesId ( theMainObject, theListOfSubObjects )

-
diff --git a/doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html b/doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html deleted file mode 100644 index ff9d3d619..000000000 --- a/doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
interface SMESH_Hypothesis
IDL file
Python
string GetName ( )
return_value = GetName ( )
string GetLibName ( )
return_value = GetLibName ( )
long GetId ( )
return_value = GetId ( )

- - - - - - - - - - - -
interface SMESH_Algo
IDL file
Python
ListOfHypothesisName GetCompatibleHypothesis ( )
return_value = GetCompatibleHypothesis ( )

- - - - - - - -
interface SMESH_1D_Algo
IDL file
Python

- - - - - - - -
interface SMESH_2D_Algo
IDL file
Python

- - - - - - - -
interface SMESH_3D_Algo
IDL file
Python

-
diff --git a/doc/salome/tui/SMESH/HTML/SMESH_Mesh.html b/doc/salome/tui/SMESH/HTML/SMESH_Mesh.html deleted file mode 100644 index 527298f54..000000000 --- a/doc/salome/tui/SMESH/HTML/SMESH_Mesh.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface SMESH_Mesh
IDL file
Python
SMESH_subMesh GetSubMesh ( in GEOM_Object aSubObject, in string name )
return_value = GetSubMesh ( aSubObject, name )
void RemoveSubMesh ( in SMESH_subMesh aSubMesh )
RemoveSubMesh ( aSubMesh )
SMESH_Group CreateGroup ( in ElementType elem_type, in string name )
return_value = CreateGroup ( elem_type, name )
SMESH_Group CreateGroupFromGEOM ( in ElementType elem_type, in string name, in GEOM_Object theGEOMGroup )
return_value = CreateGroupFromGEOM ( elem_type, name, theGEOMGroup )
void RemoveGroup ( in SMESH_Group aGroup )
RemoveGroup ( aGroup )
void RemoveGroupWithContents ( in SMESH_Group aGroup )
RemoveGroupWithContents ( aGroup )
SMESH_Group UnionGroups ( in SMESH_Group aGroup1, in SMESH_Group aGroup2, in string name )
return_value = UnionGroups ( aGroup1, aGroup2, name )
SMESH_Group IntersectGroups ( in SMESH_Group aGroup1, in SMESH_Group aGroup2, in string name )
return_value = IntersectGroups ( aGroup1, aGroup2, name )
SMESH_Group CutGroups ( in SMESH_Group aMainGroup, in SMESH_Group aToolGroup, in string name )
return_value = CutGroups ( aMainGroup, aToolGroup, name )
Hypothesis_Status AddHypothesis ( in GEOM_Object aSubObject, in SMESH_Hypothesis anHyp )
return_value = AddHypothesis ( aSubObject, anHyp )
Hypothesis_Status RemoveHypothesis ( in GEOM_Object aSubObject, in SMESH_Hypothesis anHyp )
return_value = RemoveHypothesis ( aSubObject, anHyp )
ListOfHypothesis GetHypothesisList ( in GEOM_Object aSubObject )
return_value = GetHypothesisList ( aSubObject )
log_array GetLog ( in boolean clearAfterGet )
return_value = GetLog ( clearAfterGet )
void ClearLog ( )
ClearLog ( )
long GetId ( )
return_value = GetId ( )
long GetStudyId ( )
return_value = GetStudyId ( )
SMESH_MeshEditor GetMeshEditor ( )
return_value = GetMeshEditor ( )
void ExportDAT ( in string file )
ExportDAT ( file )
void ExportMED ( in string file, in boolean auto_groups )
ExportMED ( file, auto_groups )
void ExportUNV ( in string file )
ExportUNV ( file )
void ExportSTL ( in string file, in boolean isascii )
ExportSTL ( file, isascii )
MESH GetMEDMesh ( )
return_value = GetMEDMesh ( )
long NbNodes ( )
return_value = NbNodes ( )
long NbEdges ( )
return_value = NbEdges ( )
long NbFaces ( )
return_value = NbFaces ( )
long NbTriangles ( )
return_value = NbTriangles ( )
long NbQuadrangles ( )
return_value = NbQuadrangles ( )
long NbVolumes ( )
return_value = NbVolumes ( )
long NbTetras ( )
return_value = NbTetras ( )
long NbHexas ( )
return_value = NbHexas ( )
long NbPyramids ( )
return_value = NbPyramids ( )
long NbPrisms ( )
return_value = NbPrisms ( )
long NbSubMesh ( )
return_value = NbSubMesh ( )
string Dump ( )
return_value = Dump ( )

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface SMESH_subMesh
IDL file
Python
long GetNumberOfElements ( )
return_value = GetNumberOfElements ( )
long GetNumberOfNodes ( in boolean all )
return_value = GetNumberOfNodes ( all )
long_array GetElementsId ( )
return_value = GetElementsId ( )
long_array GetElementsByType ( in ElementType theType )
return_value = GetElementsByType ( theType )
long_array GetNodesId ( )
return_value = GetNodesId ( )
SMESH_Mesh GetFather ( )
return_value = GetFather ( )
long GetId ( )
return_value = GetId ( )
FAMILY GetFamily ( )
return_value = GetFamily ( )

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface SMESH_MeshEditor
IDL file
Python
boolean RemoveElements ( in long_array IDsOfElements )
return_value = RemoveElements ( IDsOfElements )
boolean RemoveNodes ( in long_array IDsOfNodes )
return_value = RemoveNodes ( IDsOfNodes )
boolean AddNode ( in double x, in double y, in double z )
return_value = AddNode ( x, y, z )
boolean AddEdge ( in long_array IDsOfNodes )
return_value = AddEdge ( IDsOfNodes )
boolean AddFace ( in long_array IDsOfNodes )
return_value = AddFace ( IDsOfNodes )
boolean AddVolume ( in long_array IDsOfNodes )
return_value = AddVolume ( IDsOfNodes )
boolean MoveNode ( in long NodeID, in double x, in double y, in double z )
return_value = MoveNode ( NodeID, x, y, z )
boolean InverseDiag ( in long NodeID1, in long NodeID2 )
return_value = InverseDiag ( NodeID1, NodeID2 )
boolean DeleteDiag ( in long NodeID1, in long NodeID2 )
return_value = DeleteDiag ( NodeID1, NodeID2 )
boolean Reorient ( in long_array IDsOfElements )
return_value = Reorient ( IDsOfElements )
boolean TriToQuad ( in long_array IDsOfElements, in NumericalFunctor Criterion, in double MaxAngle )
return_value = TriToQuad ( IDsOfElements, Criterion, MaxAngle )
boolean QuadToTri ( in long_array IDsOfElements, in NumericalFunctor Criterion )
return_value = QuadToTri ( IDsOfElements, Criterion )
boolean SplitQuad ( in long_array IDsOfElements, in boolean Diag13 )
return_value = SplitQuad ( IDsOfElements, Diag13 )
boolean Smooth ( in long_array IDsOfElements, in long_array IDsOfFixedNodes, in long MaxNbOfIterations, in double MaxAspectRatio, in Smooth_Method Method )
return_value = Smooth ( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations, MaxAspectRatio, Method )
void RenumberNodes ( )
RenumberNodes ( )
void RenumberElements ( )
RenumberElements ( )
void RotationSweep ( in long_array IDsOfElements, in AxisStruct Axix, in double AngleInRadians, in long NbOfSteps, in double Tolerance )
RotationSweep ( IDsOfElements, Axix, AngleInRadians, NbOfSteps, Tolerance )
void ExtrusionSweep ( in long_array IDsOfElements, in DirStruct StepVector, in long NbOfSteps )
ExtrusionSweep ( IDsOfElements, StepVector, NbOfSteps )
void Mirror ( in long_array IDsOfElements, in AxisStruct Mirror, in MirrorType theMirrorType, in boolean Copy )
Mirror ( IDsOfElements, Mirror, theMirrorType, Copy )
void Translate ( in long_array IDsOfElements, in DirStruct Vector, in boolean Copy )
Translate ( IDsOfElements, Vector, Copy )
void Rotate ( in long_array IDsOfElements, in AxisStruct Axis, in double AngleInRadians, in boolean Copy )
Rotate ( IDsOfElements, Axis, AngleInRadians, Copy )
void FindCoincidentNodes ( in double Tolerance, out array_of_long_array GroupsOfNodes )
GroupsOfNodes = FindCoincidentNodes ( Tolerance )
void MergeNodes ( in array_of_long_array GroupsOfNodes )
MergeNodes ( GroupsOfNodes )
void MergeEqualElements ( )
MergeEqualElements ( )
boolean SewFreeBorders ( in long FirstNodeID1, in long SecondNodeID1, in long LastNodeID1, in long FirstNodeID2, in long SecondNodeID2, in long LastNodeID2 )
return_value = SewFreeBorders ( FirstNodeID1, SecondNodeID1, LastNodeID1, FirstNodeID2, SecondNodeID2, LastNodeID2 )
boolean SewConformFreeBorders ( in long FirstNodeID1, in long SecondNodeID1, in long LastNodeID1, in long FirstNodeID2, in long SecondNodeID2 )
return_value = SewConformFreeBorders ( FirstNodeID1, SecondNodeID1, LastNodeID1, FirstNodeID2, SecondNodeID2 )
boolean SewBorderToSide ( in long FirstNodeIDOnFreeBorder, in long SecondNodeIDOnFreeBorder, in long LastNodeIDOnFreeBorder, in long FirstNodeIDOnSide, in long LastNodeIDOnSide )
return_value = SewBorderToSide ( FirstNodeIDOnFreeBorder, SecondNodeIDOnFreeBorder, LastNodeIDOnFreeBorder, FirstNodeIDOnSide, LastNodeIDOnSide )
boolean SewSideElements ( in long_array IDsOfSide1Elements, in long_array IDsOfSide2Elements, in long NodeID1OfSide1ToMerge, in long NodeID1OfSide2ToMerge, in long NodeID2OfSide1ToMerge, in long NodeID2OfSide2ToMerge )
return_value = SewSideElements ( IDsOfSide1Elements, IDsOfSide2Elements, NodeID1OfSide1ToMerge, NodeID1OfSide2ToMerge, NodeID2OfSide1ToMerge, NodeID2OfSide2ToMerge )

-
diff --git a/doc/salome/tui/SMESH/sources/Application-About.png b/doc/salome/tui/SMESH/sources/Application-About.png deleted file mode 100755 index 7b58330d5..000000000 Binary files a/doc/salome/tui/SMESH/sources/Application-About.png and /dev/null differ diff --git a/doc/salome/tui/SMESH/sources/Application-About1.jpg b/doc/salome/tui/SMESH/sources/Application-About1.jpg deleted file mode 100755 index cf7ab8ba0..000000000 Binary files a/doc/salome/tui/SMESH/sources/Application-About1.jpg and /dev/null differ diff --git a/doc/salome/tui/SMESH/sources/application.gif b/doc/salome/tui/SMESH/sources/application.gif deleted file mode 100644 index 0b05d5c18..000000000 Binary files a/doc/salome/tui/SMESH/sources/application.gif and /dev/null differ diff --git a/doc/salome/tui/SMESH/sources/application.jpg b/doc/salome/tui/SMESH/sources/application.jpg deleted file mode 100755 index a6979ab99..000000000 Binary files a/doc/salome/tui/SMESH/sources/application.jpg and /dev/null differ diff --git a/doc/salome/tui/SMESH/sources/bg_salome.gif b/doc/salome/tui/SMESH/sources/bg_salome.gif deleted file mode 100755 index 677b70468..000000000 Binary files a/doc/salome/tui/SMESH/sources/bg_salome.gif and /dev/null differ diff --git a/doc/salome/tui/SMESH/sources/logocorp.gif b/doc/salome/tui/SMESH/sources/logocorp.gif deleted file mode 100755 index 7697e0837..000000000 Binary files a/doc/salome/tui/SMESH/sources/logocorp.gif and /dev/null differ diff --git a/doc/salome/tui/SMESH/sources/myheader.html b/doc/salome/tui/SMESH/sources/myheader.html deleted file mode 100755 index 83ca543cd..000000000 --- a/doc/salome/tui/SMESH/sources/myheader.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Main Page - - - -  -
- - - - - - -
-
-
- - - - diff --git a/doc/salome/tui/SMESH/sources/myheader_py2.html b/doc/salome/tui/SMESH/sources/myheader_py2.html deleted file mode 100755 index 372b2247f..000000000 --- a/doc/salome/tui/SMESH/sources/myheader_py2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Main Page - - - -  -
- - - - - - -
-
-
- - - - diff --git a/doc/salome/tui/SMESH/sources/occ.gif b/doc/salome/tui/SMESH/sources/occ.gif deleted file mode 100755 index ce017c8ae..000000000 Binary files a/doc/salome/tui/SMESH/sources/occ.gif and /dev/null differ diff --git a/doc/salome/tui/SMESH/sources/static/PluginMeshers.html b/doc/salome/tui/SMESH/sources/static/PluginMeshers.html deleted file mode 100755 index f860aef7b..000000000 --- a/doc/salome/tui/SMESH/sources/static/PluginMeshers.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - - Main Page - - - - -   -
- - - - - - - - -
-

-

-
- -
-
- -
-

How to add your own mesher

-
- -
-

(as a set of hypotheses and algorithms)

-
- -
-

to the application.

-
- -

Table of contents

- - - -

1. Introduction

- All hypotheses and algorithms are available in SMESH module via plugin mechanism. -Such approach allows easily to introduce new hypotheses and algorithms types -to the application. Also, it makes possible the customization of available -hypotheses and algorithms list for different users without recompilation -of sources.
-The goal of this document is to describe the process of creation external -mesher plugins. -

Back to the contents

-

2. Implementation steps

- -

-

2.1. Mesher plugin package

- -Create your mesher plugin package which will contain the sources files, e.g. - MyMesherPlugin.
-
-Back -to the contents
-

2.2. List of available hypotheses and algorithms

-Create XML file to describe all algorithms and hypotheses, provided by your -plugin package (see SMESH_SRC/resources/SMESH_Meshers.xml for example).
-
<meshers-group name="MyName"
-               resources="MyResourceKey"
-               -server-lib="libMyServerLib.so"
-               gui-lib="libMyClientLib.so">
-     <hypotheses>
-          <hypothesis type="MyHypType1"
-                  -    label-id="My beautiful hypothesis name"
-                   -   icon-id="my_hypo_1_icon.png"/>
-          </hypotheses>
-     <algorithms>
-          <algorithm type="MyAlgType1"
-                -     label-id="My beautiful algorithm name"
-                 -    icon-id="my_algo_1_icon.png"/>
-          </algorithms>
-</meshers-group>
-

- -
    -
  • Attributes of <meshers-group> tag:
  • -
-
-
    -
  • value of <name> attribute is used to collect hypotheses/algoritms -in groups; you can also use this attribute for short description of your -mesher plugin.
  • -
  • value of <resources> attribute (MyResourceKey) is used to -access resources (messages and icons) from GUI (see paragraphs 2.4.2 and 2.5); in the current implementation -it should coincide with the name of plugin package; this limitation will -be eliminated in the further development.
  • -
  • value of <server-lib> attribute describes the name of your -mesher's server plugin library (See paragraph 2.3)
  • -
  • value of <gui-lib> attribute describes the name of your mesher's -client plugin library (See paragraph 2.4)
  • -
-
-
    -
  • Attributes of <hypothesis/algorithm> tag:
  • -
-
-
    -
  • value of <type> attribute is an unique name of the hypothesis/algorithm
  • -
-
    -
      -
    • It is a value of _name field of your hypothesis class (see paragraph - 2.3, implementation of constructor of StdMeshers_LocalLength -class: _name = "LocalLength")
    • -
    • It is a key to each certain hypothesis class (see paragraph 2.3, implementation of "GetHypothesisCreator()" method in -StdMeshers_i.cxx)
    • -
    • It is a key to each certain hypothesis GUI (see paragraph 2.4, implementation of "StdMeshersGUI_HypothesisCreator::CreateHypothesis()" -and "StdMeshersGUI_HypothesisCreator::EditHypothesis()" methods in StdMeshersGUI.cxx)
    • -
    • It is a key to each certain hypothesis icon in Object Browser -(see paragraph 2.4.2.1)
    • -
    -
-
-
-
    -
  • value of <label-id> attribute is displayed in the GUI in -the list of available hypotheses/algorithms ("Create Hypothesis/Algorithm" -dialog)
  • -
  • value of <icon-id> attribute is a name of icon file, which -is displayed in GUI in the list of available hypotheses/algorithms ("Create -Hypothesis/Algorithm" dialog)
  • -
-
-Note: All attributes values are accessible in your GUI via HypothesisData -class (see paragraph 2.4.1)
-
-Note: The environment variable SMESH_MeshersList contains the list of plugins -names, separated by colon (":") symbol, e.g.:
-
-     setenv SMESH_MeshersList StdMeshers:NETGENPlugin
-
-Please, pay attention that StdMeshers should also be included into this environment -variable, if you want to use standard hypotheses/algorithms, provided with -SMESH module.
-
-The SALOME automatically locates XML files, searching them in the following -directories:
-
-    ${<PLUGINNAME>_ROOT_DIR}/share/salome/resources
-    ${SALOME_<PluginName>Resources}
-    ${HOME}/.salome/resources
-    ${KERNEL_ROOT_DIR}/share/salome/resources

-
-where <PluginName> is a name of each mesher plugin package
-
-Back to the contents -

2.3. Build server plugin library <libMyServerLib.so>.

- -

2.3.1. Define interface to your hypotheses and algorithms.

- -
Example: SMESH_SRC/idl/SMESH_BasicHypothesis.idl
-         NETGENPLUGIN_SRC/src/NETGENPlugin_Algorithm.idl
-
- -

2.3.2. Implement functionality of your hypotheses -and algorithms.

- -
Inherit corresponding classes from SMESH. -

Example: SMESH_SRC/src/StdMeshers/StdMeshers_*
-         NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D
-

-
- -

2.3.3.Implement interface to your hypotheses and -algorithms.

- -
Inherit corresponding classes from SMESH_I. -

Example: SMESH_SRC/src/StdMeshers_I/SMESH_*_i
-         NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D_i
-

-
- -

2.3.4. Implement being exported method.

- -
GenericHypothesisCreator_i* GetHypothesisCreator (const char* -aHypType) -

<aHypType> is a value of <type> attribute in the XML-description -file

-
- -
Example: SMESH_SRC/src/StdMeshers_I/StdMeshers_i.cxx
-         NETGENPLUGIN_SRC/src/NETGENPlugin_i.cxx
-
- Back to the contents -

2.4. Build client (GUI) plugin library <libMyClientLib.so>.

- -
This step is required only if your hypotheses/algorithms need -specific GUI for their construction.
- -

2.4.1. Implement the required GUI (e.g. construction -dialog boxes).

- -
Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI_*Dlg -

Note: all data from XML-description files is accessible in your GUI -via HypothesisData class  (mySMESHGUI->GetHypothesisData (aHypType), -see SMESHGUI_Hypotheses.h for HypothesisData definition)

-
- -

2.4.2. Provide icons and messages for your GUI.

- -
2.4.2.1. Implement resource files
- -
MyResourceKey_icons.po and MyResourceKey_msg_en.po -

Example: SMESH_SRC/src/StdMeshersGUI/StdMeshers_*.po
-         NETGENPLUGIN_SRC/src/NETGENPlugin_icons.po
-

-Note: ICON_SMESH_TREE_HYPO_MyHypType1 is ID of icon for Object Browser for -hypothesis with type="MyHypType1"; ICON_SMESH_TREE_ALGO_MyAlgType1 is ID -of icon for Object Browser for algorithm with type="MyAlgType1".
-See paragraph 2 for definition of MyResourceKey, MyHypType1, MyAlgType1.
-

-
- -
2.4.2.2. Define environment variable SALOME_<MyResourceKey>Resources
-
It should point to the directory where resources are situated.
- -
Example: setenv SALOME_StdMeshersResources ${SMESH_ROOT_DIR}/share/salome/resources
- -

2.4.3. Implement your Hypothesis Creator and being -exported method

- -
SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator -
-   (QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI) -

<aHypType> is to pass a value of <type> attribute in XML-description -file;
-<aServerLibName> is to pass a value of <server-lib> attribute -in XML-description file.

-

Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI.cxx

-
- Back to the contents -

2.5. Provide icons for object browser.

- -
If your hypotheses/algorithms do not need specific GUI, but you -want to provide icons for object browser, see 2.4.2 paragrath.
-
- - -

2.6. Setup your SALOME environment.

- -

2.6.1.  Add your plugin to the LD_LIBRARY_PATH, -PYTHONPATH (and maybe PATH) environment variables.
-

-
setenv PATH <path-to-my-plugin>/bin/salome:${PATH}
-setenv LD_LIBRARY_PATH <path-to-my-plugin>/lib/salome:${LD_LIBRARY_PATH}
-Setenv PYTHONPATH <path-to-my-plugin>/lib/python2.2/site-packages/salome:${PYTHONPATH}
-
  
-
-

2.6.2.  Set mesher plugin resources environment -variable

-
 This enviroment variable is used to set meshers plugins -which should be loaded by SMESH module (see 2.4.2.2 -paragraph). Add your plugin to this variable. All plugins are separated by -colon (":") symbol.
-
-Note: If you use runSalome.py script from KERNEL package to launch SALOME, -you may not to set environment variables, because this script sets them itself. -All what you should do is to add <plugin> section to your ${HOME}/.salome/salome.launch -file for SMESH module section:
-
-...
-<modules-list>
-    ...
-    <module name="SMESH">
-        <plugin name="MyMesher"/>
-    </module>
-    ...
-</modules-list>
-...

-
-Back to the contents

- - diff --git a/doc/salome/tui/SMESH/sources/static/doxygen.css b/doc/salome/tui/SMESH/sources/static/doxygen.css deleted file mode 100755 index 0a8e93d50..000000000 --- a/doc/salome/tui/SMESH/sources/static/doxygen.css +++ /dev/null @@ -1,49 +0,0 @@ -H1 { text-align: center; } -CAPTION { font-weight: bold } -A.qindex {} -A.qindexRef {} -A.el { text-decoration: none; font-weight: bold } -A.elRef { font-weight: bold } -A.code { text-decoration: none; font-weight: normal; color: #4444ee } -A.codeRef { font-weight: normal; color: #4444ee } -A:hover { text-decoration: none; background-color: lightblue } -DL.el { margin-left: -1cm } -DIV.fragment { width: 100%; border: none; background-color: #CCCCCC } -DIV.ah { background-color: #CCCCCC; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } -TD.md { background-color: lightblue; font-weight: bold; } -TD.mdname1 { background-color: lightblue; font-weight: bold; color: #602020; } -TD.mdname { background-color: lightblue; font-weight: bold; color: #602020; width: 600px; } -DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } -DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } -BODY { background: url(sources/bg_salome.gif) } -TD.indexkey { - background-color: #CCCCCC; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} -TD.indexvalue { - background-color: #CCCCCC; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} -span.keyword { color: #008000 } -span.keywordtype { color: #604020 } -span.keywordflow { color: #e08000 } -span.comment { color: #800000 } -span.preprocessor { color: #806020 } -span.stringliteral { color: #002080 } -span.charliteral { color: #008080 } diff --git a/doc/salome/tui/SMESH/sources/static/page2.html b/doc/salome/tui/SMESH/sources/static/page2.html deleted file mode 100755 index 0e5c0ad5e..000000000 --- a/doc/salome/tui/SMESH/sources/static/page2.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - Main Page - - - - -   -
- - - - - - - - -
- - -
-
- - -
- - diff --git a/doc/salome/tui/SMESH/sources/static/treeview.js b/doc/salome/tui/SMESH/sources/static/treeview.js deleted file mode 100644 index 55eb43d07..000000000 --- a/doc/salome/tui/SMESH/sources/static/treeview.js +++ /dev/null @@ -1,505 +0,0 @@ -//**************************************************************** -// You are free to copy the "Folder-Tree" script as long as you -// keep this copyright notice: -// Script found in: http://www.geocities.com/Paris/LeftBank/2178/ -// Author: Marcelino Alves Martins (martins@hks.com) December '97. -//**************************************************************** - -//Log of changes: -// 17 Feb 98 - Fix initialization flashing problem with Netscape -// -// 27 Jan 98 - Root folder starts open; support for USETEXTLINKS; -// make the ftien4 a js file -// -// DvH: Dec 2000 - Made some minor changes to support external -// references - -// Definition of class Folder -// ***************************************************************** - -function Folder(folderDescription, tagName, hreference) //constructor -{ - //constant data - this.desc = folderDescription - this.tagName = tagName - this.hreference = hreference - this.id = -1 - this.navObj = 0 - this.iconImg = 0 - this.nodeImg = 0 - this.isLastNode = 0 - - //dynamic data - this.isOpen = true - this.iconSrc = "ftv2folderopen.png" - this.children = new Array - this.nChildren = 0 - - //methods - this.initialize = initializeFolder - this.setState = setStateFolder - this.addChild = addChild - this.createIndex = createEntryIndex - this.hide = hideFolder - this.display = display - this.renderOb = drawFolder - this.totalHeight = totalHeight - this.subEntries = folderSubEntries - this.outputLink = outputFolderLink -} - -function setStateFolder(isOpen) -{ - var subEntries - var totalHeight - var fIt = 0 - var i=0 - - if (isOpen == this.isOpen) - return - - if (browserVersion == 2) - { - totalHeight = 0 - for (i=0; i < this.nChildren; i++) - totalHeight = totalHeight + this.children[i].navObj.clip.height - subEntries = this.subEntries() - if (this.isOpen) - totalHeight = 0 - totalHeight - for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) - indexOfEntries[fIt].navObj.moveBy(0, totalHeight) - } - this.isOpen = isOpen - propagateChangesInState(this) -} - -function propagateChangesInState(folder) -{ - var i=0 - - if (folder.isOpen) - { - if (folder.nodeImg) - if (folder.isLastNode) - folder.nodeImg.src = "ftv2mlastnode.png" - else - folder.nodeImg.src = "ftv2mnode.png" - folder.iconImg.src = "ftv2folderopen.png" - for (i=0; i 0) - auxEv = "" - else - auxEv = "" - - if (level>0) - if (lastNode) //the last 'brother' in the children array - { - this.renderOb(leftSide + auxEv + "") -// leftSide = leftSide + "" - this.isLastNode = 1 - } - else - { - this.renderOb(leftSide + auxEv + "") - leftSide = leftSide + "" - this.isLastNode = 0 - } - else - this.renderOb("") - - if (nc > 0) - { - level = level + 1 - for (i=0 ; i < this.nChildren; i++) - { - if (i == this.nChildren-1) - this.children[i].initialize(level, 1, leftSide) - else - this.children[i].initialize(level, 0, leftSide) - } - } -} - -function drawFolder(leftSide) -{ - if (browserVersion == 2) { - if (!doc.yPos) - doc.yPos=8 - doc.write("") - } - if (browserVersion == 3) - { - doc.write("
") - } - - doc.write("\n") - doc.write("\n\n") - doc.write("\n
") - doc.write(leftSide) - this.outputLink() - doc.write("") - doc.write("") - if (USETEXTLINKS) - { - this.outputLink() - doc.write(this.desc + "") - } - else - doc.write(this.desc) - -/*! - if (this.tagName!="") - { - doc.write(" [external]") - } -*/ - doc.write("
\n") - - if (browserVersion == 2) { - doc.write("") - } - if (browserVersion == 3) { - doc.write("
") - } - - if (browserVersion == 1) { - this.navObj = doc.all["folder"+this.id] - this.iconImg = doc.all["folderIcon"+this.id] - this.nodeImg = doc.all["nodeIcon"+this.id] - } else if (browserVersion == 2) { - this.navObj = doc.layers["folder"+this.id] - this.iconImg = this.navObj.document.images["folderIcon"+this.id] - this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] - doc.yPos=doc.yPos+this.navObj.clip.height - } else if (browserVersion == 3) { - this.navObj = doc.getElementById("folder"+this.id) - this.iconImg = doc.images.namedItem("folderIcon"+this.id) - this.nodeImg = doc.images.namedItem("nodeIcon"+this.id) - } -} - -function outputFolderLink() -{ - if (this.hreference) - { - doc.write(" 0) - doc.write("onClick='javascript:clickOnFolder("+this.id+")'") - doc.write(">") - } - else - doc.write("") -} - -function addChild(childNode) -{ - this.children[this.nChildren] = childNode - this.nChildren++ - return childNode -} - -function folderSubEntries() -{ - var i = 0 - var se = this.nChildren - - for (i=0; i < this.nChildren; i++){ - if (this.children[i].children) //is a folder - se = se + this.children[i].subEntries() - } - - return se -} - - -// Definition of class Item (a document or link inside a Folder) -// ************************************************************* - -function Item(itemDescription, tagName, itemLink) // Constructor -{ - // constant data - this.desc = itemDescription - this.tagName = tagName - this.link = itemLink - this.id = -1 //initialized in initalize() - this.navObj = 0 //initialized in render() - this.iconImg = 0 //initialized in render() - this.iconSrc = "ftv2doc.png" - - // methods - this.initialize = initializeItem - this.createIndex = createEntryIndex - this.hide = hideItem - this.display = display - this.renderOb = drawItem - this.totalHeight = totalHeight -} - -function hideItem() -{ - if (browserVersion == 1 || browserVersion == 3) { - if (this.navObj.style.display == "none") - return - this.navObj.style.display = "none" - } else { - if (this.navObj.visibility == "hidden") - return - this.navObj.visibility = "hidden" - } -} - -function initializeItem(level, lastNode, leftSide) -{ - this.createIndex() - - if (level>0) - if (lastNode) //the last 'brother' in the children array - { - this.renderOb(leftSide + "") - leftSide = leftSide + "" - } - else - { - this.renderOb(leftSide + "") - leftSide = leftSide + "" - } - else - this.renderOb("") -} - -function drawItem(leftSide) -{ - if (browserVersion == 2) - doc.write("") - if (browserVersion == 3) - doc.write("
") - - doc.write("\n\n") - doc.write("\n
") - doc.write(leftSide) - if (this.link!="") - { - doc.write("") - } - doc.write("") - if (this.link!="") - { - doc.write("") - } - doc.write("") - if (USETEXTLINKS && this.link!="") - doc.write("" + this.desc + "") - else - doc.write(this.desc) -/*! - if (this.tagName!="") - { - doc.write(" [external]"); - } -*/ - doc.write("\n
\n") - - if (browserVersion == 2) - doc.write("") - if (browserVersion == 3) - doc.write("
") - - if (browserVersion == 1) { - this.navObj = doc.all["item"+this.id] - this.iconImg = doc.all["itemIcon"+this.id] - } else if (browserVersion == 2) { - this.navObj = doc.layers["item"+this.id] - this.iconImg = this.navObj.document.images["itemIcon"+this.id] - doc.yPos=doc.yPos+this.navObj.clip.height - } else if (browserVersion == 3) { - this.navObj = doc.getElementById("item"+this.id) - this.iconImg = doc.images.namedItem("itemIcon"+this.id) - } -} - - -// Methods common to both objects (pseudo-inheritance) -// ******************************************************** - -function display() -{ - if (browserVersion == 1 || browserVersion == 3) - this.navObj.style.display = "block" - else - this.navObj.visibility = "show" -} - -function createEntryIndex() -{ - this.id = nEntries - indexOfEntries[nEntries] = this - nEntries++ -} - -// total height of subEntries open -function totalHeight() //used with browserVersion == 2 -{ - var h = this.navObj.clip.height - var i = 0 - - if (this.isOpen) //is a folder and _is_ open - for (i=0 ; i < this.nChildren; i++) - h = h + this.children[i].totalHeight() - - return h -} - - -// Events -// ********************************************************* - -function clickOnFolder(folderId) -{ - var clicked = indexOfEntries[folderId] - - if (!clicked.isOpen) - clickOnNode(folderId) - - return - - if (clicked.isSelected) - return -} - -function clickOnNode(folderId) -{ - var clickedFolder = 0 - var state = 0 - - clickedFolder = indexOfEntries[folderId] - state = clickedFolder.isOpen - - clickedFolder.setState(!state) //open<->close -} - -function initializeDocument() -{ - doc = document; - if (doc.all) - browserVersion = 1 //IE4 - else - if (doc.layers) - browserVersion = 2 //NS4 - else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1) - browserVersion = 3 //mozilla - else - browserVersion = 0 //other - - foldersTree.initialize(0, 1, "") - foldersTree.display() - - if (browserVersion > 0) - { - if(browserVersion != 3) - doc.write(" ") - - // close the whole tree - clickOnNode(0) - // open the root folder - clickOnNode(0) - } -} - -// Auxiliary Functions for Folder-Treee backward compatibility -// ********************************************************* - -function gFld(description, tagName, hreference) -{ - folder = new Folder(description, tagName, hreference) - return folder -} - -function gLnk(description, tagName, linkData) -{ - fullLink = "" - - if (linkData!="") - { - fullLink = "'"+linkData+"' target=\"basefrm\"" - } - - linkItem = new Item(description, tagName, fullLink) - return linkItem -} - -function insFld(parentFolder, childFolder) -{ - return parentFolder.addChild(childFolder) -} - -function insDoc(parentFolder, document) -{ - parentFolder.addChild(document) -} - -// Global variables -// **************** - -USETEXTLINKS = 1 -indexOfEntries = new Array -nEntries = 0 -doc = document -browserVersion = 0 -selectedFolder=0 diff --git a/idl/Makefile.in b/idl/Makefile.in deleted file mode 100644 index 8bc4e84d3..000000000 --- a/idl/Makefile.in +++ /dev/null @@ -1,74 +0,0 @@ -# -# generate dependencies for idl file : -# - -# source path -top_srcdir=@top_srcdir@ -top_builddir=.. -srcdir=@srcdir@ -VPATH=.:${KERNEL_ROOT_DIR}/idl/salome:${GEOM_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome - -@COMMENCE@ - -IDL_FILES = \ - SMESH_Gen.idl \ - SMESH_Mesh.idl \ - SMESH_Hypothesis.idl \ - SMESH_BasicHypothesis.idl \ - SMESH_Filter.idl \ - SMESH_Group.idl \ - SMESH_Pattern.idl - -PY_CLIENT_IDL = $(IDL_FILES) - -# we copy all idl file in $(top_builddir)/idl -inc: $(top_builddir)/idl/salome $(IDL_FILES:%=$(top_builddir)/idl/salome/%) - -$(top_builddir)/idl/salome: - mkdir $@ - -$(IDL_FILES:%=$(top_builddir)/idl/salome/%):$(IDL_FILES:%=$(top_srcdir)/idl/%) -# $(CP) $< $@ - cp -f $^ $(top_builddir)/idl/salome - - -lib: pyidl - -PYTHON_BUILD_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/@PACKAGE@ - -pyidl: $(PYTHON_BUILD_SITE) $(IDL_FILES:%.idl=$(PYTHON_BUILD_SITE)/%_idl.py) - -$(PYTHON_BUILD_SITE): - $(INSTALL) -d $@ - -$(PYTHON_BUILD_SITE)/%_idl.py: $(top_builddir)/idl/salome/%.idl - $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_BUILD_SITE) $< - - -# install python client (generated from idl file -install: install-pyidl install-idl - -# create directory $(idldir) and copy idl files into it -install-idl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%) - $(INSTALL) -d $(idldir) - $(INSTALL_DATA) $^ $(idldir) - - -install-pyidl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%) - $(INSTALL) -d $(PYTHON_SITE_INSTALL) - @for file in $^ dummy; do \ - if [ $$file != "dummy" ]; then \ - $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_SITE_INSTALL) $$file ; \ - fi ; \ - done ; - -#@ CONCLUDE @ - -cleandep: - -$(RM) .dep* - -distclean: - -$(RM) *.py - -$(RM) $(IDL_FILES:%=$(top_builddir)/idl/salome/%) - -$(RM) Makefile - diff --git a/idl/SMESH_Group.idl b/idl/SMESH_Group.idl deleted file mode 100644 index 37657674b..000000000 --- a/idl/SMESH_Group.idl +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Group.idl -// Author : Sergey ANIKIN, OCC -// $Header$ - - -#ifndef _SMESH_GROUP_IDL_ -#define _SMESH_GROUP_IDL_ - -#include "SALOME_Exception.idl" -#include "SALOME_GenericObj.idl" - -#include "SMESH_Mesh.idl" - -module SMESH -{ - interface Predicate; - - /*! - * SMESH_Group: base interface of group object - */ - interface SMESH_GroupBase : SALOME::GenericObj, SMESH_IDSource - { - /*! - * Sets group name - */ - void SetName( in string name ); - - /*! - * Returns group name - */ - string GetName(); - - /*! - * Returns group type (type of elements in the group) - */ - ElementType GetType(); - - /*! - * Returns the number of elements in the group - */ - long Size(); - - /*! - * Returns true if the group does not contain any elements - */ - boolean IsEmpty(); - - /*! - * returns true if the group contains an element with ID == - */ - boolean Contains( in long elem_id ); - - /*! - * Returns ID of an element at position - */ - long GetID( in long elem_index ); - - /*! - * Returns a sequence of all element IDs in the group - */ - long_array GetListOfID(); - - /*! - * Returns the mesh object this group belongs to - */ - SMESH_Mesh GetMesh(); - }; - - /*! - * SMESH_Group: interface of group object - */ - interface SMESH_Group : SMESH_GroupBase - { - /*! - * Clears the group's contents - */ - void Clear(); - - /*! - * Adds elements to the group - */ - long Add( in long_array elem_ids ); - long AddByPredicate( in Predicate thePredicate ); - - /*! - * Removes elements from the group - */ - long Remove( in long_array elem_ids ); - long RemoveByPredicate( in Predicate thePredicate ); - - }; - /*! - * SMESH_Group: interface of group object linked to geometry - */ - interface SMESH_GroupOnGeom : SMESH_GroupBase - { - GEOM::GEOM_Object GetShape(); - }; - -}; - - -#endif diff --git a/idl/SMESH_Hypothesis.idl b/idl/SMESH_Hypothesis.idl deleted file mode 100644 index 69832b9ed..000000000 --- a/idl/SMESH_Hypothesis.idl +++ /dev/null @@ -1,102 +0,0 @@ -// 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 : SMESH_Hypothesis.idl -// Author : Paul RASCLE, EDF -// $Header$ - -#ifndef _SMESH_HYPOTHESIS_IDL_ -#define _SMESH_HYPOTHESIS_IDL_ - -#include "SALOME_Exception.idl" -#include "SALOME_GenericObj.idl" - -module SMESH -{ - enum Dimension - { - DIM_1D, - DIM_2D, - DIM_3D - }; - - interface SMESH_Hypothesis : SALOME::GenericObj - { - /*! - * Get the Hypothesis typeName - */ - string GetName(); - - /*! - * Get the Hypothesis plugin library Name - */ - string GetLibName(); - - /*! - * Get the internal Id - */ - long GetId(); - - /*! - * Verify whether hypothesis supports given entity type - */ - boolean IsDimSupported( in Dimension type ); - }; - - typedef sequence ListOfHypothesisName; - - interface SMESH_Algo : SMESH_Hypothesis - { - /*! - * Get list of hypothesis that can be used with this algorithm - */ - ListOfHypothesisName GetCompatibleHypothesis(); - - }; - - interface SMESH_1D_Algo : SMESH_Algo - { - /*! - * - */ - }; - - interface SMESH_2D_Algo : SMESH_Algo - { - /*! - * - */ - }; - - interface SMESH_3D_Algo : SMESH_Algo - { - /*! - * - */ - }; -}; - - // ----------------------------------------------------------------- - // Specific Algorithms in separate idl file - // ----------------------------------------------------------------- - - -#endif diff --git a/idl/SMESH_Pattern.idl b/idl/SMESH_Pattern.idl deleted file mode 100644 index d2324a0b2..000000000 --- a/idl/SMESH_Pattern.idl +++ /dev/null @@ -1,189 +0,0 @@ -// 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 : SMESH_Pattern.idl -// Created : Mon Aug 2 10:48:36 2004 -// Author : Edward AGAPOV (eap) -// $Header: - -#ifndef _SMESH_PATTERN_IDL_ -#define _SMESH_PATTERN_IDL_ - -#include "SMESH_Mesh.idl" - -module SMESH -{ - - typedef sequence point_array; - - /*! - * SMESH_Pattern: interface of mesh pattern - */ - interface SMESH_Pattern { - - /*! - * Load a pattern from the string - */ - boolean LoadFromFile(in string theFileContents); - - /*! - * Create a pattern from the mesh built on . - * ==true makes override nodes positions - * on computed by mesher - */ - boolean LoadFromFace(in SMESH_Mesh theMesh, - in GEOM::GEOM_Object theFace, - in boolean theProject); - - /*! - * Create a pattern from the mesh built on - */ - boolean LoadFrom3DBlock(in SMESH_Mesh theMesh, - in GEOM::GEOM_Object theBlock); - - /*! - * Compute nodes coordinates applying - * the loaded pattern to . The first key-point - * will be mapped into , which must - * be in the outer wire of theFace - */ - point_array ApplyToFace(in GEOM::GEOM_Object theFace, - in GEOM::GEOM_Object theVertexOnKeyPoint1, - in boolean theReverse); - - /*! - * Compute nodes coordinates applying - * the loaded pattern to . The (0,0,0) key-point - * will be mapped into . The (0,0,1) - * key-point will be mapped into . - */ - point_array ApplyTo3DBlock(in GEOM::GEOM_Object theBlock, - in GEOM::GEOM_Object theVertex000, - in GEOM::GEOM_Object theVertex001); - - /*! - * Compute nodes coordinates applying - * the loaded pattern to mesh faces. The first key-point - * will be mapped into -th node of each face - */ - point_array ApplyToMeshFaces(in SMESH_Mesh theMesh, - in long_array theFacesIDs, - in long theNodeIndexOnKeyPoint1, - in boolean theReverse); - - /*! - * Compute nodes coordinates applying - * the loaded pattern to hexahedrons. The (0,0,0) key-point - * will be mapped into -th node of each volume. - * The (0,0,1) key-point will be mapped into -th - * node of each volume. - */ - point_array ApplyToHexahedrons(in SMESH_Mesh theMesh, - in long_array theVolumesIDs, - in long theNode000Index, - in long theNode001Index); - - /*! - * Create nodes and elements in using nodes - * coordinates computed by either of Apply...() methods. - * If CreatePolygons is TRUE, replace adjacent faces by polygons - * to keep mesh conformity. - * If CreatePolyedrs is TRUE, replace adjacent volumes by polyedrs - * to keep mesh conformity. - */ - boolean MakeMesh (in SMESH_Mesh theMesh, - in boolean CreatePolygons, - in boolean CreatePolyedrs); - - /*! - * Return the loaded pattern in the string form to be saved in file - */ - string GetString(); - - /*! - * error code of the last of one of above operations - */ - enum ErrorCode { - ERR_OK, - // Load(file) - ERR_READ_NB_POINTS, // couldn't read nb of points - ERR_READ_POINT_COORDS, // invalid nb of point coordinates - ERR_READ_TOO_FEW_POINTS, // too few points in a pattern - ERR_READ_3D_COORD, // coordinate of 3D point out of [0,1] range - ERR_READ_NO_KEYPOINT, // no key-points in 2D pattern - ERR_READ_BAD_INDEX, // invalid point index - ERR_READ_ELEM_POINTS, // invalid nb of points in element - ERR_READ_NO_ELEMS, // no elements in a pattern - ERR_READ_BAD_KEY_POINT, // a key-point not on a boundary - // Save(file) - ERR_SAVE_NOT_LOADED, // pattern was not loaded - // Load(shape) - ERR_LOAD_EMPTY_SUBMESH, // no elements to load - // Load(face) - ERR_LOADF_NARROW_FACE, // too narrow face - ERR_LOADF_CLOSED_FACE, // closed face - // Load(volume) - ERR_LOADV_BAD_SHAPE, // volume is not a brick of 6 faces - ERR_LOADV_COMPUTE_PARAMS, // cant compute point parameters - // Apply(shape) - ERR_APPL_NOT_LOADED, // pattern was not loaded - ERR_APPL_BAD_DIMENTION, // wrong shape dimention - ERR_APPL_BAD_NB_VERTICES, // keypoints - vertices mismatch - // Apply(face) - ERR_APPLF_BAD_TOPOLOGY, // bad pattern topology - ERR_APPLF_BAD_VERTEX, // first vertex not on an outer face boundary - ERR_APPLF_INTERNAL_EEROR, // program error - // Apply(volume) - ERR_APPLV_BAD_SHAPE, // volume is not a brick of 6 faces - // MakeMesh - ERR_MAKEM_NOT_COMPUTED // mapping failed - }; - - /*! - * Return error code of the last operation - */ - ErrorCode GetErrorCode(); - - /*! - * Return true if the loaded pattern is a 2D one - */ - boolean Is2D(); - - /*! - * Return coordinates of pattern points - */ - point_array GetPoints(); - - /*! - * Return indices of key-points within the arrays returned by - * GetPoints() - */ - long_array GetKeyPoints(); - - /*! - * Return nodal connectivity of the elements of the pattern - * or of all elements to be crated - */ - array_of_long_array GetElementPoints(in boolean all); - }; -}; - -#endif diff --git a/resources/ModuleMesh.png b/resources/ModuleMesh.png deleted file mode 100755 index 5e781ac34..000000000 Binary files a/resources/ModuleMesh.png and /dev/null differ diff --git a/resources/SMESH.config b/resources/SMESH.config deleted file mode 100644 index ec675575a..000000000 --- a/resources/SMESH.config +++ /dev/null @@ -1,2 +0,0 @@ -language=en -resources=StdMeshers:NETGENPlugin \ No newline at end of file diff --git a/resources/SMESH_en.xml b/resources/SMESH_en.xml deleted file mode 100644 index 7d314c75d..000000000 --- a/resources/SMESH_en.xml +++ /dev/null @@ -1,483 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/SMESH_fr.xml b/resources/SMESH_fr.xml deleted file mode 100644 index d5dbf4640..000000000 --- a/resources/SMESH_fr.xml +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/advanced_mesh_info.png b/resources/advanced_mesh_info.png deleted file mode 100644 index 01eaea267..000000000 Binary files a/resources/advanced_mesh_info.png and /dev/null differ diff --git a/resources/delete.png b/resources/delete.png deleted file mode 100644 index 8ae847527..000000000 Binary files a/resources/delete.png and /dev/null differ diff --git a/resources/mesh.png b/resources/mesh.png deleted file mode 100644 index f8147b3f8..000000000 Binary files a/resources/mesh.png and /dev/null differ diff --git a/resources/mesh_add.png b/resources/mesh_add.png deleted file mode 100755 index 2dde69a72..000000000 Binary files a/resources/mesh_add.png and /dev/null differ diff --git a/resources/mesh_add_sub.png b/resources/mesh_add_sub.png deleted file mode 100644 index 20d8d8f62..000000000 Binary files a/resources/mesh_add_sub.png and /dev/null differ diff --git a/resources/mesh_algo_hexa.png b/resources/mesh_algo_hexa.png deleted file mode 100644 index 87e50a89f..000000000 Binary files a/resources/mesh_algo_hexa.png and /dev/null differ diff --git a/resources/mesh_algo_mefisto.png b/resources/mesh_algo_mefisto.png deleted file mode 100644 index 21616d052..000000000 Binary files a/resources/mesh_algo_mefisto.png and /dev/null differ diff --git a/resources/mesh_algo_netgen.png b/resources/mesh_algo_netgen.png deleted file mode 100644 index 87e50a89f..000000000 Binary files a/resources/mesh_algo_netgen.png and /dev/null differ diff --git a/resources/mesh_algo_quad.png b/resources/mesh_algo_quad.png deleted file mode 100644 index f31b93c95..000000000 Binary files a/resources/mesh_algo_quad.png and /dev/null differ diff --git a/resources/mesh_algo_regular.png b/resources/mesh_algo_regular.png deleted file mode 100644 index 47593f16d..000000000 Binary files a/resources/mesh_algo_regular.png and /dev/null differ diff --git a/resources/mesh_algo_tetra.png b/resources/mesh_algo_tetra.png deleted file mode 100644 index 3fb67d507..000000000 Binary files a/resources/mesh_algo_tetra.png and /dev/null differ diff --git a/resources/mesh_angle.png b/resources/mesh_angle.png deleted file mode 100644 index 5b03e5776..000000000 Binary files a/resources/mesh_angle.png and /dev/null differ diff --git a/resources/mesh_area.png b/resources/mesh_area.png deleted file mode 100644 index 9c51c32ed..000000000 Binary files a/resources/mesh_area.png and /dev/null differ diff --git a/resources/mesh_aspect.png b/resources/mesh_aspect.png deleted file mode 100644 index ffc98c835..000000000 Binary files a/resources/mesh_aspect.png and /dev/null differ diff --git a/resources/mesh_aspect_3d.png b/resources/mesh_aspect_3d.png deleted file mode 100644 index 479263444..000000000 Binary files a/resources/mesh_aspect_3d.png and /dev/null differ diff --git a/resources/mesh_compute.png b/resources/mesh_compute.png deleted file mode 100644 index c06dc7ba9..000000000 Binary files a/resources/mesh_compute.png and /dev/null differ diff --git a/resources/mesh_connectivity.png b/resources/mesh_connectivity.png deleted file mode 100644 index 9ce3e4455..000000000 Binary files a/resources/mesh_connectivity.png and /dev/null differ diff --git a/resources/mesh_cutGroups.png b/resources/mesh_cutGroups.png deleted file mode 100644 index b06bb8052..000000000 Binary files a/resources/mesh_cutGroups.png and /dev/null differ diff --git a/resources/mesh_cutquad.png b/resources/mesh_cutquad.png deleted file mode 100644 index 836343c7c..000000000 Binary files a/resources/mesh_cutquad.png and /dev/null differ diff --git a/resources/mesh_deleteGroups.png b/resources/mesh_deleteGroups.png deleted file mode 100644 index b7126e002..000000000 Binary files a/resources/mesh_deleteGroups.png and /dev/null differ diff --git a/resources/mesh_diagonal.png b/resources/mesh_diagonal.png deleted file mode 100644 index c997cefc7..000000000 Binary files a/resources/mesh_diagonal.png and /dev/null differ diff --git a/resources/mesh_edit.png b/resources/mesh_edit.png deleted file mode 100644 index 5ad2f1504..000000000 Binary files a/resources/mesh_edit.png and /dev/null differ diff --git a/resources/mesh_edit_group.png b/resources/mesh_edit_group.png deleted file mode 100644 index 4747a66b9..000000000 Binary files a/resources/mesh_edit_group.png and /dev/null differ diff --git a/resources/mesh_extrusion.png b/resources/mesh_extrusion.png deleted file mode 100644 index 76909c0e1..000000000 Binary files a/resources/mesh_extrusion.png and /dev/null differ diff --git a/resources/mesh_extrusionpath.png b/resources/mesh_extrusionpath.png deleted file mode 100644 index 47f0aa76a..000000000 Binary files a/resources/mesh_extrusionpath.png and /dev/null differ diff --git a/resources/mesh_free_edges.png b/resources/mesh_free_edges.png deleted file mode 100755 index 5813e11e6..000000000 Binary files a/resources/mesh_free_edges.png and /dev/null differ diff --git a/resources/mesh_free_edges_2d.png b/resources/mesh_free_edges_2d.png deleted file mode 100644 index cc6cdb8ad..000000000 Binary files a/resources/mesh_free_edges_2d.png and /dev/null differ diff --git a/resources/mesh_hexa.png b/resources/mesh_hexa.png deleted file mode 100644 index b4b64b2e4..000000000 Binary files a/resources/mesh_hexa.png and /dev/null differ diff --git a/resources/mesh_hexa_n.png b/resources/mesh_hexa_n.png deleted file mode 100644 index 74532b4ed..000000000 Binary files a/resources/mesh_hexa_n.png and /dev/null differ diff --git a/resources/mesh_hypo_area.png b/resources/mesh_hypo_area.png deleted file mode 100644 index 487fdb749..000000000 Binary files a/resources/mesh_hypo_area.png and /dev/null differ diff --git a/resources/mesh_hypo_edit.png b/resources/mesh_hypo_edit.png deleted file mode 100644 index 8f61dea7c..000000000 Binary files a/resources/mesh_hypo_edit.png and /dev/null differ diff --git a/resources/mesh_hypo_length.png b/resources/mesh_hypo_length.png deleted file mode 100644 index d6106a3ea..000000000 Binary files a/resources/mesh_hypo_length.png and /dev/null differ diff --git a/resources/mesh_hypo_segment.png b/resources/mesh_hypo_segment.png deleted file mode 100644 index 2d9245023..000000000 Binary files a/resources/mesh_hypo_segment.png and /dev/null differ diff --git a/resources/mesh_hypo_volume.png b/resources/mesh_hypo_volume.png deleted file mode 100644 index 925a5ba87..000000000 Binary files a/resources/mesh_hypo_volume.png and /dev/null differ diff --git a/resources/mesh_info.png b/resources/mesh_info.png deleted file mode 100644 index b0c0c17c3..000000000 Binary files a/resources/mesh_info.png and /dev/null differ diff --git a/resources/mesh_init.png b/resources/mesh_init.png deleted file mode 100644 index dbf1a2ed6..000000000 Binary files a/resources/mesh_init.png and /dev/null differ diff --git a/resources/mesh_intersectGroups.png b/resources/mesh_intersectGroups.png deleted file mode 100644 index 7d473cfc8..000000000 Binary files a/resources/mesh_intersectGroups.png and /dev/null differ diff --git a/resources/mesh_length.png b/resources/mesh_length.png deleted file mode 100644 index 64ddd5104..000000000 Binary files a/resources/mesh_length.png and /dev/null differ diff --git a/resources/mesh_length_2d.png b/resources/mesh_length_2d.png deleted file mode 100644 index 0009dc0cc..000000000 Binary files a/resources/mesh_length_2d.png and /dev/null differ diff --git a/resources/mesh_line.png b/resources/mesh_line.png deleted file mode 100644 index f699e13d8..000000000 Binary files a/resources/mesh_line.png and /dev/null differ diff --git a/resources/mesh_line_n.png b/resources/mesh_line_n.png deleted file mode 100644 index ce082c63c..000000000 Binary files a/resources/mesh_line_n.png and /dev/null differ diff --git a/resources/mesh_make_group.png b/resources/mesh_make_group.png deleted file mode 100644 index 19ba2e66e..000000000 Binary files a/resources/mesh_make_group.png and /dev/null differ diff --git a/resources/mesh_merge_elements.png b/resources/mesh_merge_elements.png deleted file mode 100644 index 3bc292fc4..000000000 Binary files a/resources/mesh_merge_elements.png and /dev/null differ diff --git a/resources/mesh_merge_nodes.png b/resources/mesh_merge_nodes.png deleted file mode 100644 index 275862ed8..000000000 Binary files a/resources/mesh_merge_nodes.png and /dev/null differ diff --git a/resources/mesh_move_node.png b/resources/mesh_move_node.png deleted file mode 100644 index 678add55e..000000000 Binary files a/resources/mesh_move_node.png and /dev/null differ diff --git a/resources/mesh_multi_edges.png b/resources/mesh_multi_edges.png deleted file mode 100755 index 0a36db1b5..000000000 Binary files a/resources/mesh_multi_edges.png and /dev/null differ diff --git a/resources/mesh_multi_edges_2d.png b/resources/mesh_multi_edges_2d.png deleted file mode 100644 index 627ceebbf..000000000 Binary files a/resources/mesh_multi_edges_2d.png and /dev/null differ diff --git a/resources/mesh_orientation.png b/resources/mesh_orientation.png deleted file mode 100644 index 9639b31d7..000000000 Binary files a/resources/mesh_orientation.png and /dev/null differ diff --git a/resources/mesh_pattern.png b/resources/mesh_pattern.png deleted file mode 100755 index 9440269b7..000000000 Binary files a/resources/mesh_pattern.png and /dev/null differ diff --git a/resources/mesh_points.png b/resources/mesh_points.png deleted file mode 100644 index f0d2c78a8..000000000 Binary files a/resources/mesh_points.png and /dev/null differ diff --git a/resources/mesh_polygon.png b/resources/mesh_polygon.png deleted file mode 100644 index a1f671b1f..000000000 Binary files a/resources/mesh_polygon.png and /dev/null differ diff --git a/resources/mesh_polyhedron.png b/resources/mesh_polyhedron.png deleted file mode 100644 index f475dec62..000000000 Binary files a/resources/mesh_polyhedron.png and /dev/null differ diff --git a/resources/mesh_pyramid.png b/resources/mesh_pyramid.png deleted file mode 100644 index 480f5730c..000000000 Binary files a/resources/mesh_pyramid.png and /dev/null differ diff --git a/resources/mesh_pyramid_n.png b/resources/mesh_pyramid_n.png deleted file mode 100644 index edde6a59f..000000000 Binary files a/resources/mesh_pyramid_n.png and /dev/null differ diff --git a/resources/mesh_quad.png b/resources/mesh_quad.png deleted file mode 100644 index 1eba33ebb..000000000 Binary files a/resources/mesh_quad.png and /dev/null differ diff --git a/resources/mesh_quad_n.png b/resources/mesh_quad_n.png deleted file mode 100644 index 499068e34..000000000 Binary files a/resources/mesh_quad_n.png and /dev/null differ diff --git a/resources/mesh_rem_element.png b/resources/mesh_rem_element.png deleted file mode 100644 index a2bb0f12a..000000000 Binary files a/resources/mesh_rem_element.png and /dev/null differ diff --git a/resources/mesh_rem_node.png b/resources/mesh_rem_node.png deleted file mode 100644 index c4f2834fc..000000000 Binary files a/resources/mesh_rem_node.png and /dev/null differ diff --git a/resources/mesh_remove.png b/resources/mesh_remove.png deleted file mode 100755 index 960f1ac00..000000000 Binary files a/resources/mesh_remove.png and /dev/null differ diff --git a/resources/mesh_renumbering_elements.png b/resources/mesh_renumbering_elements.png deleted file mode 100644 index b7bcc1cc6..000000000 Binary files a/resources/mesh_renumbering_elements.png and /dev/null differ diff --git a/resources/mesh_renumbering_nodes.png b/resources/mesh_renumbering_nodes.png deleted file mode 100644 index dc1cb3dc8..000000000 Binary files a/resources/mesh_renumbering_nodes.png and /dev/null differ diff --git a/resources/mesh_revolution.png b/resources/mesh_revolution.png deleted file mode 100644 index 3190e5f1b..000000000 Binary files a/resources/mesh_revolution.png and /dev/null differ diff --git a/resources/mesh_rotation.png b/resources/mesh_rotation.png deleted file mode 100644 index b971d4554..000000000 Binary files a/resources/mesh_rotation.png and /dev/null differ diff --git a/resources/mesh_set_algo.png b/resources/mesh_set_algo.png deleted file mode 100644 index d14d68612..000000000 Binary files a/resources/mesh_set_algo.png and /dev/null differ diff --git a/resources/mesh_set_hypo.png b/resources/mesh_set_hypo.png deleted file mode 100644 index 68949b83e..000000000 Binary files a/resources/mesh_set_hypo.png and /dev/null differ diff --git a/resources/mesh_sew_bordertoside.png b/resources/mesh_sew_bordertoside.png deleted file mode 100644 index 48a3ba1d3..000000000 Binary files a/resources/mesh_sew_bordertoside.png and /dev/null differ diff --git a/resources/mesh_sew_conform_freeborders.png b/resources/mesh_sew_conform_freeborders.png deleted file mode 100644 index fff04a28e..000000000 Binary files a/resources/mesh_sew_conform_freeborders.png and /dev/null differ diff --git a/resources/mesh_sew_freeborders.png b/resources/mesh_sew_freeborders.png deleted file mode 100644 index 4b0f694dc..000000000 Binary files a/resources/mesh_sew_freeborders.png and /dev/null differ diff --git a/resources/mesh_sew_sideelements.png b/resources/mesh_sew_sideelements.png deleted file mode 100644 index 2c64b875d..000000000 Binary files a/resources/mesh_sew_sideelements.png and /dev/null differ diff --git a/resources/mesh_shading.png b/resources/mesh_shading.png deleted file mode 100644 index a2535afaa..000000000 Binary files a/resources/mesh_shading.png and /dev/null differ diff --git a/resources/mesh_shrink.png b/resources/mesh_shrink.png deleted file mode 100644 index 59e7b4062..000000000 Binary files a/resources/mesh_shrink.png and /dev/null differ diff --git a/resources/mesh_skew.png b/resources/mesh_skew.png deleted file mode 100644 index 45cca1b3e..000000000 Binary files a/resources/mesh_skew.png and /dev/null differ diff --git a/resources/mesh_smoothing.png b/resources/mesh_smoothing.png deleted file mode 100644 index 0da777dfa..000000000 Binary files a/resources/mesh_smoothing.png and /dev/null differ diff --git a/resources/mesh_symmetry_axis.png b/resources/mesh_symmetry_axis.png deleted file mode 100644 index dd5e19bcf..000000000 Binary files a/resources/mesh_symmetry_axis.png and /dev/null differ diff --git a/resources/mesh_symmetry_plane.png b/resources/mesh_symmetry_plane.png deleted file mode 100644 index 91a720354..000000000 Binary files a/resources/mesh_symmetry_plane.png and /dev/null differ diff --git a/resources/mesh_symmetry_point.png b/resources/mesh_symmetry_point.png deleted file mode 100644 index 81a29a73c..000000000 Binary files a/resources/mesh_symmetry_point.png and /dev/null differ diff --git a/resources/mesh_taper.png b/resources/mesh_taper.png deleted file mode 100644 index 68dbc66e6..000000000 Binary files a/resources/mesh_taper.png and /dev/null differ diff --git a/resources/mesh_tetra.png b/resources/mesh_tetra.png deleted file mode 100644 index 6812d5b68..000000000 Binary files a/resources/mesh_tetra.png and /dev/null differ diff --git a/resources/mesh_tetra_n.png b/resources/mesh_tetra_n.png deleted file mode 100644 index fa4d0fae9..000000000 Binary files a/resources/mesh_tetra_n.png and /dev/null differ diff --git a/resources/mesh_translation_points.png b/resources/mesh_translation_points.png deleted file mode 100644 index 1805c97fb..000000000 Binary files a/resources/mesh_translation_points.png and /dev/null differ diff --git a/resources/mesh_translation_vector.png b/resources/mesh_translation_vector.png deleted file mode 100644 index dc4f08af1..000000000 Binary files a/resources/mesh_translation_vector.png and /dev/null differ diff --git a/resources/mesh_tree_algo.png b/resources/mesh_tree_algo.png deleted file mode 100644 index 61b11bbdd..000000000 Binary files a/resources/mesh_tree_algo.png and /dev/null differ diff --git a/resources/mesh_tree_algo_hexa.png b/resources/mesh_tree_algo_hexa.png deleted file mode 100644 index cb75b7e9d..000000000 Binary files a/resources/mesh_tree_algo_hexa.png and /dev/null differ diff --git a/resources/mesh_tree_algo_mefisto.png b/resources/mesh_tree_algo_mefisto.png deleted file mode 100644 index 5375071b5..000000000 Binary files a/resources/mesh_tree_algo_mefisto.png and /dev/null differ diff --git a/resources/mesh_tree_algo_netgen.png b/resources/mesh_tree_algo_netgen.png deleted file mode 100644 index cb75b7e9d..000000000 Binary files a/resources/mesh_tree_algo_netgen.png and /dev/null differ diff --git a/resources/mesh_tree_algo_quad.png b/resources/mesh_tree_algo_quad.png deleted file mode 100644 index fe6ce0285..000000000 Binary files a/resources/mesh_tree_algo_quad.png and /dev/null differ diff --git a/resources/mesh_tree_algo_regular.png b/resources/mesh_tree_algo_regular.png deleted file mode 100644 index ecd1f7351..000000000 Binary files a/resources/mesh_tree_algo_regular.png and /dev/null differ diff --git a/resources/mesh_tree_algo_tetra.png b/resources/mesh_tree_algo_tetra.png deleted file mode 100644 index 9c21a58c1..000000000 Binary files a/resources/mesh_tree_algo_tetra.png and /dev/null differ diff --git a/resources/mesh_tree_group.png b/resources/mesh_tree_group.png deleted file mode 100644 index cfcfc687f..000000000 Binary files a/resources/mesh_tree_group.png and /dev/null differ diff --git a/resources/mesh_tree_hypo.png b/resources/mesh_tree_hypo.png deleted file mode 100644 index 3ab76a6e8..000000000 Binary files a/resources/mesh_tree_hypo.png and /dev/null differ diff --git a/resources/mesh_tree_hypo_area.png b/resources/mesh_tree_hypo_area.png deleted file mode 100644 index 22c8bd0ae..000000000 Binary files a/resources/mesh_tree_hypo_area.png and /dev/null differ diff --git a/resources/mesh_tree_hypo_length.png b/resources/mesh_tree_hypo_length.png deleted file mode 100644 index abe34f5b4..000000000 Binary files a/resources/mesh_tree_hypo_length.png and /dev/null differ diff --git a/resources/mesh_tree_hypo_segment.png b/resources/mesh_tree_hypo_segment.png deleted file mode 100644 index 1957e6d8f..000000000 Binary files a/resources/mesh_tree_hypo_segment.png and /dev/null differ diff --git a/resources/mesh_tree_hypo_volume.png b/resources/mesh_tree_hypo_volume.png deleted file mode 100644 index fb18eadce..000000000 Binary files a/resources/mesh_tree_hypo_volume.png and /dev/null differ diff --git a/resources/mesh_tree_importedmesh.png b/resources/mesh_tree_importedmesh.png deleted file mode 100644 index 0c37d0a7e..000000000 Binary files a/resources/mesh_tree_importedmesh.png and /dev/null differ diff --git a/resources/mesh_tree_mesh.png b/resources/mesh_tree_mesh.png deleted file mode 100644 index 2a2ff57d6..000000000 Binary files a/resources/mesh_tree_mesh.png and /dev/null differ diff --git a/resources/mesh_tree_mesh_warn.png b/resources/mesh_tree_mesh_warn.png deleted file mode 100644 index d61b873c3..000000000 Binary files a/resources/mesh_tree_mesh_warn.png and /dev/null differ diff --git a/resources/mesh_triangle.png b/resources/mesh_triangle.png deleted file mode 100644 index 9a2a6fd60..000000000 Binary files a/resources/mesh_triangle.png and /dev/null differ diff --git a/resources/mesh_triangle_n.png b/resources/mesh_triangle_n.png deleted file mode 100644 index a7228d322..000000000 Binary files a/resources/mesh_triangle_n.png and /dev/null differ diff --git a/resources/mesh_union2tri.png b/resources/mesh_union2tri.png deleted file mode 100644 index 88831b9af..000000000 Binary files a/resources/mesh_union2tri.png and /dev/null differ diff --git a/resources/mesh_unionGroups.png b/resources/mesh_unionGroups.png deleted file mode 100644 index c3412bb09..000000000 Binary files a/resources/mesh_unionGroups.png and /dev/null differ diff --git a/resources/mesh_uniontri.png b/resources/mesh_uniontri.png deleted file mode 100644 index 229cb6aa8..000000000 Binary files a/resources/mesh_uniontri.png and /dev/null differ diff --git a/resources/mesh_update.png b/resources/mesh_update.png deleted file mode 100644 index 8757e3063..000000000 Binary files a/resources/mesh_update.png and /dev/null differ diff --git a/resources/mesh_vertex.png b/resources/mesh_vertex.png deleted file mode 100644 index b85d63a13..000000000 Binary files a/resources/mesh_vertex.png and /dev/null differ diff --git a/resources/mesh_vertex_n.png b/resources/mesh_vertex_n.png deleted file mode 100644 index dfbafc945..000000000 Binary files a/resources/mesh_vertex_n.png and /dev/null differ diff --git a/resources/mesh_wireframe.png b/resources/mesh_wireframe.png deleted file mode 100644 index 01e82f034..000000000 Binary files a/resources/mesh_wireframe.png and /dev/null differ diff --git a/resources/mesh_wrap.png b/resources/mesh_wrap.png deleted file mode 100644 index c919168bc..000000000 Binary files a/resources/mesh_wrap.png and /dev/null differ diff --git a/resources/pattern_sample_2d.png b/resources/pattern_sample_2d.png deleted file mode 100755 index 290872b51..000000000 Binary files a/resources/pattern_sample_2d.png and /dev/null differ diff --git a/resources/pattern_sample_3D.png b/resources/pattern_sample_3D.png deleted file mode 100755 index b3066858e..000000000 Binary files a/resources/pattern_sample_3D.png and /dev/null differ diff --git a/resources/select1.png b/resources/select1.png deleted file mode 100644 index 99ebde65e..000000000 Binary files a/resources/select1.png and /dev/null differ diff --git a/resources/standard_mesh_info.png b/resources/standard_mesh_info.png deleted file mode 100644 index 060008742..000000000 Binary files a/resources/standard_mesh_info.png and /dev/null differ diff --git a/src/Controls/SMESHControls.cxx b/src/Controls/SMESHControls.cxx deleted file mode 100644 index 0c8d145a3..000000000 --- a/src/Controls/SMESHControls.cxx +++ /dev/null @@ -1,45 +0,0 @@ -// 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 - -#include "SMESH_ControlsDef.hxx" - -int main(int argc, char** argv) -{ - using namespace SMESH::Controls; - new MinimumAngle(); - new AspectRatio(); - new Warping(); - new Taper(); - new Skew(); - new Area(); - new Length(); - // new Length2D(); - new MultiConnection(); - // new MultiConnection2D(); - new FreeBorders(); - new LessThan(); - new MoreThan(); - new EqualTo(); - new LogicalNOT(); - new LogicalAND(); - new LogicalOR(); - new ManifoldPart(); - - return 1; -} diff --git a/src/Controls/SMESH_Controls.hxx b/src/Controls/SMESH_Controls.hxx deleted file mode 100644 index fa4558db5..000000000 --- a/src/Controls/SMESH_Controls.hxx +++ /dev/null @@ -1,43 +0,0 @@ -// 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 - -#ifndef _SMESH_CONTROLS_HXX_ -#define _SMESH_CONTROLS_HXX_ - -#include - -namespace SMESH{ - namespace Controls{ - - class Functor; - typedef boost::shared_ptr FunctorPtr; - - - class NumericalFunctor; - typedef boost::shared_ptr NumericalFunctorPtr; - - - class Predicate; - typedef boost::shared_ptr PredicatePtr; - - } -} - - -#endif diff --git a/src/Controls/SMESH_ControlsDef.hxx b/src/Controls/SMESH_ControlsDef.hxx deleted file mode 100644 index 576b1e8e0..000000000 --- a/src/Controls/SMESH_ControlsDef.hxx +++ /dev/null @@ -1,660 +0,0 @@ -// 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 - -#ifndef _SMESH_CONTROLSDEF_HXX_ -#define _SMESH_CONTROLSDEF_HXX_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SMDSAbs_ElementType.hxx" -#include "SMDS_MeshNode.hxx" - -#include "SMESH_Controls.hxx" - -class SMDS_MeshElement; -class SMDS_MeshFace; -class SMDS_MeshNode; -class SMDS_Mesh; - -class SMESHDS_Mesh; -class SMESHDS_SubMesh; - -class gp_Pnt; -class TopoDS_Shape; - - -namespace SMESH{ - namespace Controls{ - - class TSequenceOfXYZ: public std::vector - { - public: - typedef std::vector TSuperClass; - TSequenceOfXYZ() - {} - - TSequenceOfXYZ(size_type n): - TSuperClass(n) - {} - - TSequenceOfXYZ(size_type n, const value_type& t): - TSuperClass(n,t) - {} - - TSequenceOfXYZ(const TSequenceOfXYZ& theSequenceOfXYZ): - TSuperClass(theSequenceOfXYZ) - {} - - template - TSequenceOfXYZ(InputIterator theBegin, InputIterator theEnd): - TSuperClass(theBegin,theEnd) - {} - - TSequenceOfXYZ& operator=(const TSequenceOfXYZ& theSequenceOfXYZ){ - TSuperClass::operator=(theSequenceOfXYZ); - return *this; - } - - reference operator()(size_type n){ - return TSuperClass::operator[](n-1); - } - - const_reference operator()(size_type n) const{ - return TSuperClass::operator[](n-1); - } - - private: - reference operator[](size_type n); - - const_reference operator[](size_type n) const; - }; - - /* - Class : Functor - Description : Root of all Functors - */ - class Functor - { - public: - ~Functor(){} - virtual void SetMesh( const SMDS_Mesh* theMesh ) = 0; - virtual SMDSAbs_ElementType GetType() const = 0; - }; - - /* - Class : NumericalFunctor - Description : Root of all Functors returning numeric value - */ - class NumericalFunctor: public virtual Functor{ - public: - NumericalFunctor(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual double GetValue( long theElementId ); - virtual double GetValue(const TSequenceOfXYZ& thePoints) { return -1.0;}; - virtual SMDSAbs_ElementType GetType() const = 0; - virtual double GetBadRate( double Value, int nbNodes ) const = 0; - long GetPrecision() const; - void SetPrecision( const long thePrecision ); - - bool GetPoints(const int theId, - TSequenceOfXYZ& theRes) const; - static bool GetPoints(const SMDS_MeshElement* theElem, - TSequenceOfXYZ& theRes); - protected: - const SMDS_Mesh* myMesh; - long myPrecision; - }; - - - /* - Class : Volume - Description : Functor calculating volume of 3D mesh element - */ - class Volume: public virtual NumericalFunctor{ - public: - virtual double GetValue( long theElementId ); - //virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : SMESH_MinimumAngle - Description : Functor for calculation of minimum angle - */ - class MinimumAngle: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : AspectRatio - Description : Functor for calculating aspect ratio - */ - class AspectRatio: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : AspectRatio3D - Description : Functor for calculating aspect ratio of 3D elems. - */ - class AspectRatio3D: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : Warping - Description : Functor for calculating warping - */ - class Warping: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - - private: - double ComputeA( const gp_XYZ&, const gp_XYZ&, const gp_XYZ&, const gp_XYZ& ) const; - }; - - - /* - Class : Taper - Description : Functor for calculating taper - */ - class Taper: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : Skew - Description : Functor for calculating skew in degrees - */ - class Skew: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : Area - Description : Functor for calculating area - */ - class Area: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : Length - Description : Functor for calculating length of edge - */ - class Length: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - /* - Class : Length2D - Description : Functor for calculating length of edge - */ - class Length2D: public virtual NumericalFunctor{ - public: - virtual double GetValue( long theElementId ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - struct Value{ - double myLength; - long myPntId[2]; - Value(double theLength, long thePntId1, long thePntId2); - bool operator<(const Value& x) const; - }; - typedef std::set TValues; - void GetValues(TValues& theValues); - - }; - typedef boost::shared_ptr Length2DPtr; - - /* - Class : MultiConnection - Description : Functor for calculating number of faces conneted to the edge - */ - class MultiConnection: public virtual NumericalFunctor{ - public: - virtual double GetValue( long theElementId ); - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - /* - Class : MultiConnection2D - Description : Functor for calculating number of faces conneted to the edge - */ - class MultiConnection2D: public virtual NumericalFunctor{ - public: - virtual double GetValue( long theElementId ); - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - struct Value{ - long myPntId[2]; - Value(long thePntId1, long thePntId2); - bool operator<(const Value& x) const; - }; - typedef std::map MValues; - - void GetValues(MValues& theValues); - }; - typedef boost::shared_ptr MultiConnection2DPtr; - /* - PREDICATES - */ - /* - Class : Predicate - Description : Base class for all predicates - */ - class Predicate: public virtual Functor{ - public: - virtual bool IsSatisfy( long theElementId ) = 0; - virtual SMDSAbs_ElementType GetType() const = 0; - }; - - - - /* - Class : FreeBorders - Description : Predicate for free borders - */ - class FreeBorders: public virtual Predicate{ - public: - FreeBorders(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - - protected: - const SMDS_Mesh* myMesh; - }; - - - /* - Class : BadOrientedVolume - Description : Predicate bad oriented volumes - */ - class BadOrientedVolume: public virtual Predicate{ - public: - BadOrientedVolume(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - - protected: - const SMDS_Mesh* myMesh; - }; - - - /* - Class : FreeEdges - Description : Predicate for free Edges - */ - class FreeEdges: public virtual Predicate{ - public: - FreeEdges(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - static bool IsFreeEdge( const SMDS_MeshNode** theNodes, const int theFaceId ); - typedef long TElemId; - struct Border{ - TElemId myElemId; - TElemId myPntId[2]; - Border(long theElemId, long thePntId1, long thePntId2); - bool operator<(const Border& x) const; - }; - typedef std::set TBorders; - void GetBoreders(TBorders& theBorders); - - protected: - const SMDS_Mesh* myMesh; - }; - typedef boost::shared_ptr FreeEdgesPtr; - - - /* - Class : RangeOfIds - Description : Predicate for Range of Ids. - Range may be specified with two ways. - 1. Using AddToRange method - 2. With SetRangeStr method. Parameter of this method is a string - like as "1,2,3,50-60,63,67,70-" - */ - class RangeOfIds: public virtual Predicate - { - public: - RangeOfIds(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theNodeId ); - virtual SMDSAbs_ElementType GetType() const; - virtual void SetType( SMDSAbs_ElementType theType ); - - bool AddToRange( long theEntityId ); - void GetRangeStr( TCollection_AsciiString& ); - bool SetRangeStr( const TCollection_AsciiString& ); - - protected: - const SMDS_Mesh* myMesh; - - TColStd_SequenceOfInteger myMin; - TColStd_SequenceOfInteger myMax; - TColStd_MapOfInteger myIds; - - SMDSAbs_ElementType myType; - }; - - typedef boost::shared_ptr RangeOfIdsPtr; - - - /* - Class : Comparator - Description : Base class for comparators - */ - class Comparator: public virtual Predicate{ - public: - Comparator(); - virtual ~Comparator(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual void SetMargin(double theValue); - virtual void SetNumFunctor(NumericalFunctorPtr theFunct); - virtual bool IsSatisfy( long theElementId ) = 0; - virtual SMDSAbs_ElementType GetType() const; - double GetMargin(); - - protected: - double myMargin; - NumericalFunctorPtr myFunctor; - }; - typedef boost::shared_ptr ComparatorPtr; - - - /* - Class : LessThan - Description : Comparator "<" - */ - class LessThan: public virtual Comparator{ - public: - virtual bool IsSatisfy( long theElementId ); - }; - - - /* - Class : MoreThan - Description : Comparator ">" - */ - class MoreThan: public virtual Comparator{ - public: - virtual bool IsSatisfy( long theElementId ); - }; - - - /* - Class : EqualTo - Description : Comparator "=" - */ - class EqualTo: public virtual Comparator{ - public: - EqualTo(); - virtual bool IsSatisfy( long theElementId ); - virtual void SetTolerance( double theTol ); - virtual double GetTolerance(); - - private: - double myToler; - }; - typedef boost::shared_ptr EqualToPtr; - - - /* - Class : LogicalNOT - Description : Logical NOT predicate - */ - class LogicalNOT: public virtual Predicate{ - public: - LogicalNOT(); - virtual ~LogicalNOT(); - virtual bool IsSatisfy( long theElementId ); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual void SetPredicate(PredicatePtr thePred); - virtual SMDSAbs_ElementType GetType() const; - - private: - PredicatePtr myPredicate; - }; - typedef boost::shared_ptr LogicalNOTPtr; - - - /* - Class : LogicalBinary - Description : Base class for binary logical predicate - */ - class LogicalBinary: public virtual Predicate{ - public: - LogicalBinary(); - virtual ~LogicalBinary(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual void SetPredicate1(PredicatePtr thePred); - virtual void SetPredicate2(PredicatePtr thePred); - virtual SMDSAbs_ElementType GetType() const; - - protected: - PredicatePtr myPredicate1; - PredicatePtr myPredicate2; - }; - typedef boost::shared_ptr LogicalBinaryPtr; - - - /* - Class : LogicalAND - Description : Logical AND - */ - class LogicalAND: public virtual LogicalBinary{ - public: - virtual bool IsSatisfy( long theElementId ); - }; - - - /* - Class : LogicalOR - Description : Logical OR - */ - class LogicalOR: public virtual LogicalBinary{ - public: - virtual bool IsSatisfy( long theElementId ); - }; - - - /* - Class : ManifoldPart - Description : Predicate for manifold part of mesh - */ - class ManifoldPart: public virtual Predicate{ - public: - - /* internal class for algorithm uses */ - class Link - { - public: - Link( SMDS_MeshNode* theNode1, - SMDS_MeshNode* theNode2 ); - ~Link(); - - bool IsEqual( const ManifoldPart::Link& theLink ) const; - bool operator<(const ManifoldPart::Link& x) const; - - SMDS_MeshNode* myNode1; - SMDS_MeshNode* myNode2; - }; - - bool IsEqual( const ManifoldPart::Link& theLink1, - const ManifoldPart::Link& theLink2 ); - - typedef std::set TMapOfLink; - typedef std::vector TVectorOfFacePtr; - typedef std::vector TVectorOfLink; - typedef std::map TDataMapFacePtrInt; - typedef std::map TDataMapOfLinkFacePtr; - - ManifoldPart(); - ~ManifoldPart(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - // inoke when all parameters already set - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - - void SetAngleTolerance( const double theAngToler ); - double GetAngleTolerance() const; - void SetIsOnlyManifold( const bool theIsOnly ); - void SetStartElem( const long theStartElemId ); - - private: - bool process(); - bool findConnected( const TDataMapFacePtrInt& theAllFacePtrInt, - SMDS_MeshFace* theStartFace, - TMapOfLink& theNonManifold, - TColStd_MapOfInteger& theResFaces ); - bool isInPlane( const SMDS_MeshFace* theFace1, - const SMDS_MeshFace* theFace2 ); - void expandBoundary( TMapOfLink& theMapOfBoundary, - TVectorOfLink& theSeqOfBoundary, - TDataMapOfLinkFacePtr& theDMapLinkFacePtr, - TMapOfLink& theNonManifold, - SMDS_MeshFace* theNextFace ) const; - - void getFacesByLink( const Link& theLink, - TVectorOfFacePtr& theFaces ) const; - - private: - const SMDS_Mesh* myMesh; - TColStd_MapOfInteger myMapIds; - TColStd_MapOfInteger myMapBadGeomIds; - TVectorOfFacePtr myAllFacePtr; - TDataMapFacePtrInt myAllFacePtrIntDMap; - double myAngToler; - bool myIsOnlyManifold; - long myStartElemId; - - }; - typedef boost::shared_ptr ManifoldPartPtr; - - - /* - Class : ElementsOnSurface - Description : Predicate elements that lying on indicated surface - (plane or cylinder) - */ - class ElementsOnSurface : public virtual Predicate { - public: - ElementsOnSurface(); - ~ElementsOnSurface(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - - void SetTolerance( const double theToler ); - double GetTolerance() const; - void SetSurface( const TopoDS_Shape& theShape, - const SMDSAbs_ElementType theType ); - - private: - void process(); - void process( const SMDS_MeshElement* theElem ); - bool isOnSurface( const SMDS_MeshNode* theNode ) const; - - private: - const SMDS_Mesh* myMesh; - TColStd_MapOfInteger myIds; - SMDSAbs_ElementType myType; - Handle(Geom_Surface) mySurf; - double myToler; - }; - - typedef boost::shared_ptr ElementsOnSurfacePtr; - - - /* - FILTER - */ - class Filter{ - public: - Filter(); - virtual ~Filter(); - virtual void SetPredicate(PredicatePtr thePred); - - typedef std::vector TIdSequence; - - virtual - void - GetElementsId( const SMDS_Mesh* theMesh, - TIdSequence& theSequence ); - - static - void - GetElementsId( const SMDS_Mesh* theMesh, - PredicatePtr thePredicate, - TIdSequence& theSequence ); - - protected: - PredicatePtr myPredicate; - }; - }; -}; - - -#endif diff --git a/src/Driver/Driver_Document.cxx b/src/Driver/Driver_Document.cxx deleted file mode 100644 index 159c1a85a..000000000 --- a/src/Driver/Driver_Document.cxx +++ /dev/null @@ -1,36 +0,0 @@ -// 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 - -#include "Driver_Document.h" - -Driver_Document::Driver_Document(): - myDocument(NULL) -{} - - -void Driver_Document::SetFile(const std::string& theFileName) -{ - myFile = theFileName; -} - - -void Driver_Document::SetDocument(SMESHDS_Document * theDocument) -{ - myDocument = theDocument; -} diff --git a/src/Driver/Driver_Document.h b/src/Driver/Driver_Document.h deleted file mode 100644 index 8d4ff5a68..000000000 --- a/src/Driver/Driver_Document.h +++ /dev/null @@ -1,44 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVER_DOCUMENT -#define _INCLUDE_DRIVER_DOCUMENT - -#include - -class SMESHDS_Document; - -class Driver_Document -{ - public: - Driver_Document(); - virtual ~Driver_Document(){} - - virtual void Perform() = 0; - void SetFile(const std::string& theFileName); - void SetDocument(SMESHDS_Document *theDocument); - - protected: - SMESHDS_Document * myDocument; - std::string myFile; - -}; - - -#endif diff --git a/src/Driver/Driver_Mesh.cxx b/src/Driver/Driver_Mesh.cxx deleted file mode 100644 index f656bdd5d..000000000 --- a/src/Driver/Driver_Mesh.cxx +++ /dev/null @@ -1,46 +0,0 @@ -// SMESH Driver : implementaion of driver for reading and writing -// -// 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 : Mesh_Reader.cxx -// Module : SMESH - -#include "Driver_Mesh.h" - -using namespace std; - -Driver_Mesh::Driver_Mesh(): - myFile(""), - myMeshId(-1) -{} - - -void Driver_Mesh::SetMeshId(int theMeshId) -{ - myMeshId = theMeshId; -} - - -void Driver_Mesh::SetFile(const std::string& theFileName) -{ - myFile = theFileName; -} diff --git a/src/Driver/Driver_Mesh.h b/src/Driver/Driver_Mesh.h deleted file mode 100644 index 14ca22fd1..000000000 --- a/src/Driver/Driver_Mesh.h +++ /dev/null @@ -1,63 +0,0 @@ -// SMESH Driver : implementaion of driver for reading and writing -// -// 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 : Mesh_Reader.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVER_MESH -#define _INCLUDE_DRIVER_MESH - -#include - -#if defined WNT && defined WIN32 && defined DRIVER_EXPORTS -#define DRIVER_WNT_EXPORT __declspec( dllexport ) -#else -#define DRIVER_WNT_EXPORT -#endif - -class DRIVER_WNT_EXPORT Driver_Mesh -{ - public: - Driver_Mesh(); - virtual ~Driver_Mesh(){} - - enum Status { - DRS_OK, - DRS_EMPTY, // a file contains no mesh with the given name - DRS_WARN_RENUMBER, // a file has overlapped ranges of element numbers, - // so the numbers from the file are ignored - DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data - DRS_FAIL // general failure (exception etc.) - }; - - virtual Status Perform() = 0; - void SetMeshId(int theMeshId); - void SetFile(const std::string& theFileName); - - protected: - std::string myFile; - int myMeshId; - -}; - -#endif diff --git a/src/Driver/Driver_SMDS_Mesh.cxx b/src/Driver/Driver_SMDS_Mesh.cxx deleted file mode 100644 index dae030df0..000000000 --- a/src/Driver/Driver_SMDS_Mesh.cxx +++ /dev/null @@ -1,31 +0,0 @@ -// 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 - -#include "Driver_SMDS_Mesh.h" - -using namespace std; - -Driver_SMDS_Mesh::Driver_SMDS_Mesh(): - myMesh(NULL) -{} - -void Driver_SMDS_Mesh::SetMesh(SMDS_Mesh *theMesh) -{ - myMesh = theMesh; -} diff --git a/src/Driver/Driver_SMDS_Mesh.h b/src/Driver/Driver_SMDS_Mesh.h deleted file mode 100644 index 1ea37562d..000000000 --- a/src/Driver/Driver_SMDS_Mesh.h +++ /dev/null @@ -1,38 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVER_SMDS_MESH -#define _INCLUDE_DRIVER_SMDS_MESH - -#include "Driver_Mesh.h" - -class SMDS_Mesh; - -class Driver_SMDS_Mesh: public Driver_Mesh -{ - public: - Driver_SMDS_Mesh(); - void SetMesh(SMDS_Mesh *theMesh); - - protected: - SMDS_Mesh *myMesh; - -}; - -#endif diff --git a/src/Driver/Driver_SMESHDS_Mesh.cxx b/src/Driver/Driver_SMESHDS_Mesh.cxx deleted file mode 100644 index 2bf88277d..000000000 --- a/src/Driver/Driver_SMESHDS_Mesh.cxx +++ /dev/null @@ -1,31 +0,0 @@ -// 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 - -#include "Driver_SMESHDS_Mesh.h" - -using namespace std; - -Driver_SMESHDS_Mesh::Driver_SMESHDS_Mesh(): - myMesh(NULL) -{} - -void Driver_SMESHDS_Mesh::SetMesh(SMESHDS_Mesh *theMesh) -{ - myMesh = theMesh; -} diff --git a/src/Driver/Driver_SMESHDS_Mesh.h b/src/Driver/Driver_SMESHDS_Mesh.h deleted file mode 100644 index 30e059522..000000000 --- a/src/Driver/Driver_SMESHDS_Mesh.h +++ /dev/null @@ -1,44 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVER_SMESHDS_MESH -#define _INCLUDE_DRIVER_SMESHDS_MESH - -#include "Driver_Mesh.h" - -class SMESHDS_Mesh; - -#if defined WNT && defined WIN32 && defined DRIVER_EXPORTS -#define DRIVER_WNT_EXPORT __declspec( dllexport ) -#else -#define DRIVER_WNT_EXPORT -#endif - -class DRIVER_WNT_EXPORT Driver_SMESHDS_Mesh: public Driver_Mesh -{ - public: - Driver_SMESHDS_Mesh(); - void SetMesh(SMESHDS_Mesh *theMesh); - - protected: - SMESHDS_Mesh *myMesh; - -}; - -#endif diff --git a/src/Driver/Makefile.in b/src/Driver/Makefile.in deleted file mode 100644 index d1c71416d..000000000 --- a/src/Driver/Makefile.in +++ /dev/null @@ -1,60 +0,0 @@ -# SMESH Driver : implementaion of driver for reading and writing -# -# 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) -# Module : SMESH -# $Header$ - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - - -@COMMENCE@ - -# header files -EXPORT_HEADERS= Driver_Document.h Driver_Mesh.h \ - Driver_SMDS_Mesh.h Driver_SMESHDS_Mesh.h - -# Libraries targets -LIB = libMeshDriver.la -LIB_SRC = Driver_Document.cxx Driver_Mesh.cxx \ - Driver_SMDS_Mesh.cxx Driver_SMESHDS_Mesh.cxx - -LIB_CLIENT_IDL = - -LIB_SERVER_IDL = - -# additionnal information to compil and link file -CPPFLAGS += -CXXFLAGS += - -LDFLAGS += $(OCC_KERNEL_LIBS) -lTKTopAlgo -lSMESHDS -L${KERNEL_ROOT_DIR}/lib/salome -lOpUtil - - -@CONCLUDE@ - - - diff --git a/src/DriverDAT/DAT_Test.cxx b/src/DriverDAT/DAT_Test.cxx deleted file mode 100644 index a36b4dd10..000000000 --- a/src/DriverDAT/DAT_Test.cxx +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#include "DriverDAT_R_SMDS_Mesh.h" -#include "DriverDAT_W_SMDS_Mesh.h" - -int main(int argc, char** argv) -{ - DriverDAT_R_SMDS_Mesh aR; - DriverDAT_W_SMDS_Mesh aW; - return 1; -} diff --git a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx deleted file mode 100644 index a49d7dbf3..000000000 --- a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx +++ /dev/null @@ -1,170 +0,0 @@ -// 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 - -#include - -#include "DriverDAT_R_SMDS_Mesh.h" -#include "SMDS_Mesh.hxx" - -#include "utilities.h" - -using namespace std; - -Driver_Mesh::Status DriverDAT_R_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - - int i, j; - int nbNodes, nbCells; - int intNumPoint; - float coordX, coordY, coordZ; - int nbNoeuds; - - int intNumMaille, Degre; - int ValElement; - int ValDegre; - int NoeudsMaille[20]; - int NoeudMaille; - - bool ok; - - MESSAGE("in DriverDAT_R_SMDS_Mesh::Read()"); - /**************************************************************************** - * OUVERTURE DU FICHIER EN LECTURE * - ****************************************************************************/ - char *file2Read = (char *)myFile.c_str(); - FILE* aFileId = fopen(file2Read, "r"); - if (aFileId < 0) { - fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read); - return DRS_FAIL; - } - - fscanf(aFileId, "%d %d\n", &nbNodes, &nbCells); - - /**************************************************************************** - * LECTURE DES NOEUDS * - ****************************************************************************/ - fprintf(stdout, "\n(************************)\n"); - fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n"); - fprintf(stdout, "(************************)\n"); - - for (i = 0; i < nbNodes; i++){ - fscanf(aFileId, "%d %e %e %e\n", &intNumPoint, &coordX, &coordY, &coordZ); - ok = myMesh->AddNodeWithID(coordX, coordY, coordZ, intNumPoint); - } - - fprintf(stdout, "%d noeuds\n", myMesh->NbNodes()); - /**************************************************************************** - * LECTURE DES ELEMENTS * - ****************************************************************************/ - fprintf(stdout, "\n(**************************)\n"); - fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n"); - fprintf(stdout, "(**************************)"); - - fprintf(stdout, "%d elements\n", nbCells); - - for (i = 0; i < nbCells; i++) { - fscanf(aFileId, "%d %d", &intNumMaille, &ValElement); - Degre = abs(ValElement / 100); - nbNoeuds = ValElement - (Degre * 100); - - // Recuperation des noeuds de la maille - for (j = 0; j < nbNoeuds; j++) { - fscanf(aFileId, "%d", &NoeudMaille); - NoeudsMaille[j] = NoeudMaille; - } - - // Analyse des cas de cellules - switch (ValElement) { - case 102: - case 103: - ValDegre = 3; - nbNoeuds = 2; - ok = myMesh->AddEdgeWithID(NoeudsMaille[0], NoeudsMaille[1], - intNumMaille); - break; - case 204: - case 208: - ValDegre = 9; - nbNoeuds = 4; - ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], NoeudsMaille[3], - intNumMaille); - break; - case 203: - case 206: - ValDegre = 5; - nbNoeuds = 3; - ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], intNumMaille); - break; - case 308: - case 320: - ValDegre = 12; - nbNoeuds = 8; - if (ValElement == 320){ - //A voir, correspondance VTK - NoeudsMaille[4] = NoeudsMaille[8]; - NoeudsMaille[5] = NoeudsMaille[9]; - NoeudsMaille[6] = NoeudsMaille[10]; - NoeudsMaille[7] = NoeudsMaille[11]; - } - ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], NoeudsMaille[3], - NoeudsMaille[4], NoeudsMaille[5], - NoeudsMaille[6], NoeudsMaille[7], - intNumMaille); - break; - case 304: - case 310: - ValDegre = 10; - nbNoeuds = 4; - if (ValElement == 310) - NoeudsMaille[3] = NoeudsMaille[6]; - ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], NoeudsMaille[3], - intNumMaille); - break; - case 306: - case 315: - ValDegre = 12; - nbNoeuds = 8; - if (ValElement == 315) { - NoeudsMaille[3] = NoeudsMaille[6]; - NoeudsMaille[4] = NoeudsMaille[7]; - NoeudsMaille[5] = NoeudsMaille[8]; - } - NoeudsMaille[7] = NoeudsMaille[5]; - NoeudsMaille[6] = NoeudsMaille[5]; - NoeudsMaille[5] = NoeudsMaille[4]; - NoeudsMaille[4] = NoeudsMaille[3]; - NoeudsMaille[3] = NoeudsMaille[2]; - ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], NoeudsMaille[3], - NoeudsMaille[4], NoeudsMaille[5], - intNumMaille); - break; - } - } - /**************************************************************************** - * FERMETURE DU FICHIER * - ****************************************************************************/ - fclose(aFileId); - return aResult; -} diff --git a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.h b/src/DriverDAT/DriverDAT_R_SMDS_Mesh.h deleted file mode 100644 index d955cf7b7..000000000 --- a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.h +++ /dev/null @@ -1,31 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERDAT_R_SMDS_MESH -#define _INCLUDE_DRIVERDAT_R_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class DriverDAT_R_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - virtual Status Perform(); -}; - -#endif diff --git a/src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx b/src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx deleted file mode 100644 index c7d9b2230..000000000 --- a/src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverDAT_R_SMESHDS_Document.h" diff --git a/src/DriverDAT/DriverDAT_R_SMESHDS_Document.h b/src/DriverDAT/DriverDAT_R_SMESHDS_Document.h deleted file mode 100644 index 3d63ced6a..000000000 --- a/src/DriverDAT/DriverDAT_R_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERDAT_R_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERDAT_R_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverDAT_R_SMESHDS_Document : public Driver_Document -{}; - -#endif diff --git a/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx b/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx deleted file mode 100644 index a7e974f52..000000000 --- a/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverDAT_R_SMESHDS_Mesh.h" diff --git a/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h b/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h deleted file mode 100644 index e74967581..000000000 --- a/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERDAT_R_SMESHDS_MESH -#define _INCLUDE_DRIVERDAT_R_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" - -class DriverDAT_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{}; - -#endif diff --git a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx deleted file mode 100644 index 1f8d5ab61..000000000 --- a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx +++ /dev/null @@ -1,144 +0,0 @@ -// 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 - -#include - -#include "DriverDAT_W_SMDS_Mesh.h" - -#include "SMDS_Mesh.hxx" - -#include "utilities.h" - -using namespace std; - -Driver_Mesh::Status DriverDAT_W_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - - int nbNodes, nbCells; - int i; - - char *file2Read = (char *)myFile.c_str(); - FILE* aFileId = fopen(file2Read, "w+"); - if (aFileId < 0) { - fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read); - return DRS_FAIL; - } - SCRUTE(myMesh); - /**************************************************************************** - * NOMBRES D'OBJETS * - ****************************************************************************/ - fprintf(stdout, "\n(****************************)\n"); - fprintf(stdout, "(* INFORMATIONS GENERALES : *)\n"); - fprintf(stdout, "(****************************)\n"); - - /* Combien de noeuds ? */ - nbNodes = myMesh->NbNodes(); - - /* Combien de mailles, faces ou aretes ? */ - int nb_of_nodes, nb_of_edges, nb_of_faces, nb_of_volumes; - nb_of_edges = myMesh->NbEdges(); - nb_of_faces = myMesh->NbFaces(); - nb_of_volumes = myMesh->NbVolumes(); - nbCells = nb_of_edges + nb_of_faces + nb_of_volumes; - SCRUTE(nb_of_edges); - SCRUTE(nb_of_faces); - SCRUTE(nb_of_volumes); - - fprintf(stdout, "%d %d\n", nbNodes, nbCells); - fprintf(aFileId, "%d %d\n", nbNodes, nbCells); - - /**************************************************************************** - * ECRITURE DES NOEUDS * - ****************************************************************************/ - fprintf(stdout, "\n(************************)\n"); - fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n"); - fprintf(stdout, "(************************)\n"); - - SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator(); - while(itNodes->more()){ - const SMDS_MeshNode * node = itNodes->next(); - fprintf(aFileId, "%d %e %e %e\n", node->GetID(), node->X(), node->Y(), node->Z()); - } - - /**************************************************************************** - * ECRITURE DES ELEMENTS * - ****************************************************************************/ - fprintf(stdout, "\n(**************************)\n"); - fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n"); - fprintf(stdout, "(**************************)"); - /* Ecriture des connectivites, noms, numeros des mailles */ - - SMDS_EdgeIteratorPtr itEdges=myMesh->edgesIterator(); - while(itEdges->more()){ - const SMDS_MeshElement * elem = itEdges->next(); - switch (elem->NbNodes()) { - case 2: - fprintf(aFileId, "%d %d ", elem->GetID(), 102); - break; - case 3: - fprintf(aFileId, "%d %d ", elem->GetID(), 103); - break; - } - SMDS_ElemIteratorPtr it=elem->nodesIterator(); - while(it->more()) - fprintf(aFileId, "%d ", it->next()->GetID()); - fprintf(aFileId, "\n"); - } - - SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator(); - while(itFaces->more()){ - const SMDS_MeshElement * elem = itFaces->next(); - switch (elem->NbNodes()) { - case 3: - fprintf(aFileId, "%d %d ", elem->GetID(), 203); - break; - case 4: - fprintf(aFileId, "%d %d ", elem->GetID(), 204); - break; - case 6: - fprintf(aFileId, "%d %d ", elem->GetID(), 206); - break; - } - SMDS_ElemIteratorPtr it=elem->nodesIterator(); - while(it->more()) - fprintf(aFileId, "%d ", it->next()->GetID()); - fprintf(aFileId, "\n"); - } - - SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator(); - while(itVolumes->more()){ - const SMDS_MeshElement * elem = itVolumes->next(); - switch (elem->NbNodes()) { - case 8: - fprintf(aFileId, "%d %d ", elem->GetID(), 308); - break; - } - - SMDS_ElemIteratorPtr it=elem->nodesIterator(); - while(it->more()) - fprintf(aFileId, "%d ", it->next()->GetID()); - - fprintf(aFileId, "\n"); - } - - fclose(aFileId); - - return aResult; -} diff --git a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.h b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.h deleted file mode 100644 index ebd3d642e..000000000 --- a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.h +++ /dev/null @@ -1,38 +0,0 @@ -// SMESH DriverDAT : driver to read and write 'dat' files -// -// 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 : DriverDAT_W_SMDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERDAT_W_SMDS_MESH -#define _INCLUDE_DRIVERDAT_W_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class DriverDAT_W_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - virtual Status Perform(); -}; - -#endif diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx b/src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx deleted file mode 100644 index 1cd9699af..000000000 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverDAT_W_SMESHDS_Document.h" diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Document.h b/src/DriverDAT/DriverDAT_W_SMESHDS_Document.h deleted file mode 100644 index 6b2bad5a0..000000000 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERDAT_W_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERDAT_W_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverDAT_W_SMESHDS_Document: public Driver_Document -{}; - -#endif diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx b/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx deleted file mode 100644 index e17c6cdd2..000000000 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverDAT_W_SMESHDS_Mesh.h" diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h b/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h deleted file mode 100644 index b9b9130c2..000000000 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h +++ /dev/null @@ -1,35 +0,0 @@ -// SMESH DriverDAT : driver to read and write 'dat' files -// -// 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 : DriverDAT_W_SMESHDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERDAT_W_SMESHDS_MESH -#define _INCLUDE_DRIVERDAT_W_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" - -class DriverDAT_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{}; - -#endif diff --git a/src/DriverMED/DriverMED_Family.cxx b/src/DriverMED/DriverMED_Family.cxx deleted file mode 100644 index 47a923dbd..000000000 --- a/src/DriverMED/DriverMED_Family.cxx +++ /dev/null @@ -1,390 +0,0 @@ -// SMESH DriverMED : tool to split groups on families -// -// Copyright (C) 2003 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverMED_Family.cxx -// Author : Julia DOROVSKIKH -// Module : SMESH -// $Header$ - -#include "DriverMED_Family.h" -#include "MED_Factory.hxx" - -#include - -using namespace std; - -//============================================================================= -/*! - * Split each group from list on some parts (families) - * on the basis of the elements membership in other groups from this list. - * Resulting families have no common elements. - */ -//============================================================================= -list DriverMED_Family::MakeFamilies - (const map & theSubMeshes, - const list& theGroups, - const bool doGroupOfNodes, - const bool doGroupOfEdges, - const bool doGroupOfFaces, - const bool doGroupOfVolumes) -{ - list aFamilies; - - string anAllNodesGroupName = "Group_Of_All_Nodes"; - string anAllEdgesGroupName = "Group_Of_All_Edges"; - string anAllFacesGroupName = "Group_Of_All_Faces"; - string anAllVolumesGroupName = "Group_Of_All_Volumes"; - - // Reserve four ids for families of free elements - // (1 - nodes, -1 - edges, -2 - faces, -3 - volumes). - // 'Free' means here not belonging to any group. - int aNodeFamId = FIRST_NODE_FAMILY; - int aElemFamId = FIRST_ELEM_FAMILY; - - // Process sub-meshes - map::const_iterator aSMIter = theSubMeshes.begin(); - for (; aSMIter != theSubMeshes.end(); aSMIter++) - { - if ( aSMIter->second->IsComplexSubmesh() ) - continue; // submesh containing other submeshs - list aSMFams = SplitByType((*aSMIter).second, (*aSMIter).first); - list::iterator aSMFamsIter = aSMFams.begin(); - for (; aSMFamsIter != aSMFams.end(); aSMFamsIter++) - { - DriverMED_FamilyPtr aFam2 = (*aSMFamsIter); - - list::iterator aFamsIter = aFamilies.begin(); - while (aFamsIter != aFamilies.end()) - { - DriverMED_FamilyPtr aFam1 = *aFamsIter; - list::iterator aCurrIter = aFamsIter++; - if (aFam1->myType == aFam2->myType) - { - DriverMED_FamilyPtr aCommon (new DriverMED_Family); - aFam1->Split(aFam2, aCommon); - if (!aCommon->IsEmpty()) - { - aFamilies.push_back(aCommon); - } - if (aFam1->IsEmpty()) - { - aFamilies.erase(aCurrIter); - } - if (aFam2->IsEmpty()) break; - } - } - // The rest elements of family - if (!aFam2->IsEmpty()) - { - aFamilies.push_back(aFam2); - } - } - } - - // Process groups - list::const_iterator aGroupsIter = theGroups.begin(); - for (; aGroupsIter != theGroups.end(); aGroupsIter++) - { - DriverMED_FamilyPtr aFam2 (new DriverMED_Family); - aFam2->Init(*aGroupsIter); - - list::iterator aFamsIter = aFamilies.begin(); - while (aFamsIter != aFamilies.end()) - { - DriverMED_FamilyPtr aFam1 = *aFamsIter; - list::iterator aCurrIter = aFamsIter++; - if (aFam1->myType == aFam2->myType) - { - DriverMED_FamilyPtr aCommon (new DriverMED_Family); - aFam1->Split(aFam2, aCommon); - if (!aCommon->IsEmpty()) - { - aFamilies.push_back(aCommon); - } - if (aFam1->IsEmpty()) - { - aFamilies.erase(aCurrIter); - } - if (aFam2->IsEmpty()) break; - } - } - // The rest elements of group - if (!aFam2->IsEmpty()) - { - aFamilies.push_back(aFam2); - } - } - - list::iterator aFamsIter = aFamilies.begin(); - for (; aFamsIter != aFamilies.end(); aFamsIter++) - { - DriverMED_FamilyPtr aFam = *aFamsIter; - if (aFam->myType == SMDSAbs_Node) { - aFam->SetId(aNodeFamId++); - if (doGroupOfNodes) aFam->myGroupNames.insert(anAllNodesGroupName); - } - else { - aFam->SetId(aElemFamId--); - if (aFam->myType == SMDSAbs_Edge) { - if (doGroupOfEdges) aFam->myGroupNames.insert(anAllEdgesGroupName); - } - else if (aFam->myType == SMDSAbs_Face) { - if (doGroupOfFaces) aFam->myGroupNames.insert(anAllFacesGroupName); - } - else if (aFam->myType == SMDSAbs_Volume) { - if (doGroupOfVolumes) aFam->myGroupNames.insert(anAllVolumesGroupName); - } - } - } - - // Create families for elements, not belonging to any group - if (doGroupOfNodes) - { - DriverMED_FamilyPtr aFreeNodesFam (new DriverMED_Family); - aFreeNodesFam->SetId(REST_NODES_FAMILY); - aFreeNodesFam->myType = SMDSAbs_Node; - aFreeNodesFam->myGroupNames.insert(anAllNodesGroupName); - aFamilies.push_back(aFreeNodesFam); - } - - if (doGroupOfEdges) - { - DriverMED_FamilyPtr aFreeEdgesFam (new DriverMED_Family); - aFreeEdgesFam->SetId(REST_EDGES_FAMILY); - aFreeEdgesFam->myType = SMDSAbs_Edge; - aFreeEdgesFam->myGroupNames.insert(anAllEdgesGroupName); - aFamilies.push_back(aFreeEdgesFam); - } - - if (doGroupOfFaces) - { - DriverMED_FamilyPtr aFreeFacesFam (new DriverMED_Family); - aFreeFacesFam->SetId(REST_FACES_FAMILY); - aFreeFacesFam->myType = SMDSAbs_Face; - aFreeFacesFam->myGroupNames.insert(anAllFacesGroupName); - aFamilies.push_back(aFreeFacesFam); - } - - if (doGroupOfVolumes) - { - DriverMED_FamilyPtr aFreeVolumesFam (new DriverMED_Family); - aFreeVolumesFam->SetId(REST_VOLUMES_FAMILY); - aFreeVolumesFam->myType = SMDSAbs_Volume; - aFreeVolumesFam->myGroupNames.insert(anAllVolumesGroupName); - aFamilies.push_back(aFreeVolumesFam); - } - - DriverMED_FamilyPtr aNullFam (new DriverMED_Family); - aNullFam->SetId(0); - aNullFam->myType = SMDSAbs_All; - aFamilies.push_back(aNullFam); - - return aFamilies; -} - -//============================================================================= -/*! - * Create TFamilyInfo for this family - */ -//============================================================================= -MED::PFamilyInfo -DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, - const MED::PMeshInfo& theMeshInfo) const -{ - string aValue; - - ostringstream aStr; - - aStr << "FAM_" << myId; - set::const_iterator aGrIter = myGroupNames.begin(); - for (; aGrIter != myGroupNames.end(); aGrIter++) - { - aStr << "_" << *aGrIter; - } - - aValue = aStr.str(); - /* - MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description, - MED::TIntVector anAttrIds (1, myId); // Id=0, - MED::TIntVector anAttrVals (1, myId); // Value=0 - */ - - MED::PFamilyInfo anInfo = theWrapper->CrFamilyInfo(theMeshInfo, - aValue, - myId, - myGroupNames); -/* - anAttrDescs, - anAttrIds, - anAttrVals); -*/ - -// cout << endl; -// cout << "Groups: "; -// set::iterator aGrIter = myGroupNames.begin(); -// for (; aGrIter != myGroupNames.end(); aGrIter++) -// { -// cout << " " << *aGrIter; -// } -// cout << endl; -// -// cout << "Elements: "; -// set::iterator anIter = myElements.begin(); -// for (; anIter != myElements.end(); anIter++) -// { -// cout << " " << (*anIter)->GetID(); -// } -// cout << endl; - - return anInfo; -} - -//============================================================================= -/*! - * Initialize the tool by SMESHDS_GroupBase - */ -//============================================================================= -void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup) -{ - // Elements - myElements.clear(); - SMDS_ElemIteratorPtr elemIt = theGroup->GetElements(); - while (elemIt->more()) - { - myElements.insert(elemIt->next()); - } - - // Type - myType = theGroup->GetType(); - - // Groups list - myGroupNames.clear(); - myGroupNames.insert(string(theGroup->GetStoreName())); -} - -//============================================================================= -/*! - * Split on some parts (families) - * on the basis of the elements type. - */ -//============================================================================= -list DriverMED_Family::SplitByType (SMESHDS_SubMesh* theSubMesh, - const int theId) -{ - list aFamilies; - DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family); - DriverMED_FamilyPtr anEdgesFamily (new DriverMED_Family); - DriverMED_FamilyPtr aFacesFamily (new DriverMED_Family); - DriverMED_FamilyPtr aVolumesFamily (new DriverMED_Family); - - char submeshGrpName[ 30 ]; - sprintf( submeshGrpName, "SubMesh %d", theId ); - - SMDS_NodeIteratorPtr aNodesIter = theSubMesh->GetNodes(); - while (aNodesIter->more()) - { - const SMDS_MeshNode* aNode = aNodesIter->next(); - aNodesFamily->AddElement(aNode); - } - - SMDS_ElemIteratorPtr anElemsIter = theSubMesh->GetElements(); - while (anElemsIter->more()) - { - const SMDS_MeshElement* anElem = anElemsIter->next(); - switch (anElem->GetType()) - { - case SMDSAbs_Edge: - anEdgesFamily->AddElement(anElem); - break; - case SMDSAbs_Face: - aFacesFamily->AddElement(anElem); - break; - case SMDSAbs_Volume: - aVolumesFamily->AddElement(anElem); - break; - default: - break; - } - } - - if (!aNodesFamily->IsEmpty()) { - aNodesFamily->SetType(SMDSAbs_Node); - aNodesFamily->AddGroupName(submeshGrpName); - aFamilies.push_back(aNodesFamily); - } - if (!anEdgesFamily->IsEmpty()) { - anEdgesFamily->SetType(SMDSAbs_Edge); - anEdgesFamily->AddGroupName(submeshGrpName); - aFamilies.push_back(anEdgesFamily); - } - if (!aFacesFamily->IsEmpty()) { - aFacesFamily->SetType(SMDSAbs_Face); - aFacesFamily->AddGroupName(submeshGrpName); - aFamilies.push_back(aFacesFamily); - } - if (!aVolumesFamily->IsEmpty()) { - aVolumesFamily->SetType(SMDSAbs_Volume); - aVolumesFamily->AddGroupName(submeshGrpName); - aFamilies.push_back(aVolumesFamily); - } - - return aFamilies; -} - -//============================================================================= -/*! - * Remove from elements, common with , - * Remove from elements, common with , - * Create family from common elements, with combined groups list. - */ -//============================================================================= -void DriverMED_Family::Split (DriverMED_FamilyPtr by, - DriverMED_FamilyPtr common) -{ - // Elements - set::iterator anIter = by->myElements.begin(); - while ( anIter != by->myElements.end()) - { - if (myElements.find(*anIter) != myElements.end()) - { - common->myElements.insert(*anIter); - myElements.erase(*anIter); - by->myElements.erase(anIter++); - } - else - anIter++; - } - - if (!common->IsEmpty()) - { - // Groups list - common->myGroupNames = myGroupNames; - set::iterator aGrNamesIter = by->myGroupNames.begin(); - for (; aGrNamesIter != by->myGroupNames.end(); aGrNamesIter++) - { - common->myGroupNames.insert(*aGrNamesIter); - } - - // Type - common->myType = myType; - } -} diff --git a/src/DriverMED/DriverMED_Family.h b/src/DriverMED/DriverMED_Family.h deleted file mode 100644 index 1632ccb3b..000000000 --- a/src/DriverMED/DriverMED_Family.h +++ /dev/null @@ -1,120 +0,0 @@ -// SMESH DriverMED : tool to split groups on families -// -// Copyright (C) 2003 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverMED_Family.hxx -// Author : Julia DOROVSKIKH -// Module : SMESH -// $Header$ - -#ifndef _INCLUDE_DRIVERMED_FAMILY -#define _INCLUDE_DRIVERMED_FAMILY - -#include "SMDS_Mesh.hxx" -#include "SMESHDS_GroupBase.hxx" -#include "SMESHDS_SubMesh.hxx" -#include "MED_Common.hxx" - -#include -#include - -#define REST_NODES_FAMILY 1 -#define REST_EDGES_FAMILY -1 -#define REST_FACES_FAMILY -2 -#define REST_VOLUMES_FAMILY -3 -#define FIRST_NODE_FAMILY 2 -#define FIRST_ELEM_FAMILY -4 - -class DriverMED_Family; -typedef boost::shared_ptr DriverMED_FamilyPtr; - -class DriverMED_Family -{ - public: - - // Methods for groups storing to MED - - static std::list MakeFamilies (const std::map & theSubMeshes, - const std::list& theGroups, - const bool doGroupOfNodes, - const bool doGroupOfEdges, - const bool doGroupOfFaces, - const bool doGroupOfVolumes); - // Split each group from list and each sub-mesh from list - // on some parts (families) on the basis of the elements membership in other groups - // from and other sub-meshes from . - // Resulting families have no common elements. - - MED::PFamilyInfo GetFamilyInfo (const MED::PWrapper& theWrapper, - const MED::PMeshInfo& theMeshInfo) const; - // Create TFamilyInfo for this family - - const std::set& GetElements () const { return myElements; } - // Returns elements of this family - - int GetId () const { return myId; } - // Returns a family ID - - public: - - // Methods for groups reading from MED - - void AddElement (const SMDS_MeshElement* theElement) { myElements.insert(theElement); } - - void AddGroupName (std::string theGroupName) { myGroupNames.insert(theGroupName); } - - void SetType (const SMDSAbs_ElementType theType) { myType = theType; } - SMDSAbs_ElementType GetType () { return myType; } - - bool MemberOf (std::string theGroupName) const - { return (myGroupNames.find(theGroupName) != myGroupNames.end()); } - - const MED::TStringSet& GetGroupNames () const { return myGroupNames; } - - void SetId (const int theId) { myId = theId; } - // Sets a family ID - - private: - void Init (SMESHDS_GroupBase* group); - // Initialize the tool by SMESHDS_GroupBase - - static std::list SplitByType (SMESHDS_SubMesh* theSubMesh, - const int theId); - // Split on some parts (families) - // on the basis of the elements type. - - void Split (DriverMED_FamilyPtr by, - DriverMED_FamilyPtr common); - // Remove from elements, common with , - // Remove from elements, common with , - // Create family from common elements, with combined groups list. - - bool IsEmpty () const { return myElements.empty(); } - // Check, if this family has empty list of elements - - private: - int myId; - SMDSAbs_ElementType myType; - std::set myElements; - MED::TStringSet myGroupNames; -}; - -#endif diff --git a/src/DriverMED/DriverMED_R_SMDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMDS_Mesh.cxx deleted file mode 100644 index cac48ff45..000000000 --- a/src/DriverMED/DriverMED_R_SMDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverMED_R_SMDS_Mesh.h" diff --git a/src/DriverMED/DriverMED_R_SMDS_Mesh.h b/src/DriverMED/DriverMED_R_SMDS_Mesh.h deleted file mode 100644 index a6ece3039..000000000 --- a/src/DriverMED/DriverMED_R_SMDS_Mesh.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERMED_R_SMDS_MESH -#define _INCLUDE_DRIVERMED_R_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class DriverMED_R_SMDS_Mesh: public Driver_SMDS_Mesh -{}; - -#endif diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Document.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Document.cxx deleted file mode 100644 index 9527382ad..000000000 --- a/src/DriverMED/DriverMED_R_SMESHDS_Document.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverMED_R_SMESHDS_Document.h" diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Document.h b/src/DriverMED/DriverMED_R_SMESHDS_Document.h deleted file mode 100644 index c933e0c4a..000000000 --- a/src/DriverMED/DriverMED_R_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERMED_R_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERMED_R_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverMED_R_SMESHDS_Document : public Driver_Document -{}; - -#endif diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h deleted file mode 100644 index cb72bccdf..000000000 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h +++ /dev/null @@ -1,69 +0,0 @@ -// SMESH DriverMED : driver to read and write 'med' files -// -// 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 : DriverMED_R_SMESHDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERMED_R_SMESHDS_MESH -#define _INCLUDE_DRIVERMED_R_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" -#include "DriverMED_Family.h" - -#include - -class SMESHDS_Mesh; -class SMESHDS_Group; -class SMESHDS_SubMesh; - -typedef std::pair< std::string, SMDSAbs_ElementType > TNameAndType; - -class DriverMED_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{ - public: - virtual Status Perform(); - - std::list< TNameAndType > GetGroupNamesAndTypes(); - void GetGroup(SMESHDS_Group* theGroup); - void CreateAllSubMeshes(); - void GetSubMesh(SMESHDS_SubMesh* theSubMesh, const int theId); - - std::list GetMeshNames(Status& theStatus); - void SetMeshName(std::string theMeshName); - - private: - /*! - * \brief Ensure aFamily has required ID - * \param aFamily - a family to check - * \param anID - an ID aFamily should have - * \retval bool - true if successful - */ - bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const; - - private: - std::string myMeshName; - std::map myFamilies; - -}; - -#endif diff --git a/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx deleted file mode 100644 index d48e08547..000000000 --- a/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverMED_W_SMDS_Mesh.h" diff --git a/src/DriverMED/DriverMED_W_SMDS_Mesh.h b/src/DriverMED/DriverMED_W_SMDS_Mesh.h deleted file mode 100644 index 2151ae672..000000000 --- a/src/DriverMED/DriverMED_W_SMDS_Mesh.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERMED_W_SMDS_MESH -#define _INCLUDE_DRIVERMED_W_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class DriverMED_W_SMDS_Mesh: public Driver_SMDS_Mesh -{}; - -#endif diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Document.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Document.cxx deleted file mode 100644 index d0537c23a..000000000 --- a/src/DriverMED/DriverMED_W_SMESHDS_Document.cxx +++ /dev/null @@ -1,27 +0,0 @@ -// SMESH DriverMED : driver to read and write 'med' files -// -// 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 : DriverMED_W_SMESHDS_Document.cxx -// Module : SMESH - -#include "DriverMED_W_SMESHDS_Document.h" diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Document.h b/src/DriverMED/DriverMED_W_SMESHDS_Document.h deleted file mode 100644 index 2f0cce3bc..000000000 --- a/src/DriverMED/DriverMED_W_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERMED_W_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERMED_W_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverMED_W_SMESHDS_Document : public Driver_Document -{}; - -#endif diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h deleted file mode 100644 index 1cc864944..000000000 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h +++ /dev/null @@ -1,83 +0,0 @@ -// SMESH DriverMED : driver to read and write 'med' files -// -// 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 : DriverMED_W_SMESHDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERMED_W_SMESHDS_MESH -#define _INCLUDE_DRIVERMED_W_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" -#include "MED_Factory.hxx" - -#include -#include -#include - -class SMESHDS_Mesh; -class SMESHDS_GroupBase; -class SMESHDS_SubMesh; - -class DriverMED_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{ - public: - - DriverMED_W_SMESHDS_Mesh(); - - virtual void SetFile(const std::string& theFileName); - void SetFile(const std::string& theFileName, MED::EVersion theId); - - /*! sets file name; only for usage with Add(), not Write() - */ - void AddGroupOfNodes(); - void AddGroupOfEdges(); - void AddGroupOfFaces(); - void AddGroupOfVolumes(); - - /*! functions to prepare adding one mesh - */ - void SetMeshName(const std::string& theMeshName); - void AddGroup(SMESHDS_GroupBase * theGroup); - void AddAllSubMeshes(); - void AddSubMesh(SMESHDS_SubMesh* theSubMesh, int theID); - - /*! add one mesh - */ - virtual Status Perform(); - - private: - - MED::PWrapper myMed; - std::string myMeshName; - std::list myGroups; - bool myAllSubMeshes; - std::map mySubMeshes; - bool myDoGroupOfNodes; - bool myDoGroupOfEdges; - bool myDoGroupOfFaces; - bool myDoGroupOfVolumes; -}; - - -#endif - diff --git a/src/DriverMED/MED_Test.cxx b/src/DriverMED/MED_Test.cxx deleted file mode 100644 index 7d6c3cd21..000000000 --- a/src/DriverMED/MED_Test.cxx +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#include "DriverMED_R_SMESHDS_Mesh.h" -#include "DriverMED_W_SMESHDS_Mesh.h" - -int main(int argc, char** argv) -{ - DriverMED_R_SMESHDS_Mesh aR; - DriverMED_W_SMESHDS_Mesh aW; - return 1; -} diff --git a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx b/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx deleted file mode 100644 index 2064453af..000000000 --- a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx +++ /dev/null @@ -1,343 +0,0 @@ -// 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 - -#include -#include -//======================================================================= -//function : HashCode -//purpose : -//======================================================================= -inline Standard_Integer HashCode - (const gp_Pnt& point, Standard_Integer Upper) -{ - union - { - Standard_Real R[3]; - Standard_Integer I[6]; - } U; - - point.Coord(U.R[0],U.R[1],U.R[2]); - - return ::HashCode(U.I[0]/23+U.I[1]/19+U.I[2]/17+U.I[3]/13+U.I[4]/11+U.I[5]/7,Upper); -} -static Standard_Real tab1[3]; -static Standard_Real tab2[3]; -//======================================================================= -//function : IsEqual -//purpose : -//======================================================================= -inline Standard_Boolean IsEqual - (const gp_Pnt& point1, const gp_Pnt& point2) -{ - point1.Coord(tab1[0],tab1[1],tab1[2]); - point2.Coord(tab2[0],tab2[1],tab2[2]); - return (memcmp(tab1,tab2,sizeof(tab1)) == 0); -} -#include "DriverSTL_R_SMDS_Mesh.h" - -#include "SMDS_Mesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" - -#include -#include -#include -#include -#include -#include - -#include "utilities.h" - -static const int HEADER_SIZE = 84; -static const int SIZEOF_STL_FACET = 50; -//static const int STL_MIN_FILE_SIZE = 284; -static const int ASCII_LINES_PER_FACET = 7; - - -//typedef NCollection_BaseCollection DriverSTL_ColOfNodePtr; - - -#include -typedef NCollection_DataMap DriverSTL_DataMapOfPntNodePtr; -//======================================================================= -//function : DriverSTL_R_SMDS_Mesh -//purpose : -//======================================================================= - -DriverSTL_R_SMDS_Mesh::DriverSTL_R_SMDS_Mesh() -{ - myIsCreateFaces = true; - myIsAscii = Standard_True; -} - -//======================================================================= -//function : SetIsCreateFaces -//purpose : -//======================================================================= - -void DriverSTL_R_SMDS_Mesh::SetIsCreateFaces( const bool theIsCreate ) -{ myIsCreateFaces = theIsCreate; } - -//======================================================================= -//function : Perform -//purpose : -//======================================================================= - -Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - if ( aFileName.IsEmpty() ) { - fprintf(stderr, ">> ERREOR : invalid file name \n"); - return DRS_FAIL; - } - - filebuf fic; - Standard_IStream is(&fic); - if (!fic.open(aFileName.ToCString(),ios::in)) { - fprintf(stderr, ">> ERROR : cannot open file %s \n", aFileName.ToCString()); - return DRS_FAIL; - } - - - OSD_Path aPath( aFileName ); - OSD_File file = OSD_File( aPath ); - file.Open(OSD_ReadOnly,OSD_Protection(OSD_RWD,OSD_RWD,OSD_RWD,OSD_RWD)); - unsigned char str[128]; - Standard_Integer lread,i; - Standard_Address ach; - ach = (Standard_Address)str; - // we skip the header which is in Ascii for both modes - file.Read(ach,HEADER_SIZE,lread); - - // we read 128 characters to detect if we have a non-ascii char - file.Read(ach,sizeof(str),lread); - - myIsAscii = Standard_True; - for (i = 0; i < lread; ++i) { - if (str[i] > '~') { - myIsAscii = Standard_False; - break; - } - } - - file.Close(); - - if ( !myMesh ) { - fprintf(stderr, ">> ERREOR : cannot create mesh \n"); - return DRS_FAIL; - } - - if ( myIsAscii ) - aResult = readAscii(); - else - aResult = readBinary(); - - return aResult; -} - -// static methods - -static Standard_Real readFloat(OSD_File& theFile) -{ - union { - Standard_Boolean i; - Standard_ShortReal f; - }u; - - char c[4]; - Standard_Address adr; - adr = (Standard_Address)c; - Standard_Integer lread; - theFile.Read(adr,4,lread); - u.i = c[0] & 0xFF; - u.i |= (c[1] & 0xFF) << 0x08; - u.i |= (c[2] & 0xFF) << 0x10; - u.i |= (c[3] & 0xFF) << 0x18; - - return u.f; -} - -static SMDS_MeshNode* addNode(const gp_Pnt& P, - DriverSTL_DataMapOfPntNodePtr& uniqnodes, - SMDS_Mesh* theMesh) -{ - SMDS_MeshNode* node = 0; - if ( uniqnodes.IsBound(P) ) { - node = uniqnodes.Find(P); - } else { - node = theMesh->AddNode(P.X(), P.Y(), P.Z() ); - uniqnodes.Bind(P,node); - } - - return node; -} - -static SMDS_MeshNode* readNode(FILE* file, - DriverSTL_DataMapOfPntNodePtr& uniqnodes, - SMDS_Mesh* theMesh) -{ - Standard_ShortReal coord[3]; - // reading vertex - fscanf(file,"%*s %f %f %f\n",&coord[0],&coord[1],&coord[2]); - - gp_Pnt P(coord[0],coord[1],coord[2]); - return addNode( P, uniqnodes, theMesh ); -} - -static SMDS_MeshNode* readNode(OSD_File& theFile, - DriverSTL_DataMapOfPntNodePtr& uniqnodes, - SMDS_Mesh* theMesh) -{ - Standard_ShortReal coord[3]; - coord[0] = readFloat(theFile); - coord[1] = readFloat(theFile); - coord[2] = readFloat(theFile); - - gp_Pnt P(coord[0],coord[1],coord[2]); - return addNode( P, uniqnodes, theMesh ); -} - -//======================================================================= -//function : readAscii -//purpose : -//======================================================================= - -Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::readAscii() const -{ - Status aResult = DRS_OK; - long ipos; - Standard_Integer nbLines = 0; - - // Open the file - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - FILE* file = fopen(aFileName.ToCString(),"r"); - fseek(file,0L,SEEK_END); - // get the file size - long filesize = ftell(file); - fclose(file); - file = fopen(aFileName.ToCString(),"r"); - - // count the number of lines - for (ipos = 0; ipos < filesize; ++ipos) { - if (getc(file) == '\n') - nbLines++; - } - - // go back to the beginning of the file -// fclose(file); -// file = fopen(aFileName.ToCString(),"r"); - rewind(file); - - Standard_Integer nbTri = (nbLines / ASCII_LINES_PER_FACET); - - DriverSTL_DataMapOfPntNodePtr uniqnodes; - // skip header - while (getc(file) != '\n'); - - // main reading - for (Standard_Integer iTri = 0; iTri < nbTri; ++iTri) { - - // skipping the facet normal - Standard_ShortReal normal[3]; - fscanf(file,"%*s %*s %f %f %f\n",&normal[0],&normal[1],&normal[2]); - - // skip the keywords "outer loop" - fscanf(file,"%*s %*s"); - - // reading nodes - SMDS_MeshNode* node1 = readNode( file, uniqnodes, myMesh ); - SMDS_MeshNode* node2 = readNode( file, uniqnodes, myMesh ); - SMDS_MeshNode* node3 = readNode( file, uniqnodes, myMesh ); - - if (myIsCreateFaces) - myMesh->AddFace(node1,node2,node3); - - // skip the keywords "endloop" - fscanf(file,"%*s"); - - // skip the keywords "endfacet" - fscanf(file,"%*s"); - } - - fclose(file); - return aResult; -} - -//======================================================================= -//function : readBinary -//purpose : -//======================================================================= - -Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::readBinary() const -{ - Status aResult = DRS_OK; - - char buftest[5]; - Standard_Address adr; - adr = (Standard_Address)buftest; - - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - OSD_File aFile = OSD_File(OSD_Path( aFileName )); - aFile.Open(OSD_ReadOnly,OSD_Protection(OSD_RWD,OSD_RWD,OSD_RWD,OSD_RWD)); - - // the size of the file (minus the header size) - // must be a multiple of SIZEOF_STL_FACET - - // compute file size - Standard_Integer filesize = aFile.Size(); - - if ( (filesize - HEADER_SIZE) % SIZEOF_STL_FACET !=0 - // Commented to allow reading small files (ex: 1 face) - /*|| (filesize < STL_MIN_FILE_SIZE)*/) { - Standard_NoMoreObject::Raise("DriverSTL_R_SMDS_MESH::readBinary (wrong file size)"); - } - - // don't trust the number of triangles which is coded in the file - // sometimes it is wrong, and with this technique we don't need to swap endians for integer - Standard_Integer nbTri = ((filesize - HEADER_SIZE) / SIZEOF_STL_FACET); - - // skip the header - aFile.Seek(HEADER_SIZE,OSD_FromBeginning); - - DriverSTL_DataMapOfPntNodePtr uniqnodes; - Standard_Integer lread; - - for (Standard_Integer iTri = 0; iTri < nbTri; ++iTri) { - - // ignore normals - readFloat(aFile); - readFloat(aFile); - readFloat(aFile); - - // read vertices - SMDS_MeshNode* node1 = readNode( aFile, uniqnodes, myMesh ); - SMDS_MeshNode* node2 = readNode( aFile, uniqnodes, myMesh ); - SMDS_MeshNode* node3 = readNode( aFile, uniqnodes, myMesh ); - - if (myIsCreateFaces) - myMesh->AddFace(node1,node2,node3); - - // skip extra bytes - aFile.Read(adr,2,lread); - } - aFile.Close(); - return aResult; -} diff --git a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.h b/src/DriverSTL/DriverSTL_R_SMDS_Mesh.h deleted file mode 100644 index 14afd3c21..000000000 --- a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.h +++ /dev/null @@ -1,45 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERSTL_R_SMDS_MESH -#define _INCLUDE_DRIVERSTL_R_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -#include - -class DriverSTL_R_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - DriverSTL_R_SMDS_Mesh(); - virtual Status Perform(); - void SetIsCreateFaces( const bool theIsCreate = true ); - - private: - // PRIVATE METHODS - Status readAscii() const; - Status readBinary() const; - - private: - // PRIVATE FIELDS - bool myIsCreateFaces; - bool myIsAscii; -}; - -#endif diff --git a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx b/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx deleted file mode 100644 index 04ce4058a..000000000 --- a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx +++ /dev/null @@ -1,261 +0,0 @@ -// 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 - -#include - -#include "DriverSTL_W_SMDS_Mesh.h" - -#include "SMDS_Mesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include -#include -#include -#include -#include -#include -#include -#include - -#include "utilities.h" - -//using namespace std; - -// definition des constantes -static const int LABEL_SIZE = 80; - -DriverSTL_W_SMDS_Mesh::DriverSTL_W_SMDS_Mesh() -{ - myIsAscii = false; -} - -void DriverSTL_W_SMDS_Mesh::SetIsAscii( const bool theIsAscii ) -{ - myIsAscii = theIsAscii; -} - -Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - - if ( !myMesh ) { - fprintf(stderr, ">> ERROR : Mesh is null \n"); - return DRS_FAIL; - } - if ( myIsAscii ) - aResult = writeAscii(); - else - aResult = writeBinary(); - - return aResult; -} - -// static methods - -static void writeInteger( const Standard_Integer& theVal, - OSD_File& ofile ) -{ - union { - Standard_Integer i; - char c[4]; - }u; - - u.i = theVal; - - Standard_Integer entier; - entier = u.c[0] & 0xFF; - entier |= (u.c[1] & 0xFF) << 0x08; - entier |= (u.c[2] & 0xFF) << 0x10; - entier |= (u.c[3] & 0xFF) << 0x18; - - ofile.Write((char *)&entier,sizeof(u.c)); -} - -static void writeFloat ( const Standard_ShortReal& theVal, - OSD_File& ofile) -{ - union { - Standard_ShortReal f; - char c[4]; - }u; - - u.f = theVal; - - Standard_Integer entier; - - entier = u.c[0] & 0xFF; - entier |= (u.c[1] & 0xFF) << 0x08; - entier |= (u.c[2] & 0xFF) << 0x10; - entier |= (u.c[3] & 0xFF) << 0x18; - - ofile.Write((char *)&entier,sizeof(u.c)); -} - -static gp_XYZ getNormale( const SMDS_MeshFace* theFace ) -{ - gp_XYZ n; - int aNbNode = theFace->NbNodes(); - TColgp_Array1OfXYZ anArrOfXYZ(1,4); - gp_XYZ p1, p2, p3, p4; - SMDS_ElemIteratorPtr aNodeItr = theFace->nodesIterator(); - int i = 1; - for ( ; aNodeItr->more() && i <= 4; i++ ) - { - SMDS_MeshNode* aNode = (SMDS_MeshNode*)aNodeItr->next(); - anArrOfXYZ.SetValue(i, gp_XYZ( aNode->X(), aNode->Y(), aNode->Z() ) ); - } - - gp_XYZ q1 = anArrOfXYZ.Value(2) - anArrOfXYZ.Value(1); - gp_XYZ q2 = anArrOfXYZ.Value(3) - anArrOfXYZ.Value(1); - n = q1 ^ q2; - if ( aNbNode > 3 ) - { - gp_XYZ q3 = anArrOfXYZ.Value(4) - anArrOfXYZ.Value(1); - n += q2 ^ q3; - } - double len = n.Modulus(); - if ( len > 0 ) - n /= len; - - return n; -} - -// private methods - -Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::writeAscii() const -{ - Status aResult = DRS_OK; - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - if ( aFileName.IsEmpty() ) { - fprintf(stderr, ">> ERREOR : invalid file name \n"); - return DRS_FAIL; - } - - OSD_File aFile = OSD_File(OSD_Path(aFileName)); - aFile.Build(OSD_WriteOnly,OSD_Protection()); - TCollection_AsciiString buf = TCollection_AsciiString ("solid\n"); - aFile.Write (buf,buf.Length());buf.Clear(); - char sval[16]; - - SMDS_FaceIteratorPtr itFaces = myMesh->facesIterator(); - - for (; itFaces->more() ;) { - SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next(); - - if (aFace->NbNodes() == 3) { - gp_XYZ normale = getNormale( aFace ); - - buf += " facet normal "; - sprintf (sval,"% 12e",normale.X()); - buf += sval; - buf += " "; - sprintf (sval,"% 12e",normale.Y()); - buf += sval; - buf += " "; - sprintf (sval,"% 12e",normale.Z()); - buf += sval; - buf += '\n'; - aFile.Write (buf,buf.Length());buf.Clear(); - buf += " outer loop\n"; - aFile.Write (buf,buf.Length());buf.Clear(); - - SMDS_ElemIteratorPtr aNodeIter = aFace->nodesIterator(); - for (; aNodeIter->more(); ) { - SMDS_MeshNode* node = (SMDS_MeshNode*)aNodeIter->next(); - buf += " vertex "; - sprintf (sval,"% 12e",node->X()); - buf += sval; - buf += " "; - sprintf (sval,"% 12e",node->Y()); - buf += sval; - buf += " "; - sprintf (sval,"% 12e",node->Z()); - buf += sval; - buf += '\n'; - aFile.Write (buf,buf.Length());buf.Clear(); - } - buf += " endloop\n"; - aFile.Write (buf,buf.Length());buf.Clear(); - buf += " endfacet\n"; - aFile.Write (buf,buf.Length());buf.Clear(); - } - } - buf += "endsolid\n"; - aFile.Write (buf,buf.Length());buf.Clear(); - - aFile.Close (); - - return aResult; -} - -Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::writeBinary() const -{ - Status aResult = DRS_OK; - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - if ( aFileName.IsEmpty() ) { - fprintf(stderr, ">> ERREOR : invalid filename \n"); - return DRS_FAIL; - } - - OSD_File aFile = OSD_File(OSD_Path(aFileName)); - aFile.Build(OSD_WriteOnly,OSD_Protection()); - - char sval[80]; - Standard_Integer nbTri = 0; - SMDS_FaceIteratorPtr itFaces = myMesh->facesIterator(); - - // we first count the number of triangles - for (;itFaces->more();) { - SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next(); - if (aFace->NbNodes() == 3) - nbTri++; - } - - // write number of triangles - unsigned int NBT = nbTri; - aFile.Write((Standard_Address)sval,LABEL_SIZE); - writeInteger(nbTri,aFile); - - // loop writing nodes. take face iterator again - int dum=0; - itFaces = myMesh->facesIterator(); - - for (;itFaces->more();) { - SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next(); - - if (aFace->NbNodes() == 3) { - gp_XYZ aNorm = getNormale( aFace ); - writeFloat(aNorm.X(),aFile); - writeFloat(aNorm.Y(),aFile); - writeFloat(aNorm.Z(),aFile); - - SMDS_ElemIteratorPtr aNodeIter = aFace->nodesIterator(); - for (; aNodeIter->more(); ) { - SMDS_MeshNode* node = (SMDS_MeshNode*)aNodeIter->next(); - writeFloat(node->X(),aFile); - writeFloat(node->Y(),aFile); - writeFloat(node->Z(),aFile); - } - aFile.Write (&dum,2); - } - } - aFile.Close (); - - return aResult; -} diff --git a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.h b/src/DriverSTL/DriverSTL_W_SMDS_Mesh.h deleted file mode 100644 index 49d752083..000000000 --- a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.h +++ /dev/null @@ -1,51 +0,0 @@ -// SMESH DriverSTL : driver to read and write 'stl' files -// -// 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 : DriverSTL_W_SMDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERSTL_W_SMDS_MESH -#define _INCLUDE_DRIVERSTL_W_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" -#include - -class DriverSTL_W_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - - DriverSTL_W_SMDS_Mesh(); - virtual Status Perform(); - void SetIsAscii( const bool theIsAscii = false ); - - private: - // PRIVATE METHODS - Status writeAscii () const; - Status writeBinary () const; - - private: - // PRIVATE FIELDS - bool myIsAscii; -}; - -#endif diff --git a/src/DriverSTL/STL_Test.cxx b/src/DriverSTL/STL_Test.cxx deleted file mode 100644 index 78dc0df71..000000000 --- a/src/DriverSTL/STL_Test.cxx +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -//#include "DriverSTL_R_SMDS_Mesh.h" -#include "DriverSTL_W_SMDS_Mesh.h" - -int main(int argc, char** argv) -{ -// DriverSTL_R_SMDS_Mesh aR; - DriverSTL_W_SMDS_Mesh aW; - return 1; -} diff --git a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.h b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.h deleted file mode 100644 index 46c6ad347..000000000 --- a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.h +++ /dev/null @@ -1,33 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERUNV_R_SMDS_MESH -#define _INCLUDE_DRIVERUNV_R_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class SMDS_Mesh; - -class DriverUNV_R_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - virtual Status Perform(); -}; - -#endif diff --git a/src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx b/src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx deleted file mode 100644 index 0e1b871fc..000000000 --- a/src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverUNV_R_SMESHDS_Document.h" diff --git a/src/DriverUNV/DriverUNV_R_SMESHDS_Document.h b/src/DriverUNV/DriverUNV_R_SMESHDS_Document.h deleted file mode 100644 index 4d38a67c3..000000000 --- a/src/DriverUNV/DriverUNV_R_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERUNV_R_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERUNV_R_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverUNV_R_SMESHDS_Document: public Driver_Document -{}; - -#endif diff --git a/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx b/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx deleted file mode 100644 index e4fcbf3e0..000000000 --- a/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// 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 - -#include "DriverUNV_R_SMESHDS_Mesh.h" diff --git a/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h b/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h deleted file mode 100644 index fce4b66bd..000000000 --- a/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h +++ /dev/null @@ -1,28 +0,0 @@ -// 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 - -#ifndef _INCLUDE_DRIVERUNV_R_SMESHDS_MESH -#define _INCLUDE_DRIVERUNV_R_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" - -class DriverUNV_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{}; - -#endif diff --git a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx deleted file mode 100644 index 3fe3b18ef..000000000 --- a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx +++ /dev/null @@ -1,186 +0,0 @@ -// 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 - -#include - -#include "DriverUNV_W_SMDS_Mesh.h" - -#include "SMDS_Mesh.hxx" - -#include "utilities.h" - -#include "UNV2411_Structure.hxx" -#include "UNV2412_Structure.hxx" -#include "UNV_Utilities.hxx" - -using namespace std; - -namespace{ - typedef std::vector TConnect; - - int GetConnect(const SMDS_ElemIteratorPtr& theNodesIter, - TConnect& theConnect) - { - theConnect.clear(); - for(; theNodesIter->more();){ - const SMDS_MeshElement* anElem = theNodesIter->next(); - theConnect.push_back(anElem->GetID()); - } - return theConnect.size(); - } - -} - -Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - std::ofstream out_stream(myFile.c_str()); - try{ - { - using namespace UNV2411; - TDataSet aDataSet2411; - // Storing SMDS nodes to the UNV file - //----------------------------------- - MESSAGE("Perform - myMesh->NbNodes() = "<NbNodes()); - SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); - for(; aNodesIter->more();){ - const SMDS_MeshNode* aNode = aNodesIter->next(); - TRecord aRec; - aRec.coord[0] = aNode->X(); - aRec.coord[1] = aNode->Y(); - aRec.coord[2] = aNode->Z(); - const TNodeLab& aLabel = aNode->GetID(); - aDataSet2411.insert(TDataSet::value_type(aLabel,aRec)); - } - MESSAGE("Perform - aDataSet2411.size() = "<NbEdges() = "<NbEdges()); - if(myMesh->NbEdges()){ - SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); - for(; anIter->more();){ - const SMDS_MeshEdge* anElem = anIter->next(); - TElementLab aLabel = anElem->GetID(); - int aNbNodes = anElem->NbNodes(); - TRecord aRec; - aRec.node_labels.reserve(aNbNodes); - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - for(; aNodesIter->more();){ - const SMDS_MeshElement* aNode = aNodesIter->next(); - aRec.node_labels.push_back(aNode->GetID()); - } - aRec.fe_descriptor_id = 11; - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); - } - MESSAGE("Perform - aDataSet2412.size() = "<NbFaces() = "<NbFaces()); - if(myMesh->NbFaces()){ - SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); - for(; anIter->more();){ - const SMDS_MeshFace* anElem = anIter->next(); - TElementLab aLabel = anElem->GetID(); - int aNbNodes = anElem->NbNodes(); - TRecord aRec; - aRec.node_labels.reserve(aNbNodes); - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - for(; aNodesIter->more();){ - const SMDS_MeshElement* aNode = aNodesIter->next(); - aRec.node_labels.push_back(aNode->GetID()); - } - switch(aNbNodes){ - case 3: - aRec.fe_descriptor_id = 41; - break; - case 4: - aRec.fe_descriptor_id = 44; - break; - default: - continue; - } - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); - } - MESSAGE("Perform - aDataSet2412.size() = "<NbVolumes() = "<NbVolumes()); - if(myMesh->NbVolumes()){ - SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator(); - for(; anIter->more();){ - const SMDS_MeshVolume* anElem = anIter->next(); - TElementLab aLabel = anElem->GetID(); - - int aNbNodes = anElem->NbNodes(); - aConnect.resize(aNbNodes); - - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - GetConnect(aNodesIter,aConnect); - - int anId = -1; - int* aConn = NULL; - switch(aNbNodes){ - case 4: { - static int anIds[] = {0,2,1,3}; - aConn = anIds; - anId = 111; - break; - } - case 6: { - static int anIds[] = {0,2,1,3,5,4}; - aConn = anIds; - anId = 112; - break; - } - case 8: { - static int anIds[] = {0,3,2,1,4,7,6,5}; - aConn = anIds; - anId = 115; - break; - } - default: - continue; - } - if(aConn){ - TRecord aRec; - aRec.fe_descriptor_id = anId; - aRec.node_labels.resize(aNbNodes); - for(int aNodeId = 0; aNodeId < aNbNodes; aNodeId++){ - aRec.node_labels[aConn[aNodeId]] = aConnect[aNodeId]; - } - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); - } - } - MESSAGE("Perform - aDataSet2412.size() = "< -#include - -#include "UNV2411_Structure.hxx" -#include "UNV_Utilities.hxx" - -using namespace std; -using namespace UNV; -using namespace UNV2411; - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - -static string _label_dataset = "2411"; - -UNV2411::TRecord::TRecord(): - exp_coord_sys_num(0), - disp_coord_sys_num(0), - color(0) -{} - -void UNV2411::Read(std::ifstream& in_stream, TDataSet& theDataSet) -{ - if(!in_stream.good()) - EXCEPTION(runtime_error,"ERROR: Input file not good."); - - /* - * adjust the \p istream to our - * position - */ - if(!beginning_of_dataset(in_stream,_label_dataset)) - EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!"); - - /** - * always 3 coordinates in the UNV file, no matter - * which dimensionality libMesh is in - */ - TNodeLab aLabel; - std::string num_buf; - for(; !in_stream.eof();){ - in_stream >> aLabel ; - if(aLabel == -1){ - // end of dataset is reached - break; - } - - TRecord aRec; - in_stream>>aRec.exp_coord_sys_num; - in_stream>>aRec.disp_coord_sys_num; - in_stream>>aRec.color; - - /* - * take care of the - * floating-point data - */ - for(int d = 0; d < 3; d++){ - in_stream>>num_buf; - aRec.coord[d] = D_to_e(num_buf); - } - - theDataSet.insert(TDataSet::value_type(aLabel,aRec)); - } -} - - -void UNV2411::Write(std::ofstream& out_stream, const TDataSet& theDataSet) -{ - if(!out_stream.good()) - EXCEPTION(runtime_error,"ERROR: Output file not good."); - - /* - * Write beginning of dataset - */ - out_stream<<" -1\n"; - out_stream<<" "<<_label_dataset<<"\n"; - - TDataSet::const_iterator anIter = theDataSet.begin(); - for(; anIter != theDataSet.end(); anIter++){ - const TNodeLab& aLabel = anIter->first; - const TRecord& aRec = anIter->second; - char buf[78]; - sprintf(buf, "%10d%10d%10d%10d\n", - aLabel, - aRec.exp_coord_sys_num, - aRec.disp_coord_sys_num, - aRec.color); - out_stream< -#include - -namespace UNV2411{ - - struct TRecord{ - TRecord(); - int exp_coord_sys_num; // export coordinate system number - int disp_coord_sys_num; // displacement coordinate system number - int color; // color - double coord[3]; // node coordinates in the part coordinate system - }; - - typedef int TNodeLab; // type of node label - typedef std::map TDataSet; - - void Read(std::ifstream& in_stream, TDataSet& theDataSet); - - void Write(std::ofstream& out_stream, const TDataSet& theDataSet); - -}; - - -#endif diff --git a/src/DriverUNV/UNV2412_Structure.cxx b/src/DriverUNV/UNV2412_Structure.cxx deleted file mode 100644 index 0160d7b68..000000000 --- a/src/DriverUNV/UNV2412_Structure.cxx +++ /dev/null @@ -1,203 +0,0 @@ -// 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 - -#include -#include - -#include "UNV2412_Structure.hxx" -#include "UNV_Utilities.hxx" - -using namespace std; -using namespace UNV; -using namespace UNV2412; - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - -static string _label_dataset = "2412"; - -UNV2412::TRecord::TRecord(): - phys_prop_tab_num(2), - mat_prop_tab_num(1), - color(7), - beam_orientation(0), - beam_fore_end(0), - beam_aft_end(0) -{} - -void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet) -{ - if(!in_stream.good()) - EXCEPTION(runtime_error,"ERROR: Input file not good."); - - /* - * adjust the \p istream to our - * position - */ - if(!beginning_of_dataset(in_stream,_label_dataset)) - EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!"); - - TElementLab aLabel; - for(; !in_stream.eof();){ - in_stream >> aLabel ; - if(aLabel == -1){ - // end of dataset is reached - break; - } - - int n_nodes; - TRecord aRec; - in_stream>>aRec.fe_descriptor_id; - in_stream>>aRec.phys_prop_tab_num; - in_stream>>aRec.mat_prop_tab_num; - in_stream>>aRec.color; - in_stream>>n_nodes; - - if(IsBeam(aRec.fe_descriptor_id)){ - in_stream>>aRec.beam_orientation; - in_stream>>aRec.beam_fore_end; - in_stream>>aRec.beam_aft_end; - } - - aRec.node_labels.resize(n_nodes); - for(int j=0; j < n_nodes; j++){ - // read node labels - in_stream>>aRec.node_labels[j]; - } - - theDataSet.insert(TDataSet::value_type(aLabel,aRec)); - } - -} - - -void UNV2412::Write(std::ofstream& out_stream, const TDataSet& theDataSet) -{ - if(!out_stream.good()) - EXCEPTION(runtime_error,"ERROR: Output file not good."); - - /* - * Write beginning of dataset - */ - out_stream<<" -1\n"; - out_stream<<" "<<_label_dataset<<"\n"; - - TDataSet::const_iterator anIter = theDataSet.begin(); - for(; anIter != theDataSet.end(); anIter++){ - const TElementLab& aLabel = anIter->first; - const TRecord& aRec = anIter->second; - out_stream< -#include -#include - - -namespace UNV2412{ - - typedef std::vector TNodeLabels; // Nodal connectivities - - struct TRecord{ - TRecord(); - - int fe_descriptor_id; // FE descriptor id - int phys_prop_tab_num; // physical property table number - int mat_prop_tab_num; // material property table number - int color; // color - TNodeLabels node_labels; // node labels defining element - - //FOR BEAM ELEMENTS ONLY - int beam_orientation; // beam orientation node number - int beam_fore_end; // beam fore-end cross section number - int beam_aft_end; // beam aft-end cross section number - }; - - typedef int TElementLab; // type of element label - typedef std::map TDataSet; - - void Read(std::ifstream& in_stream, TDataSet& theDataSet); - - void Write(std::ofstream& out_stream, const TDataSet& theDataSet); - - bool IsBeam(int theFeDescriptorId); - bool IsFace(int theFeDescriptorId); - bool IsVolume(int theFeDescriptorId); - -}; - - -#endif diff --git a/src/DriverUNV/UNV_Test.cxx b/src/DriverUNV/UNV_Test.cxx deleted file mode 100644 index 0156b5051..000000000 --- a/src/DriverUNV/UNV_Test.cxx +++ /dev/null @@ -1,69 +0,0 @@ -// 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 - -#include "UNV2411_Structure.hxx" -#include "UNV2412_Structure.hxx" -#include "UNV_Utilities.hxx" - -#include "DriverUNV_R_SMDS_Mesh.h" -#include "DriverUNV_W_SMDS_Mesh.h" - -using namespace std; - -#ifdef DEBUG -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - - -void ReadMed(const char* theFileName){ - std::ifstream in_stream(theFileName); - - UNV2411::TDataSet aDataSet2411; - UNV2411::Read(in_stream,aDataSet2411); - - in_stream.seekg(0); - UNV2412::TDataSet aDataSet2412; - UNV2412::Read(in_stream,aDataSet2412); - - string aFileName(theFileName); - aFileName += "-"; - std::ofstream out_stream(aFileName.c_str()); - - UNV2411::Write(out_stream,aDataSet2411); - UNV2412::Write(out_stream,aDataSet2412); -} - - -int main(int argc, char** argv){ - DriverUNV_R_SMDS_Mesh aR; - DriverUNV_W_SMDS_Mesh aW; - try{ - if(argc > 1){ - ReadMed(argv[1]); - } - return 0; - }catch(std::exception& exc){ - MESSAGE("Follow exception was accured :\n"< -#include -#include -#include -#include - -namespace UNV{ - using namespace std; - - class PrefixPrinter{ - static int myCounter; - public: - PrefixPrinter(); - ~PrefixPrinter(); - - static string GetPrefix(); - }; - - /** - * @returns \p false when error occured, \p true otherwise. - * Adjusts the \p in_stream to the beginning of the - * dataset \p ds_name. - */ - inline bool beginning_of_dataset(std::istream& in_file, const std::string& ds_name) - { - assert (in_file.good()); - assert (!ds_name.empty()); - - std::string olds, news; - - while(true){ - in_file >> olds >> news; - /* - * a "-1" followed by a number means the beginning of a dataset - * stop combing at the end of the file - */ - while( ((olds != "-1") || (news == "-1") ) && !in_file.eof() ){ - olds = news; - in_file >> news; - } - if(in_file.eof()) - return false; - if (news == ds_name) - return true; - } - // should never end up here - return false; - } - - /** - * Method for converting exponential notation - * from "D" to "e", for example - * \p 3.141592654D+00 \p --> \p 3.141592654e+00 - * in order to make it readable for C++. - */ - inline double D_to_e(std::string& number) - { - /* find "D" in string, start looking at - * 6th element, to improve speed. - * We dont expect a "D" earlier - */ - const int position = number.find("D",6); - if(position != std::string::npos){ - number.replace(position, 1, "e"); - } - return atof (number.c_str()); - } - -}; - - -#ifndef MESSAGE - -#define MESSAGE(msg) std::cout<<__FILE__<<"["<<__LINE__<<"]::"< //Dans OpenCascade -#include //Dans OpenCascade -#include //Dans OpenCascade - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// BUT: Definir les espaces affines R R2 R3 R4 soit Rn pour n=1,2,3,4 -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// AUTEUR : Frederic HECHT ANALYSE NUMERIQUE UPMC PARIS OCTOBRE 2000 -// MODIFS : Alain PERRONNET ANALYSE NUMERIQUE UPMC PARIS NOVEMBRE 2000 -//............................................................................... -#include -#include - - -template inline T Abs (const T &a){return a <0 ? -a : a;} -template inline void Echange (T& a,T& b) {T c=a;a=b;b=c;} - -template inline T Min (const T &a,const T &b) {return a < b ? a : b;} -template inline T Max (const T &a,const T & b) {return a > b ? a : b;} - -template inline T Max (const T &a,const T & b,const T & c){return Max(Max(a,b),c);} -template inline T Min (const T &a,const T & b,const T & c){return Min(Min(a,b),c);} - -template inline T Max (const T &a,const T & b,const T & c,const T & d) - {return Max(Max(a,b),Max(c,d));} -template inline T Min (const T &a,const T & b,const T & c,const T & d) - {return Min(Min(a,b),Min(c,d));} - -//le type Nom des entites geometriques P L S V O -//=========== -typedef char Nom[1+24]; - -//le type N des nombres entiers positifs -//========= -typedef unsigned long int N; - -//le type Z des nombres entiers relatifs -//========= -typedef long int Z; - -//le type R des nombres "reels" -//========= -typedef double R; - -//le type XPoint des coordonnees d'un pixel dans une fenetre -//============== -//typedef struct { short int x,y } XPoint; //en fait ce type est defini dans X11-Window - // #include -//la classe R2 -//============ -class R2 -{ - friend std::ostream& operator << (std::ostream& f, const R2 & P) - { f << P.x << ' ' << P.y ; return f; } - friend std::istream& operator >> (std::istream& f, R2 & P) - { f >> P.x >> P.y ; return f; } - - friend std::ostream& operator << (std::ostream& f, const R2 * P) - { f << P->x << ' ' << P->y ; return f; } - friend std::istream& operator >> (std::istream& f, R2 * P) - { f >> P->x >> P->y ; return f; } - -public: - R x,y; //les donnees - - R2 () :x(0),y(0) {} //les constructeurs - R2 (R a,R b) :x(a),y(b) {} - R2 (R2 A,R2 B) :x(B.x-A.x),y(B.y-A.y) {} //vecteur defini par 2 points - - R2 operator+(R2 P) const {return R2(x+P.x,y+P.y);} // Q+P possible - R2 operator+=(R2 P) {x += P.x;y += P.y; return *this;}// Q+=P; - R2 operator-(R2 P) const {return R2(x-P.x,y-P.y);} // Q-P - R2 operator-=(R2 P) {x -= P.x;y -= P.y; return *this;} // Q-=P; - R2 operator-()const {return R2(-x,-y);} // -Q - R2 operator+()const {return *this;} // +Q - R operator,(R2 P)const {return x*P.x+y*P.y;} // produit scalaire (Q,P) - R operator^(R2 P)const {return x*P.y-y*P.x;} // produit vectoriel Q^P - R2 operator*(R c)const {return R2(x*c,y*c);} // produit a droite P*c - R2 operator*=(R c) {x *= c; y *= c; return *this;} - R2 operator/(R c)const {return R2(x/c,y/c);} // division par un reel - R2 operator/=(R c) {x /= c; y /= c; return *this;} - R & operator[](int i) {return (&x)[i];} // la coordonnee i - R2 orthogonal() {return R2(-y,x);} //le vecteur orthogonal dans R2 - friend R2 operator*(R c,R2 P) {return P*c;} // produit a gauche c*P -}; - - -//la classe R3 -//============ -class R3 -{ - friend std::ostream& operator << (std::ostream& f, const R3 & P) - { f << P.x << ' ' << P.y << ' ' << P.z ; return f; } - friend std::istream& operator >> (std::istream& f, R3 & P) - { f >> P.x >> P.y >> P.z ; return f; } - - friend std::ostream& operator << (std::ostream& f, const R3 * P) - { f << P->x << ' ' << P->y << ' ' << P->z ; return f; } - friend std::istream& operator >> (std::istream& f, R3 * P) - { f >> P->x >> P->y >> P->z ; return f; } - -public: - R x,y,z; //les 3 coordonnees - - R3 () :x(0),y(0),z(0) {} //les constructeurs - R3 (R a,R b,R c):x(a),y(b),z(c) {} //Point ou Vecteur (a,b,c) - R3 (R3 A,R3 B):x(B.x-A.x),y(B.y-A.y),z(B.z-A.z) {} //Vecteur AB - - R3 (gp_Pnt P) : x(P.X()), y(P.Y()), z(P.Z()) {} //Point d'OpenCascade - R3 (gp_Vec V) : x(V.X()), y(V.Y()), z(V.Z()) {} //Vecteur d'OpenCascade - R3 (gp_Dir P) : x(P.X()), y(P.Y()), z(P.Z()) {} //Direction d'OpenCascade - - R3 operator+(R3 P)const {return R3(x+P.x,y+P.y,z+P.z);} - R3 operator+=(R3 P) {x += P.x; y += P.y; z += P.z; return *this;} - R3 operator-(R3 P)const {return R3(x-P.x,y-P.y,z-P.z);} - R3 operator-=(R3 P) {x -= P.x; y -= P.y; z -= P.z; return *this;} - R3 operator-()const {return R3(-x,-y,-z);} - R3 operator+()const {return *this;} - R operator,(R3 P)const {return x*P.x+y*P.y+z*P.z;} // produit scalaire - R3 operator^(R3 P)const {return R3(y*P.z-z*P.y ,P.x*z-x*P.z, x*P.y-y*P.x);} // produit vectoriel - R3 operator*(R c)const {return R3(x*c,y*c,z*c);} - R3 operator*=(R c) {x *= c; y *= c; z *= c; return *this;} - R3 operator/(R c)const {return R3(x/c,y/c,z/c);} - R3 operator/=(R c) {x /= c; y /= c; z /= c; return *this;} - R & operator[](int i) {return (&x)[i];} - friend R3 operator*(R c,R3 P) {return P*c;} - - R3 operator=(gp_Pnt P) {return R3(P.X(),P.Y(),P.Z());} - R3 operator=(gp_Dir P) {return R3(P.X(),P.Y(),P.Z());} - - friend gp_Pnt gp_pnt(R3 xyz) { return gp_Pnt(xyz.x,xyz.y,xyz.z); } - //friend gp_Pnt operator=() { return gp_Pnt(x,y,z); } - friend gp_Dir gp_dir(R3 xyz) { return gp_Dir(xyz.x,xyz.y,xyz.z); } - - bool DansPave( R3 & xyzMin, R3 & xyzMax ) - { return xyzMin.x<=x && x<=xyzMax.x && - xyzMin.y<=y && y<=xyzMax.y && - xyzMin.z<=z && z<=xyzMax.z; } -}; - -//la classe R4 -//============ -class R4: public R3 -{ - friend std::ostream& operator <<(std::ostream& f, const R4 & P ) - { f << P.x << ' ' << P.y << ' ' << P.z << ' ' << P.omega; return f; } - friend istream& operator >>(istream& f, R4 & P) - { f >> P.x >> P.y >> P.z >> P.omega ; return f; } - - friend std::ostream& operator <<(std::ostream& f, const R4 * P ) - { f << P->x << ' ' << P->y << ' ' << P->z << ' ' << P->omega; return f; } - friend istream& operator >>(istream& f, R4 * P) - { f >> P->x >> P->y >> P->z >> P->omega ; return f; } - -public: - R omega; //la donnee du poids supplementaire - - R4 () :omega(1.0) {} //les constructeurs - R4 (R a,R b,R c,R d):R3(a,b,c),omega(d) {} - R4 (R4 A,R4 B) :R3(B.x-A.x,B.y-A.y,B.z-A.z),omega(B.omega-A.omega) {} - - R4 operator+(R4 P)const {return R4(x+P.x,y+P.y,z+P.z,omega+P.omega);} - R4 operator+=(R4 P) {x += P.x;y += P.y;z += P.z;omega += P.omega;return *this;} - R4 operator-(R4 P)const {return R4(x-P.x,y-P.y,z-P.z,omega-P.omega);} - R4 operator-=(R4 P) {x -= P.x;y -= P.y;z -= P.z;omega -= P.omega;return *this;} - R4 operator-()const {return R4(-x,-y,-z,-omega);} - R4 operator+()const {return *this;} - R operator,(R4 P)const {return x*P.x+y*P.y+z*P.z+omega*P.omega;} // produit scalaire - R4 operator*(R c)const {return R4(x*c,y*c,z*c,omega*c);} - R4 operator*=(R c) {x *= c; y *= c; z *= c; omega *= c; return *this;} - R4 operator/(R c)const {return R4(x/c,y/c,z/c,omega/c);} - R4 operator/=(R c) {x /= c; y /= c; z /= c; omega /= c; return *this;} - R & operator[](int i) {return (&x)[i];} - friend R4 operator*(R c,R4 P) {return P*c;} -}; - -//quelques fonctions supplementaires sur ces classes -//================================================== -inline R Aire2d(const R2 A,const R2 B,const R2 C){return (B-A)^(C-A);} -inline R Angle2d(R2 P){ return atan2(P.y,P.x);} - -inline R Norme2_2(const R2 & A){ return (A,A);} -inline R Norme2(const R2 & A){ return sqrt((A,A));} -inline R NormeInfinie(const R2 & A){return Max(Abs(A.x),Abs(A.y));} - -inline R Norme2_2(const R3 & A){ return (A,A);} -inline R Norme2(const R3 & A){ return sqrt((A,A));} -inline R NormeInfinie(const R3 & A){return Max(Abs(A.x),Abs(A.y),Abs(A.z));} - -inline R Norme2_2(const R4 & A){ return (A,A);} -inline R Norme2(const R4 & A){ return sqrt((A,A));} -inline R NormeInfinie(const R4 & A){return Max(Abs(A.x),Abs(A.y),Abs(A.z),Abs(A.omega));} - -inline R2 XY(R3 P) {return R2(P.x, P.y);} //restriction a R2 d'un R3 par perte de z -inline R3 Min(R3 P, R3 Q) -{return R3(P.xQ.x ? P.x : Q.x, P.y>Q.y ? P.y : Q.y, P.z>Q.z ? P.z : Q.z);} //Pt de xyz Max - -#endif diff --git a/src/MEFISTO2/aptrte.cxx b/src/MEFISTO2/aptrte.cxx deleted file mode 100755 index 40c090523..000000000 --- a/src/MEFISTO2/aptrte.cxx +++ /dev/null @@ -1,786 +0,0 @@ -// MEFISTO : library to compute 2D triangulation from segmented boundaries -// -// Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris -// -// 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.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr -// -// -// File : aptrte.cxx -// Module : SMESH -// Author: Alain PERRONNET - -#include "Rn.h" -#include "aptrte.h" -#include "utilities.h" - -using namespace std; - -extern "C" -{ - R aretemaxface_; - R areteideale_( R3 xyz, R3 direction ) - { - return aretemaxface_; - } -} -//calcul de la longueur ideale de l'arete au sommet xyz (z ici inactif) -//dans la direction donnee -//a ajuster pour chaque surface plane et selon l'entier notysu (voir plus bas) - - -static double cpunew, cpuold=0; - -void tempscpu_( double & tempsec ) -//Retourne le temps CPU utilise en secondes -{ - tempsec = ( (double) clock() ) / CLOCKS_PER_SEC; - //MESSAGE( "temps cpu=" << tempsec ); -} - - -void deltacpu_( R & dtcpu ) -//Retourne le temps CPU utilise en secondes depuis le precedent appel -{ - tempscpu_( cpunew ); - dtcpu = R( cpunew - cpuold ); - cpuold = cpunew; - //MESSAGE( "delta temps cpu=" << dtcpu ); - return; -} - - -void aptrte( Z nutysu, R aretmx, - Z nblf, Z * nudslf, R2 * uvslf, - Z nbpti, R2 *uvpti, - Z & nbst, R2 * & uvst, Z & nbt, Z * & nust, - Z & ierr ) -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : appel de la triangulation par un arbre-4 recouvrant -// ----- de triangles equilateraux -// le contour du domaine plan est defini par des lignes fermees -// la premiere ligne etant l'enveloppe de toutes les autres -// la fonction areteideale(s,d) donne la taille d'arete -// au point s dans la direction (actuellement inactive) d -// des lors toute arete issue d'un sommet s devrait avoir une longueur -// comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d) -// -//Attention: -// Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques! -// De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee -// -// entrees: -// -------- -// nutysu : numero de traitement de areteideale_(s,d) selon le type de surface -// 0 pas d'emploi de la fonction areteideale_() et aretmx est active -// 1 il existe une fonction areteideale_(s,d) -// dont seules les 2 premieres composantes de uv sont actives -// ... autres options a definir ... -// aretmx : longueur maximale des aretes de la future triangulation -// nblf : nombre de lignes fermees de la surface -// nudslf : numero du dernier sommet de chacune des nblf lignes fermees -// nudslf(0)=0 pour permettre la difference sans test -// Attention le dernier sommet de chaque ligne est raccorde au premier -// tous les sommets et les points internes ont des coordonnees -// UV differentes <=> Pas de point double! -// uvslf : uv des nudslf(nblf) sommets des lignes fermees -// nbpti : nombre de points internes futurs sommets de la triangulation -// uvpti : uv des points internes futurs sommets de la triangulation -// -// sorties: -// -------- -// nbst : nombre de sommets de la triangulation finale -// uvst : coordonnees uv des nbst sommets de la triangulation -// nbt : nombre de triangles de la triangulation finale -// nust : 4 numeros dans uvst des sommets des nbt triangles -// s1, s2, s3, 0: no dans uvst des 3 sommets et 0 car quadrangle! -// ierr : 0 si pas d'erreur -// > 0 sinon -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001 -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -{ - R d, tcpu=0; - R3 direction=R3(0,0,0); //direction pour areteideale() inactive ici! - Z nbarfr=nudslf[nblf]; //nombre total d'aretes des lignes fermees - Z mxtrou = Max( 1024, nblf ); //nombre maximal de trous dans la surface - - R3 *mnpxyd=NULL; - Z *mnsoar=NULL, mosoar=7, mxsoar, n1soar; //le hachage des aretes - Z *mnartr=NULL, moartr=3, mxartr, n1artr; //le no des 3 aretes des triangles - Z *mntree=NULL, motree=9, mxtree; //L'arbre 4 de TE et nombre d'entiers par TE - Z *mnqueu=NULL, mxqueu; - Z *mn1arcf=NULL; - Z *mnarcf=NULL, mxarcf; - Z *mnarcf1=NULL; - Z *mnarcf2=NULL; - Z *mnarcf3=NULL; - Z *mntrsu=NULL; - Z *mndalf=NULL; - Z *mnslig=NULL; - Z *mnarst=NULL; - Z *mnlftr=NULL; - - R3 comxmi[2]; //coordonnees UV Min et Maximales - R aremin, aremax; //longueur minimale et maximale des aretes - R quamoy, quamin; - - Z noar0, noar, na; - Z i, l, n, ns, ns0, ns1, ns2, nosotr[3], nt; - Z mxsomm, nbsomm, nbarpi, nbarli, ndtri0, mn; - Z moins1=-1; - - aretemaxface_ = aretmx; - - // initialisation du temps cpu - deltacpu_( d ); - ierr = 0; - - // quelques reservations de tableaux pour faire les calculs - // ======================================================== - // le tableau pointeur sur la premiere arete de chaque ligne fermee - if( mndalf!=NULL ) delete [] mndalf; - mndalf = new Z[1+nblf]; - if( mndalf==NULL ) goto ERREUR; - mndalf[0]=0; - - // declaration du tableau des coordonnees des sommets de la frontiere - // puis des sommets internes ajoutes - // majoration empirique du nombre de sommets de la triangulation - i = 4*nbarfr/10; - mxsomm = Max( 20000, 64*nbpti+i*i ); - MESSAGE( "APTRTE: Depart de la triangulation avec " ); - MESSAGE( "nutysu=" << nutysu << " aretmx=" << aretmx << " mxsomm=" << mxsomm ); - - NEWDEPART: - //mnpxyd( 3, mxsomm ) les coordonnees UV des sommets et la taille d'arete aux sommets - if( mnpxyd!=NULL ) delete [] mnpxyd; - mnpxyd = new R3[mxsomm]; - if( mnpxyd==NULL ) goto ERREUR; - - // le tableau mnsoar des aretes des triangles - // 1: sommet 1 dans pxyd, - // 2: sommet 2 dans pxyd, - // 3: numero de 1 a nblf de la ligne qui supporte l'arete - // 4: numero dans mnartr du triangle 1 partageant cette arete, - // 5: numero dans mnartr du triangle 2 partageant cette arete, - // 6: chainage des aretes frontalieres ou internes ou - // des aretes simples des etoiles de triangles, - // 7: chainage du hachage des aretes - // nombre d'aretes = 3 ( nombre de sommets - 1 + nombre de trous ) - // pour le hachage des aretes mxsoar doit etre > 3*mxsomm! - // h(ns1,ns2) = min( ns1, ns2 ) - if( mnsoar!=NULL ) delete [] mnsoar; - mxsoar = 3 * ( mxsomm + mxtrou ); - mnsoar = new Z[mosoar*mxsoar]; - if( mnsoar==NULL ) goto ERREUR; - //initialiser le tableau mnsoar pour le hachage des aretes - insoar_( mxsomm, mosoar, mxsoar, n1soar, mnsoar ); - - // mnarst( mxsomm ) numero mnsoar d'une arete pour chacun des sommets - if( mnarst!=NULL ) delete [] mnarst; - mnarst = new Z[1+mxsomm]; - if( mnarst==NULL ) goto ERREUR; - n = 1+mxsomm; - azeroi_( n, mnarst ); - - // mnslig( mxsomm ) no de sommet dans sa ligne pour chaque sommet frontalier - // ou no du point si interne forc'e par l'utilisateur - // ou 0 si interne cree par le module - if( mnslig!=NULL ) delete [] mnslig; - mnslig = new Z[mxsomm]; - if( mnslig==NULL ) goto ERREUR; - azeroi_( mxsomm, mnslig ); - - // initialisation des aretes frontalieres de la triangulation future - // renumerotation des sommets des aretes des lignes pour la triangulation - // mise a l'echelle des coordonnees des sommets pour obtenir une - // meilleure precision lors des calculs + quelques verifications - // boucle sur les lignes fermees qui forment la frontiere - // ====================================================================== - noar = 0; - aremin = 1e100; - aremax = 0; - - for (n=1; n<=nblf; n++) - { - //l'initialisation de la premiere arete de la ligne n dans la triangulation - //------------------------------------------------------------------------- - //le sommet ns0 est le numero de l'origine de la ligne - ns0 = nudslf[n-1]; - mnpxyd[ns0].x = uvslf[ns0].x; - mnpxyd[ns0].y = uvslf[ns0].y; - mnpxyd[ns0].z = areteideale_( mnpxyd[ns0], direction ); -// MESSAGE("Sommet " << ns0 << ": " << mnpxyd[ns0].x -// << " " << mnpxyd[ns0].y << " longueur arete=" << mnpxyd[ns0].z); - - //carre de la longueur de l'arete 1 de la ligne fermee n - d = pow( uvslf[ns0+1].x - uvslf[ns0].x, 2 ) - + pow( uvslf[ns0+1].y - uvslf[ns0].y, 2 ) ; - aremin = Min( aremin, d ); - aremax = Max( aremax, d ); - - //le numero des 2 sommets (ns1,ns2) de la premiere arete de la ligne - //initialisation de la 1-ere arete ns1-ns1+1 de cette ligne fermee n - //le numero des 2 sommets ns1 ns2 de la 1-ere arete - //Attention: les numeros ns debutent a 1 (ils ont >0) - // les tableaux c++ demarrent a zero! - // les tableaux fortran demarrent ou l'on veut! - ns0++; - ns1 = ns0; - ns2 = ns1+1; - - //le numero n de la ligne du sommet et son numero ns1 dans la ligne - mnslig[ns0-1] = 1000000 * n + ns1-nudslf[n-1]; - fasoar_( ns1, ns2, moins1, moins1, n, - mosoar, mxsoar, n1soar, mnsoar, mnarst, - noar0, ierr ); - //pas de test sur ierr car pas de saturation possible a ce niveau - - //le pointeur dans le hachage sur la premiere arete de la ligne fermee n - mndalf[n] = noar0; - - //la nouvelle arete est la suivante de l'arete definie juste avant - if( noar > 0 ) - mnsoar[mosoar * noar - mosoar + 5] = noar0; - - //l'initialisation des aretes suivantes de la ligne dans la triangulation - //----------------------------------------------------------------------- - nbarli = nudslf[n] - nudslf[n-1]; //nombre d'aretes=sommets de la ligne n - for (i=2; i<=nbarli; i++) - { - ns1 = ns2; //le numero de l'arete et le numero du premier sommet de l'arete - if( i < nbarli ) - //nbs+1 est le 2-eme sommet de l'arete i de la ligne fermee n - ns2 = ns1+1; - else - //le 2-eme sommet de la derniere arete est le premier sommet de la ligne - ns2 = ns0; - - //l'arete precedente est dotee de sa suivante:celle cree ensuite - //les 2 coordonnees du sommet ns2 de la ligne - ns = ns1 - 1; - mnpxyd[ns].x = uvslf[ns].x; - mnpxyd[ns].y = uvslf[ns].y; - mnpxyd[ns].z = areteideale_( mnpxyd[ns], direction ); -// MESSAGE("Sommet " << ns << ": " << mnpxyd[ns].x -// << " " << mnpxyd[ns].y << " longueur arete=" << mnpxyd[ns].z); - - //carre de la longueur de l'arete - d = pow( uvslf[ns2-1].x - uvslf[ns1-1].x, 2) - + pow( uvslf[ns2-1].y - uvslf[ns1-1].y, 2); - aremin = Min( aremin, d ); - aremax = Max( aremax, d ); - - //le numero n de la ligne du sommet et son numero ns1 dans la ligne - mnslig[ns] = 1000000 * n + ns1-nudslf[n-1]; - - //ajout de l'arete dans la liste - fasoar_( ns1, ns2, moins1, moins1, n, - mosoar, mxsoar, n1soar, mnsoar, - mnarst, noar, ierr ); - //pas de test sur ierr car pas de saturation possible a ce niveau - - //chainage des aretes frontalieres en position 6 du tableau mnsoar - //la nouvelle arete est la suivante de l'arete definie juste avant - mnsoar[ mosoar * noar0 - mosoar + 5 ] = noar; - noar0 = noar; - } - //attention: la derniere arete de la ligne fermee enveloppe - // devient en fait la premiere arete de cette ligne - // dans le chainage des aretes de la frontiere! - } - if( ierr != 0 ) goto ERREUR; - - aremin = sqrt( aremin ); //longueur minimale d'une arete des lignes fermees - aremax = sqrt( aremax ); //longueur maximale d'une arete - - aretmx = Min( aretmx, aremax ); //pour homogeneiser - MESSAGE("nutysu=" << nutysu << " aretmx=" << aretmx - << " arete min=" << aremin << " arete max=" << aremax); - - //chainage des aretes frontalieres : la derniere arete frontaliere - mnsoar[ mosoar * noar - mosoar + 5 ] = 0; - - //tous les sommets et aretes frontaliers sont numerotes de 1 a nbarfr - //reservation du tableau des numeros des 3 aretes de chaque triangle - //mnartr( moartr, mxartr ) - //En nombre: Triangles = Aretes Internes + Aretes Frontalieres - Sommets + 1-Trous - // 3Triangles = 2 Aretes internes + Aretes frontalieres - // d'ou 3T/2 < AI + AF => T < 3T/2 - Sommets + 1-Trous - //nombre de triangles < 2 ( nombre de sommets - 1 + nombre de trous ) - if( mnartr!=NULL ) delete [] mnartr; - mxartr = 2 * ( mxsomm + mxtrou ); - mnartr = new Z[moartr*mxartr]; - if( mnartr==NULL ) goto ERREUR; - - //Ajout des points internes - ns1 = nudslf[ nblf ]; - for (i=0; i redepart avec 2 fois plus de sommets - mxsomm = 2 * mxsomm; - ierr = 0; - goto NEWDEPART; - } - else - { - MESSAGE( "Triangulation non realisee " << ierr ); - if( ierr == 0 ) ierr=1; - goto NETTOYAGE; - } -} - - -void qualitetrte( R3 *mnpxyd, - Z & mosoar, Z & mxsoar, Z *mnsoar, - Z & moartr, Z & mxartr, Z *mnartr, - Z & nbtria, R & quamoy, R & quamin ) -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : calculer la qualite moyenne et minimale de la triangulation -// ----- actuelle definie par les tableaux mnsoar et mnartr -// entrees: -// -------- -// mnpxyd : tableau des coordonnees 2d des points -// par point : x y distance_souhaitee -// mosoar : nombre maximal d'entiers par arete et -// indice dans mnsoar de l'arete suivante dans le hachage -// mxsoar : nombre maximal d'aretes stockables dans le tableau mnsoar -// attention: mxsoar>3*mxsomm obligatoire! -// mnsoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -// chainage des aretes frontalieres, chainage du hachage des aretes -// hachage des aretes = mnsoar(1)+mnsoar(2)*2 -// avec mxsoar>=3*mxsomm -// une arete i de mnsoar est vide <=> mnsoar(1,i)=0 et -// mnsoar(2,arete vide)=l'arete vide qui precede -// mnsoar(3,arete vide)=l'arete vide qui suit -// moartr : nombre maximal d'entiers par arete du tableau mnartr -// mxartr : nombre maximal de triangles declarables -// mnartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -// arete1 = 0 si triangle vide => arete2 = triangle vide suivant -// sorties: -// -------- -// nbtria : nombre de triangles internes au domaine -// quamoy : qualite moyenne des triangles actuels -// quamin : qualite minimale des triangles actuels -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -{ - R d, aire, qualite; - Z nosotr[3], mn, nbtrianeg, nt; - - aire = 0; - quamoy = 0; - quamin = 2.0; - nbtria = 0; - nbtrianeg = 0; - - mn = -moartr; - for ( nt=1; nt<=mxartr; nt++ ) - { - mn += moartr; - if( mnartr[mn]!=0 ) - { - //un triangle occupe de plus - nbtria++; - - //le numero des 3 sommets du triangle nt - nusotr_( nt, mosoar, mnsoar, moartr, mnartr, nosotr ); - - //la qualite du triangle ns1 ns2 ns3 - qutr2d_( mnpxyd[nosotr[0]-1], mnpxyd[nosotr[1]-1], mnpxyd[nosotr[2]-1], - qualite ); - - //la qualite moyenne - quamoy += qualite; - - //la qualite minimale - quamin = Min( quamin, qualite ); - - //aire signee du triangle nt - d = surtd2_( mnpxyd[nosotr[0]-1], mnpxyd[nosotr[1]-1], mnpxyd[nosotr[2]-1] ); - if( d<0 ) - { - //un triangle d'aire negative de plus - nbtrianeg++; - MESSAGE("ATTENTION: le triangle " << nt << " de sommets:" - << nosotr[0] << " " << nosotr[1] << " " << nosotr[2] - << " a une aire " << d <<"<=0"); - } - - //aire des triangles actuels - aire += Abs(d); - } - } - - //les affichages - quamoy /= nbtria; - MESSAGE("Qualite moyenne=" << quamoy - << " Qualite minimale=" << quamin - << " des " << nbtria << " triangles de surface totale=" - << aire); - - if( nbtrianeg>0 ) - MESSAGE( "ATTENTION: nombre de triangles d'aire negative=" << nbtrianeg ); - return; -} diff --git a/src/MEFISTO2/aptrte.h b/src/MEFISTO2/aptrte.h deleted file mode 100755 index 531087700..000000000 --- a/src/MEFISTO2/aptrte.h +++ /dev/null @@ -1,255 +0,0 @@ -// SMESH MEFISTO2 : algorithm for meshing -// -// Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris -// -// 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.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr -// -// -// -// File : aptrte.h -// Author: Alain PERRONNET -// Module : SMESH - -#ifndef aptrte__h -#define aptrte__h - -#include // limites min max int long real ... -#include // gethostname, ... -#include -#include // pour cout cin ... -#include // pour le format des io setw, stx, setfill, ... -#include // pour les fonctions sur les chaines de caracteres -#include -#include -#include // pour les fonctions mathematiques -#include - -#include -#include - -void qualitetrte( R3 *mnpxyd, - Z & mosoar, Z & mxsoar, Z *mnsoar, - Z & moartr, Z & mxartr, Z *mnartr, - Z & nbtria, R & quamoy, R & quamin ); -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : calculer la qualite moyenne et minimale de la triangulation -// ----- actuelle definie par les tableaux nosoar et noartr -// entrees: -// -------- -// mnpxyd : tableau des coordonnees 2d des points -// par point : x y distance_souhaitee -// mosoar : nombre maximal d'entiers par arete et -// indice dans nosoar de l'arete suivante dans le hachage -// mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -// attention: mxsoar>3*mxsomm obligatoire! -// nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -// chainage des aretes frontalieres, chainage du hachage des aretes -// hachage des aretes = nosoar(1)+nosoar(2)*2 -// avec mxsoar>=3*mxsomm -// une arete i de nosoar est vide <=> nosoar(1,i)=0 et -// nosoar(2,arete vide)=l'arete vide qui precede -// nosoar(3,arete vide)=l'arete vide qui suit -// moartr : nombre maximal d'entiers par arete du tableau noartr -// mxartr : nombre maximal de triangles declarables -// noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -// arete1 = 0 si triangle vide => arete2 = triangle vide suivant -// sorties: -// -------- -// nbtria : nombre de triangles internes au domaine -// quamoy : qualite moyenne des triangles actuels -// quamin : qualite minimale des triangles actuels -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - -void aptrte( Z nutysu, R aretmx, - Z nblf, Z *nudslf, R2 *uvslf, - Z nbpti, R2 *uvpti, - Z & nbst, R2 * & uvst, Z & nbt, Z * & nust, - Z & ierr ); -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : appel de la triangulation par un arbre-4 recouvrant -// ----- de triangles equilateraux -// le contour du domaine plan est defini par des lignes fermees -// la premiere ligne etant l'enveloppe de toutes les autres -// la fonction areteideale_(s,d) donne la taille d'arete -// au point s dans la direction d (direction inactive pour l'instant) -// des lors toute arete issue d'un sommet s devrait avoir une longueur -// comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d) -// -//Attention: -// Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques! -// De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee -// -// entrees: -// -------- -// nutysu : numero de traitement de areteideale_() selon le type de surface -// 0 pas d'emploi de la fonction areteideale_() et aretmx est active -// 1 il existe une fonction areteideale_(s,d) -// dont seules les 2 premieres composantes de uv sont actives -// ... autres options a definir ... -// aretmx : longueur maximale des aretes de la future triangulation -// nblf : nombre de lignes fermees de la surface -// nudslf : numero du dernier sommet de chacune des nblf lignes fermees -// nudslf(0)=0 pour permettre la difference sans test -// Attention le dernier sommet de chaque ligne est raccorde au premier -// tous les sommets et les points internes ont des coordonnees -// UV differentes <=> Pas de point double! -// uvslf : uv des nudslf(nblf) sommets des lignes fermees -// nbpti : nombre de points internes futurs sommets de la triangulation -// uvpti : uv des points internes futurs sommets de la triangulation -// -// sorties: -// -------- -// nbst : nombre de sommets de la triangulation finale -// uvst : coordonnees uv des nbst sommets de la triangulation -// nbt : nombre de triangles de la triangulation finale -// nust : 3 numeros dans uvst des sommets des nbt triangles -// ierr : 0 si pas d'erreur -// > 0 sinon -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001 -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -extern "C" { void tempscpu_( double & tempsec ); } -//Retourne le temps CPU utilise en secondes - -extern "C" { void deltacpu_( R & dtcpu ); } -//Retourne le temps CPU utilise en secondes depuis le precedent appel - -//initialiser le tableau mnsoar pour le hachage des aretes -extern "C" {void insoar_( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );} - -//mettre a zero les nb entiers de tab -extern "C" {void azeroi_( Z & nb, Z * tab );} - -extern "C" {void fasoar_( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign, - Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst, - Z & noar, Z & ierr );} -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : former l'arete de sommet ns1-ns2 dans le hachage du tableau -// ----- nosoar des aretes de la triangulation -// entrees: -// -------- -// ns1 ns2: numero pxyd des 2 sommets de l'arete -// nt1 : numero du triangle auquel appartient l'arete -// nt1=-1 si numero inconnu -// nt2 : numero de l'eventuel second triangle de l'arete si connu -// nt2=-1 si numero inconnu -// nolign : numero de la ligne fermee de l'arete -// =0 si l'arete n'est une arete de ligne -// ce numero est ajoute seulement si l'arete est creee -// mosoar : nombre maximal d'entiers par arete du tableau nosoar -// mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -// modifies: -// --------- -// n1soar : numero de la premiere arete vide dans le tableau nosoar -// une arete i de nosoar est vide <=> nosoar(1,i)=0 -// chainage des aretes vides amont et aval -// l'arete vide qui precede=nosoar(4,i) -// l'arete vide qui suit =nosoar(5,i) -// nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, -// chainage momentan'e d'aretes, chainage du hachage des aretes -// hachage des aretes = min( nosoar(1), nosoar(2) ) -// noarst : noarst(np) numero d'une arete du sommet np - -// ierr : si < 0 en entree pas d'affichage en cas d'erreur du type -// "arete appartenant a plus de 2 triangles et a creer!" -// si >=0 en entree affichage de ce type d'erreur -// sorties: -// -------- -// noar : >0 numero de l'arete retrouvee ou ajoutee -// ierr : =0 si pas d'erreur -// =1 si le tableau nosoar est sature -// =2 si arete a creer et appartenant a 2 triangles distincts -// des triangles nt1 et nt2 -// =3 si arete appartenant a 2 triangles distincts -// differents des triangles nt1 et nt2 -// =4 si arete appartenant a 2 triangles distincts -// dont le second n'est pas le triangle nt2 -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm -extern "C" {void teajte_( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi, - R & aretmx, Z & mxtree, Z * letree, - Z & ierr );} - - -extern "C" {void tehote_( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd, - R3 * comxmi, R & aretmx, - Z * letree, Z & mxqueu, Z * mnqueu, - Z & ierr );} -// homogeneisation de l'arbre des te a un saut de taille au plus -// prise en compte des tailles d'aretes souhaitees autour des sommets initiaux - -extern "C" {void tetrte_( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd, - Z & mxqueu, Z * mnqueu, Z * mntree, - Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, - Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, - Z & ierr );} -// trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets -// et des points de la frontiere, des points internes imposes interieurs - -extern "C" {void aisoar_( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );} - // formation du chainage 6 des aretes internes a echanger eventuellement - -extern "C" {void tedela_( R3 * mnpxyd, Z * mnarst, - Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na, - Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );} - // boucle sur les aretes internes (non sur une ligne de la frontiere) - // avec echange des 2 diagonales afin de rendre la triangulation delaunay - -extern "C" {void terefr_( Z & nbarpi, R3 * mnpxyd, - Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, - Z & moartr, Z & n1artr, Z * mnartr, Z * mnarst, - Z & mxarcf, Z * mnarc1, Z * mnarc2, - Z * mnarc3, Z * mnarc4, - Z & n, Z & ierr );} -// detection des aretes frontalieres initiales perdues -// triangulation frontale pour les restaurer - -extern "C" {void tesuex_( Z & nblf, Z * nulftr, - Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig, - Z & mosoar, Z & mxsoar, Z * mnsoar, - Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, - Z & nbtria, Z * mntrsu, Z & ierr );} -// suppression des triangles externes a la surface - -extern "C" {void teamqt_( Z & nutysu, - Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, - Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, - Z & mxarcf, Z * mntrcf, Z * mnstbo, - Z * n1arcf, Z * mnarcf, Z * mnarc1, - R3 * comxmi, Z & nbarpi, Z & nbsomm, Z & mxsomm, - R3 * mnpxyd, Z * mnslig, - Z & ierr );} -// amelioration de la qualite de la triangulation par -// barycentrage des sommets internes a la triangulation -// suppression des aretes trop longues ou trop courtes -// modification de la topologie des groupes de triangles -// mise en delaunay de la triangulation - -extern "C" {void nusotr_( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr, - Z * nosotr );} -//retrouver les numero des 3 sommets du triangle nt - -extern "C" {void qutr2d_( R3 & p1, R3 & p2, R3 & p3, R & qualite );} -//calculer la qualite d'un triangle de R2 de sommets p1, p2, p3 - -extern "C" { R surtd2_( R3 & p1, R3 & p2, R3 & p3 ); } -//calcul de la surface d'un triangle defini par 3 points de r**2 - -#endif diff --git a/src/MEFISTO2/areteideale.f b/src/MEFISTO2/areteideale.f deleted file mode 100755 index f0c8744ca..000000000 --- a/src/MEFISTO2/areteideale.f +++ /dev/null @@ -1,30 +0,0 @@ -c MEFISTO : library to compute 2D triangulation from segmented boundaries -c -c Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris -c -c This library is free software; you can redistribute it and/or -c modify it under the terms of the GNU Lesser General Public -c License as published by the Free Software Foundation; either -c version 2.1 of the License. -c -c This library is distributed in the hope that it will be useful, -c but WITHOUT ANY WARRANTY; without even the implied warranty of -c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -c Lesser General Public License for more details. -c -c You should have received a copy of the GNU Lesser General Public -c License along with this library; if not, write to the Free Software -c Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -c -c See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr -c -c -c File : areteideale.f -c Module : SMESH -c Author: Alain PERRONNET - - double precision function areteideale( xyz, direction ) - double precision xyz(3), direction(3) - areteideale = 10 - return - end diff --git a/src/MEFISTO2/trte.f b/src/MEFISTO2/trte.f deleted file mode 100755 index 8e0388b88..000000000 --- a/src/MEFISTO2/trte.f +++ /dev/null @@ -1,8332 +0,0 @@ -c MEFISTO : library to compute 2D triangulation from segmented boundaries -c -c Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris -c -c This library is free software; you can redistribute it and/or -c modify it under the terms of the GNU Lesser General Public -c License as published by the Free Software Foundation; either -c version 2.1 of the License. -c -c This library is distributed in the hope that it will be useful, -c but WITHOUT ANY WARRANTY; without even the implied warranty of -c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -c Lesser General Public License for more details. -c -c You should have received a copy of the GNU Lesser General Public -c License along with this library; if not, write to the Free Software -c Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -c -c See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr -c -c -c File : trte.f -c Module : SMESH -c Author: Alain PERRONNET - - subroutine qutr2d( p1, p2, p3, qualite ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer la qualite d'un triangle de r**2 -c ----- 2 coordonnees des 3 sommets en double precision -c -c entrees : -c --------- -c p1,p2,p3 : les 3 coordonnees des 3 sommets du triangle -c sens direct pour une surface et qualite >0 -c sorties : -c --------- -c qualite: valeur de la qualite du triangle entre 0 et 1 (equilateral) -c 1 etant la qualite optimale -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris janvier 1995 -c2345x7..............................................................012 - parameter ( d2uxr3 = 3.4641016151377544d0 ) -c d2uxr3 = 2 * sqrt(3) - double precision p1(2), p2(2), p3(2), qualite, a, b, c, p -c -c la longueur des 3 cotes - a = sqrt( (p2(1)-p1(1))**2 + (p2(2)-p1(2))**2 ) - b = sqrt( (p3(1)-p2(1))**2 + (p3(2)-p2(2))**2 ) - c = sqrt( (p1(1)-p3(1))**2 + (p1(2)-p3(2))**2 ) -c -c demi perimetre - p = (a+b+c) * 0.5d0 -c - if ( (a*b*c) .ne. 0d0 ) then -c critere : 2 racine(3) * rayon_inscrit / plus longue arete - qualite = d2uxr3 * sqrt( abs( (p-a) / p * (p-b) * (p-c) ) ) - % / max(a,b,c) - else - qualite = 0d0 - endif -c -c -c autres criteres possibles: -c critere : 2 * rayon_inscrit / rayon_circonscrit -c qualite = 8d0 * (p-a) * (p-b) * (p-c) / (a * b * c) -c -c critere : 3*sqrt(3.) * ray_inscrit / demi perimetre -c qualite = 3*sqrt(3.) * sqrt ((p-a)*(p-b)*(p-c) / p**3) -c -c critere : 2*sqrt(3.) * ray_inscrit / max( des aretes ) -c qualite = 2*sqrt(3.) * sqrt( (p-a)*(p-b)*(p-c) / p ) / max(a,b,c) - end - - - double precision function surtd2( p1 , p2 , p3 ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul de la surface d'un triangle defini par 3 points de R**2 -c ----- -c parametres d entree : -c --------------------- -c p1 p2 p3 : les 3 fois 2 coordonnees des sommets du triangle -c -c parametre resultat : -c -------------------- -c surtd2 : surface du triangle -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris fevrier 1992 -c2345x7..............................................................012 - double precision p1(2), p2(2), p3(2) -c -c la surface du triangle - surtd2 = ( ( p2(1)-p1(1) ) * ( p3(2)-p1(2) ) - % - ( p2(2)-p1(2) ) * ( p3(1)-p1(1) ) ) * 0.5d0 - end - - integer function nopre3( i ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : numero precedent i dans le sens circulaire 1 2 3 1 ... -c ----- -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - if( i .eq. 1 ) then - nopre3 = 3 - else - nopre3 = i - 1 - endif - end - - integer function nosui3( i ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : numero suivant i dans le sens circulaire 1 2 3 1 ... -c ----- -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - if( i .eq. 3 ) then - nosui3 = 1 - else - nosui3 = i + 1 - endif - end - - subroutine provec( v1 , v2 , v3 ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : v3 vecteur = produit vectoriel de 2 vecteurs de r ** 3 -c ----- -c entrees: -c -------- -c v1, v2 : les 2 vecteurs de 3 composantes -c -c sortie : -c -------- -c v3 : vecteur = v1 produit vectoriel v2 -cc++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : perronnet alain upmc analyse numerique paris mars 1987 -c2345x7..............................................................012 - double precision v1(3), v2(3), v3(3) -c - v3( 1 ) = v1( 2 ) * v2( 3 ) - v1( 3 ) * v2( 2 ) - v3( 2 ) = v1( 3 ) * v2( 1 ) - v1( 1 ) * v2( 3 ) - v3( 3 ) = v1( 1 ) * v2( 2 ) - v1( 2 ) * v2( 1 ) -c - return - end - - subroutine norme1( n, v, ierr ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : normalisation euclidienne a 1 d un vecteur v de n composantes -c ----- -c entrees : -c --------- -c n : nombre de composantes du vecteur -c -c modifie : -c --------- -c v : le vecteur a normaliser a 1 -c -c sortie : -c --------- -c ierr : 1 si la norme de v est egale a 0 -c 0 si pas d'erreur -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris mars 1987 -c ...................................................................... - double precision v( n ), s, sqrt -c - s = 0.0d0 - do 10 i=1,n - s = s + v( i ) * v( i ) - 10 continue -c -c test de nullite de la norme du vecteur -c -------------------------------------- - if( s .le. 0.0d0 ) then -c norme nulle du vecteur non normalisable a 1 - ierr = 1 - return - endif -c - s = 1.0d0 / sqrt( s ) - do 20 i=1,n - v( i ) = v ( i ) * s - 20 continue -c - ierr = 0 - end - - - subroutine insoar( mxsomm, mosoar, mxsoar, n1soar, nosoar ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : initialiser le tableau nosoar pour le hachage des aretes -c ----- -c -c entrees: -c -------- -c mxsomm : plus grand numero de sommet d'une arete au cours du calcul -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c avec mxsoar>=3*mxsomm -c -c sorties: -c -------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c chainage des aretes vides amont et aval -c l'arete vide qui precede=nosoar(4,i) -c l'arete vide qui suit =nosoar(5,i) -c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, -c chainage momentan'e d'aretes, chainage du hachage des aretes -c hachage des aretes = min( nosoar(1), nosoar(2) ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - integer nosoar(mosoar,mxsoar) -c -c initialisation des aretes 1 a mxsomm - do 10 i=1,mxsomm -c -c sommet 1 = 0 <=> temoin d'arete vide pour le hachage - nosoar( 1, i ) = 0 -c -c arete sur aucune ligne - nosoar( 3, i ) = 0 -c -c la position de l'arete interne ou frontaliere est inconnue - nosoar( 6, i ) = -2 -c -c fin de chainage du hachage pas d'arete suivante - nosoar( mosoar, i ) = 0 -c - 10 continue -c -c la premiere arete vide chainee est la mxsomm+1 du tableau -c car ces aretes ne sont pas atteignables par le hachage direct - n1soar = mxsomm + 1 -c -c initialisation des aretes vides et des chainages - do 20 i = n1soar, mxsoar -c -c sommet 1 = 0 <=> temoin d'arete vide pour le hachage - nosoar( 1, i ) = 0 -c -c arete sur aucune ligne - nosoar( 3, i ) = 0 -c -c chainage sur l'arete vide qui precede -c (si arete occupee cela deviendra le no du triangle 1 de l'arete) - nosoar( 4, i ) = i-1 -c -c chainage sur l'arete vide qui suit -c (si arete occupee cela deviendra le no du triangle 2 de l'arete) - nosoar( 5, i ) = i+1 -c -c chainages des aretes frontalieres ou internes ou ... - nosoar( 6, i ) = -2 -c -c fin de chainage du hachage - nosoar( mosoar, i ) = 0 -c - 20 continue -c -c la premiere arete vide n'a pas de precedent - nosoar( 4, n1soar ) = 0 -c -c la derniere arete vide est mxsoar sans arete vide suivante - nosoar( 5, mxsoar ) = 0 - end - - - subroutine azeroi ( l , ntab ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : initialisation a zero d un tableau ntab de l variables entieres -c ----- -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris septembre 1988 -c23456---------------------------------------------------------------012 - integer ntab(l) - do 1 i = 1 , l - ntab( i ) = 0 - 1 continue - end - - - subroutine fasoar( ns1, ns2, nt1, nt2, nolign, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former l'arete de sommet ns1-ns2 dans le hachage du tableau -c ----- nosoar des aretes de la triangulation -c -c entrees: -c -------- -c ns1 ns2: numero pxyd des 2 sommets de l'arete -c nt1 : numero du triangle auquel appartient l'arete -c nt1=-1 si numero inconnu -c nt2 : numero de l'eventuel second triangle de l'arete si connu -c nt2=-1 si numero inconnu -c nolign : numero de la ligne de l'arete dans ladefi(wulftr-1+nolign) -c =0 si l'arete n'est une arete de ligne -c ce numero est ajoute seulement si l'arete est creee -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c chainage des aretes vides amont et aval -c l'arete vide qui precede=nosoar(4,i) -c l'arete vide qui suit =nosoar(5,i) -c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, -c chainage momentan'e d'aretes, chainage du hachage des aretes -c hachage des aretes = min( nosoar(1), nosoar(2) ) -c noarst : noarst(np) numero d'une arete du sommet np -c -c ierr : si < 0 en entree pas d'affichage en cas d'erreur du type -c "arete appartenant a plus de 2 triangles et a creer!" -c si >=0 en entree affichage de ce type d'erreur -c -c sorties: -c -------- -c noar : >0 numero de l'arete retrouvee ou ajoutee -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si arete a creer et appartenant a 2 triangles distincts -c des triangles nt1 et nt2 -c =3 si arete appartenant a 2 triangles distincts -c differents des triangles nt1 et nt2 -c =4 si arete appartenant a 2 triangles distincts -c dont le second n'est pas le triangle nt2 -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,mxsoar), noarst(*) - integer nu2sar(2) -c -c ajout eventuel de l'arete s1 s2 dans nosoar - nu2sar(1) = ns1 - nu2sar(2) = ns2 -c -c hachage de l'arete de sommets nu2sar - call hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar, noar ) -c en sortie: noar>0 => no arete retrouvee -c <0 => no arete ajoutee -c =0 => saturation du tableau nosoar -c - if( noar .eq. 0 ) then -c -c saturation du tableau nosoar - write(imprim,*) 'fasoar: tableau nosoar sature' - ierr = 1 - return -c - else if( noar .lt. 0 ) then -c -c l'arete a ete ajoutee. initialisation des autres informations - noar = -noar -c le numero de la ligne de l'arete - nosoar(3,noar) = nolign -c le triangle 1 de l'arete => le triangle nt1 - nosoar(4,noar) = nt1 -c le triangle 2 de l'arete => le triangle nt2 - nosoar(5,noar) = nt2 -c -c le sommet appartient a l'arete noar - noarst( nu2sar(1) ) = noar - noarst( nu2sar(2) ) = noar -c - else -c -c l'arete a ete retrouvee. -c si elle appartient a 2 triangles differents de nt1 et nt2 -c alors il y a une erreur - if( nosoar(4,noar) .gt. 0 .and. - % nosoar(5,noar) .gt. 0 ) then - if( nosoar(4,noar) .ne. nt1 .and. - % nosoar(4,noar) .ne. nt2 .or. - % nosoar(5,noar) .ne. nt1 .and. - % nosoar(5,noar) .ne. nt2 ) then -c arete appartenant a plus de 2 triangles => erreur - if( ierr .ge. 0 ) then - write(imprim,*) 'erreur fasoar: arete ',noar, - % ' dans 2 triangles et a creer!' - endif - ierr = 2 - return - endif - endif -c -c mise a jour du numero des triangles de l'arete noar -c le triangle 2 de l'arete => le triangle nt1 - if( nosoar(4,noar) .lt. 0 ) then -c pas de triangle connu pour cette arete - n = 4 - else -c deja un triangle connu. ce nouveau est le second - if( nosoar(5,noar) .gt. 0 .and. nt1 .gt. 0 .and. - % nosoar(5,noar) .ne. nt1 ) then -c arete appartenant a plus de 2 triangles => erreur - write(imprim,*) 'erreur fasoar: arete ',noar, - % ' dans plus de 2 triangles' - ierr = 3 - return - endif - n = 5 - endif - nosoar(n,noar) = nt1 -c -c cas de l'arete frontaliere retrouvee comme diagonale d'un quadrangle - if( nt2 .gt. 0 ) then -c l'arete appartient a 2 triangles - if( nosoar(5,noar) .gt. 0 .and. - % nosoar(5,noar) .ne. nt2 ) then -c arete appartenant a plus de 2 triangles => erreur - write(imprim,*) 'erreur fasoar: arete ',noar, - % ' dans plus de 2 triangles' - ierr = 4 - return - endif - nosoar(5,noar) = nt2 - endif -c - endif -c -c pas d'erreur - ierr = 0 - end - - subroutine fq1inv( x, y, s, xc, yc, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul des 2 coordonnees (xc,yc) dans le carre (0,1) -c ----- image par f:carre unite-->quadrangle appartenant a q1**2 -c par une resolution directe due a nicolas thenault -c -c entrees: -c -------- -c x,y : coordonnees du point image dans le quadrangle de sommets s -c s : les 2 coordonnees des 4 sommets du quadrangle -c -c sorties: -c -------- -c xc,yc : coordonnees dans le carre dont l'image par f vaut (x,y) -c ierr : 0 si calcul sans erreur, 1 si quadrangle degenere -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteurs: thenault tulenew analyse numerique paris janvier 1998 -c modifs : perronnet alain analyse numerique paris janvier 1998 -c234567..............................................................012 - real s(1:2,1:4), dist(2) - double precision a,b,c,d,alpha,beta,gamma,delta,x0,y0,t(2),u,v,w -c - a = s(1,1) - b = s(1,2) - s(1,1) - c = s(1,4) - s(1,1) - d = s(1,1) - s(1,2) + s(1,3) - s(1,4) -c - alpha = s(2,1) - beta = s(2,2) - s(2,1) - gamma = s(2,4) - s(2,1) - delta = s(2,1) - s(2,2) + s(2,3) - s(2,4) -c - u = beta * c - b * gamma - if( u .eq. 0 ) then -c quadrangle degenere - ierr = 1 - return - endif - v = delta * c - d * gamma - w = b * delta - beta * d -c - x0 = c * (y-alpha) - gamma * (x-a) - y0 = b * (y-alpha) - beta * (x-a) -c - a = v * w - b = u * u - w * x0 - v * y0 - c = x0 * y0 -c - if( a .ne. 0 ) then -c - delta = sqrt( b*b-4*a*c ) - if( b .ge. 0.0 ) then - t(2) = -b - delta - else - t(2) = -b + delta - endif -c la racine de plus grande valeur absolue -c (elle donne le plus souvent le point exterieur au carre unite -c donc a tester en second pour reduire les calculs) - t(2) = t(2) / ( 2 * a ) -c calcul de la seconde racine a partir de la somme => plus stable - t(1) = - b/a - t(2) -c - do 10 i=1,2 -c -c la solution i donne t elle un point interne au carre unite? - xc = ( x0 - v * t(i) ) / u - yc = ( w * t(i) - y0 ) / u - if( 0.0 .le. xc .and. xc .le. 1.0 ) then - if( 0.0 .le. yc .and. yc .le. 1.0 ) goto 9000 - endif -c -c le point (xc,yc) n'est pas dans le carre unite -c cela peut etre du aux erreurs d'arrondi -c => choix par le minimum de la distance aux bords du carre - dist(i) = max( 0.0, -xc, xc-1.0, -yc, yc-1.0 ) -c - 10 continue -c - if( dist(1) .gt. dist(2) ) then -c f(xc,yc) pour la racine 2 est plus proche de x,y -c xc yc sont deja calcules - goto 9000 - endif -c - else if ( b .ne. 0 ) then - t(1) = - c / b - else - t(1) = 0 - endif -c -c les 2 coordonnees du point dans le carre unite - xc = ( x0 - v * t(1) ) / u - yc = ( w * t(1) - y0 ) / u -c - 9000 ierr = 0 - return - end - - - subroutine ptdatr( point, pxyd, nosotr, nsigne ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : le point est il dans le triangle de sommets nosotr -c ----- -c -c entrees: -c -------- -c point : les 2 coordonnees du point -c pxyd : les 2 coordonnees et distance souhaitee des points du maillage -c nosotr : le numero des 3 sommets du triangle -c -c sorties: -c -------- -c nsigne : >0 si le point est dans le triangle ou sur une des 3 aretes -c =0 si le triangle est degenere ou indirect ou ne contient pas le poin -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - integer nosotr(3) - double precision point(2), pxyd(3,*) - double precision xp,yp, x1,x2,x3, y1,y2,y3, d,dd, cb1,cb2,cb3 -c - xp = point( 1 ) - yp = point( 2 ) -c - n1 = nosotr( 1 ) - x1 = pxyd( 1 , n1 ) - y1 = pxyd( 2 , n1 ) -c - n2 = nosotr( 2 ) - x2 = pxyd( 1 , n2 ) - y2 = pxyd( 2 , n2 ) -c - n3 = nosotr( 3 ) - x3 = pxyd( 1 , n3 ) - y3 = pxyd( 2 , n3 ) -c -c 2 fois la surface du triangle = determinant de la matrice -c de calcul des coordonnees barycentriques du point p - d = ( x2 - x1 ) * ( y3 - y1 ) - ( x3 - x1 ) * ( y2 - y1 ) -c - if( d .gt. 0 ) then -c -c triangle non degenere -c ===================== -c calcul des 3 coordonnees barycentriques du -c point xp yp dans le triangle - cb1 = ( ( x2-xp ) * ( y3-yp ) - ( x3-xp ) * ( y2-yp ) ) / d - cb2 = ( ( x3-xp ) * ( y1-yp ) - ( x1-xp ) * ( y3-yp ) ) / d - cb3 = 1d0 - cb1 -cb2 -ccc cb3 = ( ( x1-xp ) * ( y2-yp ) - ( x2-xp ) * ( y1-yp ) ) / d -c -ccc if( cb1 .ge. -0.00005d0 .and. cb1 .le. 1.00005d0 .and. - if( cb1 .ge. 0d0 .and. cb1 .le. 1d0 .and. - % cb2 .ge. 0d0 .and. cb2 .le. 1d0 .and. - % cb3 .ge. 0d0 .and. cb3 .le. 1d0 ) then -c -c le triangle nosotr contient le point - nsigne = 1 - else - nsigne = 0 - endif -c - else -c -c triangle degenere -c ================= -c le point est il du meme cote que le sommet oppose de chaque arete? - nsigne = 0 - do 10 i=1,3 -c le sinus de l'angle p1 p2-p1 point - x1 = pxyd(1,n1) - y1 = pxyd(2,n1) - d = ( pxyd(1,n2) - x1 ) * ( point(2) - y1 ) - % - ( pxyd(2,n2) - y1 ) * ( point(1) - x1 ) - dd = ( pxyd(1,n2) - x1 ) * ( pxyd(2,n3) - y1 ) - % - ( pxyd(2,n2) - y1 ) * ( pxyd(1,n3) - x1 ) - cb1 = ( pxyd(1,n2) - x1 ) ** 2 - % + ( pxyd(2,n2) - y1 ) ** 2 - cb2 = ( point(1) - x1 ) ** 2 - % + ( point(2) - y1 ) ** 2 - cb3 = ( pxyd(1,n3) - x1 ) ** 2 - % + ( pxyd(2,n3) - y1 ) ** 2 - if( abs( dd ) .le. 1e-4 * sqrt( cb1 * cb3 ) ) then -c le point 3 est sur l'arete 1-2 -c le point doit y etre aussi - if( abs( d ) .le. 1e-4 * sqrt( cb1 * cb2 ) ) then -c point sur l'arete - nsigne = nsigne + 1 - endif - else -c le point 3 n'est pas sur l'arete . test des signes - if( d * dd .ge. 0 ) then - nsigne = nsigne + 1 - endif - endif -c permutation circulaire des 3 sommets et aretes - n = n1 - n1 = n2 - n2 = n3 - n3 = n - 10 continue - if( nsigne .ne. 3 ) nsigne = 0 - endif - end - - integer function nosstr( p, pxyd, nt, letree ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer le numero 0 a 3 du sous-triangle te contenant -c ----- le point p -c -c entrees: -c -------- -c p : point de r**2 contenu dans le te nt de letree -c pxyd : x y distance des points -c nt : numero letree du te de te voisin a calculer -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 Â…a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c nosstr : 0 si le sous-triangle central contient p -c i =1,2,3 numero du sous-triangle contenant p -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - integer letree(0:8,0:*) - double precision pxyd(3,*), p(2), - % x1, y1, x21, y21, x31, y31, d, xe, ye -c -c le numero des 3 sommets du triangle - ns1 = letree( 6, nt ) - ns2 = letree( 7, nt ) - ns3 = letree( 8, nt ) -c -c les coordonnees entre 0 et 1 du point p - x1 = pxyd(1,ns1) - y1 = pxyd(2,ns1) -c - x21 = pxyd(1,ns2) - x1 - y21 = pxyd(2,ns2) - y1 -c - x31 = pxyd(1,ns3) - x1 - y31 = pxyd(2,ns3) - y1 -c - d = 1.0 / ( x21 * y31 - x31 * y21 ) -c - xe = ( ( p(1) - x1 ) * y31 - ( p(2) - y1 ) * x31 ) * d - ye = ( ( p(2) - y1 ) * x21 - ( p(1) - x1 ) * y21 ) * d -c - if( xe .gt. 0.5d0 ) then -c sous-triangle droit - nosstr = 2 - else if( ye .gt. 0.5d0 ) then -c sous-triangle haut - nosstr = 3 - else if( xe+ye .lt. 0.5d0 ) then -c sous-triangle gauche - nosstr = 1 - else -c sous-triangle central - nosstr = 0 - endif - end - - - integer function notrpt( p, pxyd, notrde, letree ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer le numero letree du sous-triangle feuille contenant -c ----- le point p a partir du te notrde de letree -c -c entrees: -c -------- -c p : point de r**2 contenu dans le te nt de letree -c pxyd : x y distance des points -c notrde : numero letree du triangle depart de recherche (1=>racine) -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 Â… 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c notrpt : numero letree du triangle contenant le point p -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - integer letree(0:8,0:*) - double precision pxyd(1:3,*), p(2) -c -c la racine depart de la recherche - notrpt = notrde -c -c tant que la feuille n'est pas atteinte descendre l'arbre - 10 if( letree(0,notrpt) .gt. 0 ) then -c -c recherche du sous-triangle contenant p - nsot = nosstr( p, pxyd, notrpt, letree ) -c -c le numero letree du sous-triangle - notrpt = letree( nsot, notrpt ) - goto 10 -c - endif - end - - - subroutine teajpt( ns, nbsomm, mxsomm, pxyd, letree, - & ntrp, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : ajout du point ns de pxyd dans letree -c ----- -c -c entrees: -c -------- -c ns : numero du point a ajouter dans letree -c mxsomm : nombre maximal de points declarables dans pxyd -c pxyd : tableau des coordonnees des points -c par point : x y distance_souhaitee -c -c modifies : -c ---------- -c nbsomm : nombre actuel de points dans pxyd -c -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 Â…a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c ntrp : numero letree du triangle te ou a ete ajoute le point -c ierr : 0 si pas d'erreur, 51 saturation letree, 52 saturation pxyd -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - integer letree(0:8,0:*) - double precision pxyd(3,mxsomm) -c -c depart de la racine - ntrp = 1 -c -c recherche du triangle contenant le point pxyd(ns) - 1 ntrp = notrpt( pxyd(1,ns), pxyd, ntrp, letree ) -c -c existe t il un point libre - do 10 i=0,3 - if( letree(i,ntrp) .eq. 0 ) then -c la place i est libre - letree(i,ntrp) = -ns - return - endif - 10 continue -c -c pas de place libre => 4 sous-triangles sont crees -c a partir des 3 milieux des aretes - call te4ste( nbsomm, mxsomm, pxyd, ntrp, letree, ierr ) - if( ierr .ne. 0 ) return -c -c ajout du point ns - goto 1 - end - - subroutine n1trva( nt, lar, letree, notrva, lhpile ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer le numero letree du triangle voisin du te nt -c ----- par l'arete lar (1 a 3 ) de nt -c attention : notrva n'est pas forcement minimal -c -c entrees: -c -------- -c nt : numero letree du te de te voisin a calculer -c lar : numero 1 a 3 de l'arete du triangle nt -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur-triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c notrva : >0 numero letree du te voisin par l'arete lar -c =0 si pas de te voisin (racine , ... ) -c lhpile : =0 si nt et notrva ont meme taille -c >0 nt est 4**lhpile fois plus petit que notrva -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - integer letree(0:8,0:*) - integer lapile(1:64) -c -c initialisation de la pile -c le triangle est empile - lapile(1) = nt - lhpile = 1 -c -c tant qu'il existe un sur-triangle - 10 ntr = lapile( lhpile ) - if( ntr .eq. 1 ) then -c racine atteinte => pas de triangle voisin - notrva = 0 - lhpile = lhpile - 1 - return - endif -c -c le type du triangle ntr - nty = letree( 5, ntr ) -c l'eventuel sur-triangle - nsut = letree( 4, ntr ) -c - if( nty .eq. 0 ) then -c -c triangle de type 0 => triangle voisin de type precedent(lar) -c dans le sur-triangle de ntr -c ce triangle remplace ntr dans lapile - lapile( lhpile ) = letree( nopre3(lar), nsut ) - goto 20 - endif -c -c triangle ntr de type nty>0 - if( nosui3(nty) .eq. lar ) then -c -c le triangle voisin par lar est le triangle 0 - lapile( lhpile ) = letree( 0, nsut ) - goto 20 - endif -c -c triangle sans voisin direct => passage par le sur-triangle - if( nsut .eq. 0 ) then -c -c ntr est la racine => pas de triangle voisin par cette arete - notrva = 0 - return - else -c -c le sur-triangle est empile - lhpile = lhpile + 1 - lapile(lhpile) = nsut - goto 10 - endif -c -c descente aux sous-triangles selon la meme arete - 20 notrva = lapile( lhpile ) -c - 30 lhpile = lhpile - 1 - if( letree(0,notrva) .le. 0 ) then -c le triangle est une feuille de l'arbre 0 sous-triangle -c lhpile = nombre de differences de niveaux dans l'arbre - return - else -c le triangle a 4 sous-triangles - if( lhpile .gt. 0 ) then -c -c bas de pile non atteint - nty = letree( 5, lapile(lhpile) ) - if( nty .eq. lar ) then -c l'oppose est suivant(nty) de notrva - notrva = letree( nosui3(nty) , notrva ) - else -c l'oppose est precedent(nty) de notrva - notrva = letree( nopre3(nty) , notrva ) - endif - goto 30 - endif - endif -c -c meme niveau dans l'arbre lhpile = 0 - end - - - subroutine cenced( xy1, xy2, xy3, cetria, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul des coordonnees du centre du cercle circonscrit -c ----- du triangle defini par ses 3 sommets de coordonnees -c xy1 xy2 xy3 ainsi que le carre du rayon de ce cercle -c -c entrees : -c --------- -c xy1 xy2 xy3 : les 2 coordonnees des 3 sommets du triangle -c ierr : <0 => pas d'affichage si triangle degenere -c >=0 => affichage si triangle degenere -c -c sortie : -c -------- -c cetria : cetria(1)=abcisse du centre -c cetria(2)=ordonnee du centre -c cetria(3)=carre du rayon 1d28 si triangle degenere -c ierr : 0 si triangle non degenere -c 1 si triangle degenere -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : perronnet alain upmc analyse numerique paris juin 1995 -c2345x7..............................................................012 - parameter (epsurf=1d-7) - common / unites / lecteu,imprim,nunite(30) - double precision x1,y1,x21,y21,x31,y31, - % aire2,xc,yc,rot, - % xy1(2),xy2(2),xy3(2),cetria(3) -c -c le calcul de 2 fois l'aire du triangle -c attention l'ordre des 3 sommets est direct ou non - x1 = xy1(1) - x21 = xy2(1) - x1 - x31 = xy3(1) - x1 -c - y1 = xy1(2) - y21 = xy2(2) - y1 - y31 = xy3(2) - y1 -c - aire2 = x21 * y31 - x31 * y21 -c -c recherche d'un test relatif peu couteux -c pour reperer la degenerescence du triangle - if( abs(aire2) .le. - % epsurf*(abs(x21)+abs(x31))*(abs(y21)+abs(y31)) ) then -c triangle de qualite trop faible - if( ierr .ge. 0 ) then -c nblgrc(nrerr) = 1 -c kerr(1) = 'erreur cenced: triangle degenere' -c call lereur - write(imprim,*) 'erreur cenced: triangle degenere' - write(imprim,10000) xy1,xy2,xy3,aire2 - endif -10000 format( 3(' x=',g24.16,' y=',g24.16/),' aire*2=',g24.16) - cetria(1) = 0d0 - cetria(2) = 0d0 - cetria(3) = 1d28 - ierr = 1 - return - endif -c -c les 2 coordonnees du centre intersection des 2 mediatrices -c x = (x1+x2)/2 + lambda * (y2-y1) -c y = (y1+y2)/2 - lambda * (x2-x1) -c x = (x1+x3)/2 + rot * (y3-y1) -c y = (y1+y3)/2 - rot * (x3-x1) -c ========================================================== - rot = ((xy2(1)-xy3(1))*x21 + (xy2(2)-xy3(2))*y21) / (2 * aire2) -c - xc = ( x1 + xy3(1) ) * 0.5d0 + rot * y31 - yc = ( y1 + xy3(2) ) * 0.5d0 - rot * x31 -c - cetria(1) = xc - cetria(2) = yc -c -c le carre du rayon - cetria(3) = (x1-xc) ** 2 + (y1-yc) ** 2 -c -c pas d'erreur rencontree - ierr = 0 - end - - - double precision function angled( p1, p2, p3 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer l'angle (p1p2,p1p3) en radians -c ----- -c -c entrees : -c --------- -c p1,p2,p3 : les 2 coordonnees des 3 sommets de l'angle -c sens direct pour une surface >0 -c sorties : -c --------- -c angled : angle (p1p2,p1p3) en radians entre [0 et 2pi] -c 0 si p1=p2 ou p1=p3 -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris fevrier 1992 -c2345x7..............................................................012 - double precision p1(2),p2(2),p3(2),x21,y21,x31,y31,a1,a2,d,c -c -c les cotes - x21 = p2(1) - p1(1) - y21 = p2(2) - p1(2) - x31 = p3(1) - p1(1) - y31 = p3(2) - p1(2) -c -c longueur des cotes - a1 = x21 * x21 + y21 * y21 - a2 = x31 * x31 + y31 * y31 - d = sqrt( a1 * a2 ) - if( d .eq. 0 ) then - angled = 0 - return - endif -c -c cosinus de l'angle - c = ( x21 * x31 + y21 * y31 ) / d - if( c .le. -1.d0 ) then -c tilt sur apollo si acos( -1 -eps ) - angled = atan( 1.d0 ) * 4.d0 - return - else if( c .ge. 1.d0 ) then -c tilt sur apollo si acos( 1 + eps ) - angled = 0 - return - endif -c - angled = acos( c ) - if( x21 * y31 - x31 * y21 .lt. 0 ) then -c demi plan inferieur - angled = 8.d0 * atan( 1.d0 ) - angled - endif - end - - - subroutine teajte( mxsomm, nbsomm, pxyd, comxmi, - % aretmx, mxtree, letree, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : initialisation des tableaux letree -c ----- ajout des sommets 1 a nbsomm (valeur en entree) dans letree -c -c entrees: -c -------- -c mxsomm : nombre maximal de sommets permis pour la triangulation -c mxtree : nombre maximal de triangles equilateraux (te) declarables -c aretmx : longueur maximale des aretes des triangles equilateraux -c -c entrees et sorties : -c -------------------- -c nbsomm : nombre de sommets apres identification -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c tableau reel(3,mxsomm) -c -c sorties: -c -------- -c comxmi : coordonnees minimales et maximales des points frontaliers -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c ierr : 0 si pas d'erreur -c 51 saturation letree -c 52 saturation pxyd -c 7 tous les points sont alignes -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juillet 1994 -c....................................................................012 - integer letree(0:8,0:mxtree) - double precision pxyd(3,mxsomm) - double precision comxmi(3,2) - double precision a(2),s,aretmx,rac3 -c -c protection du nombre de sommets avant d'ajouter ceux de tetree - nbsofr = nbsomm - do 1 i = 1, nbsomm - comxmi(1,1) = min( comxmi(1,1), pxyd(1,i) ) - comxmi(1,2) = max( comxmi(1,2), pxyd(1,i) ) - comxmi(2,1) = min( comxmi(2,1), pxyd(2,i) ) - comxmi(2,2) = max( comxmi(2,2), pxyd(2,i) ) - 1 continue -c -c creation de l'arbre tee -c ======================= -c la premiere colonne vide de letree - letree(0,0) = 2 -c chainage des te vides - do 4 i = 2 , mxtree - letree(0,i) = i+1 - 4 continue - letree(0,mxtree) = 0 -c les maxima des 2 indices de letree - letree(1,0) = 8 - letree(2,0) = mxtree -c -c la racine -c aucun point interne au triangle equilateral (te) 1 - letree(0,1) = 0 - letree(1,1) = 0 - letree(2,1) = 0 - letree(3,1) = 0 -c pas de sur-triangle - letree(4,1) = 0 - letree(5,1) = 0 -c le numero pxyd des 3 sommets du te 1 - letree(6,1) = nbsomm + 1 - letree(7,1) = nbsomm + 2 - letree(8,1) = nbsomm + 3 -c -c calcul de la largeur et hauteur du rectangle englobant -c ====================================================== - a(1) = comxmi(1,2) - comxmi(1,1) - a(2) = comxmi(2,2) - comxmi(2,1) -c la longueur de la diagonale - s = sqrt( a(1)**2 + a(2)**2 ) - do 60 k=1,2 - if( a(k) .lt. 1e-4 * s ) then -c nblgrc(nrerr) = 1 - write(imprim,*) 'tous les points sont alignes' -c call lereur - ierr = 7 - return - endif - 60 continue -c -c le maximum des ecarts - s = s + s -c -c le triangle equilateral englobant -c ================================= -c ecart du rectangle au triangle equilateral - rac3 = sqrt( 3.0d0 ) - arete = a(1) + 2 * aretmx + 2 * ( a(2) + aretmx ) / rac3 -c -c le point nbsomm + 1 en bas a gauche - nbsomm = nbsomm + 1 - pxyd(1,nbsomm) = (comxmi(1,1)+comxmi(1,2))*0.5d0 - arete*0.5d0 - pxyd(2,nbsomm) = comxmi(2,1) - aretmx - pxyd(3,nbsomm) = s -c -c le point nbsomm + 2 en bas a droite - nbsomm = nbsomm + 1 - pxyd(1,nbsomm) = pxyd(1,nbsomm-1) + arete - pxyd(2,nbsomm) = pxyd(2,nbsomm-1) - pxyd(3,nbsomm) = s -c -c le point nbsomm + 3 sommet au dessus - nbsomm = nbsomm + 1 - pxyd(1,nbsomm) = pxyd(1,nbsomm-2) + arete * 0.5d0 - pxyd(2,nbsomm) = pxyd(2,nbsomm-2) + arete * 0.5d0 * rac3 - pxyd(3,nbsomm) = s -c -c ajout des sommets des lignes pour former letree -c =============================================== - do 150 i=1,nbsofr -c ajout du point i de pxyd a letree - call teajpt( i, nbsomm, mxsomm, pxyd, letree, - & nt, ierr ) - if( ierr .ne. 0 ) return - 150 continue -c - return - end - - - subroutine tetaid( nutysu, dx, dy, longai, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer la longueur de l'arete ideale en dx,dy -c ----- -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale(xyz,xyzdir) -c ... autres options a definir ... -c dx, dy : abscisse et ordonnee dans le plan du point (reel2!) -c -c sorties: -c -------- -c longai : longueur de l'areteideale(xyz,xyzdir) autour du point xyz -c ierr : 0 si pas d'erreur, <>0 sinon -c 1 calcul incorrect de areteideale(xyz,xyzdir) -c 2 longueur calculee nulle -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) -c - double precision areteideale - double precision dx, dy, longai - double precision xyz(3), xyzd(3), d0 -c - ierr = 0 - if( nutysu .gt. 0 ) then - d0 = longai -c le point ou se calcule la longueur - xyz(1) = dx - xyz(2) = dy -c z pour le calcul de la longueur (inactif ici!) - xyz(3) = 0d0 -c la direction pour le calcul de la longueur (inactif ici!) - xyzd(1) = 0d0 - xyzd(2) = 0d0 - xyzd(3) = 0d0 - - longai = areteideale(xyz,xyzd) - if( longai .lt. 0d0 ) then - write(imprim,10000) xyz -10000 format('attention: longueur de areteideale(', - % g14.6,',',g14.6,',',g14.6,')<=0! => rendue >0' ) - longai = -longai - endif - if( longai .eq. 0d0 ) then - write(imprim,10001) xyz -10001 format('erreur: longueur de areteideale(', - % g14.6,',',g14.6,',',g14.6,')=0!' ) - ierr = 2 - longai = d0 - endif - endif - end - - - subroutine tehote( nutysu, - % nbarpi, mxsomm, nbsomm, pxyd, - % comxmi, aretmx, - % letree, mxqueu, laqueu, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : homogeneisation de l'arbre des te a un saut de taille au plus -c ----- prise en compte des distances souhaitees autour des sommets initiaux -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c nbarpi : nombre de sommets de la frontiere + nombre de points internes -c imposes par l'utilisateur -c mxsomm : nombre maximal de sommets permis pour la triangulation et te -c mxqueu : nombre d'entiers utilisables dans laqueu -c comxmi : minimum et maximum des coordonnees de l'objet -c aretmx : longueur maximale des aretes des triangles equilateraux -c permtr : perimetre de la ligne enveloppe dans le plan -c avant mise a l'echelle a 2**20 -c -c modifies : -c ---------- -c nbsomm : nombre de sommets apres identification -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(1,0) : maximum du 1-er indice de letree (ici 8) -c letree(2,0) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c auxiliaire : -c ------------ -c laqueu : mxqueu entiers servant de queue pour le parcours de letree -c -c sorties: -c -------- -c ierr : 0 si pas d'erreur -c 51 si saturation letree dans te4ste -c 52 si saturation pxyd dans te4ste -c >0 si autre erreur -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc avril 1997 -c2345x7..............................................................012 - double precision ampli - parameter (ampli=1.34d0) - common / unites / lecteu, imprim, intera, nunite(29) -c - double precision pxyd(3,mxsomm), d2, aretm2 - double precision comxmi(3,2),aretmx,a,s,xrmin,xrmax,yrmin,yrmax - double precision dmin, dmax - integer letree(0:8,0:*) -c - integer laqueu(1:mxqueu),lequeu -c lequeu : entree dans la queue -c lhqueu : longueur de la queue -c gestion circulaire -c - integer nuste(3) - equivalence (nuste(1),ns1),(nuste(2),ns2),(nuste(3),ns3) -c -c existence ou non de la fonction 'taille_ideale' des aretes -c autour du point. ici la carte est supposee isotrope -c ========================================================== -c attention: si la fonction taille_ideale existe -c alors pxyd(3,*) est la taille_ideale dans l'espace initial -c sinon pxyd(3,*) est la distance calculee dans le plan par -c propagation a partir des tailles des aretes de la frontiere -c - if( nutysu .gt. 0 ) then -c -c la fonction taille_ideale(x,y,z) existe -c --------------------------------------- -c initialisation de la distance souhaitee autour des points 1 a nbsomm - do 1 i=1,nbsomm -c calcul de pxyzd(3,i) - call tetaid( nutysu, pxyd(1,i), pxyd(2,i), - % pxyd(3,i), ierr ) - if( ierr .ne. 0 ) goto 9999 - 1 continue -c - else -c -c la fonction taille_ideale(x,y,z) n'existe pas -c --------------------------------------------- -c prise en compte des distances souhaitees dans le plan -c autour des points frontaliers et des points internes imposes -c toutes les autres distances souhaitees ont ete mis a aretmx -c lors de l'execution du sp teqini - do 3 i=1,nbarpi -c le sommet i n'est pas un sommet de letree => sommet frontalier -c recherche du sous-triangle minimal feuille contenant le point i - nte = 1 - 2 nte = notrpt( pxyd(1,i), pxyd, nte, letree ) -c la distance au sommet le plus eloigne est elle inferieure -c a la distance souhaitee? - ns1 = letree(6,nte) - ns2 = letree(7,nte) - ns3 = letree(8,nte) - d2 = max( ( pxyd(1,i)-pxyd(1,ns1) )**2 + - % ( pxyd(2,i)-pxyd(2,ns1) )**2 - % , ( pxyd(1,i)-pxyd(1,ns2) )**2 + - % ( pxyd(2,i)-pxyd(2,ns2) )**2 - % , ( pxyd(1,i)-pxyd(1,ns3) )**2 + - % ( pxyd(2,i)-pxyd(2,ns3) )**2 ) - if( d2 .gt. pxyd(3,i)**2 ) then -c le triangle nte trop grand doit etre subdivise en 4 sous-triangle - call te4ste( nbsomm, mxsomm, pxyd, nte, letree, - & ierr ) - if( ierr .ne. 0 ) return - goto 2 - endif - 3 continue - endif -c -c le sous-triangle central de la racine est decoupe systematiquement -c ================================================================== - nte = 2 - if( letree(0,2) .le. 0 ) then -c le sous-triangle central de la racine n'est pas subdivise -c il est donc decoupe en 4 soustriangles - nbsom0 = nbsomm - call te4ste( nbsomm, mxsomm, pxyd, nte, letree, - % ierr ) - if( ierr .ne. 0 ) return - do 4 i=nbsom0+1,nbsomm -c mise a jour de taille_ideale des nouveaux sommets de te - call tetaid( nutysu, pxyd(1,i), pxyd(2,i), pxyd(3,i), ierr ) - if( ierr .ne. 0 ) goto 9999 - 4 continue - endif -c -c le carre de la longueur de l'arete de triangles equilateraux -c souhaitee pour le fond de la triangulation - aretm2 = (aretmx*ampli) ** 2 -c -c tout te contenu dans le rectangle englobant doit avoir un -c cote < aretmx et etre de meme taille que les te voisins -c s'il contient un point; sinon un seul saut de taille est permis -c =============================================================== -c le rectangle englobant pour selectionner les te "internes" -c le numero des 3 sommets du te englobant racine de l'arbre des te - ns1 = letree(6,1) - ns2 = letree(7,1) - ns3 = letree(8,1) - a = aretmx * 0.01d0 -c abscisse du milieu de l'arete gauche du te 1 - s = ( pxyd(1,ns1) + pxyd(1,ns3) ) / 2 - xrmin = min( s, comxmi(1,1) - aretmx ) - a -c abscisse du milieu de l'arete droite du te 1 - s = ( pxyd(1,ns2) + pxyd(1,ns3) ) / 2 - xrmax = max( s, comxmi(1,2) + aretmx ) + a - yrmin = comxmi(2,1) - aretmx -c ordonnee de la droite passant par les milieus des 2 aretes -c droite gauche du te 1 - s = ( pxyd(2,ns1) + pxyd(2,ns3) ) / 2 - yrmax = max( s, comxmi(2,2) + aretmx ) + a -c -c cas particulier de 3 ou 4 ou peu d'aretes frontalieres - if( nbarpi .le. 8 ) then -c tout le triangle englobant (racine) est a prendre en compte - xrmin = pxyd(1,ns1) - a - xrmax = pxyd(1,ns2) + a - yrmin = pxyd(2,ns1) - a - yrmax = pxyd(2,ns3) + a - endif -c - nbs0 = nbsomm - nbiter = -1 -c -c initialisation de la queue - 5 nbiter = nbiter + 1 - lequeu = 1 - lhqueu = 0 -c la racine de letree initialise la queue - laqueu(1) = 1 -c -c tant que la longueur de la queue est >=0 traiter le debut de queue - 10 if( lhqueu .ge. 0 ) then -c -c le triangle te a traiter - i = lequeu - lhqueu - if( i .le. 0 ) i = mxqueu + i - nte = laqueu( i ) -c la longueur de la queue est reduite - lhqueu = lhqueu - 1 -c -c nte est il un sous-triangle feuille minimal ? - 15 if( letree(0,nte) .gt. 0 ) then -c -c non les 4 sous-triangles sont mis dans la queue - if( lhqueu + 4 .ge. mxqueu ) then - write(imprim,*) 'tehote: saturation de la queue' - ierr = 7 - return - endif - do 20 i=3,0,-1 -c ajout du sous-triangle i - lhqueu = lhqueu + 1 - lequeu = lequeu + 1 - if( lequeu .gt. mxqueu ) lequeu = lequeu - mxqueu - laqueu( lequeu ) = letree( i, nte ) - 20 continue - goto 10 -c - endif -c -c ici nte est un triangle minimal non subdivise -c --------------------------------------------- -c le te est il dans le cadre englobant de l'objet ? - ns1 = letree(6,nte) - ns2 = letree(7,nte) - ns3 = letree(8,nte) - if( pxyd(1,ns1) .gt. pxyd(1,ns2) ) then - dmin = pxyd(1,ns2) - dmax = pxyd(1,ns1) - else - dmin = pxyd(1,ns1) - dmax = pxyd(1,ns2) - endif - if( (xrmin .le. dmin .and. dmin .le. xrmax) .or. - % (xrmin .le. dmax .and. dmax .le. xrmax) ) then - if( pxyd(2,ns1) .gt. pxyd(2,ns3) ) then - dmin = pxyd(2,ns3) - dmax = pxyd(2,ns1) - else - dmin = pxyd(2,ns1) - dmax = pxyd(2,ns3) - endif - if( (yrmin .le. dmin .and. dmin .le. yrmax) .or. - % (yrmin .le. dmax .and. dmax .le. yrmax) ) then -c -c nte est un te feuille et interne au rectangle englobant -c ======================================================= -c le carre de la longueur de l'arete du te de numero nte - d2 = (pxyd(1,ns1)-pxyd(1,ns2)) ** 2 + - % (pxyd(2,ns1)-pxyd(2,ns2)) ** 2 -c - if( nutysu .eq. 0 ) then -c -c il n'existe pas de fonction 'taille_ideale' -c ------------------------------------------- -c si la taille effective de l'arete du te est superieure a aretmx -c alors le te est decoupe - if( d2 .gt. aretm2 ) then -c le triangle nte trop grand doit etre subdivise -c en 4 sous-triangles - call te4ste( nbsomm,mxsomm, pxyd, - % nte, letree, ierr ) - if( ierr .ne. 0 ) return - goto 15 - endif -c - else -c -c il existe ici une fonction 'taille_ideale' -c ------------------------------------------ -c si la taille effective de l'arete du te est superieure au mini -c des 3 tailles_ideales aux sommets alors le te est decoupe - do 28 i=1,3 - if( d2 .gt. (pxyd(3,nuste(i))*ampli)**2 ) then -c le triangle nte trop grand doit etre subdivise -c en 4 sous-triangles - nbsom0 = nbsomm - call te4ste( nbsomm, mxsomm, pxyd, - & nte, letree, ierr ) - if( ierr .ne. 0 ) return - do 27 j=nbsom0+1,nbsomm -c mise a jour de taille_ideale des nouveaux sommets de - call tetaid( nutysu, pxyd(1,j), pxyd(2,j), - % pxyd(3,j), ierr ) - if( ierr .ne. 0 ) goto 9999 - 27 continue - goto 15 - endif - 28 continue - endif -c -c recherche du nombre de niveaux entre nte et les te voisins par se -c si la difference de subdivisions excede 1 alors le plus grand des -c ================================================================= - 29 do 30 i=1,3 -c -c noteva triangle voisin de nte par l'arete i - call n1trva( nte, i, letree, noteva, niveau ) - if( noteva .le. 0 ) goto 30 -c il existe un te voisin - if( niveau .gt. 0 ) goto 30 -c nte a un te voisin plus petit ou egal - if( letree(0,noteva) .le. 0 ) goto 30 -c nte a un te voisin noteva subdivise au moins une fois -c - if( nbiter .gt. 0 ) then -c les 2 sous triangles voisins sont-ils subdivises? - ns2 = letree(i,noteva) - if( letree(0,ns2) .le. 0 ) then -c ns2 n'est pas subdivise - ns2 = letree(nosui3(i),noteva) - if( letree(0,ns2) .le. 0 ) then -c les 2 sous-triangles ne sont pas subdivises - goto 30 - endif - endif - endif -c -c saut>1 => le triangle nte doit etre subdivise en 4 sous-triang -c -------------------------------------------------------------- - nbsom0 = nbsomm - call te4ste( nbsomm,mxsomm, pxyd, nte, letree, - & ierr ) - if( ierr .ne. 0 ) return - if( nutysu .gt. 0 ) then - do 32 j=nbsom0+1,nbsomm -c mise a jour de taille_ideale des nouveaux sommets de te - call tetaid( nutysu, pxyd(1,j), pxyd(2,j), - % pxyd(3,j), ierr ) - if( ierr .ne. 0 ) goto 9999 - 32 continue - endif - goto 15 -c - 30 continue - endif - endif - goto 10 - endif - if( nbs0 .lt. nbsomm ) then - nbs0 = nbsomm - goto 5 - endif - return -c -c pb dans le calcul de la fonction taille_ideale - - 9999 write(imprim,*) 'pb dans le calcul de taille_ideale' -c nblgrc(nrerr) = 1 -c kerr(1) = 'pb dans le calcul de taille_ideale' -c call lereur - return - end - - - subroutine tetrte( comxmi, aretmx, nbarpi, mxsomm, pxyd, - % mxqueu, laqueu, letree, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : trianguler les triangles equilateraux feuilles et -c ----- les points de la frontiere et les points internes imposes -c -c attention: la triangulation finale n'est pas de type delaunay! -c -c entrees: -c -------- -c comxmi : minimum et maximum des coordonnees de l'objet -c aretmx : longueur maximale des aretes des triangles equilateraux -c nbarpi : nombre de sommets de la frontiere + nombre de points internes -c imposes par l'utilisateur -c mxsomm : nombre maximal de sommets declarables dans pxyd -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c -c mxqueu : nombre d'entiers utilisables dans laqueu -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c noarst : noarst(i) numero d'une arete de sommet i -c -c auxiliaire : -c ------------ -c laqueu : mxqueu entiers servant de queue pour le parcours de letree -c -c sorties: -c -------- -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes d'un t -c =5 si saturation de la queue de parcours de l'arbre des te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, intera, nunite(29) -c - double precision pxyd(3,mxsomm) - double precision comxmi(3,2),aretmx,a,s,xrmin,xrmax,yrmin,yrmax - double precision dmin, dmax -c - integer nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(mxsomm) -c - integer letree(0:8,0:*) - integer laqueu(1:mxqueu) -c lequeu:entree dans la queue en gestion circulaire -c lhqueu:longueur de la queue en gestion circulaire -c - integer milieu(3), nutr(1:13) -c -c le rectangle englobant pour selectionner les te "internes" -c le numero des 3 sommets du te englobant racine de l'arbre des te - ns1 = letree(6,1) - ns2 = letree(7,1) - ns3 = letree(8,1) - a = aretmx * 0.01d0 -c abscisse du milieu de l'arete gauche du te 1 - s = ( pxyd(1,ns1) + pxyd(1,ns3) ) / 2 - xrmin = min( s, comxmi(1,1) - aretmx ) - a -c abscisse du milieu de l'arete droite du te 1 - s = ( pxyd(1,ns2) + pxyd(1,ns3) ) / 2 - xrmax = max( s, comxmi(1,2) + aretmx ) + a - yrmin = comxmi(2,1) - aretmx -c ordonnee de la droite passant par les milieus des 2 aretes -c droite gauche du te 1 - s = ( pxyd(2,ns1) + pxyd(2,ns3) ) / 2 - yrmax = max( s, comxmi(2,2) + aretmx ) + a -c -c cas particulier de 3 ou 4 ou peu d'aretes frontalieres - if( nbarpi .le. 8 ) then -c tout le triangle englobant (racine) est a prendre en compte - xrmin = pxyd(1,ns1) - a - xrmax = pxyd(1,ns2) + a - yrmin = pxyd(2,ns1) - a - yrmax = pxyd(2,ns3) + a - endif -c -c initialisation du tableau noartr - do 5 i=1,mxartr -c le numero de l'arete est inconnu - noartr(1,i) = 0 -c le chainage sur le triangle vide suivant - noartr(2,i) = i+1 - 5 continue - noartr(2,mxartr) = 0 - n1artr = 1 -c -c parcours des te jusqu'a trianguler toutes les feuilles (triangles eq) -c ===================================================================== -c initialisation de la queue sur les te - ierr = 0 - lequeu = 1 - lhqueu = 0 -c la racine de letree initialise la queue - laqueu(1) = 1 -c -c tant que la longueur de la queue est >=0 traiter le debut de queue - 10 if( lhqueu .ge. 0 ) then -c -c le triangle te a traiter - i = lequeu - lhqueu - if( i .le. 0 ) i = mxqueu + i - nte = laqueu( i ) -c la longueur est reduite - lhqueu = lhqueu - 1 -c -c nte est il un sous-triangle feuille (minimal) ? - 15 if( letree(0,nte) .gt. 0 ) then -c non les 4 sous-triangles sont mis dans la queue - if( lhqueu + 4 .ge. mxqueu ) then - write(imprim,*) 'tetrte: saturation de la queue' - ierr = 5 - return - endif - do 20 i=3,0,-1 -c ajout du sous-triangle i - lhqueu = lhqueu + 1 - lequeu = lequeu + 1 - if( lequeu .gt. mxqueu ) lequeu = lequeu - mxqueu - laqueu( lequeu ) = letree( i, nte ) - 20 continue - goto 10 - endif -c -c ici nte est un triangle minimal non subdivise -c --------------------------------------------- -c le te est il dans le cadre englobant de l'objet ? - ns1 = letree(6,nte) - ns2 = letree(7,nte) - ns3 = letree(8,nte) - if( pxyd(1,ns1) .gt. pxyd(1,ns2) ) then - dmin = pxyd(1,ns2) - dmax = pxyd(1,ns1) - else - dmin = pxyd(1,ns1) - dmax = pxyd(1,ns2) - endif - if( (xrmin .le. dmin .and. dmin .le. xrmax) .or. - % (xrmin .le. dmax .and. dmax .le. xrmax) ) then - if( pxyd(2,ns1) .gt. pxyd(2,ns3) ) then - dmin = pxyd(2,ns3) - dmax = pxyd(2,ns1) - else - dmin = pxyd(2,ns1) - dmax = pxyd(2,ns3) - endif - if( (yrmin .le. dmin .and. dmin .le. yrmax) .or. - % (yrmin .le. dmax .and. dmax .le. yrmax) ) then -c -c te minimal et interne au rectangle englobant -c -------------------------------------------- -c recherche du nombre de niveaux entre nte et les te voisins -c par ses aretes - nbmili = 0 - do 30 i=1,3 -c -c a priori pas de milieu de l'arete i du te nte - milieu(i) = 0 -c -c recherche de noteva te voisin de nte par l'arete i - call n1trva( nte, i, letree, noteva, niveau ) -c noteva : >0 numero letree du te voisin par l'arete i -c =0 si pas de te voisin (racine , ... ) -c niveau : =0 si nte et noteva ont meme taille -c >0 nte est 4**niveau fois plus petit que noteva - if( noteva .gt. 0 ) then -c il existe un te voisin - if( letree(0,noteva) .gt. 0 ) then -c noteva est plus petit que nte -c => recherche du numero du milieu du cote=sommet du te no -c le sous-te 0 du te noteva - nsot = letree(0,noteva) -c le numero dans pxyd du milieu de l'arete i de nte - milieu( i ) = letree( 5+nopre3(i), nsot ) - nbmili = nbmili + 1 - endif - endif -c - 30 continue -c -c triangulation du te nte en fonction du nombre de ses milieux - goto( 50, 100, 200, 300 ) , nbmili + 1 -c -c 0 milieu => 1 triangle = le te nte -c ---------------------------------- - 50 call f0trte( letree(0,nte), pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) - if( ierr .ne. 0 ) return - goto 10 -c -c 1 milieu => 2 triangles = 2 demi te -c ----------------------------------- - 100 call f1trte( letree(0,nte), pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) - if( ierr .ne. 0 ) return - goto 10 -c -c 2 milieux => 3 triangles -c ----------------------------------- - 200 call f2trte( letree(0,nte), pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) - if( ierr .ne. 0 ) return - goto 10 -c -c 3 milieux => 4 triangles = 4 quart te -c ------------------------------------- - 300 call f3trte( letree(0,nte), pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) - if( ierr .ne. 0 ) return - goto 10 - endif - endif - goto 10 - endif - end - - - subroutine aisoar( mosoar, mxsoar, nosoar, na1 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : chainer en colonne lchain les aretes non vides et -c ----- non frontalieres du tableau nosoar -c -c entrees: -c -------- -c mosoar : nombre maximal d'entiers par arete dans le tableau nosoar -c mxsoar : nombre maximal d'aretes frontalieres declarables -c -c modifies : -c ---------- -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c nosoar(lchain,i)=arete interne suivante -c -c sortie : -c -------- -c na1 : numero dans nosoar de la premiere arete interne -c les suivantes sont nosoar(lchain,na1), ... -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (lchain=6) - integer nosoar(mosoar,mxsoar) -c -c formation du chainage des aretes internes a echanger eventuellement -c recherche de la premiere arete non vide et non frontaliere - do 10 na1=1,mxsoar - if( nosoar(1,na1) .gt. 0 .and. nosoar(3,na1) .le. 0 ) goto 15 - 10 continue -c -c protection de la premiere arete non vide et non frontaliere - 15 na0 = na1 - do 20 na=na1+1,mxsoar - if( nosoar(1,na) .gt. 0 .and. nosoar(3,na) .le. 0 ) then -c arete interne => elle est chainee a partir de la precedente - nosoar(lchain,na0) = na - na0 = na - endif - 20 continue -c -c la derniere arete interne n'a pas de suivante - nosoar(lchain,na0) = 0 - end - - - subroutine tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, n1ardv, - % moartr, mxartr, n1artr, noartr, modifs ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : pour toutes les aretes chainees dans nosoar(lchain,*) -c ----- du tableau nosoar -c echanger la diagonale des 2 triangles si le sommet oppose -c a un triangle ayant en commun une arete appartient au cercle -c circonscrit de l'autre (violation boule vide delaunay) -c -c entrees: -c -------- -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c -c modifies : -c ---------- -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete dans le tableau nosoar -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c n1ardv : numero dans nosoar de la premiere arete du chainage -c des aretes a rendre delaunay -c -c moartr : nombre d'entiers par triangle dans le tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c modifs : nombre d'echanges de diagonales pour maximiser la qualite -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*), surtd2, s123, s142, s143, s234, - % s12, s34, a12, cetria(3), r0 - integer nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*) -c -c le nombre d'echanges de diagonales pour minimiser l'aire - modifs = 0 - r0 = 0 -c -c la premiere arete du chainage des aretes a rendre delaunay - na0 = n1ardv -c -c tant que la pile des aretes a echanger eventuellement est non vide -c ================================================================== - 20 if( na0 .gt. 0 ) then -c -c l'arete a traiter - na = na0 -c la prochaine arete a traiter - na0 = nosoar(lchain,na0) -c -c l'arete est marquee traitee avec le numero -1 - nosoar(lchain,na) = -1 -c -c l'arete est elle active? - if( nosoar(1,na) .eq. 0 ) goto 20 -c -c si arete frontaliere pas d'echange possible - if( nosoar(3,na) .gt. 0 ) goto 20 -c -c existe-t-il 2 triangles ayant cette arete commune? - if( nosoar(4,na) .le. 0 .or. nosoar(5,na) .le. 0 ) goto 20 -c -c aucun des 2 triangles est-il desactive? - if( noartr(1,nosoar(4,na)) .eq. 0 .or. - % noartr(1,nosoar(5,na)) .eq. 0 ) goto 20 -c -c l'arete appartient a deux triangles actifs -c le numero des 4 sommets du quadrangle des 2 triangles - call mt4sqa( na, moartr, noartr, mosoar, nosoar, - % ns1, ns2, ns3, ns4 ) - if( ns4 .eq. 0 ) goto 20 -c -c carre de la longueur de l'arete ns1 ns2 - a12 = (pxyd(1,ns2)-pxyd(1,ns1))**2+(pxyd(2,ns2)-pxyd(2,ns1))**2 -c -c comparaison de la somme des aires des 2 triangles -c ------------------------------------------------- -c calcul des surfaces des triangles 123 et 142 de cette arete - s123=surtd2( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3) ) - s142=surtd2( pxyd(1,ns1), pxyd(1,ns4), pxyd(1,ns2) ) - s12 = abs( s123 ) + abs( s142 ) - if( s12 .le. 0.001*a12 ) goto 20 -c -c calcul des surfaces des triangles 143 et 234 de cette arete - s143=surtd2( pxyd(1,ns1), pxyd(1,ns4), pxyd(1,ns3) ) - s234=surtd2( pxyd(1,ns2), pxyd(1,ns3), pxyd(1,ns4) ) - s34 = abs( s234 ) + abs( s143 ) -c - if( abs(s34-s12) .gt. 1d-15*s34 ) goto 20 -c -c quadrangle convexe : le critere de delaunay intervient -c ------------------ --------------------------------- -c calcul du centre et rayon de la boule circonscrite a 123 -c pas d'affichage si le triangle est degenere - ierr = -1 - call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), cetria, - % ierr ) - if( ierr .gt. 0 ) then -c ierr=1 si triangle degenere => abandon - goto 20 - endif -c - if( (cetria(1)-pxyd(1,ns4))**2+(cetria(2)-pxyd(2,ns4))**2 - % .lt. cetria(3) ) then -c -c protection contre une boucle infinie sur le meme cercle - if( r0 .eq. cetria(3) ) goto 20 -c -c oui: ns4 est dans le cercle circonscrit a ns1 ns2 ns3 -c => ns3 est aussi dans le cercle circonscrit de ns1 ns2 ns4 -c -cccc les 2 triangles d'arete na sont effaces -ccc do 25 j=4,5 -ccc nt = nosoar(j,na) -cccc trace du triangle nt -ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar, -ccc % ncnoir, ncjaun ) -ccc 25 continue -c -c echange de la diagonale 12 par 34 des 2 triangles - call te2t2t( na, mosoar, n1soar, nosoar, noarst, - % moartr, noartr, na34 ) - if( na34 .eq. 0 ) goto 20 - r0 = cetria(3) -c -c l'arete na34 est marquee traitee - nosoar(lchain,na34) = -1 - modifs = modifs + 1 -c -c les aretes internes peripheriques des 2 triangles sont enchainees - do 60 j=4,5 - nt = nosoar(j,na34) -cccc trace du triangle nt -ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar, -ccc % ncoran, ncgric ) - do 50 i=1,3 - n = abs( noartr(i,nt) ) - if( n .ne. na34 ) then - if( nosoar(3,n) .eq. 0 .and. - % nosoar(lchain,n) .eq. -1 ) then -c cette arete marquee est chainee pour etre traitee - nosoar(lchain,n) = na0 - na0 = n - endif - endif - 50 continue - 60 continue - goto 20 - endif -c -c retour en haut de la pile des aretes a traiter - goto 20 - endif - end - - - subroutine terefr( nbarpi, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, larmin, notrcf, - % nbarpe, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : recherche des aretes de la frontiere non dans la triangulation -c ----- triangulation frontale pour les reobtenir -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entrees: -c -------- -c le tableau nosoar -c nbarpi : numero du dernier point interne impose par l'utilisateur -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf -c -c modifies: -c --------- -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c -c auxiliaires : -c ------------- -c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers -c noarcf : tableau (3,mxarcf) auxiliaire d'entiers -c larmin : tableau (mxarcf) auxiliaire d'entiers -c notrcf : tableau (mxarcf) auxiliaire d'entiers -c -c sortie : -c -------- -c nbarpe : nombre d'aretes perdues puis retrouvees -c ierr : =0 si pas d'erreur -c >0 si une erreur est survenue -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu,imprim,intera,nunite(29) - double precision pxyd(3,*) - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf) -c -c le nombre d'aretes de la frontiere non arete de la triangulation - nbarpe = 0 -c -c initialisation du chainage des aretes des cf => 0 arete de cf - do 10 narete=1,mxsoar - nosoar( lchain, narete) = -1 - 10 continue -c -c boucle sur l'ensemble des aretes actuelles -c ========================================== - do 30 narete=1,mxsoar -c - if( nosoar(3,narete) .gt. 0 ) then -c arete appartenant a une ligne => frontaliere -c - if(nosoar(4,narete) .le. 0 .or. nosoar(5,narete) .le. 0)then -c l'arete narete frontaliere n'appartient pas a 2 triangles -c => elle est perdue - nbarpe = nbarpe + 1 -c -c le numero des 2 sommets de l'arete frontaliere perdue - ns1 = nosoar( 1, narete ) - ns2 = nosoar( 2, narete ) -c write(imprim,10000) ns1,(pxyd(j,ns1),j=1,2), -c % ns2,(pxyd(j,ns2),j=1,2) -10000 format(' arete perdue a forcer', - % (t24,'sommet=',i6,' x=',g13.5,' y=',g13.5)) -c -c traitement de cette arete perdue ns1-ns2 - call tefoar( narete, nbarpi, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, larmin, notrcf, - % ierr ) - if( ierr .ne. 0 ) return -c -c fin du traitement de cette arete perdue et retrouvee - endif - endif -c - 30 continue - end - - - subroutine tesuex( nblftr, nulftr, - % ndtri0, nbsomm, pxyd, nslign, - % mosoar, mxsoar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtria, letrsu, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : supprimer du tableau noartr les triangles externes au domaine -c ----- en annulant le numero de leur 1-ere arete dans noartr -c et en les chainant comme triangles vides -c -c entrees: -c -------- -c nblftr : nombre de lignes fermees definissant la surface -c nulftr : numero des lignes fermees definissant la surface -c ndtri0 : plus grand numero dans noartr d'un triangle -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c nslign : tableau du numero de sommet dans sa ligne pour chaque -c sommet frontalier -c numero du point dans le lexique point si interne impose -c 0 si le point est interne non impose par l'utilisateur -c -1 si le sommet est externe au domaine -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero nosoar d'une arete de sommet i -c -c sorties: -c -------- -c nbtria : nombre de triangles internes au domaine -c letrsu : letrsu(nt)=numero du triangle interne, 0 sinon -c noarst : noarst(i) numero nosoar d'une arete du sommet i (modifi'e) -c ierr : 0 si pas d'erreur, >0 sinon -cc++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mai 1999 -c2345x7..............................................................012 - double precision pxyd(3,*) - integer nulftr(nblftr),nslign(nbsomm), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*) - integer letrsu(1:ndtri0) - double precision dmin -c -c les triangles sont a priori non marques - do 5 nt=1,ndtri0 - letrsu(nt) = 0 - 5 continue -c -c les aretes sont marquees non chainees - do 10 noar1=1,mxsoar - nosoar(6,noar1) = -2 - 10 continue -c -c recherche du sommet de la triangulation de plus petite abscisse -c =============================================================== - ntmin = 0 - dmin = 1d38 - do 20 i=1,nbsomm - if( pxyd(1,i) .lt. dmin ) then -c le nouveau minimum - noar1 = noarst(i) - if( noar1 .gt. 0 ) then -c le sommet appartient a une arete de triangle - if( nosoar(4,noar1) .gt. 0 ) then -c le nouveau minimum - dmin = pxyd(1,i) - ntmin = i - endif - endif - endif - 20 continue -c -c une arete de sommet ntmin - noar1 = noarst( ntmin ) -c un triangle d'arete noar1 - ntmin = nosoar( 4, noar1 ) - if( ntmin .le. 0 ) then -c nblgrc(nrerr) = 1 -c kerr(1) = 'pas de triangle d''abscisse minimale' -c call lereur - write(imprim,*) 'pas de triangle d''abscisse minimale' - ierr = 2 - goto 9990 - endif -c -c chainage des 3 aretes du triangle ntmin -c ======================================= -c la premiere arete du chainage des aretes traitees - noar1 = abs( noartr(1,ntmin) ) - na0 = abs( noartr(2,ntmin) ) -c elle est chainee sur la seconde arete du triangle ntmin - nosoar(6,noar1) = na0 -c les 2 autres aretes du triangle ntmin sont chainees - na1 = abs( noartr(3,ntmin) ) -c la seconde est chainee sur la troisieme arete - nosoar(6,na0) = na1 -c la troisieme n'a pas de suivante - nosoar(6,na1) = 0 -c -c le triangle ntmin est a l'exterieur du domaine -c tous les triangles externes sont marques -123 456 789 -c les triangles de l'autre cote d'une arete sur une ligne -c sont marques: no de la ligne de l'arete * signe oppose -c ======================================================= - ligne0 = 0 - ligne = -123 456 789 -c - 40 if( noar1 .ne. 0 ) then -c -c l'arete noar1 du tableau nosoar est a traiter -c --------------------------------------------- - noar = noar1 -c l'arete suivante devient la premiere a traiter ensuite - noar1 = nosoar(6,noar1) -c l'arete noar est traitee - nosoar(6,noar) = -3 -c - do 60 i=4,5 -c -c l'un des 2 triangles de l'arete - nt = nosoar(i,noar) - if( nt .gt. 0 ) then -c -c triangle deja traite pour une ligne anterieure? - if( letrsu(nt) .ne. 0 .and. - % abs(letrsu(nt)) .ne. ligne ) goto 60 -c -cccc trace du triangle nt en couleur ligne0 -ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar, -ccc % ligne0, ncnoir ) -c -c le triangle est marque avec la valeur de ligne - letrsu(nt) = ligne -c -c chainage eventuel des autres aretes de ce triangle -c si ce n'est pas encore fait - do 50 j=1,3 -c -c le numero na de l'arete j du triangle nt dans nosoar - na = abs( noartr(j,nt) ) - if( nosoar(6,na) .ne. -2 ) goto 50 -c -c le numero de 1 a nblftr dans nulftr de la ligne de l'arete - nl = nosoar(3,na) -c -c si l'arete est sur une ligne fermee differente de celle envelo -c et non marquee alors examen du triangle oppose - if( nl .gt. 0 ) then -c - if( nl .eq. ligne0 ) goto 50 -c -c arete frontaliere de ligne non traitee -c => passage de l'autre cote de la ligne -c le triangle de l'autre cote de la ligne est recherche - if( nt .eq. abs( nosoar(4,na) ) ) then - nt2 = 5 - else - nt2 = 4 - endif - nt2 = abs( nosoar(nt2,na) ) - if( nt2 .gt. 0 ) then -c -c le triangle nt2 de l'autre cote est marque avec le -c avec le signe oppose de celui de ligne - if( ligne .ge. 0 ) then - lsigne = -1 - else - lsigne = 1 - endif - letrsu(nt2) = lsigne * nl -c -c temoin de ligne a traiter ensuite dans nulftr - nulftr(nl) = -abs( nulftr(nl) ) -c -cccc trace du triangle nt2 en jaune borde de magenta -ccc call mttrtr( pxyd,nt2, -ccc % moartr,noartr,mosoar,nosoar, -ccc % ncjaun, ncmage ) -c -c l'arete est traitee - nosoar(6,na) = -3 -c - endif -c -c l'arete est traitee - goto 50 -c - endif -c -c arete non traitee => elle est chainee - nosoar(6,na) = noar1 - noar1 = na -c - 50 continue -c - endif - 60 continue -c - goto 40 - endif -c les triangles de la ligne fermee ont tous ete marques -c plus d'arete chainee -c -c recherche d'une nouvelle ligne fermee a traiter -c =============================================== - 65 do 70 nl=1,nblftr - if( nulftr(nl) .lt. 0 ) goto 80 - 70 continue -c plus de ligne fermee a traiter - goto 110 -c -c tous les triangles de cette composante connexe -c entre ligne et ligne0 vont etre marques -c ============================================== -c remise en etat du numero de ligne -c nl est le numero de la ligne dans nulftr a traiter - 80 nulftr(nl) = -nulftr(nl) - do 90 nt2=1,ndtri0 - if( abs(letrsu(nt2)) .eq. nl ) goto 92 - 90 continue -c -c recherche de l'arete j du triangle nt2 avec ce numero de ligne nl - 92 do 95 j=1,3 -c -c le numero de l'arete j du triangle dans nosoar - noar1 = 0 - na0 = abs( noartr(j,nt2) ) - if( nl .eq. nosoar(3,na0) ) then -c -c na0 est l'arete de ligne nl -c l'arete suivante du triangle nt2 - i = mod(j,3) + 1 -c le numero dans nosoar de l'arete i de nt2 - na1 = abs( noartr(i,nt2) ) - if( nosoar(6,na1) .eq. -2 ) then -c arete non traitee => elle est la premiere du chainage - noar1 = na1 -c pas de suivante dans ce chainage - nosoar(6,na1) = 0 - else - na1 = 0 - endif -c -c l'eventuelle seconde arete suivante - i = mod(i,3) + 1 - na = abs( noartr(i,nt2) ) - if( nosoar(6,na) .eq. -2 ) then - if( na1 .eq. 0 ) then -c 1 arete non traitee et seule a chainer - noar1 = na - nosoar(6,na) = 0 - else -c 2 aretes a chainer - noar1 = na - nosoar(6,na) = na1 - endif - endif -c - if( noar1 .gt. 0 ) then -c -c il existe au moins une arete a visiter pour ligne -c marquage des triangles internes a la ligne nl - ligne = letrsu(nt2) - ligne0 = nl - goto 40 -c - else -c -c nt2 est le seul triangle de la ligne fermee - goto 65 -c - endif - endif - 95 continue -c -c reperage des sommets internes ou externes dans nslign -c nslign(sommet externe au domaine)=-1 -c nslign(sommet interne au domaine)= 0 -c ===================================================== - 110 do 170 ns1=1,nbsomm -c tout sommet non sur la frontiere ou interne impose -c est suppose externe - if( nslign(ns1) .eq. 0 ) nslign(ns1) = -1 - 170 continue -c -c les triangles externes sont marques vides dans le tableau noartr -c ================================================================ - nbtria = 0 - do 200 nt=1,ndtri0 -c - if( letrsu(nt) .le. 0 ) then -c -c triangle nt externe - if( noartr(1,nt) .ne. 0 ) then -c la premiere arete est annulee - noartr(1,nt) = 0 -c le triangle nt est considere comme etant vide - noartr(2,nt) = n1artr - n1artr = nt - endif -c - else -c -c triangle nt interne - nbtria = nbtria + 1 - letrsu(nt) = nbtria -c -c marquage des 3 sommets du triangle nt - do 190 i=1,3 -c le numero nosoar de l'arete i du triangle nt - noar = abs( noartr(i,nt) ) -c le numero des 2 sommets - ns1 = nosoar(1,noar) - ns2 = nosoar(2,noar) -c mise a jour du numero d'une arete des 2 sommets de l'arete - noarst( ns1 ) = noar - noarst( ns2 ) = noar -c ns1 et ns2 sont des sommets de la triangulation du domaine - if( nslign(ns1) .lt. 0 ) nslign(ns1)=0 - if( nslign(ns2) .lt. 0 ) nslign(ns2)=0 - 190 continue -c - endif -c - 200 continue -c ici tout sommet externe ns verifie nslign(ns)=-1 -c -c les triangles externes sont mis a zero dans nosoar -c ================================================== - do 300 noar=1,mxsoar -c - if( nosoar(1,noar) .gt. 0 ) then -c -c le second triangle de l'arete noar - nt = nosoar(5,noar) - if( nt .gt. 0 ) then -c si le triangle nt est externe -c alors il est supprime pour l'arete noar - if( letrsu(nt) .le. 0 ) nosoar(5,noar)=0 - endif -c -c le premier triangle de l'arete noar - nt = nosoar(4,noar) - if( nt .gt. 0 ) then - if( letrsu(nt) .le. 0 ) then -c si le triangle nt est externe -c alors il est supprime pour l'arete noar -c et l'eventuel triangle oppose prend sa place -c en position 4 de nosoar - if( nosoar(5,noar) .gt. 0 ) then - nosoar(4,noar)=nosoar(5,noar) - nosoar(5,noar)=0 - else - nosoar(4,noar)=0 - endif - endif - endif - endif -c - 300 continue -c -c remise en etat pour eviter les modifications de ladefi - 9990 do 9991 nl=1,nblftr - if( nulftr(nl) .lt. 0 ) nulftr(nl)=-nulftr(nl) - 9991 continue - return - end - - - - subroutine trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxpile, lhpile, lapile ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : recherche des triangles de noartr partageant le sommet ns -c ----- -c limite: un camembert de centre ns entame 2 fois -c ne donne que l'une des parties -c -c entrees: -c -------- -c ns : numero du sommet -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxpile : nombre maximal de triangles empilables -c -c sorties : -c -------- -c lhpile : >0 nombre de triangles empiles -c =0 si impossible de tourner autour du point -c =-lhpile si apres butee sur la frontiere il y a a nouveau -c butee sur la frontiere . a ce stade on ne peut dire si tous -c les triangles ayant ce sommet ont ete recenses -c ce cas arrive seulement si le sommet est sur la frontiere -c lapile : numero dans noartr des triangles de sommet ns -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*) - integer lapile(1:mxpile) - integer nosotr(3) -c -c la premiere arete de sommet ns - nar = noarst( ns ) - if( nar .le. 0 ) then - write(imprim,*) 'trp1st: sommet',ns,' sans arete' - goto 9999 - endif -c -c l'arete nar est elle active? - if( nosoar(1,nar) .le. 0 ) then -ccc write(imprim,*) 'trp1st: arete vide',nar, -ccc % ' st1:', nosoar(1,nar),' st2:',nosoar(2,nar) - goto 9999 - endif -c -c le premier triangle de sommet ns - nt0 = abs( nosoar(4,nar) ) - if( nt0 .le. 0 ) then - write(imprim,*) 'trp1st: sommet',ns,' dans aucun triangle' - goto 9999 - endif -c -c le triangle est il interne? - if( noartr(1,nt0) .eq. 0 ) goto 9999 -c -c le numero des 3 sommets du triangle nt0 dans le sens direct - call nusotr( nt0, mosoar, nosoar, moartr, noartr, nosotr ) -c -c reperage du sommet ns dans le triangle nt0 - do 5 nar=1,3 - if( nosotr(nar) .eq. ns ) goto 10 - 5 continue - nta = nt0 - goto 9995 -c -c ns retrouve : le triangle nt0 est empile - 10 lhpile = 1 - lapile(1) = nt0 - nta = nt0 -c -c recherche dans le sens des aiguilles d'une montre -c (sens indirect) du triangle nt1 de l'autre cote de l'arete -c nar du triangle et en tournant autour du sommet ns -c ========================================================== - noar = abs( noartr(nar,nt0) ) -c le triangle nt1 oppose du triangle nt0 par l'arete noar - if( nosoar(4,noar) .eq. nt0 ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif -c -c la boucle sur les triangles nt1 de sommet ns dans le sens indirect -c ================================================================== - if( nt1 .gt. 0 ) then -c - if( noartr(1,nt1) .eq. 0 ) goto 30 -c -c le triangle nt1 n'a pas ete detruit. il est actif -c le triangle oppose par l'arete noar existe -c le numero des 3 sommets du triangle nt1 dans le sens direct - 15 call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr ) -c -c reperage du sommet ns dans nt1 - do 20 nar=1,3 - if( nosotr(nar) .eq. ns ) goto 25 - 20 continue - nta = nt1 - goto 9995 -c -c nt1 est empile - 25 if( lhpile .ge. mxpile ) goto 9990 - lhpile = lhpile + 1 - lapile(lhpile) = nt1 -c -c le triangle nt1 de l'autre cote de l'arete de sommet ns -c sauvegarde du precedent triangle dans nta - nta = nt1 - noar = abs( noartr(nar,nt1) ) - if( nosoar(4,noar) .eq. nt1 ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif - if( nt1 .le. 0 ) goto 30 -c le triangle suivant est a l'exterieur - if( nt1 .ne. nt0 ) goto 15 -c -c recherche terminee par arrivee sur nt0 -c les triangles forment un "cercle" de "centre" ns - return -c - endif -c -c pas de triangle voisin a nt1 -c ============================ -c le parcours passe par 1 des triangles exterieurs -c le parcours est inverse par l'arete de gauche -c le triangle nta est le premier triangle empile - 30 lhpile = 1 - lapile(lhpile) = nta -c -c le numero des 3 sommets du triangle nta dans le sens direct - call nusotr( nta, mosoar, nosoar, moartr, noartr, nosotr ) - do 32 nar=1,3 - if( nosotr(nar) .eq. ns ) goto 33 - 32 continue - goto 9995 -c -c l'arete qui precede (rotation / ns dans le sens direct) - 33 if( nar .eq. 1 ) then - nar = 3 - else - nar = nar - 1 - endif -c -c le triangle voisin de nta dans le sens direct - noar = abs( noartr(nar,nta) ) - if( nosoar(4,noar) .eq. nta ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif - if( nt1 .le. 0 ) then -c un seul triangle contient ns - goto 70 - endif -c -c boucle sur les triangles de sommet ns dans le sens direct -c ========================================================== - 40 if( noartr(1,nt1) .eq. 0 ) goto 70 -c -c le triangle nt1 n'a pas ete detruit. il est actif -c le numero des 3 sommets du triangle nt1 dans le sens direct - call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr ) -c -c reperage du sommet ns dans nt1 - do 50 nar=1,3 - if( nosotr(nar) .eq. ns ) goto 60 - 50 continue - nta = nt1 - goto 9995 -c -c nt1 est empile - 60 if( lhpile .ge. mxpile ) goto 9990 - lhpile = lhpile + 1 - lapile(lhpile) = nt1 -c -c l'arete qui precede dans le sens direct - if( nar .eq. 1 ) then - nar = 3 - else - nar = nar - 1 - endif -c -c l'arete de sommet ns dans nosoar - noar = abs( noartr(nar,nt1) ) -c -c le triangle voisin de nta dans le sens direct - nta = nt1 - if( nosoar(4,noar) .eq. nt1 ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif - nta = nt1 - if( nt1 .gt. 0 ) goto 40 -c -c butee sur le trou => fin des triangles de sommet ns -c ---------------------------------------------------- - 70 lhpile = -lhpile -c impossible ici de trouver les autres triangles de sommet ns -c les triangles de sommet ns ne forment pas une boule de centre ns - return -c -c saturation de la pile des triangles -c ----------------------------------- - 9990 write(imprim,*) 'trp1st:saturation pile des triangles autour ', - %'sommet',ns - goto 9999 -c -c erreur triangle ne contenant pas le sommet ns -c ---------------------------------------------- - 9995 write(imprim,*) 'trp1st:triangle ',nta,' st=', - % (nosotr(nar),nar=1,3),' sans le sommet' ,ns -c - 9999 lhpile = 0 - return - end - - - - subroutine nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul du numero des 3 sommets du triangle nt de noartr -c ----- dans le sens direct (aire>0 si non degenere) -c -c entrees: -c -------- -c nt : numero du triangle dans le tableau noartr -c mosoar : nombre maximal d'entiers par arete -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c moartr : nombre maximal d'entiers par arete du tableau noartr -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1=0 si triangle vide => arete2=triangle vide suivant -c -c sorties: -c -------- -c nosotr : numero (dans le tableau pxyd) des 3 sommets du triangle -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - integer nosoar(mosoar,*), noartr(moartr,*), nosotr(3) -c -c les 2 sommets de l'arete 1 du triangle nt dans le sens direct - na = noartr( 1, nt ) - if( na .gt. 0 ) then - nosotr(1) = 1 - nosotr(2) = 2 - else - nosotr(1) = 2 - nosotr(2) = 1 - na = -na - endif - nosotr(1) = nosoar( nosotr(1), na ) - nosotr(2) = nosoar( nosotr(2), na ) -c -c l'arete suivante - na = abs( noartr(2,nt) ) -c -c le sommet nosotr(3 du triangle 123 - nosotr(3) = nosoar( 1, na ) - if( nosotr(3) .eq. nosotr(1) .or. nosotr(3) .eq. nosotr(2) ) then - nosotr(3) = nosoar(2,na) - endif - end - - - subroutine tesusp( nbarpi, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, notrcf, liarcf, - % nbstsu, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : supprimer de la triangulation les sommets de te trop proches -c ----- soit d'un sommet frontalier ou point interne impose -c soit d'une arete frontaliere -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entrees: -c -------- -c nbarpi : numero du dernier point interne impose par l'utilisateur -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf -c -c modifies: -c --------- -c noarst : noarst(i) numero d'une arete de sommet i -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c -c auxiliaires : -c ------------- -c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers -c noarcf : tableau (3,mxarcf) auxiliaire d'entiers -c larmin : tableau ( mxarcf ) auxiliaire d'entiers -c notrcf : tableau ( mxarcf ) auxiliaire d'entiers -c liarcf : tableau ( mxarcf ) auxiliaire d'entiers -c -c sortie : -c -------- -c nbstsu : nombre de sommets de te supprimes -c ierr : =0 si pas d'erreur -c >0 si une erreur est survenue -c 11 algorithme defaillant -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 -c parameter ( quamal=0.3 ) => ok -c parameter ( quamal=0.4 ) => pb pour le test ocean -c parameter ( quamal=0.5 ) => pb pour le test ocean -c - parameter ( quamal=0.333, lchain=6 ) - common / unites / lecteu,imprim,intera,nunite(29) - double precision pxyd(3,*), qualit - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf), - % liarcf(mxarcf) -c - integer nosotr(3) - equivalence (nosotr(1),ns1), (nosotr(2),ns2), - % (nosotr(3),ns3) -c -c le nombre de sommets de te supprimes - nbstsu = 0 -c -c initialisation du chainage des aretes des cf => 0 arete de cf - do 10 narete=1,mxsoar - nosoar( lchain, narete ) = -1 - 10 continue -c -c boucle sur l'ensemble des sommets frontaliers ou points internes -c ================================================================ - do 100 ns = 1, nbarpi -c -cccc le nombre de sommets supprimes pour ce sommet ns -ccc nbsuns = 0 -c -c la qualite minimale au dessous de laquelle le point proche -c interne est supprime - quaopt = quamal -c -c une arete de sommet ns - 15 narete = noarst( ns ) - if( narete .le. 0 ) then -c erreur: le point appartient a aucune arete - write(imprim,*) 'sommet ',ns,' dans aucune arete' - ierr = 11 - return - endif -c -c recherche des triangles de sommet ns -c ils doivent former un contour ferme de type etoile - call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxarcf, nbtrcf, notrcf ) - if( nbtrcf .le. 0 ) then -c erreur: impossible de trouver tous les triangles de sommet ns -c seule une partie est a priori retrouvee - nbtrcf = -nbtrcf - endif -c -c boucle sur les triangles de l'etoile du sommet ns - quamin = 2.0 - do 20 i=1,nbtrcf -c -c le numero des 3 sommets du triangle nt - nt = notrcf(i) - call nusotr( nt, mosoar, nosoar, moartr, noartr, - % nosotr ) -c nosotr(1:3) est en equivalence avec ns1, ns2, ns3 -c -c la qualite du triangle ns1 ns2 ns3 - call qutr2d( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), qualit ) - if( qualit .lt. quamin ) then - quamin = qualit - ntqmin = nt - endif - 20 continue -c -c bilan sur la qualite des triangles de sommet ns - if( quamin .lt. quaopt ) then -c -c recherche du sommet de ntqmin le plus proche et non frontalier -c ============================================================== -c le numero des 3 sommets du triangle nt - call nusotr( ntqmin, mosoar, nosoar, moartr, noartr, - % nosotr ) - nste = 0 - quamin = 1e28 - do 30 j=1,3 - if( nosotr(j) .ne. ns .and. nosotr(j) .gt. nbarpi ) then - d = (pxyd(1,nosotr(j))-pxyd(1,ns))**2 - % + (pxyd(2,nosotr(j))-pxyd(2,ns))**2 - if( d .lt. quamin ) then - quamin = d - nste = j - endif - endif - 30 continue -c - if( nste .gt. 0 ) then -c -c nste est le sommet le plus proche de ns de ce -c triangle de mauvaise qualite et sommet non encore traite - nste = nosotr( nste ) -c -c nste est un sommet de triangle equilateral -c => le sommet nste va etre supprime -c ========================================== - call te1stm( nste, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, - % larmin, notrcf, liarcf, ierr ) - if( ierr .eq. 0 ) then -c un sommet de te supprime de plus - nbstsu = nbstsu + 1 - else if( ierr .lt. 0 ) then -c le sommet nste est externe donc non supprime -c ou bien le sommet nste est le centre d'un cf dont toutes -c les aretes simples sont frontalieres -c dans les 2 cas le sommet n'est pas supprime - ierr = 0 - goto 100 - else -c erreur motivant un arret de la triangulation - return - endif -c -c boucle jusqu'a obtenir une qualite suffisante -c si triangulation tres irreguliere => -c destruction de beaucoup de points internes -c les 2 variables suivantes brident ces destructions massives -ccc nbsuns = nbsuns + 1 - quaopt = quaopt * 0.8 -ccc if( nbsuns .le. 5 ) goto 15 - goto 15 - endif - endif -c - 100 continue - end - - - subroutine teamqa( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but: si la taille de l'arete moyenne est >ampli*taille souhaitee -c ---- alors ajout d'un sommet barycentre du plus grand triangle -c de sommet ns -c si la taille de l'arete moyenne est aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxtrcf : nombre maximal de triangles empilables -c nbarpi : numero du dernier sommet frontalier ou interne impose -c nslign : tableau du numero de sommet dans sa ligne pour chaque -c sommet frontalier -c numero du point dans le lexique point si interne impose -c 0 si le point est interne non impose par l'utilisateur -c -1 si le sommet est externe au domaine -c comxmi : min et max des coordonneees des sommets du maillage -c -c modifies : -c ---------- -c nbsomm : nombre actuel de sommets de la triangulation -c (certains sommets internes ont ete desactives ou ajoutes) -c pxyd : tableau des coordonnees 2d des points -c -c auxiliaires: -c ------------ -c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans noartr des triangles de sommet ns -c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans pxyd des sommets des aretes simples de la boule -c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers -c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers -c larmin : tableau ( mxtrcf ) auxiliaire d'entiers -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juin 1997 -c....................................................................012 - double precision ampli,ampli2 - parameter (ampli=1.34d0,ampli2=ampli/2d0) - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - double precision ponder, ponde1, xbar, ybar, x, y, surtd2 - double precision d, dmoy - double precision d2d3(3,3) - real origin(3), xyz(3) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*), - % notrcf(mxtrcf), - % nslign(*), - % nostbo(*), - % n1arcf(0:mxtrcf), - % noarcf(3,mxtrcf), - % larmin(mxtrcf) - double precision comxmi(3,2) - integer nosotr(3) -c -c le nombre d'iterations pour ameliorer la qualite - nbitaq = 4 - ier = 0 -c -c initialisation du parcours - nbs1 = nbsomm - nbs2 = nbarpi + 1 - nbs3 = -1 -c - do 5000 iter=1,nbitaq -c -c le nombre de sommets supprimes - nbstsu = 0 - nbbaaj = 0 -c -c coefficient de ponderation croissant avec les iterations - ponder = min( 1d0, ( 50 + (50*iter)/nbitaq ) * 0.01d0 ) - ponde1 = 1d0 - ponder -c -c l'ordre du parcours dans le sens croissant ou decroissant - nt = nbs1 - nbs1 = nbs2 - nbs2 = nt -c alternance du parcours - nbs3 = -nbs3 -c - do 1000 ns = nbs1, nbs2, nbs3 -c -c le sommet est il interne au domaine? - if( nslign(ns) .ne. 0 ) goto 1000 -c -c existe-t-il une arete de sommet ns ? - 10 noar = noarst( ns ) - if( noar .le. 0 ) goto 1000 -c -c le 1-er triangle de l'arete noar - nt = nosoar( 4, noar ) - if( nt .le. 0 ) goto 1000 -c -c recherche des triangles de sommet ns -c ils doivent former un contour ferme de type etoile - call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxtrcf, nbtrcf, notrcf ) - if( nbtrcf .le. 0 ) goto 1000 -c -c mise a jour de la distance souhaitee - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,ns) dans le repere initial => xyz(1:3) - call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns), - % pxyd(3,ns), ier ) - endif -c -c boucle sur les triangles qui forment une boule autour du sommet ns - nbstbo = 0 -c chainage des aretes simples de la boule a rendre delaunay - noar0 = 0 - do 40 i=1,nbtrcf -c -c le numero de l'arete du triangle nt ne contenant pas le sommet ns - nt = notrcf(i) - do 20 na=1,3 -c le numero de l'arete na dans le tableau nosoar - noar = abs( noartr(na,nt) ) - if( nosoar(1,noar) .ne. ns .and. - % nosoar(2,noar) .ne. ns ) goto 25 - 20 continue -c -c construction de la liste des sommets des aretes simples -c de la boule des triangles de sommet ns -c ------------------------------------------------------- - 25 do 35 na=1,2 - ns1 = nosoar(na,noar) - do 30 j=nbstbo,1,-1 - if( ns1 .eq. nostbo(j) ) goto 35 - 30 continue -c ns1 est un nouveau sommet a ajouter - nbstbo = nbstbo + 1 - nostbo(nbstbo) = ns1 - 35 continue -c -c noar est une arete potentielle a rendre delaunay - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - nosoar(lchain,noar) = noar0 - noar0 = noar - endif -c - 40 continue -c -c calcul des 2 coordonnees du barycentre de la boule du sommet ns -c calcul de la longueur moyenne des aretes issues du sommet ns -c --------------------------------------------------------------- - xbar = 0d0 - ybar = 0d0 - dmoy = 0d0 - do 50 i=1,nbstbo - x = pxyd(1,nostbo(i)) - y = pxyd(2,nostbo(i)) - xbar = xbar + x - ybar = ybar + y - dmoy = dmoy + sqrt( (x-pxyd(1,ns))**2+(y-pxyd(2,ns))**2 ) - 50 continue - dmoy = dmoy / nbstbo -c -c pas de modification de la topologie lors de la derniere iteration -c ================================================================= - if( iter .eq. nbitaq ) goto 200 -c -c si la taille de l'arete moyenne est >ampli*taille souhaitee -c alors ajout d'un sommet barycentre du plus grand triangle -c de sommet ns -c =========================================================== - if( dmoy .gt. ampli*pxyd(3,ns) ) then -c - dmoy = 0d0 - do 150 i=1,nbtrcf -c recherche du plus grand triangle en surface - call nusotr( notrcf(i), mosoar, nosoar, - % moartr, noartr, nosotr ) - d = surtd2( pxyd(1,nosotr(1)), - % pxyd(1,nosotr(2)), - % pxyd(1,nosotr(3)) ) - if( d .gt. dmoy ) then - dmoy = d - imax = i - endif - 150 continue -c -c ajout du barycentre du triangle notrcf(imax) - nt = notrcf( imax ) - call nusotr( nt, mosoar, nosoar, - % moartr, noartr, nosotr ) - if( nbsomm .ge. mxsomm ) then - write(imprim,*) 'saturation du tableau pxyd' -c abandon de l'amelioration du sommet ns - goto 9999 - endif - nbsomm = nbsomm + 1 - do 160 i=1,3 - pxyd(i,nbsomm) = ( pxyd(i,nosotr(1)) - % + pxyd(i,nosotr(2)) - % + pxyd(i,nosotr(3)) ) / 3d0 - 160 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3) - call tetaid( nutysu, pxyd(1,nbsomm), pxyd(2,nbsomm), - % pxyd(3,nbsomm), ier ) - endif -c -c sommet interne a la triangulation - nslign(nbsomm) = 0 -c -c les 3 aretes du triangle nt sont a rendre delaunay - do 170 i=1,3 - noar = abs( noartr(i,nt) ) - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - if( nosoar(lchain,noar) .lt. 0 ) then -c arete non encore chainee - nosoar(lchain,noar) = noar0 - noar0 = noar - endif - endif - 170 continue -c -c triangulation du triangle de barycentre nbsomm -c protection a ne pas modifier sinon erreur! - call tr3str( nbsomm, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nosotr, ierr ) - if( ierr .ne. 0 ) goto 9999 -c -c un barycentre ajoute de plus - nbbaaj = nbbaaj + 1 -c -c les aretes chainees de la boule sont rendues delaunay - goto 900 -c - endif -c -c si la taille de l'arete moyenne est xyz(1:3) - call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns), - % pxyd(3,ns), ier ) - endif -c -c les aretes chainees de la boule sont rendues delaunay - 900 call tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, noar0, - % moartr, mxartr, n1artr, noartr, modifs ) -c - 1000 continue -c -ccc write(imprim,11000) nbstsu, nbbaaj -ccc11000 format( i6,' sommets supprimes ' , -ccc % i6,' barycentres ajoutes' ) -c -c mise a jour pour ne pas oublier les nouveaux sommets - if( nbs1 .gt. nbs2 ) then - nbs1 = nbsomm - else - nbs2 = nbsomm - endif -c - 5000 continue -c - 9999 return - end - - - subroutine teamsf( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : modification de la topologie des triangles autour des -c ----- sommets frontaliers et mise en triangulation delaunay locale -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxtrcf : nombre maximal de triangles empilables -c nbarpi : numero du dernier sommet frontalier ou interne impose -c nslign : >0 => ns numero du point dans le lexique point si interne impose -c ou => 1 000 000 * n + ns1 -c ou n est le numero (1 a nblftr) de la ligne de ce point -c ns1 est le numero du point dans sa ligne -c = 0 si le point est interne non impose par l'utilisateur -c =-1 si le sommet est externe au domaine -c comxmi : min et max des coordonneees des sommets du maillage -c -c modifies : -c ---------- -c nbsomm : nombre actuel de sommets de la triangulation -c (certains sommets internes ont ete desactives ou ajoutes) -c pxyd : tableau des coordonnees 2d des points -c -c auxiliaires: -c ------------ -c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans noartr des triangles de sommet ns -c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans pxyd des sommets des aretes simples de la boule -c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers -c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers -c larmin : tableau ( mxtrcf ) auxiliaire d'entiers -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc janvier 1998 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - double precision a, angle, angled, pi, deuxpi, pis3 - double precision d2d3(3,3) - real origin(3), xyz(3) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*), - % notrcf(mxtrcf), - % nslign(*), - % nostbo(*), - % n1arcf(0:mxtrcf), - % noarcf(3,mxtrcf), - % larmin(mxtrcf), - % nosotr(3) - double precision comxmi(3,2) -c -c le nombre d'iterations pour ameliorer la qualite - nbitaq = 2 - ier = 0 -c -c pi / 3 - pi = atan(1d0) * 4d0 - pis3 = pi / 3d0 - deuxpi = 2d0 * pi -c -c initialisation du parcours - modifs = 0 - nbs1 = nbarpi - nbs2 = 1 -c => pas de traitement sur les points des lignes de la frontiere - nbs3 = -1 -c - do 5000 iter=1,nbitaq -c -c le nombre de sommets supprimes - nbstsu = 0 -c -c l'ordre du parcours dans le sens croissant ou decroissant - nt = nbs1 - nbs1 = nbs2 - nbs2 = nt -c alternance du parcours - nbs3 = -nbs3 -c - do 1000 ns = nbs1, nbs2, nbs3 -c -c le sommet est il sur une ligne de la frontiere? -c if( nslign(ns) .lt. 1 000 000 ) goto 1000 -c -c traitement d'un sommet d'une ligne de la frontiere -c ================================================== -c existe-t-il une arete de sommet ns ? - noar = noarst( ns ) - if( noar .le. 0 ) goto 1000 -c -c le 1-er triangle de l'arete noar - nt = nosoar( 4, noar ) - if( nt .le. 0 ) goto 1000 -c -c recherche des triangles de sommet ns -c ils doivent former un contour ferme de type camembert - call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxtrcf, nbtrcf, notrcf ) - if( nbtrcf .ge. -1 ) goto 1000 -c -c boucle sur les triangles qui forment un camembert autour du sommet n - nbtrcf = -nbtrcf -c -c angle interne au camembert autour du sommet ns - angle = 0d0 - do 540 i=1,nbtrcf -c -c le numero de l'arete du triangle nt ne contenant pas le sommet ns - nt = notrcf(i) - do 520 na=1,3 -c le numero de l'arete na dans le tableau nosoar - noar = abs( noartr(na,nt) ) - if( nosoar(1,noar) .ne. ns .and. - % nosoar(2,noar) .ne. ns ) goto 525 - 520 continue -c -c calcul de l'angle (ns-st1 arete, ns-st2 arete) - 525 ns1 = nosoar(1,noar) - ns2 = nosoar(2,noar) - a = angled( pxyd(1,ns), pxyd(1,ns1), pxyd(1,ns2) ) - if( a .gt. pi ) a = deuxpi - a - angle = angle + a -c - 540 continue -c -c nombre ideal de triangles autour du sommet ns - n = nint( angle / pis3 ) - if( n .le. 1 ) goto 1000 - i = 1 - if( nbtrcf .gt. n ) then -c -c ajout du barycentre du triangle "milieu" - nt = notrcf( (n+1)/2 ) - call nusotr( nt, mosoar, nosoar, - % moartr, noartr, nosotr ) - if( nbsomm .ge. mxsomm ) then - write(imprim,*) 'saturation du tableau pxyd' -c abandon de l'amelioration du sommet ns - goto 1000 - endif - nbsomm = nbsomm + 1 - do 560 i=1,3 - pxyd(i,nbsomm) = ( pxyd(i,nosotr(1)) - % + pxyd(i,nosotr(2)) - % + pxyd(i,nosotr(3)) ) / 3d0 - 560 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3) - call tetaid( nutysu, pxyd(1,nbsomm), pxyd(2,nbsomm), - % pxyd(3,nbsomm), ier ) - endif -c -c sommet interne a la triangulation - nslign(nbsomm) = 0 -c -c les 3 aretes du triangle nt sont a rendre delaunay - noar0 = 0 - do 570 i=1,3 - noar = abs( noartr(i,nt) ) - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - if( nosoar(lchain,noar) .lt. 0 ) then -c arete non encore chainee - nosoar(lchain,noar) = noar0 - noar0 = noar - endif - endif - 570 continue -c -c triangulation du triangle de barycentre nbsomm -c protection a ne pas modifier sinon erreur! - call tr3str( nbsomm, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nosotr, ierr ) - if( ierr .ne. 0 ) goto 9999 -c -c les aretes chainees de la boule sont rendues delaunay - call tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, noar0, - % moartr, mxartr, n1artr, noartr, modifs ) - endif -c - 1000 continue -c - 5000 continue -c - 9999 return - end - - - subroutine teamqs( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : une iteration de barycentrage des points internes -c ----- modification de la topologie pour avoir 4 ou 5 ou 6 triangles -c pour chaque sommet de la triangulation -c mise en triangulation delaunay -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxtrcf : nombre maximal de triangles empilables -c nbarpi : numero du dernier sommet frontalier ou interne impose -c nslign : >0 => ns numero du point dans le lexique point si interne impose -c ou => 1 000 000 * n + ns1 -c ou n est le numero (1 a nblftr) de la ligne de ce point -c ns1 est le numero du point dans sa ligne -c = 0 si le point est interne non impose par l'utilisateur -c =-1 si le sommet est externe au domaine -c comxmi : min et max des coordonneees des sommets du maillage -c -c modifies : -c ---------- -c nbsomm : nombre actuel de sommets de la triangulation -c (certains sommets internes ont ete desactives ou ajoutes) -c pxyd : tableau des coordonnees 2d des points -c -c auxiliaires: -c ------------ -c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans noartr des triangles de sommet ns -c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans pxyd des sommets des aretes simples de la boule -c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers -c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers -c larmin : tableau ( mxtrcf ) auxiliaire d'entiers -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mai 1997 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - double precision ponder, ponde1, xbar, ybar, x, y, d, dmin, dmax - double precision d2d3(3,3) - real origin(3), xyz(3) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*), - % notrcf(mxtrcf), - % nslign(*), - % nostbo(*), - % n1arcf(0:mxtrcf), - % noarcf(3,mxtrcf), - % larmin(mxtrcf) - integer nosotr(3,2) - double precision comxmi(3,2) -c -c le nombre d'iterations pour ameliorer la qualite - nbitaq = 6 - ier = 0 -c -c initialisation du parcours - nbs1 = nbsomm - nbs2 = nbarpi + 1 -c => pas de traitement sur les points des lignes de la frontiere - nbs3 = -1 -c - do 5000 iter=1,nbitaq -c -c le nombre de sommets supprimes - nbstsu = 0 -c -c les compteurs de passage sur les differents cas - nbst4 = 0 - nbst5 = 0 - nbst8 = 0 -c -c coefficient de ponderation croissant avec les iterations - ponder = min( 1d0, ( 50 + (50*iter)/nbitaq ) * 0.01d0 ) - ponde1 = 1d0 - ponder -c -c l'ordre du parcours dans le sens croissant ou decroissant - nt = nbs1 - nbs1 = nbs2 - nbs2 = nt -c alternance du parcours - nbs3 = -nbs3 -c - do 1000 ns = nbs1, nbs2, nbs3 -c -c le sommet est il interne au domaine? - if( nslign(ns) .ne. 0 ) goto 1000 -c -c traitement d'un sommet interne non impose par l'utilisateur -c =========================================================== -c existe-t-il une arete de sommet ns ? - 10 noar = noarst( ns ) - if( noar .le. 0 ) goto 1000 -c -c le 1-er triangle de l'arete noar - nt = nosoar( 4, noar ) - if( nt .le. 0 ) goto 1000 -c -c recherche des triangles de sommet ns -c ils doivent former un contour ferme de type etoile - call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxtrcf, nbtrcf, notrcf ) - if( nbtrcf .le. 0 ) goto 1000 -c -c boucle sur les triangles qui forment une boule autour du sommet ns - nbstbo = 0 -c chainage des aretes simples de la boule a rendre delaunay - noar0 = 0 - do 40 i=1,nbtrcf -c -c le numero de l'arete du triangle nt ne contenant pas le sommet ns - nt = notrcf(i) - do 20 na=1,3 -c le numero de l'arete na dans le tableau nosoar - noar = abs( noartr(na,nt) ) - if( nosoar(1,noar) .ne. ns .and. - % nosoar(2,noar) .ne. ns ) goto 25 - 20 continue -c -c construction de la liste des sommets des aretes simples -c de la boule des triangles de sommet ns -c ------------------------------------------------------- - 25 do 35 na=1,2 - ns1 = nosoar(na,noar) - do 30 j=nbstbo,1,-1 - if( ns1 .eq. nostbo(j) ) goto 35 - 30 continue -c ns1 est un nouveau sommet a ajouter - nbstbo = nbstbo + 1 - nostbo(nbstbo) = ns1 - 35 continue -c -c noar est une arete potentielle a rendre delaunay - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - nosoar(lchain,noar) = noar0 - noar0 = noar - endif -c - 40 continue -c -c calcul des 2 coordonnees du barycentre de la boule du sommet ns -c calcul de l'arete de taille maximale et minimale issue de ns -c --------------------------------------------------------------- - xbar = 0d0 - ybar = 0d0 - dmin = 1d28 - dmax = 0d0 - do 50 i=1,nbstbo - x = pxyd(1,nostbo(i)) - y = pxyd(2,nostbo(i)) - xbar = xbar + x - ybar = ybar + y - d = (x-pxyd(1,ns)) ** 2 + (y-pxyd(2,ns)) ** 2 - if( d .gt. dmax ) then - dmax = d - imax = i - endif - if( d .lt. dmin ) then - dmin = d - imin = i - endif - 50 continue -c -c pas de modification de la topologie lors de la derniere iteration -c ================================================================= - if( iter .ge. nbitaq ) goto 200 -c -c si la boule de ns contient 3 ou 4 triangles le sommet ns est detruit -c ==================================================================== - if( nbtrcf .le. 4 ) then -c -c remise a -1 du chainage des aretes peripheriques de la boule ns - noar = noar0 - 60 if( noar .gt. 0 ) then -c protection du no de l'arete suivante - na = nosoar(lchain,noar) -c l'arete interne est remise a -1 - nosoar(lchain,noar) = -1 -c l'arete suivante - noar = na - goto 60 - endif - call te1stm( ns, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, n1arcf, noarcf, - % larmin, notrcf, nostbo, - % ierr ) - if( ierr .lt. 0 ) then -c le sommet ns est externe donc non supprime -c ou bien le sommet ns est le centre d'un cf dont toutes -c les aretes simples sont frontalieres -c dans les 2 cas le sommet ns n'est pas supprime - ierr = 0 - goto 200 - else if( ierr .eq. 0 ) then - nbst4 = nbst4 + 1 - nbstsu = nbstsu + 1 - else -c erreur irrecuperable - goto 9999 - endif - goto 1000 -c - endif -c -c si la boule de ns contient 5 triangles et a un sommet voisin -c sommet de 5 triangles alors l'arete joignant ces 2 sommets -c est transformee en un seul sommet de 6 triangles -c ============================================================ - if( nbtrcf .eq. 5 ) then -c - do 80 i=1,5 -c le numero du sommet de l'arete i et different de ns - ns1 = nostbo(i) -c la liste des triangles de sommet ns1 - call trp1st( ns1, noarst, - % mosoar, nosoar, moartr, noartr, - % mxtrcf-5, nbtrc1, notrcf(6) ) - if( nbtrc1 .eq. 5 ) then -c -c l'arete de sommets ns-ns1 devient un point -c par suppression du sommet ns -c -c remise a -1 du chainage des aretes peripheriques de la boul - noar = noar0 - 70 if( noar .gt. 0 ) then -c protection du no de l'arete suivante - na = nosoar(lchain,noar) -c l'arete interne est remise a -1 - nosoar(lchain,noar) = -1 -c l'arete suivante - noar = na - goto 70 - endif -c -c le point ns1 devient le milieu de l'arete ns-ns1 - do 75 j=1,3 - pxyd(j,ns1) = (pxyd(j,ns) + pxyd(j,ns1)) * 0.5d0 - 75 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,ns1) dans le repere initial => xyz(1:3 - call tetaid( nutysu,pxyd(1,ns1),pxyd(2,ns1), - % pxyd(3,ns1), ier ) - endif -c -c suppression du point ns et mise en delaunay - call te1stm( ns, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, n1arcf, noarcf, - % larmin, notrcf, nostbo, - % ierr ) - if( ierr .lt. 0 ) then -c le sommet ns est externe donc non supprime -c ou bien le sommet ns est le centre d'un cf dont toutes -c les aretes simples sont frontalieres -c dans les 2 cas le sommet ns n'est pas supprime - ierr = 0 - goto 200 - else if( ierr .eq. 0 ) then - nbstsu = nbstsu + 1 - nbst5 = nbst5 + 1 - goto 1000 - else -c erreur irrecuperable - goto 9999 - endif - endif - 80 continue - endif -c -c si la boule de ns contient au moins 8 triangles -c alors un triangle interne est ajoute + 3 triangles (1 par arete) -c ================================================================ - if( nbtrcf .ge. 8 ) then -c -c modification des coordonnees du sommet ns -c il devient le barycentre du triangle notrcf(1) - call nusotr( notrcf(1), mosoar, nosoar, - % moartr, noartr, nosotr ) - do 110 i=1,3 - pxyd(i,ns) = ( pxyd(i,nosotr(1,1)) - % + pxyd(i,nosotr(2,1)) - % + pxyd(i,nosotr(3,1)) ) / 3d0 - 110 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3) - call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns), - % pxyd(3,ns), ier ) - endif -c -c ajout des 2 autres sommets comme barycentres des triangles -c notrcf(1+nbtrcf/3) et notrcf(1+2*nbtrcf/3) - nbt1 = ( nbtrcf + 1 ) / 3 - do 140 n=1,2 -c -c le triangle traite - nt = notrcf(1 + n * nbt1 ) -c -c le numero pxyd de ses 3 sommets - call nusotr( nt, mosoar, nosoar, - % moartr, noartr, nosotr ) -c -c ajout du nouveau barycentre - if( nbsomm .ge. mxsomm ) then - write(imprim,*) 'saturation du tableau pxyd' -c abandon de l'amelioration - goto 1100 - endif - nbsomm = nbsomm + 1 - do 120 i=1,3 - pxyd(i,nbsomm) = ( pxyd(i,nosotr(1,1)) - % + pxyd(i,nosotr(2,1)) - % + pxyd(i,nosotr(3,1)) ) / 3d0 - 120 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3 - call tetaid( nutysu, pxyd(1,nbsomm),pxyd(2,nbsomm), - % pxyd(3,nbsomm), ier ) - endif -c -c sommet interne a la triangulation - nslign(nbsomm) = 0 -c -c les 3 aretes du triangle nt sont a rendre delaunay - do 130 i=1,3 - noar = abs( noartr(i,nt) ) - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - if( nosoar(lchain,noar) .lt. 0 ) then -c arete non encore chainee - nosoar(lchain,noar) = noar0 - noar0 = noar - endif - endif - 130 continue -c -c triangulation du triangle de barycentre nbsomm -c protection a ne pas modifier sinon erreur! - call tr3str( nbsomm, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nosotr, ierr ) - if( ierr .ne. 0 ) goto 9999 - 140 continue -c - nbst8 = nbst8 + 1 -c -c les aretes chainees de la boule sont rendues delaunay - goto 300 -c - endif -c -c nbtrcf est compris entre 5 et 7 => barycentrage simple -c ====================================================== -c les 2 coordonnees du barycentre des sommets des aretes -c simples de la boule du sommet ns - 200 xbar = xbar / nbstbo - ybar = ybar / nbstbo -c -c ponderation pour eviter les degenerescenses - pxyd(1,ns) = ponde1 * pxyd(1,ns) + ponder * xbar - pxyd(2,ns) = ponde1 * pxyd(2,ns) + ponder * ybar -c -c les aretes chainees de la boule sont rendues delaunay - 300 call tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, noar0, - % moartr, mxartr, n1artr, noartr, modifs ) -c - 1000 continue -c -c trace de la triangulation actuelle et calcul de la qualite - 1100 continue -c -ccc write(imprim,11000) nbst4, nbst5, nbst8 -ccc11000 format( i7,' sommets de 4t', -ccc % i7,' sommets 5t+5t', -ccc % i7,' sommets >7t' ) -c -c mise a jour pour ne pas oublier les nouveaux sommets - if( nbs1 .gt. nbs2 ) then - nbs1 = nbsomm - nbs2 = nbarpi + 1 - else - nbs1 = nbarpi + 1 - nbs2 = nbsomm - endif -c - 5000 continue -c - 9999 return - end - - - subroutine teamqt( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : amelioration de la qualite de la triangulation issue de teabr4 -c ----- -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxarcf : nombre maximal de triangles empilables -c nbarpi : numero du dernier sommet frontalier ou interne impose -c nslign : tableau du numero de sommet dans sa ligne pour chaque -c sommet frontalier -c numero du point dans le lexique point si interne impose -c 0 si le point est interne non impose par l'utilisateur -c -1 si le sommet est externe au domaine -c comxmi : min et max des coordonneees des sommets du maillage -c -c modifies : -c ---------- -c nbsomm : nombre actuel de sommets de la triangulation -c (certains sommets internes ont ete desactives ou ajoutes) -c pxyd : tableau des coordonnees 2d des points -c -c auxiliaires: -c ------------ -c notrcf : tableau ( mxarcf ) auxiliaire d'entiers -c numero dans noartr des triangles de sommet ns -c nostbo : tableau ( mxarcf ) auxiliaire d'entiers -c numero dans pxyd des sommets des aretes simples de la boule -c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers -c noarcf : tableau (3,mxarcf) auxiliaire d'entiers -c larmin : tableau ( mxarcf ) auxiliaire d'entiers -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juin 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*), d2d3(3,3) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*), - % notrcf(mxarcf), - % nslign(*), - % nostbo(mxarcf), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf) - double precision comxmi(3,2) -c -c suppression des sommets de triangles equilateraux trop proches -c d'un sommet frontalier ou d'un point interne impose par -c triangulation frontale de l'etoile et mise en delaunay -c ============================================================== - call tesusp( nbarpi, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, notrcf, nostbo, - % nbstsu, ierr ) - if( ierr .ne. 0 ) goto 9999 -c write(imprim,*) 'retrait de',nbstsu, -c % ' sommets de te trop proches de la frontiere' -c -c ajustage des tailles moyennes des aretes avec ampli=1.34d0 entre -c ampli/2 x taille_souhaitee et ampli x taille_souhaitee -c + barycentrage des sommets et mise en triangulation delaunay -c ================================================================ - call teamqa( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) - if( ierr .ne. 0 ) goto 9999 -c -c modification de la topologie autour des sommets frontaliers -c pour avoir un nombre de triangles egal a l'angle/60 degres -c et mise en triangulation delaunay locale -c =========================================================== - call teamsf( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) - if( ierr .ne. 0 ) goto 9999 -c -c quelques iterations de barycentrage des points internes -c modification de la topologie pour avoir 4 ou 5 ou 6 triangles -c pour chaque sommet de la triangulation -c et mise en triangulation delaunay -c ============================================================= - call teamqs( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c - 9999 return - end - - subroutine trfrcf( nscent, mosoar, nosoar, moartr, noartr, - % nbtrcf, notrcf, nbarfr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer le nombre d'aretes simples du contour ferme des -c ----- nbtrcf triangles de numeros stockes dans le tableau notrcf -c ayant tous le sommet nscent -c -c entrees: -c -------- -c nscent : numero du sommet appartenant a tous les triangles notrcf -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c nbtrcf : >0 nombre de triangles empiles -c =0 si impossible de tourner autour du point -c =-nbtrcf si apres butee sur la frontiere il y a a nouveau -c butee sur la frontiere . a ce stade on ne peut dire si tous -c les triangles ayant ce sommet ont ete recenses -c ce cas arrive seulement si le sommet est sur la frontiere -c notrcf : numero dans noartr des triangles de sommet ns -c -c sortie : -c -------- -c nbarfr : nombre d'aretes simples frontalieres -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juin 1997 -c....................................................................012 - integer noartr(moartr,*), - % nosoar(mosoar,*), - % notrcf(1:nbtrcf) -c - nbarfr = 0 - do 50 n=1,nbtrcf -c le numero du triangle n dans le tableau noartr - nt = notrcf( n ) -c parcours des 3 aretes du triangle nt - do 40 i=1,3 -c le numero de l'arete i dans le tableau nosoar - noar = abs( noartr( i, nt ) ) - do 30 j=1,2 -c le numero du sommet j de l'arete noar - ns = nosoar( j, noar ) - if( ns .eq. nscent ) goto 40 - 30 continue -c l'arete noar (sans sommet nscent) est elle frontaliere? - if( nosoar( 5, noar ) .le. 0 ) then -c l'arete appartient au plus a un triangle -c une arete simple frontaliere de plus - nbarfr = nbarfr + 1 - endif -c le triangle a au plus une arete sans sommet nscent - goto 50 - 40 continue - 50 continue - end - - subroutine int2ar( p1, p2, p3, p4, oui ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : les 2 aretes de r**2 p1-p2 p3-p4 s'intersectent elles -c ----- entre leurs sommets? -c -c entrees: -c -------- -c p1,p2,p3,p4 : les 2 coordonnees reelles des sommets des 2 aretes -c -c sortie : -c -------- -c oui : .true. si intersection, .false. sinon -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc octobre 1991 -c2345x7..............................................................012 - double precision p1(2),p2(2),p3(2),p4(2) - double precision x21,y21,d21,x43,y43,d43,d,x,y,xx - logical oui -c -c longueur des aretes - x21 = p2(1)-p1(1) - y21 = p2(2)-p1(2) - d21 = x21**2 + y21**2 -c - x43 = p4(1)-p3(1) - y43 = p4(2)-p3(2) - d43 = x43**2 + y43**2 -c -c les 2 aretes sont-elles jugees paralleles ? - d = x43 * y21 - y43 * x21 - if( abs(d) .le. 0.001 * sqrt(d21 * d43) ) then -c aretes paralleles . pas d'intersection - oui = .false. - return - endif -c -c les 2 coordonnees du point d'intersection - x = ( p1(1)*x43*y21 - p3(1)*x21*y43 - (p1(2)-p3(2))*x21*x43 ) / d - y =-( p1(2)*y43*x21 - p3(2)*y21*x43 - (p1(1)-p3(1))*y21*y43 ) / d -c -c coordonnees de x,y dans le repere ns1-ns2 - xx = ( x - p1(1) ) * x21 + ( y - p1(2) ) * y21 -c le point est il entre p1 et p2 ? - oui = -0.00001d0*d21 .le. xx .and. xx .le. 1.00001d0*d21 -c -c coordonnees de x,y dans le repere ns3-ns4 - xx = ( x - p3(1) ) * x43 + ( y - p3(2) ) * y43 -c le point est il entre p3 et p4 ? - oui = oui .and. -0.00001d0*d43 .le. xx .and. xx .le. 1.00001d0*d43 - end - - - subroutine trchtd( pxyd, nar00, nar0, noarcf, - % namin0, namin, larmin ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : recherche dans le contour ferme du sommet qui joint a la plus -c ----- courte arete nar00 donne le triangle sans intersection -c avec le contour ferme de meilleure qualite -c -c entrees: -c -------- -c pxyd : tableau des coordonnees des sommets et distance_souhaitee -c -c entrees et sorties: -c ------------------- -c nar00 : numero dans noarcf de l'arete avant nar0 -c nar0 : numero dans noarcf de la plus petite arete du contour ferme -c a joindre a noarcf(1,namin) pour former le triangle ideal -c noarcf : numero du sommet , numero de l'arete suivante -c numero du triangle exterieur a l'etoile -c -c sortie : -c -------- -c namin0 : numero dans noarcf de l'arete avant namin -c namin : numero dans noarcf du sommet choisi -c 0 si contour ferme reduit a moins de 3 aretes -c larmin : tableau auxiliaire pour stocker la liste des numeros des -c aretes de meilleure qualite pour faire le choix final -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - double precision dmaxim, precision - parameter (dmaxim=1.7d+308, precision=1d-16) -c ATTENTION:variables a ajuster selon la machine! -c ATTENTION:dmaxim : le plus grand reel machine -c ATTENTION:sur dec-alpha la precision est de 10**-14 seulement - - common / unites / lecteu,imprim,nunite(30) - double precision pxyd(1:3,1:*) - integer noarcf(1:3,1:*), - % larmin(1:*) - double precision q, dd, dmima, - % unpeps, rayon, surtd2 - logical oui - double precision centre(3) -c -c initialisations -c dmaxim : le plus grand reel machine - unpeps = 1d0 + 100d0 * precision -c -c recherche de la plus courte arete du contour ferme - nbmin = 0 - na00 = nar00 - dmima = dmaxim - nbar = 0 -c - 2 na0 = noarcf( 2, na00 ) - na1 = noarcf( 2, na0 ) - nbar = nbar + 1 -c les 2 sommets de l'arete na0 du cf - ns1 = noarcf( 1, na0 ) - ns2 = noarcf( 1, na1 ) - dd = (pxyd(1,ns2)-pxyd(1,ns1))**2 + (pxyd(2,ns2)-pxyd(2,ns1))**2 - if( dd .lt. dmima ) then - dmima = dd - larmin(1) = na00 - endif - na00 = na0 - if( na00 .ne. nar00 ) then -c derniere arete non atteinte - goto 2 - endif -c - if( nbar .eq. 3 ) then -c -c contour ferme reduit a un triangle -c ---------------------------------- - namin = nar00 - nar0 = noarcf( 2, nar00 ) - namin0 = noarcf( 2, nar0 ) - return -c - else if( nbar .le. 2 ) then - write(imprim,*) 'erreur trchtd: cf<3 aretes' - namin = 0 - namin0 = 0 - return - endif -c -c cf non reduit a un triangle -c la plus petite arete est nar0 dans noarcf - nar00 = larmin( 1 ) - nar0 = noarcf( 2, nar00 ) - nar = noarcf( 2, nar0 ) -c - ns1 = noarcf( 1, nar0 ) - ns2 = noarcf( 1, nar ) -c -c recherche dans cette etoile du sommet offrant la meilleure qualite -c du triangle ns1-ns2 ns3 sans intersection avec le contour ferme -c ================================================================== - nar3 = nar - qmima = -1 -c -c parcours des sommets possibles ns3 - 10 nar3 = noarcf( 2, nar3 ) - if( nar3 .ne. nar0 ) then -c -c il existe un sommet ns3 different de ns1 et ns2 - ns3 = noarcf( 1, nar3 ) -c -c les aretes ns1-ns3 et ns2-ns3 intersectent-elles une arete -c du contour ferme ? -c ---------------------------------------------------------- -c intersection de l'arete ns2-ns3 et des aretes du cf -c jusqu'au sommet ns3 - nar1 = noarcf( 2, nar ) -c - 15 if( nar1 .ne. nar3 .and. noarcf( 2, nar1 ) .ne. nar3 ) then -c l'arete suivante - nar2 = noarcf( 2, nar1 ) -c le numero des 2 sommets de l'arete - np1 = noarcf( 1, nar1 ) - np2 = noarcf( 1, nar2 ) - call int2ar( pxyd(1,ns2), pxyd(1,ns3), - % pxyd(1,np1), pxyd(1,np2), oui ) - if( oui ) goto 10 -c les 2 aretes ne s'intersectent pas entre leurs sommets - nar1 = nar2 - goto 15 - endif -c -c intersection de l'arete ns3-ns1 et des aretes du cf -c jusqu'au sommet de l'arete nar0 - nar1 = noarcf( 2, nar3 ) -c - 18 if( nar1 .ne. nar0 .and. noarcf( 2, nar1 ) .ne. nar0 ) then -c l'arete suivante - nar2 = noarcf( 2, nar1 ) -c le numero des 2 sommets de l'arete - np1 = noarcf( 1, nar1 ) - np2 = noarcf( 1, nar2 ) - call int2ar( pxyd(1,ns1), pxyd(1,ns3), - % pxyd(1,np1), pxyd(1,np2), oui ) - if( oui ) goto 10 -c les 2 aretes ne s'intersectent pas entre leurs sommets - nar1 = nar2 - goto 18 - endif -c -c le triangle ns1-ns2-ns3 n'intersecte pas une arete du contour ferme -c le calcul de la surface du triangle - dd = surtd2( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3) ) - if( dd .le. 0d0 ) then -c surface negative => triangle a rejeter - q = 0 - else -c calcul de la qualite du triangle ns1-ns2-ns3 - call qutr2d( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), q ) - endif -c - if( q .ge. qmima*1.00001 ) then -c q est un vrai maximum de la qualite - qmima = q - nbmin = 1 - larmin(1) = nar3 - else if( q .ge. qmima*0.999998 ) then -c q est voisin de qmima -c il est empile - nbmin = nbmin + 1 - larmin( nbmin ) = nar3 - endif - goto 10 - endif -c -c bilan : existe t il plusieurs sommets de meme qualite? -c ====================================================== - if( nbmin .gt. 1 ) then -c -c oui:recherche de ceux de cercle ne contenant pas d'autres sommets - do 80 i=1,nbmin -c le sommet - nar = larmin( i ) - if( nar .le. 0 ) goto 80 - ns3 = noarcf(1,nar) -c les coordonnees du centre du cercle circonscrit -c et son rayon - ier = -1 - call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), - % centre, ier ) - if( ier .ne. 0 ) then -c le sommet ns3 ne convient pas - larmin( i ) = 0 - goto 80 - endif - rayon = centre(3) * unpeps - do 70 j=1,nbmin - if( j .ne. i ) then -c l'autre sommet - nar1 = larmin(j) - if( nar1 .le. 0 ) goto 70 - ns4 = noarcf(1,nar1) -c appartient t il au cercle ns1 ns2 ns3 ? - dd = (centre(1)-pxyd(1,ns4))**2 + - % (centre(2)-pxyd(2,ns4))**2 - if( dd .le. rayon ) then -c ns4 est dans le cercle circonscrit ns1 ns2 ns3 -c le sommet ns3 ne convient pas - larmin( i ) = 0 - goto 80 - endif - endif - 70 continue - 80 continue -c -c existe t il plusieurs sommets ? - j = 0 - do 90 i=1,nbmin - if( larmin( i ) .gt. 0 ) then -c compactage des min - j = j + 1 - larmin(j) = larmin(i) - endif - 90 continue -c - if( j .gt. 1 ) then -c oui : choix du plus petit rayon de cercle circonscrit - dmima = dmaxim - do 120 i=1,nbmin - ns3 = noarcf(1,larmin(i)) -c -c les coordonnees du centre de cercle circonscrit -c au triangle nt et son rayon - ier = -1 - call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), - % centre, ier ) - if( ier .ne. 0 ) then -c le sommet ns3 ne convient pas - goto 120 - endif - rayon = sqrt( centre(3) ) - if( rayon .lt. dmima ) then - dmima = rayon - larmin(1) = larmin(i) - endif - 120 continue - endif - endif -c -c le choix final -c ============== - namin = larmin(1) -c -c recherche de l'arete avant namin ( nar0 <> namin ) -c ================================================== - nar1 = nar0 - 200 if( nar1 .ne. namin ) then - namin0 = nar1 - nar1 = noarcf( 2, nar1 ) - goto 200 - endif - end - - subroutine trcf0a( nbcf, na01, na1, na2, na3, - % noar1, noar2, noar3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : modification de la triangulation du contour ferme nbcf -c ----- par ajout d'un triangle ayant 0 arete sur le contour -c creation des 3 aretes dans le tableau nosoar -c modification du contour par ajout de la 3-eme arete -c creation d'un contour ferme a partir de la seconde arete -c -c entrees: -c -------- -c nbcf : numero dans n1arcf du cf traite ici -c na01 : numero noarcf de l'arete precedent l'arete na1 de noarcf -c na1 : numero noarcf du 1-er sommet du triangle -c implicitement l'arete na1 n'est pas une arete du triangle -c na2 : numero noarcf du 2-eme sommet du triangle -c implicitement l'arete na1 n'est pas une arete du triangle -c na3 : numero noarcf du 3-eme sommet du triangle -c implicitement l'arete na1 n'est pas une arete du triangle -c -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c entrees et sorties : -c -------------------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c noarst : noarst(i) numero d'une arete de sommet i -c n1arcf : numero d'une arete de chaque contour -c noarcf : numero des aretes de la ligne du contour ferme -c attention : chainage circulaire des aretes -c -c sortie : -c -------- -c noar1 : numero dans le tableau nosoar de l'arete 1 du triangle -c noar2 : numero dans le tableau nosoar de l'arete 2 du triangle -c noar3 : numero dans le tableau nosoar de l'arete 3 du triangle -c nt : numero du triangle ajoute dans noartr -c 0 si saturation du tableau noartr ou noarcf ou n1arcf -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,*), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:*), - % noarcf(3,*) -c - ierr = 0 -c -c 2 contours fermes peuvent ils etre ajoutes ? - if( nbcf+2 .gt. mxarcf ) goto 9100 -c -c creation des 3 aretes du triangle dans le tableau nosoar -c ======================================================== -c la formation de l'arete sommet1-sommet2 dans le tableau nosoar - call fasoar( noarcf(1,na1), noarcf(1,na2), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar1, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c la formation de l'arete sommet2-sommet3 dans le tableau nosoar - call fasoar( noarcf(1,na2), noarcf(1,na3), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar2, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c la formation de l'arete sommet3-sommet1 dans le tableau nosoar - call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar3, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c ajout dans noartr de ce triangle nt -c =================================== - call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3), - % noar1, noar2, noar3, - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) - if( nt .le. 0 ) return -c -c modification du contour nbcf existant -c chainage de l'arete na2 vers l'arete na1 -c ======================================== -c modification du cf en pointant na2 sur na1 - na2s = noarcf( 2, na2 ) - noarcf( 2, na2 ) = na1 -c le numero de l'arete dans le tableau nosoar - noar2s = noarcf( 3, na2 ) -c le numero de l'arete dans le tableau nosoar - noarcf( 3, na2 ) = noar1 -c debut du cf - n1arcf( nbcf ) = na2 -c -c creation d'un nouveau contour ferme na2 - na3 -c ============================================= - nbcf = nbcf + 1 -c recherche d'une arete de cf vide - nav = n1arcf(0) - if( nav .le. 0 ) goto 9100 -c la 1-ere arete vide est mise a jour - n1arcf(0) = noarcf( 2, nav ) -c -c ajout de l'arete nav pointant sur na2s -c le numero du sommet - noarcf( 1, nav ) = noarcf( 1, na2 ) -c l'arete suivante - noarcf( 2, nav ) = na2s -c le numero nosoar de cette arete - noarcf( 3, nav ) = noar2s -c -c l'arete na3 se referme sur nav - na3s = noarcf( 2, na3 ) - noarcf( 2, na3 ) = nav -c le numero de l'arete dans le tableau nosoar - noar3s = noarcf( 3, na3 ) - noarcf( 3, na3 ) = noar2 -c debut du cf+1 - n1arcf( nbcf ) = na3 -c -c creation d'un nouveau contour ferme na3 - na1 -c ============================================= - nbcf = nbcf + 1 -c recherche d'une arete de cf vide - nav = n1arcf(0) - if( nav .le. 0 ) goto 9100 -c la 1-ere arete vide est mise a jour - n1arcf(0) = noarcf( 2, nav ) -c -c ajout de l'arete nav pointant sur na3s -c le numero du sommet - noarcf( 1, nav ) = noarcf( 1, na3 ) -c l'arete suivante - noarcf( 2, nav ) = na3s -c le numero de l'arete dans le tableau nosoar - noarcf( 3, nav ) = noar3s -c -c recherche d'une arete de cf vide - nav1 = n1arcf(0) - if( nav1 .le. 0 ) goto 9100 -c la 1-ere arete vide est mise a jour - n1arcf(0) = noarcf( 2, nav1 ) -c -c l'arete precedente na01 de na1 pointe sur la nouvelle nav1 - noarcf( 2, na01 ) = nav1 -c -c ajout de l'arete nav1 pointant sur nav -c le numero du sommet - noarcf( 1, nav1 ) = noarcf( 1, na1 ) -c l'arete suivante - noarcf( 2, nav1 ) = nav -c le numero de l'arete dans le tableau nosoar - noarcf( 3, nav1 ) = noar3 -c -c debut du cf+2 - n1arcf( nbcf ) = nav1 - return -c -c erreur - 9100 write(imprim,*) 'saturation du tableau mxarcf' - nt = 0 - return -c -c erreur tableau nosoar sature - 9900 write(imprim,*) 'saturation du tableau nosoar' - nt = 0 - return - end - - - subroutine trcf1a( nbcf, na01, na1, na2, noar1, noar3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : modification de la triangulation du contour ferme nbcf -c ----- par ajout d'un triangle ayant 1 arete sur le contour -c modification du contour par ajout de la 3-eme arete -c creation d'un contour ferme a partir de la seconde arete -c -c entrees: -c -------- -c nbcf : numero dans n1arcf du cf traite ici -c na01 : numero noarcf de l'arete precedant l'arete na1 de noarcf -c na1 : numero noarcf du 1-er sommet du triangle -c implicitement l'arete na1 n'est pas une arete du triangle -c na2 : numero noarcf du 2-eme sommet du triangle -c cette arete est l'arete 2 du triangle a ajouter -c son arete suivante dans noarcf n'est pas sur le contour -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c entrees et sorties : -c -------------------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c noarst : noarst(i) numero d'une arete de sommet i -c n1arcf : numero d'une arete de chaque contour -c noarcf : numero des aretes de la ligne du contour ferme -c attention : chainage circulaire des aretes -c -c sortie : -c -------- -c noar1 : numero nosoar de l'arete 1 du triangle cree -c noar3 : numero nosoar de l'arete 3 du triangle cree -c nt : numero du triangle ajoute dans notria -c 0 si saturation du tableau notria ou noarcf ou n1arcf -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:*), - % noarcf(3,*) -c -c un cf supplementaire peut il etre ajoute ? - if( nbcf .ge. mxarcf ) then - write(imprim,*) 'saturation du tableau noarcf' - nt = 0 - return - endif -c - ierr = 0 -c -c l' arete suivante du triangle non sur le cf - na3 = noarcf( 2, na2 ) -c -c creation des 2 nouvelles aretes du triangle dans le tableau nosoar -c ================================================================== -c la formation de l'arete sommet1-sommet2 dans le tableau nosoar - call fasoar( noarcf(1,na1), noarcf(1,na2), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar1, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c la formation de l'arete sommet1-sommet3 dans le tableau nosoar - call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar3, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c le triangle nt de noartr a l'arete 2 comme arete du contour na2 -c =============================================================== - call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3), - % noar1, noarcf(3,na2), noar3, - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) - if( nt .le. 0 ) return -c -c modification du contour ferme existant -c suppression de l'arete na2 du cf -c ====================================== -c modification du cf en pointant na2 sur na1 - noarcf( 2, na2 ) = na1 - noarcf( 3, na2 ) = noar1 -c debut du cf - n1arcf( nbcf ) = na2 -c -c creation d'un nouveau contour ferme na3 - na1 -c ============================================= - nbcf = nbcf + 1 -c -c recherche d'une arete de cf vide - nav = n1arcf(0) - if( nav .le. 0 ) then - write(imprim,*) 'saturation du tableau noarcf' - nt = 0 - return - endif -c -c la 1-ere arete vide est mise a jour - n1arcf(0) = noarcf( 2, nav ) -c -c ajout de l'arete nav pointant sur na3 -c le numero du sommet - noarcf( 1, nav ) = noarcf( 1, na1 ) -c l'arete suivante - noarcf( 2, nav ) = na3 -c le numero de l'arete dans le tableau nosoar - noarcf( 3, nav ) = noar3 -c -c l'arete precedente na01 de na1 pointe sur la nouvelle nav - noarcf( 2, na01 ) = nav -c -c debut du cf - n1arcf( nbcf ) = nav - return -c -c erreur tableau nosoar sature - 9900 write(imprim,*) 'saturation du tableau nosoar' - nt = 0 - return - end - - - subroutine trcf2a( nbcf, na1, noar3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % n1arcf, noarcf, nt ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : modification de la triangulation du contour ferme nbcf -c ----- par ajout d'un triangle ayant 2 aretes sur le contour -c creation d'une arete dans nosoar (sommet3-sommet1) -c et modification du contour par ajout de la 3-eme arete -c -c entrees: -c -------- -c nbcf : numero dans n1arcf du cf traite ici -c na1 : numero noarcf de la premiere arete sur le contour -c implicitement sa suivante est sur le contour -c la suivante de la suivante n'est pas sur le contour -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c entrees et sorties : -c -------------------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c noarst : noarst(i) numero d'une arete de sommet i -c n1arcf : numero d'une arete de chaque contour -c noarcf : numero des aretes de la ligne du contour ferme -c attention : chainage circulaire des aretes -c -c sortie : -c -------- -c noar3 : numero de l'arete 3 dans le tableau nosoar -c nt : numero du triangle ajoute dans noartr -c 0 si saturation du tableau noartr ou nosoar -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,*), - % noartr(moartr,*), - % noarst(*) - integer n1arcf(0:*), - % noarcf(3,*) -c - ierr = 0 -c -c l'arete suivante de l'arete na1 dans noarcf - na2 = noarcf( 2, na1 ) -c l'arete suivante de l'arete na2 dans noarcf - na3 = noarcf( 2, na2 ) -c -c la formation de l'arete sommet3-sommet1 dans le tableau nosoar - call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar3, ierr ) - if( ierr .ne. 0 ) then - if( ierr .eq. 1 ) then - write(imprim,*) 'saturation des aretes (tableau nosoar)' - endif - nt = 0 - return - endif -c -c le triangle a ses 2 aretes na1 na2 sur le contour ferme -c ajout dans noartr de ce triangle nt - call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3), - % noarcf(3,na1), noarcf(3,na2), noar3, - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) - if( nt .le. 0 ) return -c -c suppression des 2 aretes (na1 na2) du cf -c ces 2 aretes se suivent dans le chainage du cf -c ajout de la 3-eme arete (noar3) dans le cf -c l'arete suivante de na1 devient la suivante de na2 - noarcf(2,na1) = na3 - noarcf(3,na1) = noar3 -c -c l'arete na2 devient vide dans noarcf - noarcf(2,na2) = n1arcf( 0 ) - n1arcf( 0 ) = na2 -c -c la premiere pointee dans noarcf est na1 -c chainage circulaire => ce peut etre n'importe laquelle - n1arcf(nbcf) = na1 - end - - - subroutine trcf3a( ns1, ns2, ns3, - % noar1, noar2, noar3, - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) -c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : ajouter dans le tableau noartr le triangle -c ----- de sommets ns1 ns2 ns3 -c d'aretes noar1 noar2 noar3 deja existantes -c dans le tableau nosoar des aretes -c -c entrees: -c -------- -c ns1, ns2, ns3 : le numero dans pxyd des 3 sommets du triangle -c noar1,noar2,noar3 : le numero dans nosoar des 3 aretes du triangle -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies : -c ---------- -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c sorties: -c -------- -c nt : numero dans noartr du triangle ajoute -c =0 si le tableau noartr est sature -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu,imprim,nunite(30) - integer nosoar(mosoar,*), - % noartr(moartr,*) -c -c recherche d'un triangle libre dans le tableau noartr - if( n1artr .le. 0 ) then - write(imprim,*) 'saturation du tableau noartr des aretes' - nt = 0 - return - endif -c -c le numero dans noartr du nouveau triangle - nt = n1artr -c -c le nouveau premier triangle vide dans le tableau noartr - n1artr = noartr(2,n1artr) -c -c arete 1 du triangle nt -c ====================== -c orientation des 3 aretes du triangle pour qu'il soit direct - if( ns1 .eq. nosoar(1,noar1) ) then - n = 1 - else - n = -1 - endif -c le numero de l'arete 1 du triangle nt - noartr(1,nt) = n * noar1 -c -c le numero du triangle nt pour l'arete - if( nosoar(4,noar1) .le. 0 ) then - n = 4 - else - n = 5 - endif - nosoar(n,noar1) = nt -c -c arete 2 du triangle nt -c ====================== -c orientation des 3 aretes du triangle pour qu'il soit direct - if( ns2 .eq. nosoar(1,noar2) ) then - n = 1 - else - n = -1 - endif -c le numero de l'arete 2 du triangle nt - noartr(2,nt) = n * noar2 -c -c le numero du triangle nt pour l'arete - if( nosoar(4,noar2) .le. 0 ) then - n = 4 - else - n = 5 - endif - nosoar(n,noar2) = nt -c -c arete 3 du triangle nt -c ====================== -c orientation des 3 aretes du triangle pour qu'il soit direct - if( ns3 .eq. nosoar(1,noar3) ) then - n = 1 - else - n = -1 - endif -c le numero de l'arete 3 du triangle nt - noartr(3,nt) = n * noar3 -c -c le numero du triangle nt pour l'arete - if( nosoar(4,noar3) .le. 0 ) then - n = 4 - else - n = 5 - endif - nosoar(n,noar3) = nt - end - - - - subroutine trcf3s( nbcf, na01, na1, na02, na2, na03, na3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : ajout d'un triangle d'aretes na1 2 3 du tableau noarcf -c ----- a la triangulation d'un contour ferme (cf) -c -c entrees: -c -------- -c nbcf : numero dans n1arcf du cf traite ici -c mais aussi nombre actuel de cf avant ajout du triangle -c na01 : numero noarcf de l'arete precedent l'arete na1 de noarcf -c na1 : numero noarcf du 1-er sommet du triangle -c na02 : numero noarcf de l'arete precedent l'arete na2 de noarcf -c na2 : numero noarcf du 2-eme sommet du triangle -c na03 : numero noarcf de l'arete precedent l'arete na3 de noarcf -c na3 : numero noarcf du 3-eme sommet du triangle -c -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre maximal d'aretes declarables dans noarcf, n1arcf -c -c modifies: -c --------- -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c n1arcf : numero d'une arete de chaque contour ferme -c noarcf : numero du sommet , numero de l'arete suivante -c numero de l'arete dans le tableau nosoar -c attention : chainage circulaire des aretes -c -c sortie : -c -------- -c nbcf : nombre actuel de cf apres ajout du triangle -c nt : numero du triangle ajoute dans noartr -c 0 si saturation du tableau nosoar ou noartr ou noarcf ou n1arcf -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - integer nosoar(mosoar,*), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf) -c -c combien y a t il d'aretes nbascf sur le cf ? -c ============================================ -c la premiere arete est elle sur le cf? - if( noarcf(2,na1) .eq. na2 ) then -c la 1-ere arete est sur le cf - na1cf = 1 - else -c la 1-ere arete n'est pas sur le cf - na1cf = 0 - endif -c -c la seconde arete est elle sur le cf? - if( noarcf(2,na2) .eq. na3 ) then -c la 2-eme arete est sur le cf - na2cf = 1 - else - na2cf = 0 - endif -c -c la troisieme arete est elle sur le cf? - if( noarcf(2,na3) .eq. na1 ) then -c la 3-eme arete est sur le cf - na3cf = 1 - else - na3cf = 0 - endif -c -c le nombre d'aretes sur le cf - nbascf = na1cf + na2cf + na3cf -c -c traitement selon le nombre d'aretes sur le cf -c ============================================= - if( nbascf .eq. 3 ) then -c -c le contour ferme se reduit a un triangle avec 3 aretes sur le cf -c ---------------------------------------------------------------- -c ajout dans noartr de ce nouveau triangle - call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3), - % noarcf(3,na1), noarcf(3,na2), noarcf(3,na3), - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) - if( nt .le. 0 ) return -c -c le cf est supprime et chaine vide - noarcf(2,na3) = n1arcf(0) - n1arcf( 0 ) = na1 -c -c ce cf a ete traite => un cf de moins a traiter - nbcf = nbcf - 1 -c - else if( nbascf .eq. 2 ) then -c -c le triangle a 2 aretes sur le contour -c ------------------------------------- -c les 2 aretes sont la 1-ere et 2-eme du triangle - if( na1cf .eq. 0 ) then -c l'arete 1 n'est pas sur le cf - naa1 = na2 - else if( na2cf .eq. 0 ) then -c l'arete 2 n'est pas sur le cf - naa1 = na3 - else -c l'arete 3 n'est pas sur le cf - naa1 = na1 - endif -c le triangle oppose a l'arete 3 est inconnu -c modification du contour apres integration du -c triangle ayant ses 2-eres aretes sur le cf - call trcf2a( nbcf, naa1, naor3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % n1arcf, noarcf, nt ) -c - else if( nbascf .eq. 1 ) then -c -c le triangle a 1 arete sur le contour -c ------------------------------------ -c cette arete est la seconde du triangle - if( na3cf .ne. 0 ) then -c l'arete 3 est sur le cf - naa01 = na02 - naa1 = na2 - naa2 = na3 - else if( na1cf .ne. 0 ) then -c l'arete 1 est sur le cf - naa01 = na03 - naa1 = na3 - naa2 = na1 - else -c l'arete 2 est sur le cf - naa01 = na01 - naa1 = na1 - naa2 = na2 - endif -c le triangle oppose a l'arete 1 et 3 est inconnu -c modification du contour apres integration du -c triangle ayant 1 arete sur le cf avec creation -c d'un nouveau contour ferme - call trcf1a( nbcf, naa01, naa1, naa2, naor1, naor3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) -c - else -c -c le triangle a 0 arete sur le contour -c ------------------------------------ -c modification du contour apres integration du -c triangle ayant 0 arete sur le cf avec creation -c de 2 nouveaux contours fermes - call trcf0a( nbcf, na01, na1, na2, na3, - % naa1, naa2, naa01, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) - endif - end - - - subroutine tridcf( nbcf0, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, - % nbtrcf, notrcf, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : triangulation directe de nbcf0 contours fermes (cf) -c ----- definis par la liste circulaire de leurs aretes peripheriques -c -c entrees: -c -------- -c nbcf0 : nombre initial de cf a trianguler -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre maximal d'aretes declarables dans noarcf, n1arcf, larmin, not -c -c modifies: -c --------- -c noarst : noarst(i) numero d'une arete de sommet i -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c n1arcf : numero de la premiere arete de chacun des nbcf0 cf -c n1arcf(0) no de la premiere arete vide du tableau noarcf -c noarcf(2,i) no de l'arete suivante -c noarcf : numero du sommet , numero de l'arete suivante du cf -c numero de l'arete dans le tableau nosoar -c -c auxiliaires : -c ------------- -c larmin : tableau (mxarcf) auxiliaire -c stocker la liste des numeros des meilleures aretes -c lors de la selection du meilleur sommet du cf a trianguler -c cf le sp trchtd -c -c sortie : -c -------- -c nbtrcf : nombre de triangles des nbcf0 cf -c notrcf : numero des triangles des nbcf0 cf dans le tableau noartr -c ierr : 0 si pas d'erreur -c 2 saturation de l'un des des tableaux nosoar, noartr, ... -c 3 si contour ferme reduit a moins de 3 aretes -c 4 saturation du tableau notrcf -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer noartr(moartr,*), - % nosoar(mosoar,mxsoar), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf) -c -ccc integer nosotr(3) -ccc double precision d, surtd2 -c -c depart avec nbcf0 cf a trianguler - nbcf = nbcf0 -c -c le nombre de triangles formes dans l'ensemble des cf - nbtrcf = 0 -c -c tant qu'il existe un cf a trianguler faire -c la triangulation directe du cf -c ========================================== - 10 if( nbcf .gt. 0 ) then -c -c le cf en haut de pile a pour premiere arete - na01 = n1arcf( nbcf ) - na1 = noarcf( 2, na01 ) -c -c choix du sommet du cf a relier a l'arete na1 -c -------------------------------------------- - call trchtd( pxyd, na01, na1, noarcf, - % na03, na3, larmin ) - if( na3 .eq. 0 ) then - ierr = 3 - return - endif -c -c l'arete suivante de na1 - na02 = na1 - na2 = noarcf( 2, na1 ) -c -c formation du triangle arete na1 - sommet noarcf(1,na3) -c ------------------------------------------------------ - call trcf3s( nbcf, na01, na1, na02, na2, na03, na3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) - if( nt .le. 0 ) then -c saturation du tableau noartr ou noarcf ou n1arcf - ierr = 2 - return - endif -c -c ajout du triangle cree a sa pile - if( nbtrcf .ge. mxarcf ) then - write(imprim,*) 'saturation du tableau notrcf' - ierr = 4 - return - endif - nbtrcf = nbtrcf + 1 - notrcf( nbtrcf ) = nt - goto 10 - endif -c -c mise a jour du chainage des triangles des aretes -c ================================================ - do 30 ntp0 = 1, nbtrcf -c -c le numero du triangle ajoute dans le tableau noartr - nt0 = notrcf( ntp0 ) -c -cccc aire signee du triangle nt0 -cccc le numero des 3 sommets du triangle nt -ccc call nusotr( nt0, mosoar, nosoar, moartr, noartr, -ccc % nosotr ) -ccc d = surtd2( pxyd(1,nosotr(1)), pxyd(1,nosotr(2)), -ccc % pxyd(1,nosotr(3)) ) -ccc if( d .le. 0 ) then -cccc -cccc un triangle d'aire negative de plus -ccc write(imprim,*) 'triangle ',nt0,' st:',nosotr, -ccc % ' d aire ',d,'<=0' -ccc pause -ccc endif -c -cccc trace du triangle nt0 -ccc call mttrtr( pxyd, nt0, moartr, noartr, mosoar, nosoar, -ccc % ncturq, ncblan ) -c -c boucle sur les 3 aretes du triangle - do 20 i=1,3 -c -c le numero de l'arete i du triangle dans le tableau nosoar - noar = abs( noartr(i,nt0) ) -c -c ce triangle est il deja chaine dans cette arete? - nt1 = nosoar(4,noar) - nt2 = nosoar(5,noar) - if( nt1 .eq. nt0 .or. nt2 .eq. nt0 ) goto 20 -c -c ajout de ce triangle nt0 a l'arete noar - if( nt1 .le. 0 ) then -c le triangle est ajoute a l'arete - nosoar( 4, noar ) = nt0 - else if( nt2 .le. 0 ) then -c le triangle est ajoute a l'arete - nosoar( 5, noar ) = nt0 - else -c l'arete appartient a 2 triangles differents de nt0 -c anomalie. chainage des triangles des aretes defectueux -c a corriger - write(imprim,*) 'pause dans tridcf' - ierr = 5 - return - endif -c - 20 continue -c - 30 continue - end - - - subroutine te1stm( nsasup, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, notrcf, liarcf, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : supprimer de la triangulation le sommet nsasup qui doit -c ----- etre un sommet interne ("centre" d'une boule de triangles) -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entrees: -c -------- -c nsasup : numero dans le tableau pxyd du sommet a supprimer -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf -c -c modifies: -c --------- -c noarst : noarst(i) numero d'une arete de sommet i -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c -c auxiliaires : -c ------------- -c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers -c noarcf : tableau (3,mxarcf) auxiliaire d'entiers -c larmin : tableau ( mxarcf ) auxiliaire d'entiers -c notrcf : tableau ( mxarcf ) auxiliaire d'entiers -c liarcf : tableau ( mxarcf ) auxiliaire d'entiers -c -c sortie : -c -------- -c ierr : =0 si pas d'erreur -c -1 le sommet a supprimer n'est pas le centre d'une boule -c de triangles. il est suppose externe -c ou bien le sommet est centre d'un cf dont toutes les -c aretes sont frontalieres -c dans les 2 cas => retour sans modifs -c >0 si une erreur est survenue -c =11 algorithme defaillant -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter ( lchain=6, quamal=0.3) - common / unites / lecteu,imprim,intera,nunite(29) - double precision pxyd(3,*) - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf), - % liarcf(mxarcf) -c -c nsasup est il un sommet interne, "centre" d'une boule de triangles? -c => le sommet nsasup peut etre supprime -c =================================================================== -c formation du cf de ''centre'' le sommet nsasup - call trp1st( nsasup, noarst, mosoar, nosoar, - % moartr, noartr, - % mxarcf, nbtrcf, notrcf ) - if( nbtrcf .le. 0 ) then -c erreur: impossible de trouver tous les triangles de sommet nsasup -c le sommet nsasup n'est pas supprime de la triangulation - ierr = -1 - return - else if( nbtrcf .le. 2 ) then -c le sommet nsasup n'est pas supprime - ierr = -1 - return - endif - if( nbtrcf*3 .gt. mxarcf ) then - write(imprim,*) 'saturation du tableau noarcf' - ierr = 10 - return - endif -c -ccc trace des triangles de l'etoile du sommet nsasup -ccc call trpltr( nbtrcf, notrcf, pxyd, -ccc % moartr, noartr, mosoar, nosoar, -ccc % ncroug, ncblan ) -c -c si toutes les aretes du cf sont frontalieres, alors il est -c interdit de detruire le sommet "centre" du cf -c calcul du nombre nbarfr des aretes simples des nbtrcf triangles - call trfrcf( nsasup, mosoar, nosoar, moartr, noartr, - % nbtrcf, notrcf, nbarfr ) - if( nbarfr .ge. nbtrcf ) then -c toutes les aretes simples sont frontalieres -c le sommet nsasup ("centre" de la cavite) n'est pas supprime - ierr = -1 - return - endif -c -c formation du contour ferme (liste chainee des aretes simples) -c forme a partir des aretes des triangles de l'etoile du sommet nsasup - call focftr( nbtrcf, notrcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % nbarcf, n1arcf, noarcf, - % ierr ) - if( ierr .ne. 0 ) return -c -c ici le sommet nsasup appartient a aucune arete - noarst( nsasup ) = 0 -c -c chainage des aretes vides dans le tableau noarcf - n1arcf(0) = nbarcf+1 - mmarcf = min(8*nbarcf,mxarcf) - do 40 i=nbarcf+1,mmarcf - noarcf(2,i) = i+1 - 40 continue - noarcf(2,mmarcf) = 0 -c -c sauvegarde du chainage des aretes peripheriques -c pour la mise en delaunay du maillage - nbcf = n1arcf(1) - do 50 i=1,nbarcf -c le numero de l'arete dans le tableau nosoar - liarcf( i ) = noarcf( 3, nbcf ) -c l'arete suivante dans le cf - nbcf = noarcf( 2, nbcf ) - 50 continue -c -c triangulation directe du contour ferme sans le sommet nsasup -c ============================================================ - nbcf = 1 - call tridcf( nbcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, - % nbtrcf, notrcf, ierr ) - if( ierr .ne. 0 ) return -c -c transformation des triangles du cf en triangles delaunay -c ======================================================== -c construction du chainage lchain dans nosoar -c des aretes peripheriques du cf a partir de la sauvegarde liarcf - noar0 = liarcf(1) - do 60 i=2,nbarcf -c le numero de l'arete peripherique du cf dans nosoar - noar = liarcf( i ) - if( nosoar(3,noar) .le. 0 ) then -c arete interne => elle est chainee a partir de la precedente - nosoar( lchain, noar0 ) = noar - noar0 = noar - endif - 60 continue -c la derniere arete peripherique n'a pas de suivante - nosoar(lchain,noar0) = 0 -c -c mise en delaunay des aretes chainees - call tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, liarcf(1), - % moartr, mxartr, n1artr, noartr, modifs ) -ccc write(imprim,*) 'nombre echanges diagonales =',modifs - return - end - - - subroutine tr3str( np, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former les 3 sous-triangles du triangle nt a partir -c ----- du point interne np -c -c entrees: -c -------- -c np : numero dans le tableau pxyd du point -c nt : numero dans le tableau noartr du triangle a trianguler -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c sorties: -c -------- -c nutr : le numero des 3 sous-triangles du triangle nt -c nt : en sortie le triangle initial n'est plus actif dans noartr -c c'est en fait le premier triangle vide de noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - integer nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(3) -c - integer nosotr(3), nu2sar(2), nuarco(3) -c -c reservation des 3 nouveaux triangles dans le tableau noartr -c =========================================================== - do 10 i=1,3 -c le numero du sous-triangle i dans le tableau noartr - if( n1artr .le. 0 ) then -c tableau noartr sature - ierr = 2 - return - endif - nutr(i) = n1artr -c le nouveau premier triangle libre dans noartr - n1artr = noartr(2,n1artr) - 10 continue -c -c les numeros des 3 sommets du triangle nt - call nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr ) -c -c formation des 3 aretes nosotr(i)-np dans le tableau nosoar -c ========================================================== - nt0 = nutr(3) - do 20 i=1,3 -c -c le triangle a creer - nti = nutr(i) -c -c les 2 sommets du cote i du triangle nosotr - nu2sar(1) = nosotr(i) - nu2sar(2) = np - call hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar, noar ) -c en sortie: noar>0 => no arete retrouvee -c <0 => no arete ajoutee -c =0 => saturation du tableau nosoar -c - if( noar .eq. 0 ) then -c saturation du tableau nosoar - ierr = 1 - return - else if( noar .lt. 0 ) then -c l'arete a ete ajoutee. initialisation des autres informations - noar = -noar -c le numero des 2 sommets a ete initialise par hasoar -c et (nosoar(1,noar) le triangle nt0 - nosoar(4,noar) = nt0 -c le triangle 2 de l'arete noar => le triangle nti - nosoar(5,noar) = nti -c -c le sommet nosotr(i) appartient a l'arete noar - noarst( nosotr(i) ) = noar -c -c le numero d'arete nosotr(i)-np - nuarco(i) = noar -c -c le triangle qui precede le suivant - nt0 = nti - 20 continue -c -c le numero d'une arete du point np - noarst( np ) = noar -c -c les 3 sous-triangles du triangle nt sont formes dans le tableau noartr -c ====================================================================== - do 30 i=1,3 -c -c le numero suivant i => i mod 3 + 1 - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c -c le numero dans noartr du sous-triangle a ajouter - nti = nutr( i ) -c -c le numero de l'arete i du triangle initial nt -c est l'arete 1 du sous-triangle i - noar = noartr(i,nt) - noartr( 1, nti ) = noar -c -c mise a jour du numero de triangle de cette arete - noar = abs( noar ) - if( nosoar(4,noar) .eq. nt ) then -c le sous-triangle nti remplace le triangle nt - nosoar(4,noar) = nti - else -c le sous-triangle nti remplace le triangle nt - nosoar(5,noar) = nti - endif -c -c l'arete 2 du sous-triangle i est l'arete i1 ajoutee - if( nosotr(i1) .eq. nosoar(1,nuarco(i1)) ) then -c l'arete ns i1-np dans nosoar est dans le sens direct - noartr( 2, nti ) = nuarco(i1) - else -c l'arete ns i1-np dans nosoar est dans le sens indirect - noartr( 2, nti ) = -nuarco(i1) - endif -c -c l'arete 3 du sous-triangle i est l'arete i ajoutee - if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then -c l'arete ns i1-np dans nosoar est dans le sens indirect - noartr( 3, nti ) = -nuarco(i) - else -c l'arete ns i1-np dans nosoar est dans le sens direct - noartr( 3, nti ) = nuarco(i) - endif - 30 continue -c -c le triangle nt est rendu libre -c ============================== -c il devient n1artr le premier triangle libre - noartr( 1, nt ) = 0 - noartr( 2, nt ) = n1artr - n1artr = nt - end - - - subroutine mt4sqa( na, moartr, noartr, mosoar, nosoar, - % ns1, ns2, ns3, ns4) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul du numero des 4 sommets de l'arete na de nosoar -c ----- formant un quadrangle -c -c entrees: -c -------- -c na : numero de l'arete dans nosoar a traiter -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1=0 si triangle vide => arete2=triangle vide suivant -c mosoar : nombre maximal d'entiers par arete -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c -c sorties: -c -------- -c ns1,ns2,ns3 : les 3 numeros des sommets du triangle t1 en sens direct -c ns1,ns4,ns2 : les 3 numeros des sommets du triangle t2 en sens direct -c -c si erreur rencontree => ns4 = 0 -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer noartr(moartr,*), nosoar(mosoar,*) -c -c le numero de triangle est il correct ? -c a supprimer apres mise au point - if( na .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') na -c kerr(1) = kerr(mxlger)(1:6) // -c % ' no incorrect arete dans nosoar' -c call lereur - write(imprim,*) na, ' no incorrect arete dans nosoar' - ns4 = 0 - return - endif -c - if( nosoar(1,na) .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') na -c kerr(1) = kerr(mxlger)(1:6) // -c % ' arete non active dans nosoar' -c call lereur - write(imprim,*) na, ' arete non active dans nosoar' - ns4 = 0 - return - endif -c -c recherche de l'arete na dans le premier triangle - nt = nosoar(4,na) - if( nt .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') na -c kerr(1) = 'triangle 1 incorrect pour l''arete ' // -c % kerr(mxlger)(1:6) -c call lereur - write(imprim,*) 'triangle 1 incorrect pour l''arete ', na - ns4 = 0 - return - endif -c - do 5 i=1,3 - if( abs( noartr(i,nt) ) .eq. na ) goto 8 - 5 continue -c si arrivee ici => bogue avant - write(imprim,*) 'mt4sqa: arete',na,' non dans le triangle',nt - ns4 = 0 - return -c -c les 2 sommets de l'arete na - 8 if( noartr(i,nt) .gt. 0 ) then - ns1 = 1 - ns2 = 2 - else - ns1 = 2 - ns2 = 1 - endif - ns1 = nosoar(ns1,na) - ns2 = nosoar(ns2,na) -c -c l'arete suivante - if( i .lt. 3 ) then - i = i + 1 - else - i = 1 - endif - naa = abs( noartr(i,nt) ) -c -c le sommet ns3 du triangle 123 - ns3 = nosoar(1,naa) - if( ns3 .eq. ns1 .or. ns3 .eq. ns2 ) then - ns3 = nosoar(2,naa) - endif -c -c le triangle de l'autre cote de l'arete na -c ========================================= - nt = nosoar(5,na) - if( nt .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') na -c kerr(1) = 'triangle 2 incorrect pour l''arete ' // -c % kerr(mxlger)(1:6) -c call lereur - write(imprim,*) 'triangle 2 incorrect pour l''arete ',na - ns4 = 0 - return - endif -c -c le numero de l'arete naa du triangle nt - naa = abs( noartr(1,nt) ) - if( naa .eq. na ) naa = abs( noartr(2,nt) ) - ns4 = nosoar(1,naa) - if( ns4 .eq. ns1 .or. ns4 .eq. ns2 ) then - ns4 = nosoar(2,naa) - endif - end - - - subroutine te2t2t( noaret, mosoar, n1soar, nosoar, noarst, - % moartr, noartr, noar34 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : echanger la diagonale des 2 triangles ayant en commun -c ----- l'arete noaret du tableau nosoar si c'est possible -c -c entrees: -c -------- -c noaret : numero de l'arete a echanger entre les 2 triangles -c mosoar : nombre maximal d'entiers par arete -c moartr : nombre maximal d'entiers par triangle -c -c modifies : -c ---------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c noarst : noarst(i) numero d'une arete de sommet i -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c sortie : -c -------- -c noar34 : numero nosoar de la nouvelle arete diagonale -c 0 si pas d'echange des aretes diagonales -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc avril 1997 -c....................................................................012 - integer nosoar(mosoar,*), - % noartr(moartr,*), - % noarst(*) -c -c une arete frontaliere ne peut etre echangee - noar34 = 0 - if( nosoar(3,noaret) .gt. 0 ) return -c -c les 4 sommets des 2 triangles ayant l'arete noaret en commun - call mt4sqa( noaret, moartr, noartr, mosoar, nosoar, - % ns1, ns2, ns3, ns4) -c ns1,ns2,ns3 : les 3 numeros des sommets du triangle nt1 en sens direct -c ns1,ns4,ns2 : les 3 numeros des sommets du triangle nt2 en sens direct -c -c recherche du numero de l'arete noaret dans le triangle nt1 - nt1 = nosoar(4,noaret) - do 10 n1 = 1, 3 - if( abs(noartr(n1,nt1)) .eq. noaret ) goto 15 - 10 continue -c impossible d'arriver ici sans bogue! - write(imprim,*) 'pause dans te2t2t 1' -c -c l'arete de sommets 2 et 3 - 15 if( n1 .lt. 3 ) then - n2 = n1 + 1 - else - n2 = 1 - endif - na23 = noartr(n2,nt1) -c -c l'arete de sommets 3 et 1 - if( n2 .lt. 3 ) then - n3 = n2 + 1 - else - n3 = 1 - endif - na31 = noartr(n3,nt1) -c -c recherche du numero de l'arete noaret dans le triangle nt2 - nt2 = nosoar(5,noaret) - do 20 n1 = 1, 3 - if( abs(noartr(n1,nt2)) .eq. noaret ) goto 25 - 20 continue -c impossible d'arriver ici sans bogue! - write(imprim,*) 'pause dans te2t2t 2' -c -c l'arete de sommets 1 et 4 - 25 if( n1 .lt. 3 ) then - n2 = n1 + 1 - else - n2 = 1 - endif - na14 = noartr(n2,nt2) -c -c l'arete de sommets 4 et 2 - if( n2 .lt. 3 ) then - n3 = n2 + 1 - else - n3 = 1 - endif - na42 = noartr(n3,nt2) -c -c les triangles 123 142 deviennent 143 234 -c ======================================== -c ajout de l'arete ns3-ns4 -c on evite l'affichage de l'erreur - ierr = -1 - call fasoar( ns3, ns4, nt1, nt2, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar34, ierr ) - if( ierr .gt. 0 ) then -c ierr=1 si le tableau nosoar est sature -c =2 si arete a creer et appartenant a 2 triangles distincts -c des triangles nt1 et nt2 -c =3 si arete appartenant a 2 triangles distincts -c differents des triangles nt1 et nt2 -c =4 si arete appartenant a 2 triangles distincts -c dont le second n'est pas le triangle nt2 -c => pas d'echange - noar34 = 0 - return - endif -c -c suppression de l'arete noaret - call sasoar( noaret, mosoar, mxsoar, n1soar, nosoar ) -c -c nt1 = triangle 143 - noartr(1,nt1) = na14 -c sens de stockage de l'arete ns3-ns4 dans nosoar? - if( nosoar(1,noar34) .eq. ns3 ) then - n1 = -1 - else - n1 = 1 - endif - noartr(2,nt1) = noar34 * n1 - noartr(3,nt1) = na31 -c -c nt2 = triangle 234 - noartr(1,nt2) = na23 - noartr(2,nt2) = -noar34 * n1 - noartr(3,nt2) = na42 -c -c echange nt1 -> nt2 pour l'arete na23 - na23 = abs( na23 ) - if( nosoar(4,na23) .eq. nt1 ) then - n1 = 4 - else - n1 = 5 - endif - nosoar(n1,na23) = nt2 -c -c echange nt2 -> nt1 pour l'arete na14 - na14 = abs( na14 ) - if( nosoar(4,na14) .eq. nt2 ) then - n1 = 4 - else - n1 = 5 - endif - nosoar(n1,na14) = nt1 -c -c numero d'une arete de chacun des 4 sommets - noarst(ns1) = na14 - noarst(ns2) = na23 - noarst(ns3) = noar34 - noarst(ns4) = noar34 - end - - - - subroutine f0trte( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former le ou les triangles du triangle equilateral letree -c ----- les points internes au te deviennent des sommets des -c sous-triangles du te -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c si letree(0)>0 alors -c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te, triangulation du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer letree(0:8), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) - integer nuarco(3) -c -c le numero nt du triangle dans le tableau noartr - if( n1artr .le. 0 ) then -c tableau noartr sature - write(imprim,*) 'f0trte: tableau noartr sature' - ierr = 2 - return - endif - nt = n1artr -c le numero du nouveau premier triangle libre dans noartr - n1artr = noartr( 2, n1artr ) -c -c formation du triangle = le triangle equilateral letree - do 10 i=1,3 - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c ajout eventuel de l'arete si si+1 dans le tableau nosoar - call fasoar( letree(5+i), letree(5+i1), nt, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i), ierr ) - if( ierr .ne. 0 ) return - 10 continue -c -c le triangle nt est forme dans le tableau noartr - do 20 i=1,3 -c letree(5+i) est le numero du sommet 1 de l'arete i du te - if( letree(5+i) .eq. nosoar(1,nuarco(i)) ) then - lesign = 1 - else - lesign = -1 - endif -c l'arete ns1-ns2 dans nosoar est celle du cote du te - noartr( i, nt ) = lesign * nuarco(i) - 20 continue -c -c triangulation du te=triangle nt par ajout des points internes du te - nbtr = 1 - nutr(1) = nt - call trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtr, nutr, ierr ) - end - - - subroutine f1trte( letree, pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former les triangles du triangle equilateral letree -c ----- a partir de l'un des 3 milieux des cotes du te -c et des points internes au te -c ils deviennent tous des sommets des sous-triangles du te -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c si letree(0)>0 alors -c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te -c 0 si pas de milieu du cote i a ajouter -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(np) numero d'une arete du sommet np -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te, triangulation du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - double precision pxyd(3,*) - integer letree(0:8), - % milieu(3), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) -c - integer nosotr(3), nuarco(5) -c -c le numero des 2 triangles (=2 demi te) a creer dans le tableau noartr - do 5 nbtr=1,2 - if( n1artr .le. 0 ) then -c tableau noartr sature - ierr = 2 - return - endif - nutr(nbtr) = n1artr -c le nouveau premier triangle libre dans noartr - n1artr = noartr(2,n1artr) - 5 continue - nbtr = 2 -c -c recherche du milieu a creer - do 7 i=1,3 - if( milieu(i) .ne. 0 ) goto 9 - 7 continue -c le numero pxyd du point milieu du cote i - 9 nm = milieu( i ) -c -c on se ramene au seul cas i=3 c-a-d le milieu est sur le cote 3 - if( i .eq. 1 ) then -c milieu sur le cote 1 - nosotr(1) = letree(7) - nosotr(2) = letree(8) - nosotr(3) = letree(6) - else if( i .eq. 2 ) then -c milieu sur le cote 2 - nosotr(1) = letree(8) - nosotr(2) = letree(6) - nosotr(3) = letree(7) - else -c milieu sur le cote 3 - nosotr(1) = letree(6) - nosotr(2) = letree(7) - nosotr(3) = letree(8) - endif -c -c formation des 2 aretes s1 s2 et s2 s3 - do 10 i=1,2 - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c ajout eventuel de l'arete dans nosoar - call fasoar( nosotr(i), nosotr(i1), nutr(i), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i), ierr ) - if( ierr .ne. 0 ) return - 10 continue -c -c ajout eventuel de l'arete s3 milieu dans nosoar - call fasoar( nosotr(3), nm, nutr(2), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(3), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete milieu s1 dans nosoar - call fasoar( nosotr(1), nm, nutr(1), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(4), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete milieu s2 dans nosoar - call fasoar( nosotr(2), nm, nutr(1), nutr(2), 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(5), ierr ) - if( ierr .ne. 0 ) return -c -c les aretes s1 s2 et s2 s3 dans le tableau noartr - do 20 i=1,2 -c nosotr(i) est le numero du sommet 1 de l'arete i du te - if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then - lesign = 1 - else - lesign = -1 - endif -c l'arete ns1-ns2 dans nosoar est celle du cote du te - noartr( 1, nutr(i) ) = lesign * nuarco(i) - 20 continue -c -c l'arete mediane s2 milieu - if( nm .eq. nosoar(1,nuarco(5)) ) then - lesign = -1 - else - lesign = 1 - endif - noartr( 2, nutr(1) ) = lesign * nuarco(5) - noartr( 3, nutr(2) ) = -lesign * nuarco(5) -c -c l'arete s1 milieu - if( nm .eq. nosoar(1,nuarco(4)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 3, nutr(1) ) = lesign * nuarco(4) -c -c l'arete s3 milieu - if( nm .eq. nosoar(1,nuarco(3)) ) then - lesign = -1 - else - lesign = 1 - endif - noartr( 2, nutr(2) ) = lesign * nuarco(3) -c -c triangulation des 2 demi te par ajout des points internes du te - call trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtr, nutr, ierr ) - end - - - subroutine f2trte( letree, pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former les triangles du triangle equilateral letree -c ----- a partir de 2 milieux des cotes du te -c et des points internes au te -c ils deviennent tous des sommets des sous-triangles du te -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c si letree(0)>0 alors -c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te -c 0 si pas de milieu du cote i a ajouter -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(np) numero d'une arete du sommet np -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te, triangulation du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer letree(0:8), - % milieu(3), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) -c - integer nosotr(3), nuarco(7) -c -c le numero des 3 triangles a creer dans le tableau noartr - do 5 nbtr=1,3 - if( n1artr .le. 0 ) then -c tableau noartr sature - ierr = 2 - return - endif - nutr(nbtr) = n1artr -c le nouveau premier triangle libre dans noartr - n1artr = noartr(2,n1artr) - 5 continue - nbtr = 3 -c -c recherche du premier milieu a creer - do 7 i=1,3 - if( milieu(i) .ne. 0 ) goto 9 - 7 continue -c -c on se ramene au seul cas i=2 c-a-d le cote 1 n'a pas de milieu - 9 if( i .eq. 2 ) then -c pas de milieu sur le cote 1 - nosotr(1) = letree(6) - nosotr(2) = letree(7) - nosotr(3) = letree(8) -c le numero pxyd du milieu du cote 2 - nm2 = milieu( 2 ) -c le numero pxyd du milieu du cote 3 - nm3 = milieu( 3 ) - else if( milieu(2) .ne. 0 ) then -c pas de milieu sur le cote 3 - nosotr(1) = letree(8) - nosotr(2) = letree(6) - nosotr(3) = letree(7) -c le numero pxyd du milieu du cote 2 - nm2 = milieu( 1 ) -c le numero pxyd du milieu du cote 3 - nm3 = milieu( 2 ) - else -c pas de milieu sur le cote 2 - nosotr(1) = letree(7) - nosotr(2) = letree(8) - nosotr(3) = letree(6) -c le numero pxyd du milieu du cote 2 - nm2 = milieu( 3 ) -c le numero pxyd du milieu du cote 3 - nm3 = milieu( 1 ) - endif -c -c ici seul le cote 1 n'a pas de milieu -c nm2 est le milieu du cote 2 -c nm3 est le milieu du cote 3 -c -c ajout eventuel de l'arete s1 s2 dans nosoar - call fasoar( nosotr(1), nosotr(2), nutr(1), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(1), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete s1 s2 dans nosoar - call fasoar( nosotr(2), nm2, nutr(1), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(2), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete s1 nm2 dans nosoar - call fasoar( nosotr(1), nm2, nutr(1), nutr(2), 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(3), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete nm2 nm3 dans nosoar - call fasoar( nm3, nm2, nutr(2), nutr(3), 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(4), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete s1 nm3 dans nosoar - call fasoar( nosotr(1), nm3, nutr(2), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(5), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete nm2 s3 dans nosoar - call fasoar( nm2, nosotr(3), nutr(3), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(6), ierr ) -c -c ajout eventuel de l'arete nm3 s3 dans nosoar - call fasoar( nosotr(3), nm3, nutr(3), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(7), ierr ) - if( ierr .ne. 0 ) return -c -c le triangle s1 s2 nm2 ou arete1 arete2 arete3 - do 20 i=1,2 -c nosotr(i) est le numero du sommet 1 de l'arete i du te - if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then - lesign = 1 - else - lesign = -1 - endif -c l'arete ns1-ns2 dans nosoar est celle du cote du te - noartr( i, nutr(1) ) = lesign * nuarco(i) - 20 continue - if( nm2 .eq. nosoar(1,nuarco(3)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 3, nutr(1) ) = lesign * nuarco(3) -c -c le triangle s1 nm2 nm3 - noartr( 1, nutr(2) ) = -lesign * nuarco(3) - if( nm2 .eq. nosoar(1,nuarco(4)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 2, nutr(2) ) = lesign * nuarco(4) - noartr( 1, nutr(3) ) = -lesign * nuarco(4) - if( nm3 .eq. nosoar(1,nuarco(5)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 3, nutr(2) ) = lesign * nuarco(5) -c -c le triangle nm2 nm3 s3 - if( nm2 .eq. nosoar(1,nuarco(6)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 2, nutr(3) ) = lesign * nuarco(6) - if( nm3 .eq. nosoar(1,nuarco(7)) ) then - lesign = -1 - else - lesign = 1 - endif - noartr( 3, nutr(3) ) = lesign * nuarco(7) -c -c triangulation des 3 sous-te par ajout des points internes du te - call trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtr, nutr, ierr ) - end - - - subroutine f3trte( letree, pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former les triangles du triangle equilateral letree -c ----- a partir de 3 milieux des cotes du te -c et des points internes au te -c ils deviennent tous des sommets des sous-triangles du te -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c si letree(0)>0 alors -c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te -c 0 si pas de milieu du cote i a ajouter -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(np) numero d'une arete du sommet np -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te, triangulation du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer letree(0:8), - % milieu(3), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) -c - integer nuarco(9) -c -c le numero des 4 triangles a creer dans le tableau noartr - do 5 nbtr=1,4 - if( n1artr .le. 0 ) then -c tableau noartr sature - ierr = 2 - return - endif - nutr(nbtr) = n1artr -c le nouveau premier triangle libre dans noartr - n1artr = noartr(2,n1artr) - 5 continue - nbtr = 4 -c - do 10 i=1,3 -c le sommet suivant - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c le sommet precedant - if( i .ne. 1 ) then - i0 = i - 1 - else - i0 = 3 - endif - i3 = 3 * i -c -c ajout eventuel de l'arete si mi dans nosoar - call fasoar( letree(5+i), milieu(i), nutr(i), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i3-2), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete mi mi-1 dans nosoar - call fasoar( milieu(i), milieu(i0), nutr(i), nutr(4), 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i3-1), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete m i-1 si dans nosoar - call fasoar( milieu(i0), letree(5+i), nutr(i), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i3), ierr ) - if( ierr .ne. 0 ) return -c - 10 continue -c -c les 3 sous-triangles pres des sommets - do 20 i=1,3 -c le sommet suivant - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c le sommet precedant - if( i .ne. 1 ) then - i0 = i - 1 - else - i0 = 3 - endif - i3 = 3 * i -c -c ajout du triangle arete3i-2 arete3i-1 arete3i - if( letree(5+i) .eq. nosoar(1,nuarco(i3-2)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 1, nutr(i) ) = lesign * nuarco(i3-2) -c - if( milieu(i) .eq. nosoar(1,nuarco(i3-1)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 2, nutr(i) ) = lesign * nuarco(i3-1) -c - if( milieu(i0) .eq. nosoar(1,nuarco(i3)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 3, nutr(i) ) = lesign * nuarco(i3) -c - 20 continue -c -c le sous triangle central - i3 = -1 - do 30 i=1,3 - i3 = i3 + 3 - if( milieu(i) .eq. nosoar(1,nuarco(i3)) ) then - lesign = -1 - else - lesign = 1 - endif - noartr( i, nutr(4) ) = lesign * nuarco(i3) - 30 continue -c -c triangulation des 3 sous-te par ajout des points internes du te - call trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtr, nutr, ierr ) - end - - - - subroutine hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar, - % noar ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : rechercher le numero des 2 sommets d'une arete parmi -c ----- les numeros des 2 sommets des aretes du tableau nosoar -c s ils n y sont pas stockes les y ajouter -c dans tous les cas retourner le numero de l'arete dans nosoar -c -c la methode employee ici est celle du hachage -c avec pour fonction d'adressage h(ns1,ns2)=min(ns1,ns2) -c -c remarque: h(ns1,ns2)=ns1 + 2*ns2 -c ne marche pas si des aretes sont detruites -c et ajoutees aux aretes vides -c le chainage est commun a plusieurs hachages! -c d'ou ce choix du minimum pour le hachage -c -c entrees: -c -------- -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c chainage des aretes vides amont et aval -c l'arete vide qui precede=nosoar(4,i) -c l'arete vide qui suit =nosoar(5,i) -c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, -c chainage momentan'e d'aretes, chainage du hachage des aretes -c hachage des aretes = min( nosoar(1), nosoar(2) ) -c nu2sar : en entree les 2 numeros des sommets de l'arete -c en sortie nu2sar(1)0 si le tableau nu2sar est l'arete noar retrouvee -c dans le tableau nosoar -c <0 si le tableau nu2sar a ete ajoute et forme l'arete -c -noar du tableau nosoar avec nosoar(1,noar) elle devient la nouvelle arete -c retouche des chainages de cette arete noar qui ne sera plus vide - noar = nu2sar(1) -c l'eventuel chainage du hachage n'est pas modifie -c - else -c -c la premiere arete dans l'adressage du hachage n'est pas libre -c => choix quelconque d'une arete vide pour ajouter cette arete - if( n1soar .le. 0 ) then -c -c le tableau nosoar est sature avec pour temoin d'erreur - noar = 0 - return -c - else -c -c l'arete n1soar est vide => c'est la nouvelle arete -c mise a jour du chainage de la derniere arete noar du chainage -c sa suivante est la nouvelle arete n1soar - nosoar( mosoar, noar ) = n1soar -c -c l'arete ajoutee est n1soar - noar = n1soar -c -c la nouvelle premiere arete vide - n1soar = nosoar( 5, n1soar ) -c -c la premiere arete vide n1soar n'a pas d'arete vide precedente - nosoar( 4, n1soar ) = 0 -c -c noar la nouvelle arete est la derniere du chainage du hachage - nosoar( mosoar, noar ) = 0 -c - endif -c - endif -c -c les 2 sommets de la nouvelle arete noar - nosoar( 1, noar ) = nu2sar(1) - nosoar( 2, noar ) = nu2sar(2) -c -c le tableau nu2sar a ete ajoute avec l'indice -noar - noar = - noar - end - - - subroutine mt3str( nt, moartr, noartr, mosoar, nosoar, - % ns1, ns2, ns3 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul du numero des 3 sommets du triangle nt du tableau noartr -c ----- -c -c entrees: -c -------- -c nt : numero du triangle de noartr a traiter -c moartr : nombre maximal d'entiers par triangle -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1=0 si triangle vide => arete2=triangle vide suivant -c mosoar : nombre maximal d'entiers par arete -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c -c sorties: -c -------- -c ns1,ns2,ns3 : les 3 numeros des sommets du triangle en sens direct -c -c si erreur rencontree => ns1 = 0 -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juillet 1995 -c2345x7..............................................................012 - integer noartr(moartr,*), nosoar(mosoar,*) -c -c le numero de triangle est il correct ? -c a supprimer apres mise au point - if( nt .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') nt -c kerr(1) = kerr(mxlger)(1:6) // -c % ' no triangle dans noartr incorrect' -c call lereur - write(imprim,*) nt,' no triangle dans noartr incorrect' - ns1 = 0 - return - endif -c - na = noartr(1,nt) - if( na .gt. 0 ) then -c arete dans le sens direct - ns1 = nosoar(1,na) - ns2 = nosoar(2,na) - else -c arete dans le sens indirect - ns1 = nosoar(2,-na) - ns2 = nosoar(1,-na) - endif -c - na = noartr(2,nt) - if( na .gt. 0 ) then -c arete dans le sens direct => ns3 est le second sommet de l'arete - ns3 = nosoar(2,na) - else -c arete dans le sens indirect => ns3 est le premier sommet de l'arete - ns3 = nosoar(1,-na) - endif - end - subroutine trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former le ou les sous-triangles des nbtr triangles nutr -c ----- qui forment le triangle equilateral letree par ajout -c des points internes au te qui deviennent des sommets des -c sous-triangles des nbtr triangles -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0:3):-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est ici une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - logical tratri - common / dv2dco / tratri -c trace ou non des triangles generes dans la triangulation - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer letree(0:8), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) -c - integer nosotr(3) -c -c si pas de point interne alors trace eventuel puis retour - if( letree(0) .eq. 0 ) goto 150 -c -c il existe au moins un point interne a trianguler -c dans les nbtr triangles - do 100 k=0,3 -c -c le numero du point - np = -letree(k) - if( np .eq. 0 ) goto 150 -c -c le point np dans pxyd est a traiter - do 10 n = 1, nbtr -c -c les numeros des 3 sommets du triangle nt=nutr(n) - nt = nutr(n) - call nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr ) -c -c le triangle nt contient il le point np? - call ptdatr( pxyd(1,np), pxyd, nosotr, nsigne ) -c nsigne>0 si le point est dans le triangle ou sur une des 3 aretes -c =0 si triangle degenere ou indirect ou ne contient pas le poin -c - if( nsigne .gt. 0 ) then -c -c le triangle nt est triangule en 3 sous-triangles - call tr3str( np, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nutr(nbtr+1), ierr ) - if( ierr .ne. 0 ) return -c -c reamenagement des 3 triangles crees dans nutr -c en supprimant le triangle nt - nutr( n ) = nutr( nbtr + 3 ) - nbtr = nbtr + 2 -c le point np est triangule - goto 100 -c - endif - 10 continue -c -c erreur: le point np n'est pas dans l'un des nbtr triangles - write(imprim,10010) np - ierr = 3 - return -c - 100 continue -10010 format(' erreur trpite: pas de triangle contenant le point',i7) -c - 150 continue - -ccc 150 if( tratri ) then -cccc les traces sont demandes -ccc call efface -cccc le cadre objet global en unites utilisateur -ccc xx1 = min(pxyd(1,nosotr(1)),pxyd(1,nosotr(2)),pxyd(1,nosotr(3))) -ccc xx2 = max(pxyd(1,nosotr(1)),pxyd(1,nosotr(2)),pxyd(1,nosotr(3))) -ccc yy1 = min(pxyd(2,nosotr(1)),pxyd(2,nosotr(2)),pxyd(2,nosotr(3))) -ccc yy2 = max(pxyd(2,nosotr(1)),pxyd(2,nosotr(2)),pxyd(2,nosotr(3))) -ccc if( xx1 .ge. xx2 ) xx2 = xx1 + (yy2-yy1) -ccc if( yy1 .ge. yy2 ) yy2 = yy1 + (xx2-xx1)*0.5 -ccc call isofenetre( xx1-(xx2-xx1), xx2+(xx2-xx1), -ccc % yy1-(yy2-yy1), yy2+(yy2-yy1) ) -ccc do 200 i=1,nbtr -cccc trace du triangle nutr(i) -ccc call mttrtr( pxyd, nutr(i), moartr, noartr, mosoar, nosoar, -ccc % i, ncblan ) -ccc 200 continue -ccc endif - - end - - - subroutine sasoar( noar, mosoar, mxsoar, n1soar, nosoar ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : supprimer l'arete noar du tableau nosoar -c ----- si celle ci n'est pas une arete des lignes de la frontiere -c -c la methode employee ici est celle du hachage -c avec pour fonction d'adressage h = min( nu2sar(1), nu2sar(2) ) -c -c attention: il faut mettre a jour le no d'arete des 2 sommets -c de l'arete supprimee dans le tableau noarst! -c -c entrees: -c -------- -c noar : numero de l'arete de nosoar a supprimer -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage h -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c -c modifies: -c --------- -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(4,arete vide)=l'arete vide qui precede -c nosoar(5,arete vide)=l'arete vide qui suit -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris mars 1997 -c ...................................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,mxsoar) -c - if( nosoar(3,noar) .le. 0 ) then -c -c l'arete n'est pas frontaliere => elle devient une arete vide -c -c recherche de l'arete qui precede dans le chainage du hachage - noar1 = nosoar(1,noar) -c -c parcours du chainage du hachage jusqu'a retrouver l'arete noar - 10 if( noar1 .ne. noar ) then -c -c l'arete suivante parmi celles ayant meme fonction d'adressage - noar0 = noar1 - noar1 = nosoar( mosoar, noar1 ) - if( noar1 .gt. 0 ) goto 10 -c -c l'arete noar n'a pas ete retrouvee dans le chainage => erreur - write(imprim,*) 'erreur sasoar:arete non dans le chainage ' - % ,noar - write(imprim,*) 'arete de st1=',nosoar(1,noar), - % ' st2=',nosoar(2,noar),' ligne=',nosoar(3,noar), - % ' tr1=',nosoar(4,noar),' tr2=',nosoar(5,noar) - write(imprim,*) 'chainages=',(nosoar(i,noar),i=6,mosoar) -c l'arete n'est pas detruite - return -c - endif -c - if( noar .ne. nosoar(1,noar) ) then -c -c saut de l'arete noar dans le chainage du hachage -c noar0 initialisee est ici l'arete qui precede noar dans ce chainage - nosoar( mosoar, noar0 ) = nosoar( mosoar, noar ) -c -c le chainage du hachage n'existe plus pour noar -c pas utile car mise a zero faite dans le sp hasoar -ccc nosoar( mosoar, noar ) = 0 -c -c noar devient la nouvelle premiere arete du chainage des vides - nosoar( 4, noar ) = 0 - nosoar( 5, noar ) = n1soar -c la nouvelle precede l'ancienne premiere - nosoar( 4, n1soar ) = noar - n1soar = noar -c -ccc else -c -c noar est la premiere arete du chainage du hachage h -c cette arete ne peut etre consideree dans le chainage des vides -c car le chainage du hachage doit etre conserve (sinon perte...) -c - endif -c -c le temoin d'arete vide - nosoar( 1, noar ) = 0 - endif - end - - - subroutine caetoi( noar, mosoar, mxsoar, n1soar, nosoar, - % n1aeoc, nbtrar ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : ajouter (ou retirer) l'arete noar de nosoar de l'etoile -c ----- des aretes simples chainees en position lchain de nosoar -c detruire du tableau nosoar les aretes doubles -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entree : -c -------- -c noar : numero dans le tableau nosoar de l'arete a traiter -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c -c entrees et sorties: -c ------------------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c n1aeoc : numero dans nosoar de la premiere arete simple de l'etoile -c -c sortie : -c -------- -c nbtrar : 1 si arete ajoutee, 2 si arete double supprimee -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - parameter (lchain=6) - integer nosoar(mosoar,mxsoar) -c -c si l'arete n'appartient pas aux aretes de l'etoile naetoi -c alors elle est ajoutee a l'etoile dans naetoi -c sinon elle est empilee dans npile pour etre detruite ensuite -c elle est supprimee de l'etoile naetoi -c - if( nosoar( lchain, noar ) .lt. 0 ) then -c -c arete de l'etoile vue pour la premiere fois -c elle est ajoutee au chainage - nosoar( lchain, noar ) = n1aeoc -c elle devient la premiere du chainage - n1aeoc = noar -c arete simple - nbtrar = 1 -c - else -c -c arete double de l'etoile. elle est supprimee du chainage - na0 = 0 - na = n1aeoc -c parcours des aretes chainees jusqu'a trouver l'arete noar - 10 if( na .ne. noar ) then -c passage a la suivante - na0 = na - na = nosoar( lchain, na ) - goto 10 - endif -c -c suppression de noar du chainage des aretes simples de l'etoile - if( na0 .gt. 0 ) then -c il existe une arete qui precede - nosoar( lchain, na0 ) = nosoar( lchain, noar ) - else -c noar est en fait n1aeoc la premiere du chainage - n1aeoc = nosoar( lchain, noar ) - endif -c noar n'est plus une arete simple de l'etoile - nosoar( lchain, noar ) = -1 -c -c destruction du tableau nosoar de l'arete double noar - call sasoar( noar, mosoar, mxsoar, n1soar, nosoar ) -c -c arete double - nbtrar = 2 - endif - end - - - subroutine focftr( nbtrcf, notrcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % nbarcf, n1arcf, noarcf, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former un contour ferme (cf) avec les aretes simples des -c ----- nbtrcf triangles du tableau notrcf -c destruction des nbtrcf triangles du tableau noartr -c destruction des aretes doubles du tableau nosoar -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entrees: -c -------- -c nbtrcf : nombre de triangles du cf a former -c notrcf : numero des triangles dans le tableau noartr -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c entrees et sorties : -c -------------------- -c noarst : noarst(i) numero d'une arete de sommet i -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c sorties: -c -------- -c nbarcf : nombre d'aretes du cf -c n1arcf : numero d'une arete de chaque contour -c noarcf : numero des aretes de la ligne du contour ferme -c attention: chainage circulaire des aretes -c les aretes vides pointes par n1arcf(0) ne sont pas chainees -c ierr : 0 si pas d'erreur -c 14 si les lignes fermees se coupent => donnees a revoir -c 15 si une seule arete simple frontaliere -c 16 si boucle infinie car toutes les aretes simples -c de la boule sont frontalieres! -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer notrcf(1:nbtrcf) - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % n1arcf(0:*), - % noarcf(3,*), - % noarst(*) -c -c formation des aretes simples du cf autour de l'arete ns1-ns2 -c attention: le chainage lchain du tableau nosoar devient actif -c ============================================================ -c ici toutes les aretes du tableau nosoar verifient nosoar(lchain,i) = -1 -c ce qui equivaut a dire que l'etoile des aretes simples est vide -c (initialisation dans le sp insoar puis remise a -1 dans la suite!) - n1aeoc = 0 -c -c ajout a l'etoile des aretes simples des 3 aretes des triangles a supprimer -c suppression des triangles de l'etoile pour les aretes simples de l'etoile - do 10 i=1,nbtrcf -c ajout ou retrait des 3 aretes du triangle notrcf(i) de l'etoile - nt = notrcf( i ) - do 5 j=1,3 -c l'arete de nosoar a traiter - noar = abs( noartr(j,nt) ) - call caetoi( noar, mosoar, mxsoar, n1soar, nosoar, - % n1aeoc, nbtrar ) -c si arete simple alors suppression du numero de triangle pour cette a - if( nbtrar .eq. 1 ) then - if( nosoar(4,noar) .eq. nt ) then - nosoar(4,noar) = nosoar(5,noar) - endif - nosoar(5,noar) = -1 -c else -c l'arete appartient a aucun triangle => elle est vide -c les positions 4 et 5 servent maintenant aux chainages des vides - endif - 5 continue - 10 continue -c -c les aretes simples de l'etoile sont reordonnees pour former une -c ligne fermee = un contour ferme peripherique de l'etoile encore dit 1 cf -c ======================================================================== - n1ae00 = n1aeoc - 12 na1 = n1aeoc -c la premiere arete du contour ferme - ns0 = nosoar(1,na1) - ns1 = nosoar(2,na1) -c -c l'arete est-elle dans le sens direct? -c recherche de l'arete du triangle exterieur nt d'arete na1 - nt = nosoar(4,na1) - if( nt .le. 0 ) nt = nosoar(5,na1) -c -c attention au cas de l'arete initiale frontaliere de no de triangles 0 et - - if( nt .le. 0 ) then -c permutation circulaire des aretes simples chainees -c la premiere arete doit devenir la derniere du chainage, -c la 2=>1, la 3=>2, ... , la derniere=>l'avant derniere, 1=>derniere - n1aeoc = nosoar( lchain, n1aeoc ) - if( n1aeoc .eq. n1ae00 ) then -c attention: boucle infinie si toutes les aretes simples -c de la boule sont frontalieres!... arretee par ce test - ierr = 16 - return - endif - noar = n1aeoc - na0 = 0 - 14 if( noar .gt. 0 ) then -c la sauvegarde de l'arete et l'arete suivante - na0 = noar - noar = nosoar(lchain,noar) - goto 14 - endif - if( na0 .le. 0 ) then -c une seule arete simple frontaliere - ierr = 15 - return - endif -c le suivant de l'ancien dernier est l'ancien premier - nosoar(lchain,na0) = na1 -c le nouveau dernier est l'ancien premier - nosoar(lchain,na1) = 0 - goto 12 - endif -c -c ici l'arete na1 est l'une des aretes du triangle nt - do 15 i=1,3 - if( abs(noartr(i,nt)) .eq. na1 ) then -c c'est l'arete - if( noartr(i,nt) .gt. 0 ) then -c elle est parcourue dans le sens indirect de l'etoile -c (car c'est en fait le triangle exterieur a la boule) - ns0 = nosoar(2,na1) - ns1 = nosoar(1,na1) - endif - goto 17 - endif - 15 continue -c -c le 1-er sommet ou arete du contour ferme - 17 n1arcf( 1 ) = 1 -c le nombre de sommets du contour ferme de l'etoile - nbarcf = 1 -c le premier sommet de l'etoile - noarcf( 1, nbarcf ) = ns0 -c l'arete suivante du cf - noarcf( 2, nbarcf ) = nbarcf + 1 -c le numero de cette arete dans le tableau nosoar - noarcf( 3, nbarcf ) = na1 -c mise a jour du numero d'arete du sommet ns0 - noarst(ns0) = na1 -c -cccc trace de l'arete -ccc call dvtrar( pxyd, ns0, ns1, ncvert, ncblan ) -c -c l'arete suivante a chainer - n1aeoc = nosoar( lchain, na1 ) -c l'arete na1 n'est plus dans l'etoile - nosoar( lchain, na1 ) = -1 -c -c boucle sur les aretes simples de l'etoile - 20 if( n1aeoc .gt. 0 ) then -c -c recherche de l'arete de 1-er sommet ns1 - na0 = -1 - na1 = n1aeoc - 25 if( na1 .gt. 0 ) then -c -c le numero du dernier sommet de l'arete precedente -c est il l'un des 2 sommets de l'arete na1? - if ( ns1 .eq. nosoar(1,na1) ) then -c l'autre sommet de l'arete na1 - ns2 = nosoar(2,na1) - else if( ns1 .eq. nosoar(2,na1) ) then -c l'autre sommet de l'arete na1 - ns2 = nosoar(1,na1) - else -c non: passage a l'arete suivante - na0 = na1 - na1 = nosoar( lchain, na1 ) - goto 25 - endif -c -c oui: na1 est l'arete peripherique suivante -c na0 est sa precedente dans le chainage -c une arete de plus dans le contour ferme (cf) - nbarcf = nbarcf + 1 -c le premier sommet de l'arete nbarcf peripherique - noarcf( 1, nbarcf ) = ns1 -c l'arete suivante du cf - noarcf( 2, nbarcf ) = nbarcf + 1 -c le numero de cette arete dans le tableau nosoar - noarcf( 3, nbarcf ) = na1 -c mise a jour du numero d'arete du sommet ns1 - noarst(ns1) = na1 -c -cccc trace de l'arete -ccc call dvtrar( pxyd, ns1, ns2, ncvert, ncblan ) -c -c suppression de l'arete des aretes simples de l'etoile - if( n1aeoc .eq. na1 ) then - n1aeoc = nosoar( lchain, na1 ) - else - nosoar( lchain, na0 ) = nosoar( lchain, na1 ) - endif -c l'arete n'est plus une arete simple de l'etoile - nosoar( lchain, na1 ) = -1 -c -c le sommet final de l'arete a rechercher ensuite - ns1 = ns2 - goto 20 - endif - endif -c -c verification - if( ns1 .ne. ns0 ) then -c arete non retrouvee : l'etoile ne se referme pas -c nblgrc(nrerr) = 3 -c kerr(1) = 'focftr: revoyez vos donnees' -c kerr(2) = 'les lignes fermees doivent etre disjointes' -c kerr(3) = 'verifiez si elles ne se coupent pas' -c call lereur - write(imprim,*) 'focftr: revoyez vos donnees' - write(imprim,*)'les lignes fermees doivent etre disjointes' - write(imprim,*)'verifiez si elles ne se coupent pas' - ierr = 14 - return - endif -c -c l'arete suivant la derniere arete du cf est la premiere du cf -c => realisation d'un chainage circulaire des aretes du cf - noarcf( 2, nbarcf ) = 1 -c -c destruction des triangles de l'etoile du tableau noartr -c ------------------------------------------------------- - do 50 i=1,nbtrcf -c le numero du triangle dans noartr - nt0 = notrcf( i ) -c l'arete 1 de nt0 devient nulle - noartr( 1, nt0 ) = 0 -c chainage de nt0 en tete du chainage des triangles vides de noartr - noartr( 2, nt0 ) = n1artr - n1artr = nt0 - 50 continue - end - - - subroutine int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x0, y0 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : existence ou non d'une intersection a l'interieur -c ----- des 2 aretes ns1-ns2 et ns3-ns4 -c attention les intersections au sommet sont comptees -c -c entrees: -c -------- -c ns1,...ns4 : numero pxyd des 4 sommets -c pxyd : les coordonnees des sommets -c -c sortie : -c -------- -c linter : -1 si ns3-ns4 parallele a ns1 ns2 -c 0 si ns3-ns4 n'intersecte pas ns1-ns2 entre les aretes -c 1 si ns3-ns4 intersecte ns1-ns2 entre les aretes -c 2 si le point d'intersection est ns1 entre ns3-ns4 -c 3 si le point d'intersection est ns3 entre ns1-ns2 -c 4 si le point d'intersection est ns4 entre ns1-ns2 -c x0,y0 : 2 coordonnees du point d'intersection s'il existe(linter>=1) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - parameter ( epsmoi=-0.000001d0, eps=0.001d0, - % unmeps= 0.999d0, unpeps=1.000001d0 ) - double precision pxyd(3,*), x0, y0 - double precision x1,y1,x21,y21,d21,x43,y43,d43,d,x,y,p21,p43 -c - x1 = pxyd(1,ns1) - y1 = pxyd(2,ns1) - x21 = pxyd(1,ns2) - x1 - y21 = pxyd(2,ns2) - y1 - d21 = x21**2 + y21**2 -c - x43 = pxyd(1,ns4) - pxyd(1,ns3) - y43 = pxyd(2,ns4) - pxyd(2,ns3) - d43 = x43**2 + y43**2 -c -c les 2 aretes sont-elles jugees paralleles ? - d = x43 * y21 - y43 * x21 - if( d*d .le. 0.000001d0 * d21 * d43 ) then -c cote i parallele a ns1-ns2 - linter = -1 - return - endif -c -c les 2 coordonnees du point d'intersection - x =( x1*x43*y21-pxyd(1,ns3)*x21*y43-(y1-pxyd(2,ns3))*x21*x43)/d - y =(-y1*y43*x21+pxyd(2,ns3)*y21*x43+(x1-pxyd(1,ns3))*y21*y43)/d -c -c coordonnee barycentrique de x,y dans le repere ns1-ns2 - p21 = ( ( x - x1 ) * x21 + ( y - y1 ) * y21 ) / d21 -c coordonnee barycentrique de x,y dans le repere ns3-ns4 - p43 = ( (x - pxyd(1,ns3))* x43 + (y - pxyd(2,ns3)) * y43 ) / d43 -c -c - if( epsmoi .le. p21 .and. p21 .le. unpeps ) then -c x,y est entre ns1-ns2 - if( (p21 .le. eps) .and. - % (epsmoi .le. p43 .and. p43 .le. unpeps) ) then -c le point x,y est proche de ns1 et interne a ns3-ns4 - linter = 2 - x0 = pxyd(1,ns1) - y0 = pxyd(2,ns1) - return - else if( epsmoi .le. p43 .and. p43 .le. eps ) then -c le point x,y est proche de ns3 et entre ns1-ns2 - linter = 3 - x0 = pxyd(1,ns3) - y0 = pxyd(2,ns3) - return - else if( unmeps .le. p43 .and. p43 .le. unpeps ) then -c le point x,y est proche de ns4 et entre ns1-ns2 - linter = 4 - x0 = pxyd(1,ns4) - y0 = pxyd(2,ns4) - return - else if( eps .le. p43 .and. p43 .le. unmeps ) then -c le point x,y est entre ns3-ns4 - linter = 1 - x0 = x - y0 = y - return - endif - endif -c -c pas d'intersection a l'interieur des aretes - linter = 0 - end - - - subroutine tefoar( narete, nbarpi, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, larmin, notrcf, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : forcer l'arete narete de nosoar dans la triangulation actuelle -c ----- triangulation frontale pour la reobtenir -c -c attention: le chainage lchain(=6) de nosoar devient actif -c durant la formation des contours fermes (cf) -c -c entrees: -c -------- -c narete : numero nosoar de l'arete frontaliere a forcer -c nbarpi : numero du dernier point interne impose par l'utilisateur -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c modifies: -c --------- -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf -c -c tableaux auxiliaires : -c ---------------------- -c n1arcf : tableau (0:mxarcf) auxiliaire -c noarcf : tableau (3,mxarcf) auxiliaire -c larmin : tableau (mxarcf) auxiliaire -c notrcf : tableau (1:mxarcf) auxiliaire -c -c sortie : -c -------- -c ierr : 0 si pas d'erreur -c 1 saturation des sommets -c 2 ns1 dans aucun triangle -c 9 tableau nosoar de taille insuffisante car trop d'aretes -c a probleme -c 10 un des tableaux n1arcf, noarcf notrcf est sature -c augmenter a l'appel mxarcf -c 11 algorithme defaillant -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (mxpitr=32) - common / unites / lecteu,imprim,intera,nunite(29) - logical tratri - common / dv2dco / tratri - double precision pxyd(3,*) - integer noartr(moartr,*), - % nosoar(mosoar,mxsoar), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf) -c - integer lapitr(mxpitr) - double precision x1,y1,x2,y2,d12,d3,d4,x,y,d,dmin - integer nosotr(3), ns(2) - integer nacf(1:2), nacf1, nacf2 - equivalence (nacf(1),nacf1), (nacf(2),nacf2) -c -c traitement de cette arete perdue - ns1 = nosoar( 1, narete ) - ns2 = nosoar( 2, narete ) -c - if( tratri ) then -c les traces sont demandes -c call efface -c le cadre objet global en unites utilisateur - xx1 = min( pxyd(1,ns1), pxyd(1,ns2) ) - xx2 = max( pxyd(1,ns1), pxyd(1,ns2) ) - yy1 = min( pxyd(2,ns1), pxyd(2,ns2) ) - yy2 = max( pxyd(2,ns1), pxyd(2,ns2) ) - if( xx1 .ge. xx2 ) xx2 = xx1 + (yy2-yy1) - if( yy1 .ge. yy2 ) yy2 = yy1 + (xx2-xx1)*0.5 -c call isofenetre( xx1-(xx2-xx1), xx2+(xx2-xx1), -c % yy1-(yy2-yy1), yy2+(yy2-yy1) ) - endif -c -cccc trace de l'arete perdue -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) -c -c le sommet ns2 est il correct? - na = noarst( ns2 ) - if( na .le. 0 ) then - write(imprim,*) 'tefoar: erreur sommet ',ns2,' sans arete' - ierr = 8 - return - endif - if( nosoar(4,na) .le. 0 ) then - write(imprim,*) 'tefoar: erreur sommet ',ns2, - % ' dans aucun triangle' - ierr = 8 - return - endif -c -c recherche du triangle voisin dans le sens indirect de rotation - nsens = -1 -c le premier passage: recherche dans le sens ns1->ns2 - ipas = 0 -c -c recherche des triangles intersectes par le segment ns1-ns2 -c ========================================================== - 3 x1 = pxyd(1,ns1) - y1 = pxyd(2,ns1) - x2 = pxyd(1,ns2) - y2 = pxyd(2,ns2) - d12 = (x2-x1)**2 + (y2-y1)**2 -c -c recherche du no local du sommet ns1 dans l'un de ses triangles - na01 = noarst( ns1 ) - if( na01 .le. 0 ) then - write(imprim,*) 'tefoar: sommet ',ns1,' sans arete' - ierr = 8 - return - endif - nt0 = nosoar(4,na01) - if( nt0 .le. 0 ) then - write(imprim,*) 'tefoar: sommet ',ns1,' dans aucun triangle' - ierr = 8 - return - endif -c -c le numero des 3 sommets du triangle nt0 dans le sens direct - 20 call nusotr( nt0, mosoar, nosoar, moartr, noartr, nosotr ) - do 22 na00=1,3 - if( nosotr(na00) .eq. ns1 ) goto 26 - 22 continue -c - 25 if( ipas .eq. 0 ) then -c le second passage: recherche dans le sens ns2->ns1 -c tentative d'inversion des 2 sommets extremites de l'arete a forcer - na00 = ns1 - ns1 = ns2 - ns2 = na00 - ipas = 1 - goto 3 - else -c les sens ns1->ns2 et ns2->ns1 ne donne pas de solution! - write(imprim,*)'tefoar:arete ',ns1,' - ',ns2,' a imposer' - write(imprim,*)'tefoar:anomalie sommet ',ns1, - % 'non dans le triangle de sommets ',(nosotr(i),i=1,3) - ierr = 11 - return - endif -c -c le numero des aretes suivante et precedente - 26 na0 = nosui3( na00 ) - na1 = nopre3( na00 ) - ns3 = nosotr( na0 ) - ns4 = nosotr( na1 ) -c -cccc trace du triangle nt0 et de l'arete perdue -ccc call mttrtr( pxyd, nt0, moartr, noartr, mosoar, nosoar, -ccc % ncblan, ncjaun ) -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) -ccc call dvtrar( pxyd, ns3, ns4, ncbleu, nccyan ) -c -c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4 -c ------------------------------------------------------------ - call int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x1, y1 ) - if( linter .le. 0 ) then -c -c pas d'intersection: rotation autour du point ns1 -c pour trouver le triangle de l'autre cote de l'arete na01 - if( nsens .lt. 0 ) then -c sens indirect de rotation: l'arete de sommet ns1 - na01 = abs( noartr(na00,nt0) ) - else -c sens direct de rotation: l'arete de sommet ns1 qui precede - na01 = abs( noartr(na1,nt0) ) - endif -c le triangle de l'autre cote de l'arete na01 - if( nosoar(4,na01) .eq. nt0 ) then - nt0 = nosoar(5,na01) - else - nt0 = nosoar(4,na01) - endif - if( nt0 .gt. 0 ) goto 20 -c -c le parcours sort du domaine -c il faut tourner dans l'autre sens autour de ns1 - if( nsens .lt. 0 ) then - nsens = 1 - nt0 = noarst( ns1 ) - goto 20 - endif -c -c dans les 2 sens, pas d'intersection => impossible -c essai avec l'arete inversee ns1 <-> ns2 - if( ipas .eq. 0 ) goto 25 - write(imprim,*) 'tefoar: arete ',ns1,' ',ns2, - % ' sans intersection avec les triangles actuels' - write(imprim,*) 'revoyez les lignes du contour' - ierr = 11 - return - endif -c -c il existe une intersection avec l'arete opposee au sommet ns1 -c ============================================================= -c nbtrcf : nombre de triangles du cf - nbtrcf = 1 - notrcf( 1 ) = nt0 -c -c le triangle oppose a l'arete na0 de nt0 - 30 noar = abs( noartr(na0,nt0) ) - if( nosoar(4,noar) .eq. nt0 ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif -c -cccc trace du triangle nt1 et de l'arete perdue -ccc call mttrtr( pxyd, nt1, moartr, noartr, mosoar, nosoar, -ccc % ncjaun, ncmage ) -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) -c -c le numero des 3 sommets du triangle nt1 dans le sens direct - call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr ) -c -c le triangle nt1 contient il ns2 ? - do 32 j=1,3 - if( nosotr(j) .eq. ns2 ) goto 70 - 32 continue -c -c recherche de l'arete noar, na1 dans nt1 qui est l'arete na0 de nt0 - do 34 na1=1,3 - if( abs( noartr(na1,nt1) ) .eq. noar ) goto 35 - 34 continue -c -c trace du triangle nt1 et de l'arete perdue - 35 continue -ccc 35 call mttrtr( pxyd, nt1, moartr, noartr, mosoar, nosoar, -ccc % ncjaun, ncmage ) -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) -c -c recherche de l'intersection de ns1-ns2 avec les 2 autres aretes de nt1 -c ====================================================================== - na2 = na1 - do 50 i1 = 1,2 -c l'arete suivante - na2 = nosui3(na2) -c -c les 2 sommets de l'arete na2 de nt1 - noar = abs( noartr(na2,nt1) ) - ns3 = nosoar( 1, noar ) - ns4 = nosoar( 2, noar ) -ccc call dvtrar( pxyd, ns3, ns4, ncbleu, nccyan ) -c -c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4 -c ------------------------------------------------------------ - call int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x , y ) - if( linter .gt. 0 ) then -c -c les 2 aretes s'intersectent en (x,y) -c distance de (x,y) a ns3 et ns4 - d3 = (pxyd(1,ns3)-x)**2 + (pxyd(2,ns3)-y)**2 - d4 = (pxyd(1,ns4)-x)**2 + (pxyd(2,ns4)-y)**2 -c nsp est le point le plus proche de (x,y) - if( d3 .lt. d4 ) then - nsp = ns3 - d = d3 - else - nsp = ns4 - d = d4 - endif - if( d .gt. 1d-5*d12 ) goto 60 -c -c ici le sommet nsp est trop proche de l'arete perdue ns1-ns2 - if( nsp .le. nbarpi ) then -c point utilisateur ou frontalier non supprimable - ierr = 11 - write(imprim,*) 'pause dans tefoar 1', d, d3, d4, d12 - return - endif -c -c le sommet interne nsp est supprime en mettant tous les triangles -c l'ayant comme sommet dans la pile notrcf des triangles a supprimer -c ------------------------------------------------------------------ -ccc write(imprim,*) 'tefoar: le sommet ',nsp,' est supprime' -c construction de la liste des triangles de sommet nsp - call trp1st( nsp, noarst, mosoar, nosoar, moartr, noartr, - % mxpitr, nbt, lapitr ) - if( nbt .le. 0 ) then -c les triangles de sommet nsp ne forme pas une "boule" -c avec ce sommet nsp pour "centre" - write(imprim,*) - % 'tefoar: pas d''etoile de triangles autour du sommet',nsp -cccc trace des triangles de l'etoile du sommet nsp -ccc tratri = .true. -ccc call trpltr( nbt, lapitr, pxyd, -ccc % moartr, noartr, mosoar, nosoar, -ccc % ncroug, ncblan ) -ccc tratri = .false. - ierr = 11 - write(imprim,*) 'pause dans tefoar 2' - return - endif -c -c ajout des triangles de sommet ns1 a notrcf - nbtrc0 = nbtrcf - do 38 j=1,nbt - nt = lapitr(j) - do 37 k=nbtrcf,1,-1 - if( nt .eq. notrcf(k) ) goto 38 - 37 continue -c triangle ajoute - nbtrcf = nbtrcf + 1 - notrcf( nbtrcf ) = nt -ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar, -ccc % ncjaun, ncmage ) -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) - 38 continue -c -c ce sommet supprime n'appartient plus a aucun triangle - noarst( nsp ) = 0 -c -c ns2 est-il un sommet des triangles empiles? -c ------------------------------------------- - do 40 nt=nbtrc0+1,nbtrcf -c le triangle a supprimer nt - nt1 = notrcf( nt ) -c le numero des 3 sommets du triangle nt1 dans le sens direct - call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr) - do 39 k=1,3 -c le sommet k de nt1 - if( nosotr( k ) .eq. ns2 ) then -c but atteint - goto 80 - endif - 39 continue - 40 continue -c -c recherche du plus proche point d'intersection de ns1-ns2 -c par rapport a ns2 avec les aretes des triangles ajoutes - nt0 = 0 - dmin = d12 * 10000 - do 48 nt=nbtrc0+1,nbtrcf - nt1 = notrcf( nt ) -c le numero des 3 sommets du triangle nt1 dans le sens direct - call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr) - do 45 k=1,3 -c les 2 sommets de l'arete k de nt - ns3 = nosotr( k ) - ns4 = nosotr( nosui3(k) ) -c -c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4 -c ------------------------------------------------------------ - call int1sd( ns1, ns2, ns3, ns4, pxyd, - % linter, x , y ) - if( linter .gt. 0 ) then -c les 2 aretes s'intersectent en (x,y) - d = (x-x2)**2+(y-y2)**2 - if( d .lt. dmin ) then - nt0 = nt1 - na0 = k - dmin = d - endif - endif - 45 continue - 48 continue -c -c redemarrage avec le triangle nt0 et l'arete na0 - if( nt0 .gt. 0 ) goto 30 -c - write(imprim,*) 'tefoar: algorithme defaillant' - ierr = 11 - return - endif - 50 continue -c -c pas d'intersection differente de l'initiale => sommet sur ns1-ns2 -c rotation autour du sommet par l'arete suivant na1 - write(imprim,*) - write(imprim,*) 'tefoar 50: revoyez vos donnees' - write(imprim,*) 'les lignes fermees doivent etre disjointes' - write(imprim,*) 'verifiez si elles ne se coupent pas' - ierr = 13 - return -c -c cas sans probleme : intersection differente de celle initiale -c ================= ========================================= - 60 nbtrcf = nbtrcf + 1 - notrcf( nbtrcf ) = nt1 -c passage au triangle suivant - na0 = na2 - nt0 = nt1 - goto 30 -c -c ---------------------------------------------------------- -c ici toutes les intersections de ns1-ns2 ont ete parcourues -c tous les triangles intersectes ou etendus forment les -c nbtrcf triangles du tableau notrcf -c ---------------------------------------------------------- - 70 nbtrcf = nbtrcf + 1 - notrcf( nbtrcf ) = nt1 -c -c formation du cf des aretes simples des triangles de notrcf -c et destruction des nbtrcf triangles du tableau noartr -c attention: le chainage lchain du tableau nosoar devient actif -c ============================================================= - 80 if( nbtrcf*3 .gt. mxarcf ) then - write(imprim,*) 'saturation du tableau noarcf' - ierr = 10 - return - endif -c - call focftr( nbtrcf, notrcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % nbarcf, n1arcf, noarcf, - % ierr ) - if( ierr .ne. 0 ) return -c -c chainage des aretes vides dans le tableau noarcf -c ------------------------------------------------ -c decalage de 2 aretes car 2 aretes sont necessaires ensuite pour -c integrer 2 fois l'arete perdue et former ainsi 2 cf -c comme nbtrcf*3 minore mxarcf il existe au moins 2 places vides -c derriere => pas de test de debordement - n1arcf(0) = nbarcf+3 - mmarcf = min(8*nbarcf,mxarcf) - do 90 i=nbarcf+3,mmarcf - noarcf(2,i) = i+1 - 90 continue - noarcf(2,mmarcf) = 0 -c -c reperage des sommets ns1 ns2 de l'arete perdue dans le cf -c --------------------------------------------------------- - ns1 = nosoar( 1, narete ) - ns2 = nosoar( 2, narete ) - ns(1) = ns1 - ns(2) = ns2 - do 120 i=1,2 -c la premiere arete dans noarcf du cf - na0 = n1arcf(1) - 110 if( noarcf(1,na0) .ne. ns(i) ) then -c passage a l'arete suivante - na0 = noarcf( 2, na0 ) - goto 110 - endif -c position dans noarcf du sommet i de l'arete perdue - nacf(i) = na0 - 120 continue -c -c formation des 2 cf chacun contenant l'arete ns1-ns2 -c --------------------------------------------------- -c sauvegarde de l'arete suivante de celle de sommet ns1 - na0 = noarcf( 2, nacf1 ) - nt1 = noarcf( 3, nacf1 ) -c -c le premier cf - n1arcf( 1 ) = nacf1 -c l'arete suivante dans le premier cf - noarcf( 2, nacf1 ) = nacf2 -c cette arete est celle perdue - noarcf( 3, nacf1 ) = narete -c -c le second cf -c l'arete doublee - n1 = nbarcf + 1 - n2 = nbarcf + 2 -c le premier sommet de la premiere arete du second cf - noarcf( 1, n1 ) = ns2 -c l'arete suivante dans le second cf - noarcf( 2, n1 ) = n2 -c cette arete est celle perdue - noarcf( 3, n1 ) = narete -c la seconde arete du second cf - noarcf( 1, n2 ) = ns1 - noarcf( 2, n2 ) = na0 - noarcf( 3, n2 ) = nt1 - n1arcf( 2 ) = n1 -c -c recherche du precedent de nacf2 - 130 na1 = noarcf( 2, na0 ) - if( na1 .ne. nacf2 ) then -c passage a l'arete suivante - na0 = na1 - goto 130 - endif -c na0 precede nacf2 => il precede n1 - noarcf( 2, na0 ) = n1 -c -c depart avec 2 cf - nbcf = 2 -c -c triangulation directe des 2 contours fermes -c l'arete ns1-ns2 devient une arete de la triangulation des 2 cf -c ============================================================== - call tridcf( nbcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, - % nbtrcf, notrcf, ierr ) - end - - - subroutine te4ste( nbsomm, mxsomm, pxyd, ntrp, letree, - & ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : decouper un te ntrp de letree en 4 sous-triangles -c ----- eliminer les sommets de te trop proches des points -c -c entrees: -c -------- -c mxsomm : nombre maximal de points declarables dans pxyd -c ntrp : numero letree du triangle a decouper en 4 sous-triangles -c -c modifies : -c ---------- -c nbsomm : nombre actuel de points dans pxyd -c pxyd : tableau des coordonnees des points -c par point : x y distance_souhaitee -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c ierr : 0 si pas d'erreur, 51 saturation letree, 52 saturation pxyd -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juillet 1994 -c2345x7..............................................................012 - common / unites / lecteu,imprim,nunite(30) - integer letree(0:8,0:*) - double precision pxyd(3,mxsomm) - integer np(0:3),milieu(3) -c -c debut par l'arete 2 du triangle ntrp - i1 = 2 - i2 = 3 - do 30 i=1,3 -c -c le milieu de l'arete i1 existe t il deja ? - call n1trva( ntrp, i1, letree, noteva, niveau ) - if( noteva .gt. 0 ) then -c il existe un te voisin -c s'il existe 4 sous-triangles le milieu existe deja - if( letree(0,noteva) .gt. 0 ) then -c le milieu existe - nsot = letree(0,noteva) - milieu(i) = letree( 5+nopre3(i1), nsot ) - goto 25 - endif - endif -c -c le milieu n'existe pas. il est cree - nbsomm = nbsomm + 1 - if( nbsomm .gt. mxsomm ) then -c plus assez de place dans pxyd - write(imprim,*) 'te4ste: saturation pxyd' - write(imprim,*) - ierr = 52 - return - endif -c le milieu de l'arete i - milieu(i) = nbsomm -c -c ntrp est le triangle de milieux d'arete ces 3 sommets - ns1 = letree( 5+i1, ntrp ) - ns2 = letree( 5+i2, ntrp ) - pxyd(1,nbsomm) = ( pxyd(1,ns1) + pxyd(1,ns2) ) * 0.5 - pxyd(2,nbsomm) = ( pxyd(2,ns1) + pxyd(2,ns2) ) * 0.5 -c -c l'arete et milieu suivant - 25 i1 = i2 - i2 = nosui3( i2 ) - 30 continue -c - do 50 i=0,3 -c -c le premier triangle vide - nsot = letree(0,0) - if( nsot .le. 0 ) then -c manque de place. saturation letree - ierr = 51 - write(imprim,*) 'te4ste: saturation letree' - write(imprim,*) - return - endif -c -c mise a jour du premier te libre - letree(0,0) = letree(0,nsot) -c -c nsot est le i-eme sous triangle - letree(0,nsot) = 0 - letree(1,nsot) = 0 - letree(2,nsot) = 0 - letree(3,nsot) = 0 -c -c le numero des points et sous triangles dans ntrp - np(i) = -letree(i,ntrp) - letree(i,ntrp) = nsot -c -c le sommet commun avec le triangle ntrp - letree(5+i,nsot) = letree(5+i,ntrp) -c -c le sur-triangle et numero de sous-triangle de nsot -c a laisser ici car incorrect sinon pour i=0 - letree(4,nsot) = ntrp - letree(5,nsot) = i -c -c le sous-triangle du triangle - letree(i,ntrp) = nsot - 50 continue -c -c le numero des nouveaux sommets milieux - nsot = letree(0,ntrp) - letree(6,nsot) = milieu(1) - letree(7,nsot) = milieu(2) - letree(8,nsot) = milieu(3) -c - nsot = letree(1,ntrp) - letree(7,nsot) = milieu(3) - letree(8,nsot) = milieu(2) -c - nsot = letree(2,ntrp) - letree(6,nsot) = milieu(3) - letree(8,nsot) = milieu(1) -c - nsot = letree(3,ntrp) - letree(6,nsot) = milieu(2) - letree(7,nsot) = milieu(1) -c -c repartition des eventuels 4 points np dans ces 4 sous-triangles -c il y a obligatoirement suffisamment de place - do 110 i=0,3 - if( np(i) .gt. 0 ) then - nsot = notrpt( pxyd(1,np(i)), pxyd, ntrp, letree ) -c ajout du point - do 100 i1=0,3 - if( letree(i1,nsot) .eq. 0 ) then -c place libre a occuper - letree(i1,nsot) = -np(i) - goto 110 - endif - 100 continue - endif - 110 continue - end diff --git a/src/Makefile.in b/src/Makefile.in deleted file mode 100644 index c4bbfd85f..000000000 --- a/src/Makefile.in +++ /dev/null @@ -1,39 +0,0 @@ -# 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 : Patrick GOLDBRONN (CEA) -# Module : SMESH -# $Header$ - -top_srcdir=@top_srcdir@ -top_builddir=.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - -@COMMENCE@ - -SUBDIRS = \ - SMDS SMESHDS Controls Driver DriverMED DriverDAT DriverUNV DriverSTL \ - SMESH SMESH_I OBJECT SMESHFiltersSelection SMESHGUI SMESH_SWIG \ - MEFISTO2 StdMeshers StdMeshers_I StdMeshersGUI - -@MODULE@ diff --git a/src/NETGEN/Makefile.in b/src/NETGEN/Makefile.in deleted file mode 100644 index fc2e0476a..000000000 --- a/src/NETGEN/Makefile.in +++ /dev/null @@ -1,152 +0,0 @@ -# -* Makefile *- -# -# Author : Nadir Bouhamou (CEA) -# Module : SMESH -# Date : 10/10/2003 -# -# - -# source path -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - -@COMMENCE@ - -# Libraries targets -LIB = libNETGEN.la - -# additionnal information to compil and link file -CPPFLAGS += -DSOLIDGEOM -DLINUX $(OCC_INCLUDES) -CXXFLAGS += -DSOLIDGEOM -DLINUX $(OCC_CXXFLAGS) - -LDFLAGS += $(OCC_KERNEL_LIBS) $(OCC_MODELER_LIBS) -lg2c - -NETGEN_LIBS_DIR=@NETGEN_LIBS_DIR@ - -LIB_OBJ_O = linopt.o \ - bfgs.o \ - linsearch.o \ - global.o \ - bisect.o \ - meshtool.o \ - refine.o \ - ruler3.o \ - improve3.o \ - adfront3.o \ - tetrarls.o \ - prism2rls.o \ - pyramidrls.o \ - pyramid2rls.o \ - netrule3.o \ - ruler2.o \ - meshclass.o \ - improve2.o \ - adfront2.o \ - netrule2.o \ - triarls.o \ - geomsearch.o \ - secondorder.o \ - meshtype.o \ - parser3.o \ - quadrls.o \ - specials.o \ - parser2.o \ - meshing2.o \ - meshing3.o \ - meshfunc.o \ - localh.o \ - improve2gen.o \ - delaunay.o \ - boundarylayer.o \ - msghandler.o \ - meshfunc2d.o \ - smoothing2.o \ - smoothing3.o \ - topology.o \ - curvedelems.o \ - clusters.o \ - zrefine.o \ - ngexception.o \ - geomtest3d.o \ - geom2d.o \ - geom3d.o \ - adtree.o \ - transform3d.o \ - geomfuncs.o \ - polynomial.o \ - densemat.o \ - vector.o \ - basemat.o \ - sparsmat.o \ - algprim.o \ - brick.o \ - manifold.o \ - bspline2d.o \ - meshsurf.o \ - csgeom.o \ - polyhedra.o \ - curve2d.o \ - singularref.o \ - edgeflw.o \ - solid.o \ - explicitcurve2d.o \ - specpoin.o \ - gencyl.o \ - revolution.o \ - genmesh.o \ - spline3d.o \ - surface.o \ - identify.o \ - triapprox.o \ - meshstlsurface.o \ - stlline.o \ - stltopology.o \ - stltool.o \ - stlgeom.o \ - stlgeomchart.o \ - stlgeommesh.o \ - table.o \ - optmem.o \ - spbita2d.o \ - hashtabl.o \ - sort.o \ - flags.o \ - seti.o \ - bitarray.o \ - array.o \ - symbolta.o \ - mystring.o \ - moveablemem.o \ - spline2d.o \ - splinegeometry2.o \ - ngnewdelete.o \ - nglib.o - -$(LIB_OBJ_O): - ar x $(NETGEN_LIBS_DIR)/libnginterface.a - ar x $(NETGEN_LIBS_DIR)/libcsg.a - ar x $(NETGEN_LIBS_DIR)/libgprim.a - ar x $(NETGEN_LIBS_DIR)/libmesh.a - ar x $(NETGEN_LIBS_DIR)/libopti.a - ar x $(NETGEN_LIBS_DIR)/libgen.a - ar x $(NETGEN_LIBS_DIR)/libla.a - ar x $(NETGEN_LIBS_DIR)/libstlgeom.a - ar x $(NETGEN_LIBS_DIR)/libgeom2d.a - rm -rf sgparser.o hprefinement.o parthreads.o writediffpack.o writepermas.o writeuser.o dynamicmem.o importsolution.o readuser.o writefeap.o writetecplot.o wuchemnitz.o extrusion.o writeabaqus.o writefluent.o writetochnog.o csgparser.o geom2dmesh.o - -LIB_OBJ_LO = $(LIB_OBJ_O:%.o=%.lo) - -#implicits rules - -.o.lo: - ln -s $< $@ || true - -@CONCLUDE@ - -$(LIB): $(LIB_OBJ_O) $(LIB_OBJ_LO) - @$(LT) --mode=link $(CXX) -rpath $(libdir) -o $@ $(CXXFLAGS) $(LIB_OBJ_LO) $(LDFLAGS) $(LIBS) - -mostlyclean: cleandep - -$(RM) $(LIB_OBJ_O) $(LIB_OBJ_LO) diff --git a/src/NETGEN/ReadMeForNgUsers b/src/NETGEN/ReadMeForNgUsers deleted file mode 100644 index 555eb9716..000000000 --- a/src/NETGEN/ReadMeForNgUsers +++ /dev/null @@ -1,102 +0,0 @@ -The Netgen 4.3 from the web location : http://www.hpfem.jku.at/netgen/ is used -in the SMESH Module of Salome2 distribution. - -How to build Netgen for Salome ------------------------------- - -Patch the official netgen 4.3 distribution: - -$ cd netgen43 -$ patch -p1 < patch_directory/netgen43ForSalome.patch - -Then run makeForSalome.sh: -$ sh makeForSalome.sh - - -Additional information for maintainers --------------------------------------- - -The SMESH Engine of SALOME2 (particularly the m4 file check_Netgen.m4) assume -that Netgen is installed in the directory as follow: - -prompt> ls - -bin/ cshrc_for_netgen doc/ include/ lib/ tutorials/ - -prompt> ls /bin - -LINUX/ - -prompt> ls /bin/LINUX/ - -demoapp/ ng ng.tcl ngtcltk/ startup.tcl - -prompt> ls /bin/LINUX/demoapp/ - -demoapp.tcl - -prompt> ls /bin/LINUX/ngtcltk/ - -dialog.tcl menustat.tcl ngicon.tcl parameters.tcl -drawing.tcl nghelp.tcl ngvisual.tcl variables.tcl - -prompt> ls /doc/ - -ng4.pdf usenetgen.ps - -prompt> ls /include/ - -nglib.h - -prompt> ls /lib/ - -LINUX/ - -prompt> ls /lib/LINUX/ - -libcsg.a libgeom2d.a libla.a libnginterface.a libstlgeom.a -libgen.a libgprim.a libmesh.a libopti.a libvis.a - -prompt> ls /tutorials/ - -boxcyl.geo cylinder.geo ficherea.geo part1.stl square.in2d -cone.geo cylsphere.geo hinge.stl sculpture.geo trafo.geo -cubeandspheres.geo demo2d.in2d lshape3d.geo shaft.geo twobricks.geo -cube.geo ellipsoid.geo manyholes.geo sphere.geo twocubes.geo -cubemcyl.geo ellipticcyl.geo matrix.geo sphereincube.geo twocyl.geo -cubemsphere.geo - -All *.tcl files are needed to control and initiate the Netgen mesher throughout its -MHI (Machine Human Interface)./bin/LINUX/ng is the Netgen -executable with its embarked MHI. All the libraries *.a should be compiled without -the option -DOPENGL which is only needed for the Netgen MHI. netgen43 is assumed to -be the directory downloaded from the above web location archive of Netgen. The library -/lib/LINUX/libnginterface.a should contain the objects -nglib.o (from netgen43/libsrc/interface/nglib.cpp) and ngnewdelete.o -(from netgen43/ngtcltk/ngnewdelete.cpp). - -To have that kind of distribution from the version in the above web location you -should first compile Netgen as suggested in the netgen43/README.INSTALL file. It will -then produce the executable ng linked statically with the libraries *.a. Then modify -the Makefiles to remove -DOPENGL from compiler flags list, add the objects nglib.o -and ngnewdelete.o to the library libnginterface.a and recompile the libraries only. - -From the above web location perhaps, you will have to alter some Netgen sources to -compile them; if you find any difficulties to do that, just ask me. - -Nadir - -******************************** -* Dr Nadir Bouhamou * -* Ingénieur-chercheur * -* Engineer-Researcher * -* * -* CEA Saclay * -* DEN/DM2S/SFME/LGLS * -* Bat 454 Pièce 5A * -* 91191 Gif-Sur-Yvette cédex * -* * -* Tél: +33 (0)1 69 08 73 07 * -* Fax: +33 (0)1 69 08 96 96 * -* email: nadir.bouhamou@cea.fr * -******************************** diff --git a/src/NETGEN/netgen43ForSalome.patch b/src/NETGEN/netgen43ForSalome.patch deleted file mode 100644 index 5e08d8804..000000000 --- a/src/NETGEN/netgen43ForSalome.patch +++ /dev/null @@ -1,221 +0,0 @@ -diff -N -r -u netgen43/libsrc/include/spline2d.hpp /tmp/netgen43/libsrc/include/spline2d.hpp ---- netgen43/libsrc/include/spline2d.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ /tmp/netgen43/libsrc/include/spline2d.hpp 2003-12-10 16:28:12.000000000 +0100 -@@ -0,0 +1 @@ -+#include "../geom2d/spline2d.hpp" -diff -N -r -u netgen43/libsrc/include/splinegeometry2.hpp /tmp/netgen43/libsrc/include/splinegeometry2.hpp ---- netgen43/libsrc/include/splinegeometry2.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ /tmp/netgen43/libsrc/include/splinegeometry2.hpp 2003-12-10 16:28:23.000000000 +0100 -@@ -0,0 +1 @@ -+#include "../geom2d/splinegeometry2.hpp" -diff -N -r -u netgen43/libsrc/interface/Makefile /tmp/netgen43/libsrc/interface/Makefile ---- netgen43/libsrc/interface/Makefile 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/interface/Makefile 2003-12-10 15:59:47.000000000 +0100 -@@ -1,4 +1,4 @@ --src = nginterface.cpp writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp readuser.cpp importsolution.cpp -+src = writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp readuser.cpp importsolution.cpp nglib.cpp ngnewdelete.cpp - # - lib = nginterface - libpath = libsrc/interface -diff -N -r -u netgen43/libsrc/interface/nglib.cpp /tmp/netgen43/libsrc/interface/nglib.cpp ---- netgen43/libsrc/interface/nglib.cpp 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/interface/nglib.cpp 2003-12-10 16:32:54.000000000 +0100 -@@ -23,6 +23,20 @@ - - #include "nglib.h" - -+namespace netgen -+{ -+ char geomfilename [100]; -+ -+ //Destination for messages, errors, ... -+ void Ng_PrintDest(const char * s) -+ { -+ (*mycout) << s << flush; -+ } -+ -+#include -+#include -+} -+ - using namespace netgen; - - // constants and types: -@@ -171,8 +185,6 @@ - // CSG Geometry - - // FlexLexer * lexer; --char geomfilename [100]; -- - - // 2D Meshing Functions: - -@@ -362,7 +374,18 @@ - cout << "e(" << readedges.Get(i) << "," << readedges.Get(i+1) << ")" << endl; - } - */ -- geo->AddEdges(readedges); -+ -+ ARRAY< Point<3> > readedges1; -+ -+ for (i = 1; i <= readedges.Size(); i++) -+ { -+ Point3d readedgesData = readedges.Get(i); -+ Point <3> readedges1Data = Point<3>(readedgesData.X(),readedgesData.Y(),readedgesData.Z()); -+ -+ readedges1.Append(readedges1Data); -+ } -+ -+ geo->AddEdges(readedges1); - } - - if (geo->GetStatus() == STLTopology::STL_GOOD || geo->GetStatus() == STLTopology::STL_WARNING) return NG_OK; -@@ -472,7 +495,14 @@ - n = Vec3d(nv[0],nv[1],nv[2]); - } - -- readtrias.Append(STLReadTriangle(apts,n)); -+ Point<3> apts1[3]; -+ apts1[0] = Point<3>(p1[0],p1[1],p1[2]); -+ apts1[1] = Point<3>(p2[0],p2[1],p2[2]); -+ apts1[2] = Point<3>(p3[0],p3[1],p3[2]); -+ -+ Vec<3> n1 = Vec<3>(n.X(),n.Y(),n.Z()); -+ -+ readtrias.Append(STLReadTriangle(apts1,n1)); - } - - // add (optional) edges: -@@ -487,30 +517,29 @@ - - // compatibility functions: - --void MyError (const char * ch) -+void netgen::MyError (const char * ch) - { - cerr << ch; - } - --//Destination for messages, errors, ... --void Ng_PrintDest(const char * s) --{ -- (*mycout) << s << flush; --} -- -- --double GetTime () -+double netgen::GetTime () - { - return 0; - } - --void ResetTime () -+void netgen::ResetTime () - { - ; - } - --void MyBeep (int i) -+void netgen::MyBeep (int i) - { - ; - } - -+void MeshFromSpline2D (SplineGeometry2d & geometry, -+ Mesh *& mesh, -+ MeshingParameters & mp) -+{ -+ MeshFromSpline2D (geometry, mesh, mp); -+} -diff -N -r -u netgen43/libsrc/makefile.mach.LINUX /tmp/netgen43/libsrc/makefile.mach.LINUX ---- netgen43/libsrc/makefile.mach.LINUX 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/makefile.mach.LINUX 2003-12-10 15:12:18.000000000 +0100 -@@ -14,7 +14,8 @@ - # - CFLAGS2 = - # pg stands for profiling - also in linkflags2 --CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX -DOPENGL -+#CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX -DOPENGL -+CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX - # -fomit-frame-pointer - # -ffast-math - # -diff -N -r -u netgen43/libsrc/meshing/improve2.cpp /tmp/netgen43/libsrc/meshing/improve2.cpp ---- netgen43/libsrc/meshing/improve2.cpp 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/meshing/improve2.cpp 2003-12-10 15:42:00.000000000 +0100 -@@ -3,7 +3,7 @@ - #include "meshing.hpp" - #include - --#include -+/*#include */ - - - namespace netgen -diff -N -r -u netgen43/libsrc/meshing/meshing2.cpp /tmp/netgen43/libsrc/meshing/meshing2.cpp ---- netgen43/libsrc/meshing/meshing2.cpp 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/meshing/meshing2.cpp 2003-12-10 15:34:35.000000000 +0100 -@@ -1785,7 +1785,7 @@ - - - #else --void glrender (int wait) -+void netgen::glrender (int wait) - { - ; - } -diff -N -r -u netgen43/libsrc/visualization/stlmeshing.cpp /tmp/netgen43/libsrc/visualization/stlmeshing.cpp ---- netgen43/libsrc/visualization/stlmeshing.cpp 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/visualization/stlmeshing.cpp 2003-12-10 15:52:53.000000000 +0100 -@@ -5,7 +5,7 @@ - #include - - #include --#include -+/*#include */ - - namespace netgen - { -diff -N -r -u netgen43/Makefile /tmp/netgen43/Makefile ---- netgen43/Makefile 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/Makefile 2003-12-10 15:11:41.000000000 +0100 -@@ -35,7 +35,8 @@ - .SUFFIXES: .cpp .o - # - # --CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include -DOPENGL -+#CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include -DOPENGL -+CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include - LINKFLAGS1 = -lGL -lGLU -lX11 -lXext -lXmu - # - CPLUSPLUSFLAGS = $(CPLUSPLUSFLAGS1) $(CPLUSPLUSFLAGS2) $(CPLUSPLUSFLAGS3) -diff -N -r -u netgen43/makeForSalome.sh /tmp/netgen43/makeForSalome.sh ---- netgen43/makeForSalome.sh 1970-01-01 01:00:00.000000000 +0100 -+++ /tmp/netgen43/makeForSalome.sh 2004-01-05 12:33:59.000000000 +0100 -@@ -0,0 +1,26 @@ -+#! /bin/sh -+cp ngtcltk/ngnewdelete.* libsrc/interface/ -+ -+MACHINE=LINUX -+export MACHINE -+make -C libsrc/csg -+make -C libsrc/general -+make -C libsrc/geom2d -+make -C libsrc/gprim -+make -C libsrc/interface -+make -C libsrc/linalg -+make -C libsrc/meshing -+make -C libsrc/opti -+make -C libsrc/stlgeom -+ -+if [ ! -d install ] ; then -+ mkdir install -+fi -+ -+cp -r lib install/ -+ -+if [ ! -d install/include ] ; then -+ mkdir install/include -+fi -+ -+cp libsrc/interface/nglib.h install/include diff --git a/src/NETGENPlugin/Makefile.in b/src/NETGENPlugin/Makefile.in deleted file mode 100644 index 577190928..000000000 --- a/src/NETGENPlugin/Makefile.in +++ /dev/null @@ -1,67 +0,0 @@ -# SMESH NETGENPlugin : implementaion of SMESH idl descriptions -# -# 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 : Makefile.in -# Author : Julia DOROVSKIKH -# Module : SMESH -# $Header$ - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl: - - -@COMMENCE@ - -EXPORT_PYSCRIPTS = - -# .po files to transform in .qm -PO_FILES = NETGENPlugin_icons.po - -# Libraries targets -LIB = libNETGENEngine.la -LIB_SRC = \ - NETGENPlugin_NETGEN_3D.cxx \ - NETGENPlugin_NETGEN_3D_i.cxx \ - NETGENPlugin_i.cxx - -LIB_SERVER_IDL = SMESH_NetgenAlgorithm.idl - -LIB_CLIENT_IDL = SMESH_Gen.idl SMESH_Mesh.idl SMESH_Group.idl - -# Executables targets -BIN = -BIN_SRC = - -# additionnal information to compil and link file -NETGEN_INCLUDES=@NETGEN_INCLUDES@ - -CPPFLAGS+= $(OCC_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \ - -I${GEOM_ROOT_DIR}/include/salome $(NETGEN_INCLUDES) $(BOOST_CPPFLAGS) -CXXFLAGS+= $(OCC_CXXFLAGS) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \ - -I${GEOM_ROOT_DIR}/include/salome $(NETGEN_INCLUDES) - -LDFLAGS+= $(HDF5_LIBS) -lSMESHimpl -lSMESHEngine -lStdMeshers -lStdMeshersEngine -lNETGEN -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome -lSalomeGenericObj - -@CONCLUDE@ diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx deleted file mode 100644 index 489d6822e..000000000 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : NETGENPlugin_NETGEN_3D_i.cxx -// Moved here from SMESH_NETGEN_3D_i.cxx -// Author : Nadir Bouhamou CEA -// Module : SMESH -// $Header$ - -using namespace std; -#include "NETGENPlugin_NETGEN_3D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i - * - * Constructor - */ -//============================================================================= - -NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_3D_Algo_i( thePOA ) -{ - MESSAGE( "NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i" ); - myBaseImpl = new ::NETGENPlugin_NETGEN_3D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i - * - * Destructor - */ -//============================================================================= - -NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i() -{ - MESSAGE( "NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i" ); -} - -//============================================================================= -/*! - * NETGENPlugin_NETGEN_3D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::NETGENPlugin_NETGEN_3D* NETGENPlugin_NETGEN_3D_i::GetImpl() -{ - MESSAGE( "NETGENPlugin_NETGEN_3D_i::GetImpl" ); - return ( ::NETGENPlugin_NETGEN_3D* )myBaseImpl; -} - diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx deleted file mode 100644 index 724fafa55..000000000 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx +++ /dev/null @@ -1,58 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : NETGENPlugin_NETGEN_3D_i.hxx -// Moved here from SMESH_NETGEN_3D_i.hxx -// Author : Nadir Bouhamou CEA -// Module : SMESH -// $Header$ - -#ifndef _NETGENPlugin_NETGEN_3D_I_HXX_ -#define _NETGENPlugin_NETGEN_3D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_NetgenAlgorithm) - -#include "SMESH_3D_Algo_i.hxx" -#include "NETGENPlugin_NETGEN_3D.hxx" - -// ====================================================== -// NETGEN 3d algorithm -// ====================================================== -class NETGENPlugin_NETGEN_3D_i: - public virtual POA_NETGENPlugin::NETGENPlugin_NETGEN_3D, - public virtual SMESH_3D_Algo_i -{ -public: - // Constructor - NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~NETGENPlugin_NETGEN_3D_i(); - - // Get implementation - ::NETGENPlugin_NETGEN_3D* GetImpl(); -}; - -#endif diff --git a/src/NETGENPlugin/NETGENPlugin_i.cxx b/src/NETGENPlugin/NETGENPlugin_i.cxx deleted file mode 100644 index 7ec0e06f5..000000000 --- a/src/NETGENPlugin/NETGENPlugin_i.cxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH NETGENPlugin : implementaion of SMESH idl descriptions -// -// 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 : NETGENPlugin.cxx -// Author : Julia DOROVSKIKH -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_Hypothesis_i.hxx" -#include "SMESH_Gen_i.hxx" - -#include "utilities.h" - -#include "NETGENPlugin_NETGEN_3D_i.hxx" - -//============================================================================= -/*! - * - */ -//============================================================================= - -extern "C" -{ - GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypName) - { - MESSAGE("GetHypothesisCreator " << aHypName); - - GenericHypothesisCreator_i* aCreator = 0; - - // Hypotheses - - // Algorithms - if (strcmp(aHypName, "NETGEN_3D") == 0) - aCreator = new HypothesisCreator_i; - else ; - - return aCreator; - } -} diff --git a/src/NETGENPlugin/NETGENPlugin_icons.po b/src/NETGENPlugin/NETGENPlugin_icons.po deleted file mode 100644 index a3f6297d7..000000000 --- a/src/NETGENPlugin/NETGENPlugin_icons.po +++ /dev/null @@ -1,20 +0,0 @@ -# This is a Qt message file in .po format. Each msgid starts with -# a scope. This scope should *NOT* be translated - eg. "Foo::Bar" -# would be translated to "Pub", not "Foo::Pub". -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n" -"PO-Revision-Date: YYYY-MM-DD\n" -"Last-Translator: FULLNAME \n" -"Content-Type: text/plain; charset=iso-8859-1\n" - - -#----------------------------------------------------------- -# ObjectBrowser -#----------------------------------------------------------- - -#mesh_tree_algo_netgen -msgid "ICON_SMESH_TREE_ALGO_NETGEN_3D" -msgstr "mesh_tree_algo_tetra.png" -#msgstr "mesh_tree_algo_netgen.png" diff --git a/src/OBJECT/Makefile.in b/src/OBJECT/Makefile.in deleted file mode 100644 index 8cf070ccf..000000000 --- a/src/OBJECT/Makefile.in +++ /dev/null @@ -1,58 +0,0 @@ -# SMESH OBJECT : interactive object for SMESH visualization -# -# 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 -# Module : SMESH - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl - -@COMMENCE@ - -EXPORT_HEADERS = SMESH_Actor.h SMESH_Object.h SMESH_ObjectDef.h SMESH_ActorUtils.h - - -# Libraries targets - -LIB = libSMESHObject.la -LIB_SRC = SMESH_Object.cxx SMESH_DeviceActor.cxx SMESH_Actor.cxx \ - SMESH_ExtractGeometry.cxx SMESH_ActorUtils.cxx - -LIB_CLIENT_IDL = SALOME_Exception.idl \ - SALOME_GenericObj.idl \ - SMESH_Mesh.idl \ - SMESH_Group.idl - - -# Executables targets -BIN = -BIN_SRC = - -CPPFLAGS+=$(OCC_INCLUDES) $(VTK_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GUI_ROOT_DIR}/include/salome \ - $(BOOST_CPPFLAGS) $(QT_INCLUDES) -LDFLAGS+=$(OCC_KERNEL_LIBS) $(VTK_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome -L${GUI_ROOT_DIR}/lib/salome -lSMDS \ - -lSalomeApp -lSalomeObject -lSMESHControls - -@CONCLUDE@ diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx deleted file mode 100644 index 3c5e2e0d0..000000000 --- a/src/OBJECT/SMESH_Actor.cxx +++ /dev/null @@ -1,1627 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// 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 : SMESH_Actor.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - - -#include "SMESH_ActorDef.h" -#include "SMESH_ActorUtils.h" -#include "SMESH_DeviceActor.h" -#include "SMESH_ControlsDef.hxx" -#include - -#include "SUIT_Session.h" -#include "SUIT_ResourceMgr.h" - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include "utilities.h" - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - -static int aLineWidthInc = 2; -static int aPointSizeInc = 2; - - -SMESH_ActorDef* SMESH_ActorDef::New(){ - return new SMESH_ActorDef(); -} - - -SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear) -{ - SMESH_ActorDef* anActor = SMESH_ActorDef::New(); - if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){ - anActor->Delete(); - anActor = NULL; - } - if( anActor ) - anActor->UpdateScalarBar(); - return anActor; -} - - -SMESH_ActorDef::SMESH_ActorDef() -{ - if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<resourceMgr(); - if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) - myControlsPrecision = (long)SMESH::GetFloat( "SMESH", "controls_precision", -1 ); - - float aPointSize = SMESH::GetFloat("SMESH:node_size",3); - float aLineWidth = SMESH::GetFloat("SMESH:element_width",1); - - vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New(); - VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; - - //Definition 2D and 3D divices of the actor - //----------------------------------------- - float anRGB[3] = {1,1,1}; - mySurfaceProp = vtkProperty::New(); - SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); - mySurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] ); - - myBackSurfaceProp = vtkProperty::New(); - SMESH::GetColor( "SMESH", "backface_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 0, 255 ) ); - myBackSurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] ); - - my2DActor = SMESH_DeviceActor::New(); - my2DActor->SetUserMatrix(aMatrix); - my2DActor->PickableOff(); - my2DActor->SetProperty(mySurfaceProp); - my2DActor->SetBackfaceProperty(myBackSurfaceProp); - my2DActor->SetRepresentation(SMESH_DeviceActor::eSurface); - aFilter = my2DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aFilter->RegisterCellsWithType(VTK_TRIANGLE); - aFilter->RegisterCellsWithType(VTK_POLYGON); - aFilter->RegisterCellsWithType(VTK_QUAD); - - my3DActor = SMESH_DeviceActor::New(); - my3DActor->SetUserMatrix(aMatrix); - my3DActor->PickableOff(); - my3DActor->SetProperty(mySurfaceProp); - my3DActor->SetBackfaceProperty(myBackSurfaceProp); - my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface); - aFilter = my3DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aFilter->RegisterCellsWithType(VTK_TETRA); - aFilter->RegisterCellsWithType(VTK_VOXEL); - aFilter->RegisterCellsWithType(VTK_HEXAHEDRON); - aFilter->RegisterCellsWithType(VTK_WEDGE); - aFilter->RegisterCellsWithType(VTK_PYRAMID); - aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); - - //Definition 1D divice of the actor - //--------------------------------- - myEdgeProp = vtkProperty::New(); - myEdgeProp->SetAmbient(1.0); - myEdgeProp->SetDiffuse(0.0); - myEdgeProp->SetSpecular(0.0); - SMESH::GetColor( "SMESH", "outline_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); - myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myEdgeProp->SetLineWidth(aLineWidth); - - my1DActor = SMESH_DeviceActor::New(); - my1DActor->SetUserMatrix(aMatrix); - my1DActor->PickableOff(); - my1DActor->SetHighlited(true); - my1DActor->SetProperty(myEdgeProp); - my1DActor->SetRepresentation(SMESH_DeviceActor::eSurface); - aFilter = my1DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aFilter->RegisterCellsWithType(VTK_LINE); - - my1DProp = vtkProperty::New(); - my1DProp->DeepCopy(myEdgeProp); - my1DProp->SetLineWidth(aLineWidth + aLineWidthInc); - my1DProp->SetPointSize(aPointSize); - - my1DExtProp = vtkProperty::New(); - my1DExtProp->DeepCopy(myEdgeProp); - anRGB[0] = 1 - anRGB[0]; - anRGB[1] = 1 - anRGB[1]; - anRGB[2] = 1 - anRGB[2]; - my1DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - my1DExtProp->SetLineWidth(aLineWidth + aLineWidthInc); - my1DExtProp->SetPointSize(aPointSize + aPointSizeInc); - - my1DExtActor = SMESH_DeviceActor::New(); - my1DExtActor->SetUserMatrix(aMatrix); - my1DExtActor->PickableOff(); - my1DExtActor->SetHighlited(true); - my1DExtActor->SetVisibility(false); - my1DExtActor->SetProperty(my1DExtProp); - my1DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe); - aFilter = my1DExtActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aFilter->RegisterCellsWithType(VTK_LINE); - - - //Definition 0D divice of the actor - //--------------------------------- - myNodeProp = vtkProperty::New(); - SMESH::GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 0 ) ); - myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myNodeProp->SetPointSize(aPointSize); - - myNodeActor = SMESH_DeviceActor::New(); - myNodeActor->SetUserMatrix(aMatrix); - myNodeActor->SetStoreClippingMapping(true); - myNodeActor->PickableOff(); - myNodeActor->SetVisibility(false); - myNodeActor->SetProperty(myNodeProp); - myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint); - aFilter = myNodeActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); - - - //Definition of Pickable and Highlitable engines - //---------------------------------------------- - - myBaseActor = SMESH_DeviceActor::New(); - myBaseActor->SetUserMatrix(aMatrix); - myBaseActor->SetStoreGemetryMapping(true); - myBaseActor->GetProperty()->SetOpacity(0.0); - - myPickableActor = myBaseActor; - - myHighlightProp = vtkProperty::New(); - myHighlightProp->SetAmbient(1.0); - myHighlightProp->SetDiffuse(0.0); - myHighlightProp->SetSpecular(0.0); - SMESH::GetColor( "SMESH", "selection_object_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) ); - myHighlightProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myHighlightProp->SetPointSize(aPointSize); - myHighlightProp->SetRepresentation(1); - - myPreselectProp = vtkProperty::New(); - myPreselectProp->SetAmbient(1.0); - myPreselectProp->SetDiffuse(0.0); - myPreselectProp->SetSpecular(0.0); - SMESH::GetColor( "SMESH", "highlight_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 255 ) ); - myPreselectProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myPreselectProp->SetPointSize(aPointSize); - myPreselectProp->SetRepresentation(1); - - myHighlitableActor = SMESH_DeviceActor::New(); - myHighlitableActor->SetUserMatrix(aMatrix); - myHighlitableActor->PickableOff(); - myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); - - SetShrinkFactor( SMESH::GetFloat( "SMESH:shrink_coeff", 0.75 ) ); - - myName = ""; - myIO = NULL; - - myControlMode = eNone; - myControlActor = my2DActor; - - //Definition of myScalarBarActor - //------------------------------ - myLookupTable = vtkLookupTable::New(); - //Fix for Bug PAL5195 - SMESH764: - //Controls - Aspect Ratio: incorrect colors of the best and worst values - myLookupTable->SetHueRange(0.667,0.0); - - myScalarBarActor = vtkScalarBarActor::New(); - myScalarBarActor->SetVisibility(false); - myScalarBarActor->SetLookupTable(myLookupTable); - - mgr = SUIT_Session::session()->resourceMgr(); - if( !mgr ) - return; - - //Definition of points numbering pipeline - //--------------------------------------- - myPointsNumDataSet = vtkUnstructuredGrid::New(); - - myPtsMaskPoints = vtkMaskPoints::New(); - myPtsMaskPoints->SetInput(myPointsNumDataSet); - myPtsMaskPoints->SetOnRatio(1); - - myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New(); - myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput()); - myPtsSelectVisiblePoints->SelectInvisibleOff(); - myPtsSelectVisiblePoints->SetTolerance(0.1); - - myPtsLabeledDataMapper = vtkLabeledDataMapper::New(); - myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput()); - myPtsLabeledDataMapper->SetLabelFormat("%g"); - myPtsLabeledDataMapper->SetLabelModeToLabelScalars(); - - vtkTextProperty* aPtsTextProp = vtkTextProperty::New(); - aPtsTextProp->SetFontFamilyToTimes(); - static int aPointsFontSize = 10; - aPtsTextProp->SetFontSize(aPointsFontSize); - aPtsTextProp->SetBold(1); - aPtsTextProp->SetItalic(0); - aPtsTextProp->SetShadow(0); - myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp); - aPtsTextProp->Delete(); - - myEntityMode = eAllEntity; - - myIsPointsLabeled = false; - - myPointLabels = vtkActor2D::New(); - myPointLabels->SetMapper(myPtsLabeledDataMapper); - myPointLabels->GetProperty()->SetColor(1,1,1); - myPointLabels->SetVisibility(myIsPointsLabeled); - - - //Definition of cells numbering pipeline - //--------------------------------------- - myCellsNumDataSet = vtkUnstructuredGrid::New(); - - myCellCenters = vtkCellCenters::New(); - myCellCenters->SetInput(myCellsNumDataSet); - - myClsMaskPoints = vtkMaskPoints::New(); - myClsMaskPoints->SetInput(myCellCenters->GetOutput()); - myClsMaskPoints->SetOnRatio(1); - - myClsSelectVisiblePoints = vtkSelectVisiblePoints::New(); - myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput()); - myClsSelectVisiblePoints->SelectInvisibleOff(); - myClsSelectVisiblePoints->SetTolerance(0.1); - - myClsLabeledDataMapper = vtkLabeledDataMapper::New(); - myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput()); - myClsLabeledDataMapper->SetLabelFormat("%g"); - myClsLabeledDataMapper->SetLabelModeToLabelScalars(); - - vtkTextProperty* aClsTextProp = vtkTextProperty::New(); - aClsTextProp->SetFontFamilyToTimes(); - static int aCellsFontSize = 12; - aClsTextProp->SetFontSize(aCellsFontSize); - aClsTextProp->SetBold(1); - aClsTextProp->SetItalic(0); - aClsTextProp->SetShadow(0); - myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp); - aClsTextProp->Delete(); - - myIsCellsLabeled = false; - - myCellsLabels = vtkActor2D::New(); - myCellsLabels->SetMapper(myClsLabeledDataMapper); - myCellsLabels->GetProperty()->SetColor(0,1,0); - myCellsLabels->SetVisibility(myIsCellsLabeled); - - // Clipping planes - myImplicitBoolean = vtkImplicitBoolean::New(); - myImplicitBoolean->SetOperationTypeToIntersection(); -} - - -SMESH_ActorDef::~SMESH_ActorDef() -{ - if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<Delete(); - myLookupTable->Delete(); - - mySurfaceProp->Delete(); - myBackSurfaceProp->Delete(); - - myEdgeProp->Delete(); - myHighlightProp->Delete(); - myPreselectProp->Delete(); - - myNodeProp->Delete(); - - my1DProp->Delete(); - my1DActor->Delete(); - - my1DExtProp->Delete(); - my1DExtActor->Delete(); - - my2DActor->Delete(); - my3DActor->Delete(); - - myNodeActor->Delete(); - myBaseActor->Delete(); - - myHighlitableActor->Delete(); - - //Deleting of pints numbering pipeline - //--------------------------------------- - myPointsNumDataSet->Delete(); - - myPtsLabeledDataMapper->RemoveAllInputs(); - myPtsLabeledDataMapper->Delete(); - - myPtsSelectVisiblePoints->UnRegisterAllOutputs(); - myPtsSelectVisiblePoints->Delete(); - - myPtsMaskPoints->UnRegisterAllOutputs(); - myPtsMaskPoints->Delete(); - - myPointLabels->Delete(); - - - //Deleting of cells numbering pipeline - //--------------------------------------- - myCellsNumDataSet->Delete(); - - myClsLabeledDataMapper->RemoveAllInputs(); - myClsLabeledDataMapper->Delete(); - - myClsSelectVisiblePoints->UnRegisterAllOutputs(); - myClsSelectVisiblePoints->Delete(); - - myClsMaskPoints->UnRegisterAllOutputs(); - myClsMaskPoints->Delete(); - - myCellCenters->UnRegisterAllOutputs(); - myCellCenters->Delete(); - - myCellsLabels->Delete(); - - myImplicitBoolean->Delete(); - - myTimeStamp->Delete(); -} - - -void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) -{ - vtkUnstructuredGrid* aGrid = GetUnstructuredGrid(); - myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints(); - - if ( myIsPointsLabeled ) - { - myPointsNumDataSet->ShallowCopy(aGrid); - vtkDataSet *aDataSet = myPointsNumDataSet; - - int aNbElem = aDataSet->GetNumberOfPoints(); - - vtkIntArray *anArray = vtkIntArray::New(); - anArray->SetNumberOfValues( aNbElem ); - - for ( int anId = 0; anId < aNbElem; anId++ ) - { - int aSMDSId = myVisualObj->GetNodeObjId( anId ); - anArray->SetValue( anId, aSMDSId ); - } - - aDataSet->GetPointData()->SetScalars( anArray ); - anArray->Delete(); - myPtsMaskPoints->SetInput( aDataSet ); - myPointLabels->SetVisibility( GetVisibility() ); - } - else - { - myPointLabels->SetVisibility( false ); - } - SetRepresentation(GetRepresentation()); - myTimeStamp->Modified(); -} - - -void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled) -{ - vtkUnstructuredGrid* aGrid = GetUnstructuredGrid(); - myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints(); - if(myIsCellsLabeled){ - myCellsNumDataSet->ShallowCopy(aGrid); - vtkDataSet *aDataSet = myCellsNumDataSet; - int aNbElem = aDataSet->GetNumberOfCells(); - vtkIntArray *anArray = vtkIntArray::New(); - anArray->SetNumberOfValues(aNbElem); - for(int anId = 0; anId < aNbElem; anId++){ - int aSMDSId = myVisualObj->GetElemObjId(anId); - anArray->SetValue(anId,aSMDSId); - } - aDataSet->GetCellData()->SetScalars(anArray); - myCellCenters->SetInput(aDataSet); - myCellsLabels->SetVisibility(GetVisibility()); - }else{ - myCellsLabels->SetVisibility(false); - } - myTimeStamp->Modified(); -} - - -void -SMESH_ActorDef:: -SetControlMode(eControl theMode) -{ - SetControlMode(theMode,true); -} - - -void -SMESH_ActorDef:: -SetControlMode(eControl theMode, - bool theCheckEntityMode) -{ - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if( !mgr ) - return; - - myControlMode = eNone; - theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false ); - - my1DActor->GetMapper()->SetScalarVisibility(false); - my2DActor->GetMapper()->SetScalarVisibility(false); - my3DActor->GetMapper()->SetScalarVisibility(false); - myScalarBarActor->SetVisibility(false); - - bool anIsScalarVisible = theMode > eNone; - - if(anIsScalarVisible){ - SMESH::Controls::FunctorPtr aFunctor; - switch(theMode){ - case eLength: - { - SMESH::Controls::Length* aControl = new SMESH::Controls::Length(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my1DActor; - break; - } - case eLength2D: - { - aFunctor.reset(new SMESH::Controls::Length2D()); - myControlActor = my2DActor; - break; - } - case eFreeBorders: - aFunctor.reset(new SMESH::Controls::FreeBorders()); - myControlActor = my1DActor; - break; - case eFreeEdges: - aFunctor.reset(new SMESH::Controls::FreeEdges()); - myControlActor = my2DActor; - break; - case eMultiConnection: - aFunctor.reset(new SMESH::Controls::MultiConnection()); - myControlActor = my1DActor; - break; - case eMultiConnection2D: - aFunctor.reset(new SMESH::Controls::MultiConnection2D()); - myControlActor = my2DActor; - break; - case eArea: - { - SMESH::Controls::Area* aControl = new SMESH::Controls::Area(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eTaper: - { - SMESH::Controls::Taper* aControl = new SMESH::Controls::Taper(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eAspectRatio: - { - SMESH::Controls::AspectRatio* aControl = new SMESH::Controls::AspectRatio(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eAspectRatio3D: - { - SMESH::Controls::AspectRatio3D* aControl = new SMESH::Controls::AspectRatio3D(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my3DActor; - break; - } - case eVolume3D: - { - SMESH::Controls::Volume* aControl = new SMESH::Controls::Volume(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my3DActor; - break; - } - case eMinimumAngle: - { - SMESH::Controls::MinimumAngle* aControl = new SMESH::Controls::MinimumAngle(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eWarping: - { - SMESH::Controls::Warping* aControl = new SMESH::Controls::Warping(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eSkew: - { - SMESH::Controls::Skew* aControl = new SMESH::Controls::Skew(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - default: - return; - } - - vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid(); - vtkIdType aNbCells = aGrid->GetNumberOfCells(); - if(aNbCells){ - myControlMode = theMode; - switch(myControlMode){ - case eFreeEdges: - case eFreeBorders: - my1DExtActor->SetExtControlMode(aFunctor); - break; - case eLength2D: - case eMultiConnection2D: - my1DExtActor->SetExtControlMode(aFunctor,myScalarBarActor,myLookupTable); - break; - default: - myControlActor->SetControlMode(aFunctor,myScalarBarActor,myLookupTable); - } - } - - if(theCheckEntityMode){ - if(myControlActor == my1DActor) - SetEntityMode(eEdges); - else if(myControlActor == my2DActor){ - switch(myControlMode){ - case eLength2D: - case eFreeEdges: - case eMultiConnection2D: - //SetEntityMode(eEdges); - SetEntityMode(eFaces); - break; - default: - SetEntityMode(eFaces); - } - }else if(myControlActor == my3DActor) - SetEntityMode(eVolumes); - } - - }else if(theCheckEntityMode){ - myEntityMode = eAllEntity; - } - - SetRepresentation(GetRepresentation()); - - myTimeStamp->Modified(); - Modified(); -} - - -void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ - SALOME_Actor::AddToRender(theRenderer); - - theRenderer->AddActor(myNodeActor); - theRenderer->AddActor(myBaseActor); - - theRenderer->AddActor(my3DActor); - theRenderer->AddActor(my2DActor); - - theRenderer->AddActor(my1DActor); - theRenderer->AddActor(my1DExtActor); - - theRenderer->AddActor(myHighlitableActor); - - theRenderer->AddActor2D(myScalarBarActor); - - myPtsSelectVisiblePoints->SetRenderer(theRenderer); - myClsSelectVisiblePoints->SetRenderer(theRenderer); - - theRenderer->AddActor2D(myPointLabels); - theRenderer->AddActor2D(myCellsLabels); -} - -void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ - SALOME_Actor::RemoveFromRender(theRenderer); - - theRenderer->RemoveActor(myNodeActor); - theRenderer->RemoveActor(myBaseActor); - - theRenderer->RemoveActor(myHighlitableActor); - - theRenderer->RemoveActor(my1DActor); - theRenderer->RemoveActor(my1DExtActor); - - theRenderer->RemoveActor(my2DActor); - theRenderer->RemoveActor(my3DActor); - - theRenderer->RemoveActor(myScalarBarActor); - theRenderer->RemoveActor(myPointLabels); - theRenderer->RemoveActor(myCellsLabels); -} - - -bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear) -{ - Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry,"SMESH",theName); - setIO(anIO); - setName(theName); - - myVisualObj = theVisualObj; - myVisualObj->Update(theIsClear); - - myNodeActor->Init(myVisualObj,myImplicitBoolean); - myBaseActor->Init(myVisualObj,myImplicitBoolean); - - myHighlitableActor->Init(myVisualObj,myImplicitBoolean); - - my1DActor->Init(myVisualObj,myImplicitBoolean); - my1DExtActor->Init(myVisualObj,myImplicitBoolean); - - my2DActor->Init(myVisualObj,myImplicitBoolean); - my3DActor->Init(myVisualObj,myImplicitBoolean); - - my1DActor->GetMapper()->SetLookupTable(myLookupTable); - my1DExtActor->GetMapper()->SetLookupTable(myLookupTable); - - my2DActor->GetMapper()->SetLookupTable(myLookupTable); - my3DActor->GetMapper()->SetLookupTable(myLookupTable); - - float aFactor, aUnits; - my2DActor->GetPolygonOffsetParameters(aFactor,aUnits); - my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75); - - //SetIsShrunkable(theGrid->GetNumberOfCells() > 10); - SetIsShrunkable(true); - - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if( !mgr ) - return false; - - int aMode = mgr->integerValue( "SMESH", "display_mode" ); - SetRepresentation(-1); - - if(aMode == 0){ - SetRepresentation(eEdge); - }else if(aMode == 1){ - SetRepresentation(eSurface); - }else if(aMode == 2){ - SetRepresentation(ePoint); - } - - if(aMode == 3){ - SetShrink(); - } - - myTimeStamp->Modified(); - Modified(); - return true; -} - - -float* SMESH_ActorDef::GetBounds(){ - return myNodeActor->GetBounds(); -} - - -vtkDataSet* SMESH_ActorDef::GetInput(){ - return GetUnstructuredGrid(); -} - - -void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){ - myNodeActor->SetTransform(theTransform); - myBaseActor->SetTransform(theTransform); - - myHighlitableActor->SetTransform(theTransform); - - my1DActor->SetTransform(theTransform); - my1DExtActor->SetTransform(theTransform); - - my2DActor->SetTransform(theTransform); - my3DActor->SetTransform(theTransform); - - Modified(); -} - - -void SMESH_ActorDef::SetMapper(vtkMapper* theMapper){ - vtkLODActor::SetMapper(theMapper); -} - - -void SMESH_ActorDef::ShallowCopy(vtkProp *prop){ - SALOME_Actor::ShallowCopy(prop); -} - - -vtkMapper* SMESH_ActorDef::GetMapper(){ - return myPickableActor->GetMapper(); -} - - -vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid(){ - return myVisualObj->GetUnstructuredGrid(); -} - - -bool SMESH_ActorDef::IsInfinitive(){ - vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid(); - aDataSet->Update(); - myIsInfinite = aDataSet->GetNumberOfCells() == 0 || - aDataSet->GetNumberOfCells() == 1 && - aDataSet->GetCell(0)->GetCellType() == VTK_VERTEX; - return SALOME_Actor::IsInfinitive(); -} - - -void SMESH_ActorDef::SetIsShrunkable(bool theShrunkable){ - myIsShrinkable = theShrunkable; - Modified(); -} - -float SMESH_ActorDef::GetShrinkFactor(){ - return myBaseActor->GetShrinkFactor(); -} - -void SMESH_ActorDef::SetShrinkFactor(float theValue){ - myBaseActor->SetShrinkFactor(theValue); - - my1DActor->SetShrinkFactor(theValue); - my1DExtActor->SetShrinkFactor(theValue); - - my2DActor->SetShrinkFactor(theValue); - my3DActor->SetShrinkFactor(theValue); - - Modified(); -} - -void SMESH_ActorDef::SetShrink(){ - if(!myIsShrinkable) return; - - myBaseActor->SetShrink(); - - my1DActor->SetShrink(); - my1DExtActor->SetShrink(); - - my2DActor->SetShrink(); - my3DActor->SetShrink(); - - myIsShrunk = true; - Modified(); -} - -void SMESH_ActorDef::UnShrink(){ - if(!myIsShrunk) return; - - myBaseActor->UnShrink(); - - my1DActor->UnShrink(); - my1DExtActor->UnShrink(); - - my2DActor->UnShrink(); - my3DActor->UnShrink(); - - myIsShrunk = false; - Modified(); -} - - -int SMESH_ActorDef::GetNodeObjId(int theVtkID){ - return myPickableActor->GetNodeObjId(theVtkID); -} - -float* SMESH_ActorDef::GetNodeCoord(int theObjID){ - return myPickableActor->GetNodeCoord(theObjID); -} - - -int SMESH_ActorDef::GetElemObjId(int theVtkID){ - return myPickableActor->GetElemObjId(theVtkID); -} - -vtkCell* SMESH_ActorDef::GetElemCell(int theObjID){ - return myPickableActor->GetElemCell(theObjID); -} - - -void SMESH_ActorDef::SetVisibility(int theMode){ - SetVisibility(theMode,true); -} - - -void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ - SALOME_Actor::SetVisibility(theMode); - - myNodeActor->VisibilityOff(); - myBaseActor->VisibilityOff(); - - my1DActor->VisibilityOff(); - my1DExtActor->VisibilityOff(); - - my2DActor->VisibilityOff(); - my3DActor->VisibilityOff(); - - myScalarBarActor->VisibilityOff(); - myPointLabels->VisibilityOff(); - myCellsLabels->VisibilityOff(); - - if(GetVisibility()){ - if(theIsUpdateRepersentation) - SetRepresentation(GetRepresentation()); - - if(myControlMode != eNone){ - switch(myControlMode){ - case eFreeEdges: - case eFreeBorders: - my1DExtActor->VisibilityOn(); - break; - case eLength2D: - case eMultiConnection2D: - my1DExtActor->VisibilityOn(); - default: - if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) - myScalarBarActor->VisibilityOn(); - } - } - - if(myRepresentation != ePoint) - myPickableActor->VisibilityOn(); - else { - myNodeActor->VisibilityOn(); - } - - if(myEntityMode & eEdges){ - my1DActor->VisibilityOn(); - } - - if(myEntityMode & eFaces){ - my2DActor->VisibilityOn(); - } - - if(myEntityMode & eVolumes){ - my3DActor->VisibilityOn(); - } - - if(myIsPointsLabeled){ - myPointLabels->VisibilityOn(); - myNodeActor->VisibilityOn(); - } - - if(myIsCellsLabeled) - myCellsLabels->VisibilityOn(); - } - - Modified(); -} - - -void SMESH_ActorDef::SetEntityMode(unsigned int theMode){ - myEntityState = eAllEntity; - - if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)){ - myEntityState &= ~eEdges; - theMode &= ~eEdges; - } - - if(!myVisualObj->GetNbEntities(SMDSAbs_Face)){ - myEntityState &= ~eFaces; - theMode &= ~eFaces; - } - - if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)){ - myEntityState &= ~eVolumes; - theMode &= ~eVolumes; - } - - if(!theMode){ - if(myVisualObj->GetNbEntities(SMDSAbs_Edge)) - theMode |= eEdges; - - if(myVisualObj->GetNbEntities(SMDSAbs_Face)) - theMode |= eFaces; - - if(myVisualObj->GetNbEntities(SMDSAbs_Volume)) - theMode |= eVolumes; - } - - myBaseActor->myGeomFilter->SetInside(myEntityMode != myEntityState); - - myEntityMode = theMode; - VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; - aFilter = myBaseActor->GetExtractUnstructuredGrid(); - aFilter->ClearRegisteredCellsWithType(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - - if(myEntityMode & eEdges){ - if (MYDEBUG) MESSAGE("EDGES"); - aFilter->RegisterCellsWithType(VTK_LINE); - } - - if(myEntityMode & eFaces){ - if (MYDEBUG) MESSAGE("FACES"); - aFilter->RegisterCellsWithType(VTK_TRIANGLE); - aFilter->RegisterCellsWithType(VTK_POLYGON); - aFilter->RegisterCellsWithType(VTK_QUAD); - } - - if(myEntityMode & eVolumes){ - if (MYDEBUG) MESSAGE("VOLUMES"); - aFilter->RegisterCellsWithType(VTK_TETRA); - aFilter->RegisterCellsWithType(VTK_VOXEL); - aFilter->RegisterCellsWithType(VTK_HEXAHEDRON); - aFilter->RegisterCellsWithType(VTK_WEDGE); - aFilter->RegisterCellsWithType(VTK_PYRAMID); - aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); - } - aFilter->Update(); - if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells()); - SetVisibility(GetVisibility(),false); -} - -void SMESH_ActorDef::SetRepresentation(int theMode){ - int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge); - int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face); - int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume); - if(theMode < 0){ - myRepresentation = eSurface; - if(!aNbFaces && !aNbVolumes && aNbEdges){ - myRepresentation = eEdge; - }else if(!aNbFaces && !aNbVolumes && !aNbEdges){ - myRepresentation = ePoint; - } - }else{ - switch(theMode){ - case eEdge: - if(!aNbFaces && !aNbVolumes && !aNbEdges) return; - break; - case eSurface: - if(!aNbFaces && !aNbVolumes) return; - break; - } - myRepresentation = theMode; - } - - if(!GetUnstructuredGrid()->GetNumberOfCells()) - myRepresentation = ePoint; - - if(myIsShrunk){ - if(myRepresentation == ePoint){ - UnShrink(); - myIsShrunk = true; - }else{ - SetShrink(); - } - } - - myPickableActor = myBaseActor; - myNodeActor->SetVisibility(false); - vtkProperty *aProp = NULL, *aBackProp = NULL; - SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1); - switch(myRepresentation){ - case ePoint: - myPickableActor = myNodeActor; - myNodeActor->SetVisibility(true); - - aProp = aBackProp = myNodeProp; - aReperesent = SMESH_DeviceActor::ePoint; - break; - case eEdge: - aProp = aBackProp = myEdgeProp; - aReperesent = SMESH_DeviceActor::eInsideframe; - break; - case eSurface: - aProp = mySurfaceProp; - aBackProp = myBackSurfaceProp; - aReperesent = SMESH_DeviceActor::eSurface; - break; - } - - my2DActor->SetProperty(aProp); - my2DActor->SetBackfaceProperty(aBackProp); - my2DActor->SetRepresentation(aReperesent); - - my3DActor->SetProperty(aProp); - my3DActor->SetBackfaceProperty(aBackProp); - my3DActor->SetRepresentation(aReperesent); - - my1DExtActor->SetVisibility(false); - - switch(myControlMode){ - case eLength: - case eMultiConnection: - aProp = aBackProp = my1DProp; - if(myRepresentation != ePoint) - aReperesent = SMESH_DeviceActor::eInsideframe; - break; - } - - my1DActor->SetProperty(aProp); - my1DActor->SetBackfaceProperty(aBackProp); - my1DActor->SetRepresentation(aReperesent); - - my1DExtActor->SetRepresentation(aReperesent); - - if(myIsPointsVisible) - myPickableActor = myNodeActor; - if(GetPointRepresentation()) - myNodeActor->SetVisibility(true); - - SetMapper(myPickableActor->GetMapper()); - - SetVisibility(GetVisibility(),false); - - Modified(); -} - - -void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){ - myIsPointsVisible = theIsPointsVisible; - SetRepresentation(GetRepresentation()); -} - -bool SMESH_ActorDef::GetPointRepresentation(){ - return myIsPointsVisible || myIsPointsLabeled; -} - - -void SMESH_ActorDef::UpdateHighlight(){ - myHighlitableActor->SetVisibility(false); - myHighlitableActor->SetHighlited(false); - - if(myIsHighlighted){ - myHighlitableActor->SetProperty(myHighlightProp); - }else if(myIsPreselected){ - myHighlitableActor->SetProperty(myPreselectProp); - } - - bool anIsVisible = GetVisibility(); - - if(myIsHighlighted || myIsPreselected){ - if(GetUnstructuredGrid()->GetNumberOfCells()){ - myHighlitableActor->SetHighlited(anIsVisible); - myHighlitableActor->SetVisibility(anIsVisible); - myHighlitableActor->GetExtractUnstructuredGrid()-> - SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells); - myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); - }else if(myRepresentation == ePoint || GetPointRepresentation()){ - myHighlitableActor->SetHighlited(anIsVisible); - myHighlitableActor->SetVisibility(anIsVisible); - myHighlitableActor->GetExtractUnstructuredGrid()-> - SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); - myHighlitableActor->SetRepresentation(SMESH_DeviceActor::ePoint); - } - } -} - - -void SMESH_ActorDef::highlight(bool theHighlight){ - myIsHighlighted = theHighlight; - UpdateHighlight(); -} - - -void SMESH_ActorDef::SetPreSelected(bool thePreselect){ - myIsPreselected = thePreselect; - UpdateHighlight(); -} - - -// From vtkFollower -int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp) -{ - if (myPickableActor->GetIsOpaque()) - { - vtkRenderer *ren = static_cast(vp); - this->Render(ren); - return 1; - } - return 0; -} - - -int SMESH_ActorDef::RenderTranslucentGeometry(vtkViewport *vp) -{ - if (!myPickableActor->GetIsOpaque()) - { - vtkRenderer *ren = static_cast(vp); - this->Render(ren); - return 1; - } - return 0; -} - - -void SMESH_ActorDef::Render(vtkRenderer *ren){ - unsigned long aTime = myTimeStamp->GetMTime(); - unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); - unsigned long aClippingTime = myImplicitBoolean->GetMTime(); - if(anObjTime > aTime || aClippingTime > aTime) - Update(); -} - - -void SMESH_ActorDef::Update(){ - if(MYDEBUG) MESSAGE("SMESH_ActorDef::Update"); - - if(GetControlMode() != eNone) { - unsigned long aTime = myTimeStamp->GetMTime(); - unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); - if (anObjTime > aTime) - SetControlMode(GetControlMode(),false); - } - if(myIsPointsLabeled){ - SetPointsLabeled(myIsPointsLabeled); - } - if(myIsCellsLabeled){ - SetCellsLabeled(myIsCellsLabeled); - } - SetEntityMode(GetEntityMode()); - SetVisibility(GetVisibility()); - - myTimeStamp->Modified(); - Modified(); -} - - -void SMESH_ActorDef::ReleaseGraphicsResources(vtkWindow *renWin){ - SALOME_Actor::ReleaseGraphicsResources(renWin); - - myPickableActor->ReleaseGraphicsResources(renWin); -} - - -static void GetColor(vtkProperty *theProperty, float& r,float& g,float& b){ - float* aColor = theProperty->GetColor(); - r = aColor[0]; - g = aColor[1]; - b = aColor[2]; -} - - -void SMESH_ActorDef::SetOpacity(float theValue){ - mySurfaceProp->SetOpacity(theValue); - myBackSurfaceProp->SetOpacity(theValue); - myEdgeProp->SetOpacity(theValue); - myNodeProp->SetOpacity(theValue); - - my1DProp->SetOpacity(theValue); -} - - -float SMESH_ActorDef::GetOpacity(){ - return mySurfaceProp->GetOpacity(); -} - - -void SMESH_ActorDef::SetSufaceColor(float r,float g,float b){ - mySurfaceProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetSufaceColor(float& r,float& g,float& b){ - ::GetColor(mySurfaceProp,r,g,b); -} - -void SMESH_ActorDef::SetBackSufaceColor(float r,float g,float b){ - myBackSurfaceProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetBackSufaceColor(float& r,float& g,float& b){ - ::GetColor(myBackSurfaceProp,r,g,b); -} - -void SMESH_ActorDef::SetEdgeColor(float r,float g,float b){ - myEdgeProp->SetColor(r,g,b); - my1DProp->SetColor(r,g,b); - my1DExtProp->SetColor(1.0-r,1.0-g,1.0-b); - Modified(); -} - -void SMESH_ActorDef::GetEdgeColor(float& r,float& g,float& b){ - ::GetColor(myEdgeProp,r,g,b); -} - -void SMESH_ActorDef::SetNodeColor(float r,float g,float b){ - myNodeProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetNodeColor(float& r,float& g,float& b){ - ::GetColor(myNodeProp,r,g,b); -} - -void SMESH_ActorDef::SetHighlightColor(float r,float g,float b){ - myHighlightProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetHighlightColor(float& r,float& g,float& b){ - ::GetColor(myHighlightProp,r,g,b); -} - -void SMESH_ActorDef::SetPreHighlightColor(float r,float g,float b){ - myPreselectProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetPreHighlightColor(float& r,float& g,float& b){ - ::GetColor(myPreselectProp,r,g,b); -} - - -float SMESH_ActorDef::GetLineWidth(){ - return myEdgeProp->GetLineWidth(); -} - - -void SMESH_ActorDef::SetLineWidth(float theVal){ - myEdgeProp->SetLineWidth(theVal); - - my1DProp->SetLineWidth(theVal + aLineWidthInc); - my1DExtProp->SetLineWidth(theVal + aLineWidthInc); - - Modified(); -} - - -void SMESH_ActorDef::SetNodeSize(float theVal){ - myNodeProp->SetPointSize(theVal); - myHighlightProp->SetPointSize(theVal); - myPreselectProp->SetPointSize(theVal); - - my1DProp->SetPointSize(theVal + aPointSizeInc); - my1DExtProp->SetPointSize(theVal + aPointSizeInc); - - Modified(); -} - -float SMESH_ActorDef::GetNodeSize(){ - return myNodeProp->GetPointSize(); -} - -int SMESH_ActorDef::GetObjDimension( const int theObjId ) -{ - return myVisualObj->GetElemDimension( theObjId ); -} - -bool -SMESH_ActorDef:: -IsImplicitFunctionUsed() const -{ - return myBaseActor->IsImplicitFunctionUsed(); -} - -void -SMESH_ActorDef:: -SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) -{ - myNodeActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - myBaseActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - - myHighlitableActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - - my1DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - my1DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - - my2DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - my3DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); -} - -vtkIdType -SMESH_ActorDef:: -AddClippingPlane(vtkPlane* thePlane) -{ - if(thePlane){ - myImplicitBoolean->GetFunction()->AddItem(thePlane); - myCippingPlaneCont.push_back(thePlane); - if(!IsImplicitFunctionUsed()) - SetImplicitFunctionUsed(true); - } - return myCippingPlaneCont.size(); -} - -void -SMESH_ActorDef:: -RemoveAllClippingPlanes() -{ - myImplicitBoolean->GetFunction()->RemoveAllItems(); - myImplicitBoolean->GetFunction()->Modified(); // VTK bug - myCippingPlaneCont.clear(); - SetImplicitFunctionUsed(false); -} - -vtkIdType -SMESH_ActorDef:: -GetNumberOfClippingPlanes() -{ - return myCippingPlaneCont.size(); -} - -vtkPlane* -SMESH_ActorDef:: -GetClippingPlane(vtkIdType theID) -{ - if(theID >= myCippingPlaneCont.size()) - return NULL; - return myCippingPlaneCont[theID].Get(); -} - - -static void ComputeBoundsParam(vtkDataSet* theDataSet, - float theDirection[3], float theMinPnt[3], - float& theMaxBoundPrj, float& theMinBoundPrj) -{ - float aBounds[6]; - theDataSet->GetBounds(aBounds); - - //Enlarge bounds in order to avoid conflicts of precision - for(int i = 0; i < 6; i += 2){ - static double EPS = 1.0E-3; - float aDelta = (aBounds[i+1] - aBounds[i])*EPS; - aBounds[i] -= aDelta; - aBounds[i+1] += aDelta; - } - - float aBoundPoints[8][3] = { {aBounds[0],aBounds[2],aBounds[4]}, - {aBounds[1],aBounds[2],aBounds[4]}, - {aBounds[0],aBounds[3],aBounds[4]}, - {aBounds[1],aBounds[3],aBounds[4]}, - {aBounds[0],aBounds[2],aBounds[5]}, - {aBounds[1],aBounds[2],aBounds[5]}, - {aBounds[0],aBounds[3],aBounds[5]}, - {aBounds[1],aBounds[3],aBounds[5]}}; - - int aMaxId = 0, aMinId = aMaxId; - theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]); - theMinBoundPrj = theMaxBoundPrj; - for(int i = 1; i < 8; i++){ - float aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]); - if(theMaxBoundPrj < aTmp){ - theMaxBoundPrj = aTmp; - aMaxId = i; - } - if(theMinBoundPrj > aTmp){ - theMinBoundPrj = aTmp; - aMinId = i; - } - } - float *aMinPnt = aBoundPoints[aMaxId]; - theMinPnt[0] = aMinPnt[0]; - theMinPnt[1] = aMinPnt[1]; - theMinPnt[2] = aMinPnt[2]; -} - - -static void DistanceToPosition(vtkDataSet* theDataSet, - float theDirection[3], float theDist, float thePos[3]) -{ - float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; - ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - float aLength = (aMaxBoundPrj-aMinBoundPrj)*theDist; - thePos[0] = aMinPnt[0]-theDirection[0]*aLength; - thePos[1] = aMinPnt[1]-theDirection[1]*aLength; - thePos[2] = aMinPnt[2]-theDirection[2]*aLength; -} - - -static void PositionToDistance(vtkDataSet* theDataSet, - float theDirection[3], float thePos[3], float& theDist) -{ - float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; - ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - float aPrj = vtkMath::Dot(theDirection,thePos); - theDist = (aPrj-aMinBoundPrj)/(aMaxBoundPrj-aMinBoundPrj); -} - - -void SMESH_ActorDef::SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane) -{ - thePlane->SetNormal(theDir); - float anOrigin[3]; - ::DistanceToPosition(GetUnstructuredGrid(),theDir,theDist,anOrigin); - thePlane->SetOrigin(anOrigin); -} - - -void SMESH_ActorDef::GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane) -{ - thePlane->GetNormal(theDir); - - float anOrigin[3]; - thePlane->GetOrigin(anOrigin); - ::PositionToDistance(GetUnstructuredGrid(),theDir,anOrigin,theDist); -} - -void SMESH_ActorDef::UpdateScalarBar() -{ - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if( !mgr ) - return; - - vtkTextProperty* aScalarBarTitleProp = vtkTextProperty::New(); - - QColor aTColor = mgr->colorValue( "SMESH", "scalar_bar_title_color", QColor( 255, 255, 255 ) ); - aScalarBarTitleProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. ); - - aScalarBarTitleProp->SetFontFamilyToArial(); - - if ( mgr->hasValue( "SMESH", "scalar_bar_title_font" ) ) - { - QFont f = mgr->fontValue( "SMESH", "scalar_bar_title_font" ); - if ( f.family() == "Arial" ) - aScalarBarTitleProp->SetFontFamilyToArial(); - else if ( f.family() == "Courier" ) - aScalarBarTitleProp->SetFontFamilyToCourier(); - else if ( f.family() == "Times" ) - aScalarBarTitleProp->SetFontFamilyToTimes(); - - if ( f.bold() ) - aScalarBarTitleProp->BoldOn(); - else - aScalarBarTitleProp->BoldOff(); - - if ( f.italic() ) - aScalarBarTitleProp->ItalicOn(); - else - aScalarBarTitleProp->ItalicOff(); - - if ( f.underline() ) - aScalarBarTitleProp->ShadowOn(); - else - aScalarBarTitleProp->ShadowOff(); - } - - myScalarBarActor->SetTitleTextProperty( aScalarBarTitleProp ); - aScalarBarTitleProp->Delete(); - - vtkTextProperty* aScalarBarLabelProp = vtkTextProperty::New(); - - aTColor = mgr->colorValue( "SMESH", "scalar_bar_label_color", QColor( 255, 255, 255 ) ); - aScalarBarLabelProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. ); - - aScalarBarLabelProp->SetFontFamilyToArial(); - if( mgr->hasValue( "SMESH", "scalar_bar_label_font" ) ) - { - QFont f = mgr->stringValue( "SMESH", "scalar_bar_label_font" ); - if( f.family() == "Arial" ) - aScalarBarLabelProp->SetFontFamilyToArial(); - else if( f.family() == "Courier" ) - aScalarBarLabelProp->SetFontFamilyToCourier(); - else if( f.family() == "Times" ) - aScalarBarLabelProp->SetFontFamilyToTimes(); - - if ( f.bold() ) - aScalarBarLabelProp->BoldOn(); - else - aScalarBarLabelProp->BoldOff(); - - if ( f.italic() ) - aScalarBarLabelProp->ItalicOn(); - else - aScalarBarLabelProp->ItalicOff(); - - if( f.underline() ) - aScalarBarLabelProp->ShadowOn(); - else - aScalarBarLabelProp->ShadowOff(); - } - - myScalarBarActor->SetLabelTextProperty( aScalarBarLabelProp ); - aScalarBarLabelProp->Delete(); - - bool horiz = ( mgr->integerValue( "SMESH", "scalar_bar_orientation" ) == 1 ); - QString name = QString( "scalar_bar_%1_" ).arg( horiz ? "horizontal" : "vertical" ); - if( horiz ) - myScalarBarActor->SetOrientationToHorizontal(); - else - myScalarBarActor->SetOrientationToVertical(); - - - float aXVal = horiz ? 0.20 : 0.01; - if( mgr->hasValue( "SMESH", name + "x" ) ) - aXVal = mgr->doubleValue( "SMESH", name + "x", aXVal ); - - float aYVal = horiz ? 0.01 : 0.1; - if( mgr->hasValue( "SMESH", name + "y" ) ) - aYVal = mgr->doubleValue( "SMESH", name + "y", aYVal ); - myScalarBarActor->SetPosition( aXVal, aYVal ); - - float aWVal = horiz ? 0.60 : 0.10; - if( mgr->hasValue( "SMESH", name + "width" ) ) - aWVal = mgr->doubleValue( "SMESH", name + "width", aWVal ); - myScalarBarActor->SetWidth( aWVal ); - - float aHVal = horiz ? 0.12 : 0.80; - if( mgr->hasValue( "SMESH", name + "height" ) ) - aHVal = mgr->doubleValue( "SMESH", name + "height", aHVal ); - myScalarBarActor->SetHeight( aHVal ); - - int anIntVal = 5; - if( mgr->hasValue( "SMESH", "scalar_bar_num_labels" ) ) - anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_labels", anIntVal ); - myScalarBarActor->SetNumberOfLabels( anIntVal == 0 ? 5: anIntVal ); - - anIntVal = 64; - if( mgr->hasValue( "SMESH", "scalar_bar_num_colors" ) ) - anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_colors", anIntVal ); - myScalarBarActor->SetMaximumNumberOfColors( anIntVal == 0 ? 64 : anIntVal ); - -} diff --git a/src/OBJECT/SMESH_Actor.h b/src/OBJECT/SMESH_Actor.h deleted file mode 100644 index 7319914d7..000000000 --- a/src/OBJECT/SMESH_Actor.h +++ /dev/null @@ -1,121 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// 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 : SMESH_Actor.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESH_ACTOR_H -#define SMESH_ACTOR_H - -#include -#include "SMESH_Object.h" - -class vtkUnstructuredGrid; - -class vtkScalarBarActor; - -class vtkPlane; -class vtkImplicitBoolean; - -class SMESH_Actor: public SALOME_Actor -{ - static SMESH_Actor* New() { return NULL;} - - public: - vtkTypeMacro(SMESH_Actor,SALOME_Actor); - static SMESH_Actor* New(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear); - - virtual void SetSufaceColor(float r,float g,float b) = 0; - virtual void GetSufaceColor(float& r,float& g,float& b) = 0; - - virtual void SetBackSufaceColor(float r,float g,float b) = 0; - virtual void GetBackSufaceColor(float& r,float& g,float& b) = 0; - - virtual void SetEdgeColor(float r,float g,float b) = 0; - virtual void GetEdgeColor(float& r,float& g,float& b) = 0; - - virtual void SetNodeColor(float r,float g,float b) = 0; - virtual void GetNodeColor(float& r,float& g,float& b) = 0; - - virtual void SetHighlightColor(float r,float g,float b) = 0; - virtual void GetHighlightColor(float& r,float& g,float& b) = 0; - - virtual void SetPreHighlightColor(float r,float g,float b) = 0; - virtual void GetPreHighlightColor(float& r,float& g,float& b) = 0; - - virtual float GetLineWidth() = 0; - virtual void SetLineWidth(float theVal) = 0; - - virtual void SetNodeSize(float size) = 0; - virtual float GetNodeSize() = 0; - - enum EReperesent { ePoint, eEdge, eSurface}; - - enum EEntityMode { eEdges = 0x01, eFaces = 0x02, eVolumes = 0x04, eAllEntity = 0x07}; - virtual void SetEntityMode(unsigned int theMode) = 0; - virtual unsigned int GetEntityMode() const = 0; - - virtual void SetPointRepresentation(bool theIsPointsVisible) = 0; - virtual bool GetPointRepresentation() = 0; - - virtual vtkUnstructuredGrid* GetUnstructuredGrid() = 0; - - virtual void SetShrinkFactor(float theValue) = 0; - - virtual void SetPointsLabeled(bool theIsPointsLabeled) = 0; - virtual bool GetPointsLabeled() = 0; - - virtual void SetCellsLabeled(bool theIsCellsLabeled) = 0; - virtual bool GetCellsLabeled() = 0; - - enum eControl{eNone, eLength, eLength2D, eFreeBorders, eFreeEdges, eMultiConnection, - eArea, eTaper, eAspectRatio, eMinimumAngle, eWarping, eSkew, - eAspectRatio3D, eMultiConnection2D, eVolume3D}; - virtual void SetControlMode(eControl theMode) = 0; - virtual eControl GetControlMode() = 0; - - virtual vtkScalarBarActor* GetScalarBarActor() = 0; - - virtual void SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane) = 0; - virtual void GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane) = 0; - - virtual void RemoveAllClippingPlanes() = 0; - virtual vtkIdType GetNumberOfClippingPlanes() = 0; - virtual vtkPlane* GetClippingPlane(vtkIdType theID) = 0; - virtual vtkIdType AddClippingPlane(vtkPlane* thePlane) = 0; - - virtual TVisualObjPtr GetObject() = 0; - - virtual void SetControlsPrecision( const long ) = 0; - virtual long GetControlsPrecision() const = 0; - - virtual void UpdateScalarBar() = 0; -}; - - -#endif //SMESH_ACTOR_H diff --git a/src/OBJECT/SMESH_ActorDef.h b/src/OBJECT/SMESH_ActorDef.h deleted file mode 100644 index 7ed5149f1..000000000 --- a/src/OBJECT/SMESH_ActorDef.h +++ /dev/null @@ -1,277 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// 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 : SMESH_ActorDef.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESH_ACTORDEF_H -#define SMESH_ACTORDEF_H - -#include "SMESH_Actor.h" -#include "SMESH_Object.h" - -#include - -template -class TVTKSmartPtr: public vtkSmartPointer -{ -public: - TVTKSmartPtr() {} - TVTKSmartPtr(T* r, bool theIsOwner = false): vtkSmartPointer(r) { - if(r && theIsOwner) - r->Delete(); - } - TVTKSmartPtr& operator()(T* r, bool theIsOwner = false){ - vtkSmartPointer::operator=(r); - if(r && theIsOwner) - r->Delete(); - return *this; - } - TVTKSmartPtr& operator=(T* r){ vtkSmartPointer::operator=(r); return *this;} - T* Get() const { return this->GetPointer();} -}; - - -class vtkProperty; -class vtkShrinkFilter; -class vtkPolyDataMapper; -class vtkUnstructuredGrid; -class vtkMergeFilter; -class vtkPolyData; - -class vtkMapper; -class vtkActor2D; -class vtkMaskPoints; -class vtkCellCenters; -class vtkLabeledDataMapper; -class vtkSelectVisiblePoints; - -class vtkScalarBarActor; -class vtkLookupTable; - -class vtkPlane; -class vtkImplicitBoolean; - -class vtkTimeStamp; - -class SMESH_DeviceActor; - - -class SMESH_ActorDef : public SMESH_Actor{ - friend class SMESH_VisualObj; - friend class SMESH_Actor; - - public: - vtkTypeMacro(SMESH_ActorDef,SMESH_Actor); - - virtual void ReleaseGraphicsResources(vtkWindow *renWin); - virtual int RenderOpaqueGeometry(vtkViewport *viewport); - virtual int RenderTranslucentGeometry(vtkViewport *viewport); - virtual void Render(vtkRenderer *ren); - - virtual void AddToRender(vtkRenderer* theRenderer); - virtual void RemoveFromRender(vtkRenderer* theRenderer); - - virtual bool hasHighlight() { return true; } - virtual void highlight(bool theHighlight); - virtual void SetPreSelected(bool thePreselect = false); - - virtual bool IsInfinitive(); - - virtual void SetOpacity(float theValue); - virtual float GetOpacity(); - - virtual void SetSufaceColor(float r,float g,float b); - virtual void GetSufaceColor(float& r,float& g,float& b); - - virtual void SetBackSufaceColor(float r,float g,float b); - virtual void GetBackSufaceColor(float& r,float& g,float& b); - - virtual void SetEdgeColor(float r,float g,float b); - virtual void GetEdgeColor(float& r,float& g,float& b); - - virtual void SetNodeColor(float r,float g,float b); - virtual void GetNodeColor(float& r,float& g,float& b); - - virtual void SetHighlightColor(float r,float g,float b); - virtual void GetHighlightColor(float& r,float& g,float& b); - - virtual void SetPreHighlightColor(float r,float g,float b); - virtual void GetPreHighlightColor(float& r,float& g,float& b); - - virtual float GetLineWidth(); - virtual void SetLineWidth(float theVal); - - virtual void SetNodeSize(float size) ; - virtual float GetNodeSize() ; - - virtual int GetNodeObjId(int theVtkID); - virtual float* GetNodeCoord(int theObjID); - - virtual int GetElemObjId(int theVtkID); - virtual vtkCell* GetElemCell(int theObjID); - - virtual int GetObjDimension( const int theObjId ); - - virtual void SetVisibility(int theMode); - void SetVisibility(int theMode, bool theIsUpdateRepersentation); - - virtual void SetRepresentation(int theMode); - - virtual unsigned int GetEntityMode() const { return myEntityMode;} - virtual void SetEntityMode(unsigned int theMode); - - virtual void SetPointRepresentation(bool theIsPointsVisible); - virtual bool GetPointRepresentation(); - - virtual float* GetBounds(); - virtual void SetTransform(VTKViewer_Transform* theTransform); - - virtual vtkUnstructuredGrid* GetUnstructuredGrid(); - virtual vtkDataSet* GetInput(); - virtual vtkMapper* GetMapper(); - - virtual float GetShrinkFactor(); - virtual void SetShrinkFactor(float theValue); - - virtual bool IsShrunkable() { return myIsShrinkable;} - virtual bool IsShrunk() { return myIsShrunk;} - virtual void SetShrink(); - virtual void UnShrink(); - - virtual void SetPointsLabeled(bool theIsPointsLabeled); - virtual bool GetPointsLabeled(){ return myIsPointsLabeled;} - - virtual void SetCellsLabeled(bool theIsCellsLabeled); - virtual bool GetCellsLabeled(){ return myIsCellsLabeled;} - - virtual void SetControlMode(eControl theMode); - virtual eControl GetControlMode(){ return myControlMode;} - - virtual vtkScalarBarActor* GetScalarBarActor(){ return myScalarBarActor;} - - virtual void SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane); - virtual void GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane); - - virtual void RemoveAllClippingPlanes(); - virtual vtkIdType GetNumberOfClippingPlanes(); - virtual vtkPlane* GetClippingPlane(vtkIdType theID); - virtual vtkIdType AddClippingPlane(vtkPlane* thePlane); - - virtual TVisualObjPtr GetObject() { return myVisualObj;} - - virtual void SetControlsPrecision( const long p ) { myControlsPrecision = p; } - virtual long GetControlsPrecision() const { return myControlsPrecision; } - - virtual void UpdateScalarBar(); - - protected: - void SetControlMode(eControl theMode, bool theCheckEntityMode); - void SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed); - bool IsImplicitFunctionUsed() const; - - TVisualObjPtr myVisualObj; - vtkTimeStamp* myTimeStamp; - - vtkScalarBarActor* myScalarBarActor; - vtkLookupTable* myLookupTable; - - vtkProperty* mySurfaceProp; - vtkProperty* myBackSurfaceProp; - vtkProperty* myEdgeProp; - vtkProperty* myNodeProp; - - SMESH_DeviceActor* myBaseActor; - SMESH_DeviceActor* myNodeActor; - SMESH_DeviceActor* myPickableActor; - - vtkProperty* myHighlightProp; - vtkProperty* myPreselectProp; - SMESH_DeviceActor* myHighlitableActor; - - eControl myControlMode; - SMESH_DeviceActor* my2DActor; - SMESH_DeviceActor* my3DActor; - SMESH_DeviceActor* myControlActor; - - vtkProperty* my1DProp; - SMESH_DeviceActor* my1DActor; - vtkProperty* my1DExtProp; - SMESH_DeviceActor* my1DExtActor; - - unsigned int myEntityMode; - unsigned int myEntityState; - bool myIsPointsVisible; - - bool myIsShrinkable; - bool myIsShrunk; - - bool myIsPointsLabeled; - vtkUnstructuredGrid* myPointsNumDataSet; - vtkActor2D *myPointLabels; - vtkMaskPoints* myPtsMaskPoints; - vtkLabeledDataMapper* myPtsLabeledDataMapper; - vtkSelectVisiblePoints* myPtsSelectVisiblePoints; - - bool myIsCellsLabeled; - vtkUnstructuredGrid* myCellsNumDataSet; - vtkActor2D *myCellsLabels; - vtkMaskPoints* myClsMaskPoints; - vtkCellCenters* myCellCenters; - vtkLabeledDataMapper* myClsLabeledDataMapper; - vtkSelectVisiblePoints* myClsSelectVisiblePoints; - - vtkImplicitBoolean* myImplicitBoolean; - typedef TVTKSmartPtr TPlanePtr; - typedef std::vector TCippingPlaneCont; - TCippingPlaneCont myCippingPlaneCont; - long myControlsPrecision; - - SMESH_ActorDef(); - ~SMESH_ActorDef(); - - bool Init(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear); - - void SetIsShrunkable(bool theShrunkable); - void UpdateHighlight(); - void Update(); - - private: - // hide the two parameter Render() method from the user and the compiler. - virtual void Render(vtkRenderer *, vtkMapper *) {}; - virtual void ShallowCopy(vtkProp *prop); - virtual void SetMapper(vtkMapper *); - static SMESH_ActorDef* New(); - - // Not implemented. - SMESH_ActorDef(const SMESH_ActorDef&); - void operator=(const SMESH_ActorDef&); -}; - - -#endif //SMESH_ACTORDEF_H diff --git a/src/OBJECT/SMESH_ActorUtils.cxx b/src/OBJECT/SMESH_ActorUtils.cxx deleted file mode 100644 index feee143db..000000000 --- a/src/OBJECT/SMESH_ActorUtils.cxx +++ /dev/null @@ -1,101 +0,0 @@ -// 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 - - -#include "SMESH_ActorUtils.h" - -#include "SUIT_Tools.h" -#include "SUIT_Session.h" -#include "SUIT_ResourceMgr.h" - -#include "utilities.h" - -#include -#include - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - -namespace SMESH{ - - float GetFloat( const QString& theValue, float theDefault ) - { - int pos = theValue.find( ":" ); - float val = theDefault; - if( pos>=0 ) - { - QString name = theValue.right( theValue.length()-pos-1 ), - sect = theValue.left( pos ); - if( !name.isEmpty() && !sect.isEmpty() ) - val = GetFloat( name, sect, theDefault ); - } - return val; - } - - float GetFloat( const QString& theValue, const QString& theSection, float theDefault ) - { - float val = theDefault; - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if( mgr ) - val = (float) mgr->doubleValue( theValue, theSection, theDefault ); - - return val; - } - - void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName){ - vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New(); - aWriter->SetFileName(theFileName); - aWriter->SetInput(theGrid); - if(theGrid->GetNumberOfCells()){ - aWriter->Write(); - } - aWriter->Delete(); - } - - QColor GetColor( const QString& theSect, const QString& theName, const QColor& def ) - { - QColor c = def; - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if ( mgr ) - c = mgr->colorValue( theSect, theName, def ); - return c; - } - - void GetColor( const QString& theSect, const QString& theName, int& r, int& g, int& b, const QColor& def ) - { - QColor c = def; - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if ( mgr ) - c = mgr->colorValue( theSect, theName, def ); - - SUIT_Tools::rgbSet( SUIT_Tools::rgbSet( c ), r, g, b ); - } - - void GetColor( const QString& theSect, const QString& theName, float& r, float& g, float& b, const QColor& def ) - { - int ir( 0 ), ig( 0 ), ib( 0 ); - GetColor( theSect, theName, ir, ig, ib, def ); - r = ir / 255.; - g = ig / 255.; - b = ib / 255.; - } -} diff --git a/src/OBJECT/SMESH_ActorUtils.h b/src/OBJECT/SMESH_ActorUtils.h deleted file mode 100644 index f28e8d6c9..000000000 --- a/src/OBJECT/SMESH_ActorUtils.h +++ /dev/null @@ -1,41 +0,0 @@ -// 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 - -#ifndef SMESH_ACTORUTILS_H -#define SMESH_ACTORUTILS_H - -#include -#include - -class vtkUnstructuredGrid; - -namespace SMESH{ - - float GetFloat( const QString& theValue, float theDefault = 0 ); - float GetFloat( const QString& theName, const QString& theSection, float theDefault = 0 ); - - QColor GetColor( const QString& theSect, const QString& theName, const QColor&t = QColor() ); - void GetColor( const QString& theSect, const QString& theName, int&, int&, int&, const QColor&t = QColor() ); - void GetColor( const QString& theSect, const QString& theName, float&, float&, float&, const QColor&t = QColor() ); - - void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName); - -} - -#endif diff --git a/src/OBJECT/SMESH_DeviceActor.cxx b/src/OBJECT/SMESH_DeviceActor.cxx deleted file mode 100644 index 3548aaefe..000000000 --- a/src/OBJECT/SMESH_DeviceActor.cxx +++ /dev/null @@ -1,676 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// 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 : SMESH_DeviceActor.cxx -// Author : -// Module : SMESH -// $Header$ - - -#include "SMESH_DeviceActor.h" -#include "SMESH_ExtractGeometry.h" -#include "SMESH_ControlsDef.hxx" -#include "SMESH_ActorUtils.h" - -#include -#include -#include -#include - -// VTK Includes -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "utilities.h" - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -using namespace std; - - -vtkStandardNewMacro(SMESH_DeviceActor); - - -SMESH_DeviceActor::SMESH_DeviceActor() -{ - if(MYDEBUG) MESSAGE("SMESH_DeviceActor - "<UseLookupTableScalarRangeOn(); - myMapper->SetColorModeToMapScalars(); - - myShrinkFilter = vtkShrinkFilter::New(); - - myStoreClippingMapping = false; - - myExtractGeometry = SMESH_ExtractGeometry::New(); - myExtractGeometry->SetReleaseDataFlag(true); - myIsImplicitFunctionUsed = false; - - myExtractUnstructuredGrid = VTKViewer_ExtractUnstructuredGrid::New(); - - myMergeFilter = vtkMergeFilter::New(); - - myGeomFilter = VTKViewer_GeometryFilter::New(); - - myTransformFilter = VTKViewer_TransformFilter::New(); - - for(int i = 0; i < 6; i++) - myPassFilter.push_back(VTKViewer_PassThroughFilter::New()); -} - - -SMESH_DeviceActor::~SMESH_DeviceActor(){ - if(MYDEBUG) MESSAGE("~SMESH_DeviceActor - "<Delete(); - - myMapper->Delete(); - - myShrinkFilter->Delete(); - - myExtractUnstructuredGrid->Delete(); - - myMergeFilter->Delete(); - - myGeomFilter->Delete(); - - myExtractGeometry->Delete(); - - myTransformFilter->Delete(); - - for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++){ - myPassFilter[i]->Delete(); - } -} - - -void -SMESH_DeviceActor:: -SetStoreGemetryMapping(bool theStoreMapping) -{ - myGeomFilter->SetStoreMapping(theStoreMapping); - SetStoreClippingMapping(theStoreMapping); -} - - -void -SMESH_DeviceActor:: -SetStoreClippingMapping(bool theStoreMapping) -{ - myStoreClippingMapping = theStoreMapping; - myExtractGeometry->SetStoreMapping(theStoreMapping && myIsImplicitFunctionUsed); - SetStoreIDMapping(theStoreMapping); -} - - -void -SMESH_DeviceActor:: -SetStoreIDMapping(bool theStoreMapping) -{ - myExtractUnstructuredGrid->SetStoreMapping(theStoreMapping); -} - - -void SMESH_DeviceActor::Init(TVisualObjPtr theVisualObj, - vtkImplicitBoolean* theImplicitBoolean) -{ - myVisualObj = theVisualObj; - myExtractGeometry->SetImplicitFunction(theImplicitBoolean); - SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); -} - - -void -SMESH_DeviceActor:: -SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) -{ - int anId = 0; - if(theIsImplicitFunctionUsed) - myPassFilter[ anId ]->SetInput( myExtractGeometry->GetOutput() ); - else - myPassFilter[ anId ]->SetInput( myMergeFilter->GetOutput() ); - - myIsImplicitFunctionUsed = theIsImplicitFunctionUsed; - SetStoreClippingMapping(myStoreClippingMapping); -} - - -void SMESH_DeviceActor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){ - if(theGrid){ - //myIsShrinkable = theGrid->GetNumberOfCells() > 10; - myIsShrinkable = true; - - myExtractUnstructuredGrid->SetInput(theGrid); - - myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput()); - - myExtractGeometry->SetInput(myMergeFilter->GetOutput()); - - int anId = 0; - SetImplicitFunctionUsed(myIsImplicitFunctionUsed); - myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() ); - - anId++; // 1 - myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() ); - - anId++; // 2 - myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); - - anId++; // 3 - myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); - myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); - - anId++; // 4 - myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); - myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); - - anId++; // 5 - myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); - myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); - - vtkLODActor::SetMapper( myMapper ); - Modified(); - } -} - - -VTKViewer_ExtractUnstructuredGrid* SMESH_DeviceActor::GetExtractUnstructuredGrid(){ - return myExtractUnstructuredGrid; -} - - -vtkUnstructuredGrid* SMESH_DeviceActor::GetUnstructuredGrid(){ - myExtractUnstructuredGrid->Update(); - return myExtractUnstructuredGrid->GetOutput(); -} - - -void SMESH_DeviceActor::SetControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable) -{ - bool anIsInitialized = theFunctor; - if(anIsInitialized){ - vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - - SetStoreIDMapping(true); - myExtractUnstructuredGrid->Update(); - vtkUnstructuredGrid* aGrid = myExtractUnstructuredGrid->GetOutput(); - - aDataSet->ShallowCopy(aGrid); - - vtkDoubleArray *aScalars = vtkDoubleArray::New(); - vtkIdType aNbCells = aGrid->GetNumberOfCells(); - aScalars->SetNumberOfComponents(1); - aScalars->SetNumberOfTuples(aNbCells); - - myVisualObj->UpdateFunctor(theFunctor); - - using namespace SMESH::Controls; - if(NumericalFunctor* aNumericalFunctor = dynamic_cast(theFunctor.get())){ - for(vtkIdType i = 0; i < aNbCells; i++){ - vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i); - vtkIdType anObjId = myVisualObj->GetElemObjId(anId); - double aValue = aNumericalFunctor->GetValue(anObjId); - aScalars->SetValue(i,aValue); - } - }else if(Predicate* aPredicate = dynamic_cast(theFunctor.get())){ - for(vtkIdType i = 0; i < aNbCells; i++){ - vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i); - vtkIdType anObjId = myVisualObj->GetElemObjId(anId); - bool aValue = aPredicate->IsSatisfy(anObjId); - aScalars->SetValue(i,aValue); - } - } - - aDataSet->GetCellData()->SetScalars(aScalars); - aScalars->Delete(); - - theLookupTable->SetRange(aScalars->GetRange()); - theLookupTable->Build(); - - myMergeFilter->SetScalars(aDataSet); - aDataSet->Delete(); - } - GetMapper()->SetScalarVisibility(anIsInitialized); - theScalarBarActor->SetVisibility(anIsInitialized); -} - -void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable) -{ - bool anIsInitialized = theFunctor; - myExtractUnstructuredGrid->ClearRegisteredCells(); - myExtractUnstructuredGrid->ClearRegisteredCellsWithType(); - myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); - myVisualObj->UpdateFunctor(theFunctor); - - using namespace SMESH::Controls; - if (anIsInitialized){ - if (Length2D* aLength2D = dynamic_cast(theFunctor.get())){ - SMESH::Controls::Length2D::TValues aValues; - - aLength2D->GetValues(aValues); - vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); - - aDataSet->SetPoints(aGrid->GetPoints()); - - vtkIdType aNbCells = aValues.size(); - - vtkDoubleArray *aScalars = vtkDoubleArray::New(); - aScalars->SetNumberOfComponents(1); - aScalars->SetNumberOfTuples(aNbCells); - - vtkIdType aCellsSize = 3*aNbCells; - vtkCellArray* aConnectivity = vtkCellArray::New(); - aConnectivity->Allocate( aCellsSize, 0 ); - - vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); - aCellTypesArray->SetNumberOfComponents( 1 ); - aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); - - vtkIdList *anIdList = vtkIdList::New(); - anIdList->SetNumberOfIds(2); - - Length2D::TValues::const_iterator anIter = aValues.begin(); - for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){ - const Length2D::Value& aValue = *anIter; - int aNode[2] = { - myVisualObj->GetNodeVTKId(aValue.myPntId[0]), - myVisualObj->GetNodeVTKId(aValue.myPntId[1]) - }; - if(aNode[0] >= 0 && aNode[1] >= 0){ - anIdList->SetId( 0, aNode[0] ); - anIdList->SetId( 1, aNode[1] ); - aConnectivity->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_LINE ); - aScalars->SetValue(aVtkId,aValue.myLength); - } - } - - vtkIntArray* aCellLocationsArray = vtkIntArray::New(); - aCellLocationsArray->SetNumberOfComponents( 1 ); - aCellLocationsArray->SetNumberOfTuples( aNbCells ); - - aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) - aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); - - aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); - SetUnstructuredGrid(aDataSet); - - aDataSet->GetCellData()->SetScalars(aScalars); - aScalars->Delete(); - - theLookupTable->SetRange(aScalars->GetRange()); - theLookupTable->Build(); - - myMergeFilter->SetScalars(aDataSet); - aDataSet->Delete(); - } - else if (MultiConnection2D* aMultiConnection2D = dynamic_cast(theFunctor.get())){ - SMESH::Controls::MultiConnection2D::MValues aValues; - - aMultiConnection2D->GetValues(aValues); - vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); - aDataSet->SetPoints(aGrid->GetPoints()); - - vtkIdType aNbCells = aValues.size(); - vtkDoubleArray *aScalars = vtkDoubleArray::New(); - aScalars->SetNumberOfComponents(1); - aScalars->SetNumberOfTuples(aNbCells); - - vtkIdType aCellsSize = 3*aNbCells; - vtkCellArray* aConnectivity = vtkCellArray::New(); - aConnectivity->Allocate( aCellsSize, 0 ); - - vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); - aCellTypesArray->SetNumberOfComponents( 1 ); - aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); - - vtkIdList *anIdList = vtkIdList::New(); - anIdList->SetNumberOfIds(2); - - MultiConnection2D::MValues::const_iterator anIter = aValues.begin(); - for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){ - const MultiConnection2D::Value& aValue = (*anIter).first; - int aNode[2] = { - myVisualObj->GetNodeVTKId(aValue.myPntId[0]), - myVisualObj->GetNodeVTKId(aValue.myPntId[1]) - }; - if(aNode[0] >= 0 && aNode[1] >= 0){ - anIdList->SetId( 0, aNode[0] ); - anIdList->SetId( 1, aNode[1] ); - aConnectivity->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_LINE ); - aScalars->SetValue(aVtkId,(*anIter).second); - } - } - - vtkIntArray* aCellLocationsArray = vtkIntArray::New(); - aCellLocationsArray->SetNumberOfComponents( 1 ); - aCellLocationsArray->SetNumberOfTuples( aNbCells ); - - aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) - aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); - - aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); - SetUnstructuredGrid(aDataSet); - - aDataSet->GetCellData()->SetScalars(aScalars); - aScalars->Delete(); - - theLookupTable->SetRange(aScalars->GetRange()); - theLookupTable->Build(); - - myMergeFilter->SetScalars(aDataSet); - aDataSet->Delete(); - } - } - GetMapper()->SetScalarVisibility(anIsInitialized); - theScalarBarActor->SetVisibility(anIsInitialized); -} - -void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor) -{ - myExtractUnstructuredGrid->ClearRegisteredCells(); - myExtractUnstructuredGrid->ClearRegisteredCellsWithType(); - myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); - myVisualObj->UpdateFunctor(theFunctor); - - using namespace SMESH::Controls; - if(FreeBorders* aFreeBorders = dynamic_cast(theFunctor.get())){ - myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); - vtkIdType aNbCells = aGrid->GetNumberOfCells(); - for( vtkIdType i = 0; i < aNbCells; i++ ){ - vtkIdType anObjId = myVisualObj->GetElemObjId(i); - if(aFreeBorders->IsSatisfy(anObjId)) - myExtractUnstructuredGrid->RegisterCell(i); - } - if(!myExtractUnstructuredGrid->IsCellsRegistered()) - myExtractUnstructuredGrid->RegisterCell(-1); - SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); - }else if(FreeEdges* aFreeEdges = dynamic_cast(theFunctor.get())){ - SMESH::Controls::FreeEdges::TBorders aBorders; - aFreeEdges->GetBoreders(aBorders); - vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); - aDataSet->SetPoints(aGrid->GetPoints()); - - vtkIdType aNbCells = aBorders.size(); - vtkIdType aCellsSize = 3*aNbCells; - vtkCellArray* aConnectivity = vtkCellArray::New(); - aConnectivity->Allocate( aCellsSize, 0 ); - - vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); - aCellTypesArray->SetNumberOfComponents( 1 ); - aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); - - vtkIdList *anIdList = vtkIdList::New(); - anIdList->SetNumberOfIds(2); - - FreeEdges::TBorders::const_iterator anIter = aBorders.begin(); - for(; anIter != aBorders.end(); anIter++){ - const FreeEdges::Border& aBorder = *anIter; - int aNode[2] = { - myVisualObj->GetNodeVTKId(aBorder.myPntId[0]), - myVisualObj->GetNodeVTKId(aBorder.myPntId[1]) - }; - //cout<<"aNode = "<= 0 && aNode[1] >= 0){ - anIdList->SetId( 0, aNode[0] ); - anIdList->SetId( 1, aNode[1] ); - aConnectivity->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_LINE ); - } - } - - vtkIntArray* aCellLocationsArray = vtkIntArray::New(); - aCellLocationsArray->SetNumberOfComponents( 1 ); - aCellLocationsArray->SetNumberOfTuples( aNbCells ); - - aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) - aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); - - aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); - - SetUnstructuredGrid(aDataSet); - aDataSet->Delete(); - } -} - - - - -unsigned long int SMESH_DeviceActor::GetMTime(){ - unsigned long mTime = this->Superclass::GetMTime(); - mTime = max(mTime,myExtractGeometry->GetMTime()); - mTime = max(mTime,myExtractUnstructuredGrid->GetMTime()); - mTime = max(mTime,myMergeFilter->GetMTime()); - mTime = max(mTime,myGeomFilter->GetMTime()); - mTime = max(mTime,myTransformFilter->GetMTime()); - return mTime; -} - - -void SMESH_DeviceActor::SetTransform(VTKViewer_Transform* theTransform){ - myTransformFilter->SetTransform(theTransform); -} - - -void SMESH_DeviceActor::SetShrink() { - if ( !myIsShrinkable ) return; - if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() ) - { - myShrinkFilter->SetInput( aDataSet ); - myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() ); - myIsShrunk = true; - } -} - -void SMESH_DeviceActor::UnShrink() { - if ( !myIsShrunk ) return; - if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() ) - { - myPassFilter[ 1 ]->SetInput( aDataSet ); - myPassFilter[ 1 ]->Modified(); - myIsShrunk = false; - Modified(); - } -} - - -void SMESH_DeviceActor::SetRepresentation(EReperesent theMode){ - switch(theMode){ - case ePoint: - myGeomFilter->SetInside(true); - GetProperty()->SetRepresentation(0); - break; - case eInsideframe: - myGeomFilter->SetInside(true); - GetProperty()->SetRepresentation(1); - break; - default : - myGeomFilter->SetInside(false); - GetProperty()->SetRepresentation(theMode); - } - myRepresentation = theMode; - GetProperty()->Modified(); - myMapper->Modified(); - Modified(); -} - - -void SMESH_DeviceActor::SetVisibility(int theMode){ - if(!myExtractUnstructuredGrid->GetInput() || - GetUnstructuredGrid()->GetNumberOfCells()) - { - vtkLODActor::SetVisibility(theMode); - }else{ - vtkLODActor::SetVisibility(false); - } -} - - -int SMESH_DeviceActor::GetVisibility(){ - if(!GetUnstructuredGrid()->GetNumberOfCells()){ - vtkLODActor::SetVisibility(false); - } - return vtkLODActor::GetVisibility(); -} - - -int SMESH_DeviceActor::GetNodeObjId(int theVtkID){ - vtkIdType anID = theVtkID; - - if(IsImplicitFunctionUsed()) - anID = myExtractGeometry->GetNodeObjId(theVtkID); - - vtkIdType aRetID = myVisualObj->GetNodeObjId(anID); - if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "< -#include - -class vtkCell; -class vtkProperty; -class vtkMergeFilter; -class vtkShrinkFilter; -class vtkPolyDataMapper; -class vtkUnstructuredGrid; -class vtkScalarBarActor; -class vtkLookupTable; -class vtkImplicitBoolean; - -class VTKViewer_Transform; -class VTKViewer_TransformFilter; -class VTKViewer_PassThroughFilter; -class VTKViewer_ExtractUnstructuredGrid; - -class SMESH_ExtractGeometry; - - -class SMESH_DeviceActor: public vtkLODActor{ - friend class SMESH_ActorDef; - - public: - vtkTypeMacro(SMESH_DeviceActor,vtkLODActor); - static SMESH_DeviceActor* New(); - - void SetStoreClippingMapping(bool theStoreMapping); - void SetStoreGemetryMapping(bool theStoreMapping); - void SetStoreIDMapping(bool theStoreMapping); - - virtual int GetNodeObjId(int theVtkID); - virtual float* GetNodeCoord(int theObjID); - - virtual int GetElemObjId(int theVtkID); - virtual vtkCell* GetElemCell(int theObjID); - - virtual void SetTransform(VTKViewer_Transform* theTransform); - virtual unsigned long int GetMTime(); - - float GetShrinkFactor(); - void SetShrinkFactor(float value); - - bool IsShrunkable() { return myIsShrinkable;} - bool IsShrunk() { return myIsShrunk;} - void SetShrink(); - void UnShrink(); - - enum EReperesent { ePoint, eWireframe, eSurface, eInsideframe}; - EReperesent GetRepresentation(){ return myRepresentation;} - void SetRepresentation(EReperesent theMode); - - virtual void SetVisibility(int theMode); - virtual int GetVisibility(); - - VTKViewer_ExtractUnstructuredGrid* GetExtractUnstructuredGrid(); - vtkUnstructuredGrid* GetUnstructuredGrid(); - - void SetControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable); - void SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable); - void SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor); - - bool IsHighlited() { return myIsHighlited;} - void SetHighlited(bool theIsHighlited); - - virtual void Render(vtkRenderer *, vtkMapper *); - - void SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed); - bool IsImplicitFunctionUsed() const{ return myIsImplicitFunctionUsed;} - - protected: - void Init(TVisualObjPtr theVisualObj, vtkImplicitBoolean* theImplicitBoolean); - void SetUnstructuredGrid(vtkUnstructuredGrid* theGrid); - - vtkPolyDataMapper *myMapper; - TVisualObjPtr myVisualObj; - - vtkProperty *myProperty; - EReperesent myRepresentation; - - SMESH_ExtractGeometry* myExtractGeometry; - bool myIsImplicitFunctionUsed; - - vtkMergeFilter* myMergeFilter; - VTKViewer_ExtractUnstructuredGrid* myExtractUnstructuredGrid; - - bool myStoreClippingMapping; - VTKViewer_GeometryFilter *myGeomFilter; - VTKViewer_TransformFilter *myTransformFilter; - std::vector myPassFilter; - - vtkShrinkFilter* myShrinkFilter; - bool myIsShrinkable; - bool myIsShrunk; - - bool myIsHighlited; - - float myPolygonOffsetFactor; - float myPolygonOffsetUnits; - - void SetPolygonOffsetParameters(float factor, float units); - void GetPolygonOffsetParameters(float& factor, float& units){ - factor = myPolygonOffsetFactor; - units = myPolygonOffsetUnits; - } - - SMESH_DeviceActor(); - ~SMESH_DeviceActor(); - SMESH_DeviceActor(const SMESH_DeviceActor&); - void operator=(const SMESH_DeviceActor&); - -}; - - -#endif //SMESH_DEVICE_ACTOR_H diff --git a/src/OBJECT/SMESH_ExtractGeometry.cxx b/src/OBJECT/SMESH_ExtractGeometry.cxx deleted file mode 100644 index 84812a142..000000000 --- a/src/OBJECT/SMESH_ExtractGeometry.cxx +++ /dev/null @@ -1,254 +0,0 @@ -// 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 - - -#include "SMESH_ExtractGeometry.h" - -#include "vtkCell.h" -#include "vtkCellData.h" -#include "vtkFloatArray.h" -#include "vtkIdList.h" -#include "vtkImplicitFunction.h" -#include "vtkObjectFactory.h" -#include "vtkPointData.h" -#include "vtkUnstructuredGrid.h" - -using namespace std; - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -#if defined __GNUC__ - #if __GNUC__ == 2 - #define __GNUC_2__ - #endif -#endif - - -vtkStandardNewMacro(SMESH_ExtractGeometry); - - -SMESH_ExtractGeometry::SMESH_ExtractGeometry() -{} - - -SMESH_ExtractGeometry::~SMESH_ExtractGeometry(){} - - -vtkIdType SMESH_ExtractGeometry::GetElemObjId(int theVtkID){ - if(myElemVTK2ObjIds.empty() || theVtkID > myElemVTK2ObjIds.size()) return -1; -#if defined __GNUC_2__ - return myElemVTK2ObjIds[theVtkID]; -#else - return myElemVTK2ObjIds.at(theVtkID); -#endif -} - - -vtkIdType SMESH_ExtractGeometry::GetNodeObjId(int theVtkID){ - if(myNodeVTK2ObjIds.empty() || theVtkID > myNodeVTK2ObjIds.size()) return -1; -#if defined __GNUC_2__ - return myNodeVTK2ObjIds[theVtkID]; -#else - return myNodeVTK2ObjIds.at(theVtkID); -#endif -} - - -void SMESH_ExtractGeometry::Execute() -{ - vtkIdType ptId, numPts, numCells, i, cellId, newCellId, newId, *pointMap; - vtkIdList *cellPts; - vtkCell *cell; - int numCellPts; - float *x; - float multiplier; - vtkPoints *newPts; - vtkIdList *newCellPts; - vtkDataSet *input = this->GetInput(); - vtkPointData *pd = input->GetPointData(); - vtkCellData *cd = input->GetCellData(); - vtkUnstructuredGrid *output = this->GetOutput(); - vtkPointData *outputPD = output->GetPointData(); - vtkCellData *outputCD = output->GetCellData(); - int npts; - numCells = input->GetNumberOfCells(); - numPts = input->GetNumberOfPoints(); - - vtkDebugMacro(<< "Extracting geometry"); - - if ( ! this->ImplicitFunction ) - { - vtkErrorMacro(<<"No implicit function specified"); - return; - } - - newCellPts = vtkIdList::New(); - newCellPts->Allocate(VTK_CELL_SIZE); - - if ( this->ExtractInside ) - { - multiplier = 1.0; - } - else - { - multiplier = -1.0; - } - - // Loop over all points determining whether they are inside the - // implicit function. Copy the points and point data if they are. - // - pointMap = new vtkIdType[numPts]; // maps old point ids into new - for (i=0; i < numPts; i++) - { - pointMap[i] = -1; - } - - output->Allocate(numCells/4); //allocate storage for geometry/topology - newPts = vtkPoints::New(); - newPts->Allocate(numPts/4,numPts); - outputPD->CopyAllocate(pd); - outputCD->CopyAllocate(cd); - vtkFloatArray *newScalars = NULL; - - if(myStoreMapping){ - myElemVTK2ObjIds.clear(); - myElemVTK2ObjIds.reserve(numCells); - myNodeVTK2ObjIds.clear(); - myNodeVTK2ObjIds.reserve(numPts); - } - - if ( ! this->ExtractBoundaryCells ) - { - for ( ptId=0; ptId < numPts; ptId++ ) - { - x = input->GetPoint(ptId); - if ( (this->ImplicitFunction->FunctionValue(x)*multiplier) < 0.0 ) - { - newId = newPts->InsertNextPoint(x); - pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); - outputPD->CopyData(pd,ptId,newId); - } - } - } - else - { - // To extract boundary cells, we have to create supplemental information - if ( this->ExtractBoundaryCells ) - { - float val; - newScalars = vtkFloatArray::New(); - newScalars->SetNumberOfValues(numPts); - - for (ptId=0; ptId < numPts; ptId++ ) - { - x = input->GetPoint(ptId); - val = this->ImplicitFunction->FunctionValue(x) * multiplier; - newScalars->SetValue(ptId, val); - if ( val < 0.0 ) - { - newId = newPts->InsertNextPoint(x); - pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); - outputPD->CopyData(pd,ptId,newId); - } - } - } - } - - // Now loop over all cells to see whether they are inside implicit - // function (or on boundary if ExtractBoundaryCells is on). - // - for (cellId=0; cellId < numCells; cellId++) - { - cell = input->GetCell(cellId); - cellPts = cell->GetPointIds(); - numCellPts = cell->GetNumberOfPoints(); - - newCellPts->Reset(); - if ( ! this->ExtractBoundaryCells ) //requires less work - { - for ( npts=0, i=0; i < numCellPts; i++, npts++) - { - ptId = cellPts->GetId(i); - if ( pointMap[ptId] < 0 ) - { - break; //this cell won't be inserted - } - else - { - newCellPts->InsertId(i,pointMap[ptId]); - } - } - } //if don't want to extract boundary cells - - else //want boundary cells - { - for ( npts=0, i=0; i < numCellPts; i++ ) - { - ptId = cellPts->GetId(i); - if ( newScalars->GetValue(ptId) <= 0.0 ) - { - npts++; - } - } - if ( npts > 0 ) - { - for ( i=0; i < numCellPts; i++ ) - { - ptId = cellPts->GetId(i); - if ( pointMap[ptId] < 0 ) - { - x = input->GetPoint(ptId); - newId = newPts->InsertNextPoint(x); - pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); - outputPD->CopyData(pd,ptId,newId); - } - newCellPts->InsertId(i,pointMap[ptId]); - } - }//a boundary or interior cell - }//if mapping boundary cells - - if ( npts >= numCellPts || (this->ExtractBoundaryCells && npts > 0) ) - { - newCellId = output->InsertNextCell(cell->GetCellType(),newCellPts); - myElemVTK2ObjIds.push_back(cellId); - outputCD->CopyData(cd,cellId,newCellId); - } - }//for all cells - - // Update ourselves and release memory - // - delete [] pointMap; - newCellPts->Delete(); - output->SetPoints(newPts); - newPts->Delete(); - - if ( this->ExtractBoundaryCells ) - { - newScalars->Delete(); - } - - output->Squeeze(); -} diff --git a/src/OBJECT/SMESH_ExtractGeometry.h b/src/OBJECT/SMESH_ExtractGeometry.h deleted file mode 100644 index 794229516..000000000 --- a/src/OBJECT/SMESH_ExtractGeometry.h +++ /dev/null @@ -1,61 +0,0 @@ -// 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 - -#ifndef SALOME_ExtractGeometry_HeaderFile -#define SALOME_ExtractGeometry_HeaderFile - -#include -#include - - -class SMESH_ExtractGeometry : public vtkExtractGeometry{ -public: - vtkTypeMacro(SMESH_ExtractGeometry,vtkExtractGeometry); - - static SMESH_ExtractGeometry *New(); - - void SetStoreMapping(bool theStoreMapping){ - myStoreMapping = theStoreMapping; - Modified(); - } - bool GetStoreMapping(){ return myStoreMapping;} - - virtual vtkIdType GetNodeObjId(int theVtkID); - virtual vtkIdType GetElemObjId(int theVtkID); - -protected: - SMESH_ExtractGeometry(); - ~SMESH_ExtractGeometry(); - - void Execute(); - -private: - bool myStoreMapping; - typedef std::vector TVectorId; - TVectorId myElemVTK2ObjIds; - TVectorId myNodeVTK2ObjIds; - - SMESH_ExtractGeometry(const SMESH_ExtractGeometry&); // Not implemented. - void operator=(const SMESH_ExtractGeometry&); // Not implemented. -}; - - -#endif - - diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx deleted file mode 100644 index 885ee3de3..000000000 --- a/src/OBJECT/SMESH_Object.cxx +++ /dev/null @@ -1,1270 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// 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 : SMESH_Grid.cxx -// Author : Nicolas REJNERI -// Module : SMESH - -#include "SMESH_ObjectDef.h" -#include "SMESH_ActorUtils.h" - -#include "SMDS_Mesh.hxx" -#include "SMESH_Actor.h" -#include "SMESH_ControlsDef.hxx" -#include - -#include CORBA_SERVER_HEADER(SALOME_Exception) - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include "utilities.h" - -using namespace std; - -#ifndef EXCEPTION -#define EXCEPTION(TYPE, MSG) {\ - std::ostringstream aStream;\ - aStream<<__FILE__<<"["<<__LINE__<<"]::"<FindNode(theId)) return anElem; - EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<FindElement(theId)) return anElem; - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot find a SMDS_MeshElement for ID = "<AddNodeWithID(aCoords[aCoordId], - aCoords[aCoordId+1], - aCoords[aCoordId+2], - anIndexes[anElemId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddNodeWithID for ID = "<AddEdgeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<AddFaceWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<AddFaceWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "< nodes_ids (aNbNodes); - for (int i = 0; i < aNbNodes; i++) { - nodes_ids[i] = anIndexes[anIndexId++]; - } - - SMDS_MeshElement* anElem = theMesh->AddPolygonalFaceWithID(nodes_ids, aFaceId); - if (!anElem) - EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolygonalFaceWithID for ID = " - << anElemId); - } - } - - - inline void AddTetrasWithID(SMDS_Mesh* theMesh, - SMESH::log_array_var& theSeq, - CORBA::Long theId) - { - const SMESH::long_array& anIndexes = theSeq[theId].indexes; - CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number; - if(5*aNbElems != anIndexes.length()) - EXCEPTION(runtime_error,"AddEdgeWithID - 5*aNbElems != anIndexes.length()"); - for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){ - SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<AddVolumeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId+5], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<AddVolumeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId+5], - anIndexes[anIndexId+6], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<AddVolumeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId+5], - anIndexes[anIndexId+6], - anIndexes[anIndexId+7], - anIndexes[anIndexId+8], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "< nodes_ids (aNbNodes); - for (int i = 0; i < aNbNodes; i++) { - nodes_ids[i] = anIndexes[anIndexId++]; - } - - int aNbFaces = anIndexes[anIndexId++]; - std::vector quantities (aNbFaces); - for (int i = 0; i < aNbFaces; i++) { - quantities[i] = anIndexes[anIndexId++]; - } - - SMDS_MeshElement* anElem = - theMesh->AddPolyhedralVolumeWithID(nodes_ids, quantities, aFaceId); - if (!anElem) - EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolyhedralVolumeWithID for ID = " - << anElemId); - } - } - - - inline void ChangePolyhedronNodes (SMDS_Mesh* theMesh, - SMESH::log_array_var& theSeq, - CORBA::Long theId) - { - const SMESH::long_array& anIndexes = theSeq[theId].indexes; - CORBA::Long iind = 0, aNbElems = theSeq[theId].number; - - for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) - { - // find element - const SMDS_MeshElement* elem = FindElement(theMesh, anIndexes[iind++]); - // nb nodes - int nbNodes = anIndexes[iind++]; - // nodes - std::vector aNodes (nbNodes); - for (int iNode = 0; iNode < nbNodes; iNode++) { - aNodes[iNode] = FindNode(theMesh, anIndexes[iind++]); - } - // nb faces - int nbFaces = anIndexes[iind++]; - // quantities - std::vector quantities (nbFaces); - for (int iFace = 0; iFace < nbFaces; iFace++) { - quantities[iFace] = anIndexes[iind++]; - } - // change - theMesh->ChangePolyhedronNodes(elem, aNodes, quantities); - } - } - - -} -/* - Class : SMESH_VisualObjDef - Description : Base class for all mesh objects to be visuilised -*/ - -//================================================================================= -// function : getCellType -// purpose : Get type of VTK cell -//================================================================================= -static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, - const bool thePoly, - const int theNbNodes ) -{ - switch( theType ) - { - case SMDSAbs_Edge: - return theNbNodes == 2 ? VTK_LINE : VTK_EMPTY_CELL; - - case SMDSAbs_Face : - if (thePoly && theNbNodes>2 ) return VTK_POLYGON; - else if ( theNbNodes == 3 ) return VTK_TRIANGLE; - else if ( theNbNodes == 4 ) return VTK_QUAD; - else return VTK_EMPTY_CELL; - - case SMDSAbs_Volume: - if (thePoly && theNbNodes>3 ) return VTK_CONVEX_POINT_SET; - else if ( theNbNodes == 4 ) return VTK_TETRA; - else if ( theNbNodes == 5 ) return VTK_PYRAMID; - else if ( theNbNodes == 6 ) return VTK_WEDGE; - else if ( theNbNodes == 8 ) return VTK_HEXAHEDRON; - else return VTK_EMPTY_CELL; - - default: return VTK_EMPTY_CELL; - } -} - -//================================================================================= -// functions : SMESH_VisualObjDef -// purpose : Constructor -//================================================================================= -SMESH_VisualObjDef::SMESH_VisualObjDef() -{ - myGrid = vtkUnstructuredGrid::New(); -} -SMESH_VisualObjDef::~SMESH_VisualObjDef() -{ - if ( MYDEBUG ) - MESSAGE( "~SMESH_MeshObj - myGrid->GetReferenceCount() = " << myGrid->GetReferenceCount() ); - myGrid->Delete(); -} - -//================================================================================= -// functions : GetNodeObjId, GetNodeVTKId, GetElemObjId, GetElemVTKId -// purpose : Methods for retrieving VTK IDs by SMDS IDs and vice versa -//================================================================================= -vtkIdType SMESH_VisualObjDef::GetNodeObjId( int theVTKID ) -{ - return myVTK2SMDSNodes.find(theVTKID) == myVTK2SMDSNodes.end() ? -1 : myVTK2SMDSNodes[theVTKID]; -} - -vtkIdType SMESH_VisualObjDef::GetNodeVTKId( int theObjID ) -{ - return mySMDS2VTKNodes.find(theObjID) == mySMDS2VTKNodes.end() ? -1 : mySMDS2VTKNodes[theObjID]; -} - -vtkIdType SMESH_VisualObjDef::GetElemObjId( int theVTKID ) -{ - return myVTK2SMDSElems.find(theVTKID) == myVTK2SMDSElems.end() ? -1 : myVTK2SMDSElems[theVTKID]; -} - -vtkIdType SMESH_VisualObjDef::GetElemVTKId( int theObjID ) -{ - return mySMDS2VTKElems.find(theObjID) == mySMDS2VTKElems.end() ? -1 : mySMDS2VTKElems[theObjID]; -} - -//================================================================================= -// function : SMESH_VisualObjDef::createPoints -// purpose : Create points from nodes -//================================================================================= -void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) -{ - if ( thePoints == 0 ) - return; - - TEntityList aNodes; - vtkIdType nbNodes = GetEntities( SMDSAbs_Node, aNodes ); - thePoints->SetNumberOfPoints( nbNodes ); - - int nbPoints = 0; - - TEntityList::const_iterator anIter; - for ( anIter = aNodes.begin(); anIter != aNodes.end(); ++anIter ) - { - const SMDS_MeshNode* aNode = ( const SMDS_MeshNode* )(*anIter); - if ( aNode != 0 ) - { - thePoints->SetPoint( nbPoints, aNode->X(), aNode->Y(), aNode->Z() ); - int anId = aNode->GetID(); - mySMDS2VTKNodes.insert( TMapOfIds::value_type( anId, nbPoints ) ); - myVTK2SMDSNodes.insert( TMapOfIds::value_type( nbPoints, anId ) ); - nbPoints++; - } - } - - if ( nbPoints != nbNodes ) - thePoints->SetNumberOfPoints( nbPoints ); -} - -//================================================================================= -// function : buildPrs -// purpose : create VTK cells( fill unstructured grid ) -//================================================================================= -void SMESH_VisualObjDef::buildPrs() -{ - try - { - mySMDS2VTKNodes.clear(); - myVTK2SMDSNodes.clear(); - mySMDS2VTKElems.clear(); - myVTK2SMDSElems.clear(); - - if ( IsNodePrs() ) - buildNodePrs(); - else - buildElemPrs(); - } - catch( const std::exception& exc ) - { - INFOS("Follow exception was cought:\n\t"<GetNumberOfCells() = "<GetNumberOfCells() ); - if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" ); -} - -//================================================================================= -// function : buildNodePrs -// purpose : create VTK cells for nodes -//================================================================================= -void SMESH_VisualObjDef::buildNodePrs() -{ - vtkPoints* aPoints = vtkPoints::New(); - createPoints( aPoints ); - myGrid->SetPoints( aPoints ); - aPoints->Delete(); - - myGrid->SetCells( 0, 0, 0 ); - - // Create cells - /* - int nbPoints = aPoints->GetNumberOfPoints(); - vtkIdList *anIdList = vtkIdList::New(); - anIdList->SetNumberOfIds( 1 ); - - vtkCellArray *aCells = vtkCellArray::New(); - aCells->Allocate( 2 * nbPoints, 0 ); - - vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); - aCellTypesArray->SetNumberOfComponents( 1 ); - aCellTypesArray->Allocate( nbPoints ); - - for( vtkIdType aCellId = 0; aCellId < nbPoints; aCellId++ ) - { - anIdList->SetId( 0, aCellId ); - aCells->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_VERTEX ); - } - - vtkIntArray* aCellLocationsArray = vtkIntArray::New(); - aCellLocationsArray->SetNumberOfComponents( 1 ); - aCellLocationsArray->SetNumberOfTuples( nbPoints ); - - aCells->InitTraversal(); - for( vtkIdType i = 0, *pts, npts; aCells->GetNextCell( npts, pts ); i++ ) - aCellLocationsArray->SetValue( i, aCells->GetTraversalLocation( npts ) ); - - myGrid->SetCells( aCellTypesArray, aCellLocationsArray, aCells ); - - aCellLocationsArray->Delete(); - aCellTypesArray->Delete(); - aCells->Delete(); - anIdList->Delete(); - */ -} - -//================================================================================= -// function : buildElemPrs -// purpose : Create VTK cells for elements -//================================================================================= - -namespace{ - typedef std::vector TConnect; - - int GetConnect(const SMDS_ElemIteratorPtr& theNodesIter, - TConnect& theConnect) - { - theConnect.clear(); - for(; theNodesIter->more();) - theConnect.push_back(theNodesIter->next()); - return theConnect.size(); - } - - inline - void SetId(vtkIdList *theIdList, - const SMESH_VisualObjDef::TMapOfIds& theSMDS2VTKNodes, - const TConnect& theConnect, - int thePosition, - int theId) - { - theIdList->SetId(thePosition,theSMDS2VTKNodes.find(theConnect[theId]->GetID())->second); - } - -} - - -void SMESH_VisualObjDef::buildElemPrs() -{ - // Create points - - vtkPoints* aPoints = vtkPoints::New(); - createPoints( aPoints ); - myGrid->SetPoints( aPoints ); - aPoints->Delete(); - - if ( MYDEBUG ) - MESSAGE("Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints()); - - // Calculate cells size - - static SMDSAbs_ElementType aTypes[ 3 ] = { SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume }; - - // get entity data - map nbEnts; - map anEnts; - - for ( int i = 0; i <= 2; i++ ) - nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] ); - - vtkIdType aCellsSize = 3 * nbEnts[ SMDSAbs_Edge ]; - - for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes - { - if ( nbEnts[ aTypes[ i ] ] ) - { - const TEntityList& aList = anEnts[ aTypes[ i ] ]; - TEntityList::const_iterator anIter; - for ( anIter = aList.begin(); anIter != aList.end(); ++anIter ) - aCellsSize += (*anIter)->NbNodes() + 1; - } - } - - vtkIdType aNbCells = nbEnts[ SMDSAbs_Edge ] + nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ]; - - if ( MYDEBUG ) - MESSAGE( "Update - aNbCells = "<_is_nil() = "<_is_nil()); - - myMeshServer = SMESH::SMESH_Mesh::_duplicate( theMesh ); - myMeshServer->Register(); - myMesh = new SMDS_Mesh(); -} - -//================================================================================= -// function : ~SMESH_MeshObj -// purpose : Destructor -//================================================================================= -SMESH_MeshObj::~SMESH_MeshObj() -{ - myMeshServer->Destroy(); - delete myMesh; -} - -//================================================================================= -// function : Update -// purpose : Update mesh and fill grid with new values if necessary -//================================================================================= -void SMESH_MeshObj::Update( int theIsClear ) -{ - // Update SMDS_Mesh on client part - - try - { - SMESH::log_array_var aSeq = myMeshServer->GetLog( theIsClear ); - CORBA::Long aLength = aSeq->length(); - - if( MYDEBUG ) MESSAGE( "Update: length of the script is "<RemoveNode( FindNode( myMesh, anIndexes[anElemId] ) ); - break; - - case SMESH::REMOVE_ELEMENT: - for( ; anElemId < aNbElems; anElemId++ ) - myMesh->RemoveElement( FindElement( myMesh, anIndexes[anElemId] ) ); - break; - - case SMESH::MOVE_NODE: - for(CORBA::Long aCoordId=0; anElemId < aNbElems; anElemId++, aCoordId+=3) - { - SMDS_MeshNode* node = - const_cast( FindNode( myMesh, anIndexes[anElemId] )); - node->setXYZ( aCoords[aCoordId], aCoords[aCoordId+1], aCoords[aCoordId+2] ); - } - break; - - case SMESH::CHANGE_ELEMENT_NODES: - for ( CORBA::Long i = 0; anElemId < aNbElems; anElemId++ ) - { - // find element - const SMDS_MeshElement* elem = FindElement( myMesh, anIndexes[i++] ); - // nb nodes - int nbNodes = anIndexes[i++]; - // nodes - //ASSERT( nbNodes < 9 ); - const SMDS_MeshNode* aNodes[ nbNodes ]; - for ( int iNode = 0; iNode < nbNodes; iNode++ ) - aNodes[ iNode ] = FindNode( myMesh, anIndexes[i++] ); - // change - myMesh->ChangeElementNodes( elem, aNodes, nbNodes ); - } - break; - - case SMESH::CHANGE_POLYHEDRON_NODES: - ChangePolyhedronNodes(myMesh, aSeq, anId); - break; - case SMESH::RENUMBER: - for(CORBA::Long i=0; anElemId < aNbElems; anElemId++, i+=3) - { - myMesh->Renumber( anIndexes[i], anIndexes[i+1], anIndexes[i+2] ); - } - break; - - default:; - } - } - } - catch ( SALOME::SALOME_Exception& exc ) - { - INFOS("Following exception was cought:\n\t"<NbNodes() = "<NbNodes()); - MESSAGE("Update - myMesh->NbEdges() = "<NbEdges()); - MESSAGE("Update - myMesh->NbFaces() = "<NbFaces()); - MESSAGE("Update - myMesh->NbVolumes() = "<NbVolumes()); - } - - // Fill unstructured grid - buildPrs(); -} - -//================================================================================= -// function : GetElemDimension -// purpose : Get dimension of element -//================================================================================= -int SMESH_MeshObj::GetElemDimension( const int theObjId ) -{ - const SMDS_MeshElement* anElem = myMesh->FindElement( theObjId ); - if ( anElem == 0 ) - return 0; - - int aType = anElem->GetType(); - switch ( aType ) - { - case SMDSAbs_Edge : return 1; - case SMDSAbs_Face : return 2; - case SMDSAbs_Volume: return 3; - default : return 0; - } -} - -//================================================================================= -// function : GetEntities -// purpose : Get entities of specified type. Return number of entities -//================================================================================= -int SMESH_MeshObj::GetNbEntities( const SMDSAbs_ElementType theType) const -{ - switch ( theType ) - { - case SMDSAbs_Node: - { - return myMesh->NbNodes(); - } - break; - case SMDSAbs_Edge: - { - return myMesh->NbEdges(); - } - break; - case SMDSAbs_Face: - { - return myMesh->NbFaces(); - } - break; - case SMDSAbs_Volume: - { - return myMesh->NbVolumes(); - } - break; - default: - return 0; - break; - } -} - -int SMESH_MeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theObjs ) const -{ - theObjs.clear(); - - switch ( theType ) - { - case SMDSAbs_Node: - { - SMDS_NodeIteratorPtr anIter = myMesh->nodesIterator(); - while ( anIter->more() ) theObjs.push_back( anIter->next() ); - } - break; - case SMDSAbs_Edge: - { - SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); - while ( anIter->more() ) theObjs.push_back( anIter->next() ); - } - break; - case SMDSAbs_Face: - { - SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); - while ( anIter->more() ) theObjs.push_back( anIter->next() ); - } - break; - case SMDSAbs_Volume: - { - SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator(); - while ( anIter->more() ) theObjs.push_back( anIter->next() ); - } - break; - default: - break; - } - - return theObjs.size(); -} - -//================================================================================= -// function : UpdateFunctor -// purpose : Update functor in accordance with current mesh -//================================================================================= -void SMESH_MeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) -{ - theFunctor->SetMesh( GetMesh() ); -} - -//================================================================================= -// function : IsNodePrs -// purpose : Return true if node presentation is used -//================================================================================= -bool SMESH_MeshObj::IsNodePrs() const -{ - return myMesh->NbEdges() == 0 &&myMesh->NbFaces() == 0 &&myMesh->NbVolumes() == 0 ; -} - - -/* - Class : SMESH_SubMeshObj - Description : Base class for visualisation of submeshes and groups -*/ - -//================================================================================= -// function : SMESH_SubMeshObj -// purpose : Constructor -//================================================================================= -SMESH_SubMeshObj::SMESH_SubMeshObj( SMESH_MeshObj* theMeshObj ) -{ - if ( MYDEBUG ) MESSAGE( "SMESH_SubMeshObj - theMeshObj = " << theMeshObj ); - - myMeshObj = theMeshObj; -} - -SMESH_SubMeshObj::~SMESH_SubMeshObj() -{ -} - -//================================================================================= -// function : GetElemDimension -// purpose : Get dimension of element -//================================================================================= -int SMESH_SubMeshObj::GetElemDimension( const int theObjId ) -{ - return myMeshObj == 0 ? 0 : myMeshObj->GetElemDimension( theObjId ); -} - -//================================================================================= -// function : UpdateFunctor -// purpose : Update functor in accordance with current mesh -//================================================================================= -void SMESH_SubMeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) -{ - theFunctor->SetMesh( myMeshObj->GetMesh() ); -} - -//================================================================================= -// function : Update -// purpose : Update mesh object and fill grid with new values -//================================================================================= -void SMESH_SubMeshObj::Update( int theIsClear ) -{ - myMeshObj->Update( theIsClear ); - buildPrs(); -} - - -/* - Class : SMESH_GroupObj - Description : Class for visualisation of groups -*/ - -//================================================================================= -// function : SMESH_GroupObj -// purpose : Constructor -//================================================================================= -SMESH_GroupObj::SMESH_GroupObj( SMESH::SMESH_GroupBase_ptr theGroup, - SMESH_MeshObj* theMeshObj ) -: SMESH_SubMeshObj( theMeshObj ), - myGroupServer( SMESH::SMESH_GroupBase::_duplicate(theGroup) ) -{ - if ( MYDEBUG ) MESSAGE("SMESH_GroupObj - theGroup->_is_nil() = "<_is_nil()); - myGroupServer->Register(); -} - -SMESH_GroupObj::~SMESH_GroupObj() -{ - if ( MYDEBUG ) MESSAGE("~SMESH_GroupObj"); - myGroupServer->Destroy(); -} - -//================================================================================= -// function : IsNodePrs -// purpose : Return true if node presentation is used -//================================================================================= -bool SMESH_GroupObj::IsNodePrs() const -{ - return myGroupServer->GetType() == SMESH::NODE; -} - -//================================================================================= -// function : getNodesFromElems -// purpose : Retrieve nodes from elements -//================================================================================= -static int getNodesFromElems( SMESH::long_array_var& theElemIds, - const SMDS_Mesh* theMesh, - std::list& theResList ) -{ - set aNodeSet; - - for ( CORBA::Long i = 0, n = theElemIds->length(); i < n; i++ ) - { - const SMDS_MeshElement* anElem = theMesh->FindElement( theElemIds[ i ] ); - if ( anElem != 0 ) - { - SMDS_ElemIteratorPtr anIter = anElem->nodesIterator(); - while ( anIter->more() ) - { - const SMDS_MeshElement* aNode = anIter->next(); - if ( aNode != 0 ) - aNodeSet.insert( aNode ); - } - } - } - - set::const_iterator anIter; - for ( anIter = aNodeSet.begin(); anIter != aNodeSet.end(); ++anIter ) - theResList.push_back( *anIter ); - - return theResList.size(); -} - -//================================================================================= -// function : getPointers -// purpose : Get std::list from list of IDs -//================================================================================= -static int getPointers( const SMDSAbs_ElementType theRequestType, - SMESH::long_array_var& theElemIds, - const SMDS_Mesh* theMesh, - std::list& theResList ) -{ - for ( CORBA::Long i = 0, n = theElemIds->length(); i < n; i++ ) - { - const SMDS_MeshElement* anElem = theRequestType == SMDSAbs_Node - ? theMesh->FindNode( theElemIds[ i ] ) : theMesh->FindElement( theElemIds[ i ] ); - - if ( anElem != 0 ) - theResList.push_back( anElem ); - } - - return theResList.size(); -} - - -//================================================================================= -// function : GetEntities -// purpose : Get entities of specified type. Return number of entities -//================================================================================= -int SMESH_GroupObj::GetNbEntities( const SMDSAbs_ElementType theType) const -{ - if(SMDSAbs_ElementType(myGroupServer->GetType()) == theType){ - return myGroupServer->Size(); - } - return 0; -} - -int SMESH_GroupObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList ) const -{ - theResList.clear(); - SMDS_Mesh* aMesh = myMeshObj->GetMesh(); - - if ( myGroupServer->Size() == 0 || aMesh == 0 ) - return 0; - - SMDSAbs_ElementType aGrpType = SMDSAbs_ElementType(myGroupServer->GetType()); - SMESH::long_array_var anIds = myGroupServer->GetListOfID(); - - if ( aGrpType == theType ) - return getPointers( theType, anIds, aMesh, theResList ); - else if ( theType == SMDSAbs_Node ) - return getNodesFromElems( anIds, aMesh, theResList ); - else - return 0; -} - - - -/* - Class : SMESH_subMeshObj - Description : Class for visualisation of submeshes -*/ - -//================================================================================= -// function : SMESH_subMeshObj -// purpose : Constructor -//================================================================================= -SMESH_subMeshObj::SMESH_subMeshObj( SMESH::SMESH_subMesh_ptr theSubMesh, - SMESH_MeshObj* theMeshObj ) -: SMESH_SubMeshObj( theMeshObj ), - mySubMeshServer( SMESH::SMESH_subMesh::_duplicate( theSubMesh ) ) -{ - if ( MYDEBUG ) MESSAGE( "SMESH_subMeshObj - theSubMesh->_is_nil() = " << theSubMesh->_is_nil() ); - - mySubMeshServer->Register(); -} - -SMESH_subMeshObj::~SMESH_subMeshObj() -{ - if ( MYDEBUG ) MESSAGE( "~SMESH_subMeshObj" ); - mySubMeshServer->Destroy(); -} - -//================================================================================= -// function : GetEntities -// purpose : Get entities of specified type. Return number of entities -//================================================================================= -int SMESH_subMeshObj::GetNbEntities( const SMDSAbs_ElementType theType) const -{ - switch ( theType ) - { - case SMDSAbs_Node: - { - return mySubMeshServer->GetNumberOfNodes( false ); - } - break; - case SMDSAbs_Edge: - case SMDSAbs_Face: - case SMDSAbs_Volume: - { - SMESH::long_array_var anIds = - mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); - return anIds->length(); - } - default: - return 0; - break; - } -} - -int SMESH_subMeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList ) const -{ - theResList.clear(); - - SMDS_Mesh* aMesh = myMeshObj->GetMesh(); - if ( aMesh == 0 ) - return 0; - - bool isNodal = IsNodePrs(); - - if ( isNodal ) - { - if ( theType == SMDSAbs_Node ) - { - SMESH::long_array_var anIds = mySubMeshServer->GetNodesId(); - return getPointers( SMDSAbs_Node, anIds, aMesh, theResList ); - } - } - else - { - if ( theType == SMDSAbs_Node ) - { - SMESH::long_array_var anIds = mySubMeshServer->GetElementsId(); - return getNodesFromElems( anIds, aMesh, theResList ); - } - else - { - SMESH::long_array_var anIds = - mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); - return getPointers( theType, anIds, aMesh, theResList ); - } - } - - return 0; -} - -//================================================================================= -// function : IsNodePrs -// purpose : Return true if node presentation is used -//================================================================================= -bool SMESH_subMeshObj::IsNodePrs() const -{ - return mySubMeshServer->GetNumberOfElements() == 0; -} - - - - - - - - - - - - diff --git a/src/OBJECT/SMESH_Object.h b/src/OBJECT/SMESH_Object.h deleted file mode 100644 index aea4f778e..000000000 --- a/src/OBJECT/SMESH_Object.h +++ /dev/null @@ -1,70 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// 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 : SMESH_Object.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESH_OBJECT_H -#define SMESH_OBJECT_H - -#include -#include - -#include "SMESH_Controls.hxx" -#include "SMDSAbs_ElementType.hxx" - -class SMDS_Mesh; -class vtkUnstructuredGrid; - -/* - Class : SMESH_VisualObj - Description : Base class for all mesh objects to be visuilised -*/ -class SMESH_VisualObj -{ -public: - virtual void Update( int theIsClear = true ) = 0; - virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) = 0; - virtual int GetElemDimension( const int theObjId ) = 0; - - virtual int GetNbEntities( const SMDSAbs_ElementType theType) const = 0; - virtual SMDS_Mesh* GetMesh() const = 0; - - virtual bool GetEdgeNodes( const int theElemId, - const int theEdgeNum, - int& theNodeId1, - int& theNodeId2 ) const = 0; - - virtual vtkUnstructuredGrid* GetUnstructuredGrid() = 0; - - virtual vtkIdType GetNodeObjId( int theVTKID ) = 0; - virtual vtkIdType GetNodeVTKId( int theObjID ) = 0; - virtual vtkIdType GetElemObjId( int theVTKID ) = 0; - virtual vtkIdType GetElemVTKId( int theObjID ) = 0; -}; - -typedef boost::shared_ptr TVisualObjPtr; - -#endif diff --git a/src/OBJECT/SMESH_ObjectDef.h b/src/OBJECT/SMESH_ObjectDef.h deleted file mode 100644 index 134b47b10..000000000 --- a/src/OBJECT/SMESH_ObjectDef.h +++ /dev/null @@ -1,202 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// 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 : SMESH_Object.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESH_OBJECTDEF_H -#define SMESH_OBJECTDEF_H - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Group) - -#include -#include - -#include "SMESH_Controls.hxx" -#include "SMESH_Object.h" - -class vtkPoints; -class SALOME_ExtractUnstructuredGrid; - -class SMESH_Actor; -class SMDS_MeshNode; -class SMDS_MeshElement; - -/* - Class : SMESH_VisualObj - Description : Base class for all mesh objects to be visuilised -*/ -class SMESH_VisualObjDef: public SMESH_VisualObj -{ -public: - typedef std::list TEntityList; - typedef std::map TMapOfIds; - - SMESH_VisualObjDef(); - virtual ~SMESH_VisualObjDef(); - - virtual void Update( int theIsClear = true ) = 0; - virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) = 0; - virtual int GetElemDimension( const int theObjId ) = 0; - - virtual int GetNbEntities( const SMDSAbs_ElementType theType) const = 0; - virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const = 0; - virtual bool IsNodePrs() const = 0; - virtual SMDS_Mesh* GetMesh() const = 0; - - virtual bool GetEdgeNodes( const int theElemId, - const int theEdgeNum, - int& theNodeId1, - int& theNodeId2 ) const; - - virtual vtkUnstructuredGrid* GetUnstructuredGrid() { return myGrid; } - - virtual vtkIdType GetNodeObjId( int theVTKID ); - virtual vtkIdType GetNodeVTKId( int theObjID ); - virtual vtkIdType GetElemObjId( int theVTKID ); - virtual vtkIdType GetElemVTKId( int theObjID ); - -protected: - - void createPoints( vtkPoints* ); - void buildPrs(); - void buildNodePrs(); - void buildElemPrs(); - -private: - - TMapOfIds mySMDS2VTKNodes; - TMapOfIds myVTK2SMDSNodes; - TMapOfIds mySMDS2VTKElems; - TMapOfIds myVTK2SMDSElems; - - vtkUnstructuredGrid* myGrid; -}; - - -/* - Class : SMESH_MeshObj - Description : Class for visualisation of mesh -*/ - -class SMESH_MeshObj: public SMESH_VisualObjDef -{ -public: - - SMESH_MeshObj( SMESH::SMESH_Mesh_ptr ); - virtual ~SMESH_MeshObj(); - - virtual void Update( int theIsClear = true ); - - virtual int GetNbEntities( const SMDSAbs_ElementType) const; - virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const; - virtual bool IsNodePrs() const; - - virtual int GetElemDimension( const int theObjId ); - - virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ); - - SMESH::SMESH_Mesh_ptr GetMeshServer() { return myMeshServer.in(); } - SMDS_Mesh* GetMesh() const { return myMesh; } - -protected: - - SMESH::SMESH_Mesh_var myMeshServer; - SMDS_Mesh* myMesh; -}; - - -/* - Class : SMESH_SubMeshObj - Description : Base class for visualisation of submeshes and groups -*/ - -class SMESH_SubMeshObj: public SMESH_VisualObjDef -{ -public: - - SMESH_SubMeshObj(SMESH_MeshObj* theMeshObj); - virtual ~SMESH_SubMeshObj(); - - virtual void Update( int theIsClear = true ); - - virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ); - virtual int GetElemDimension( const int theObjId ); - virtual SMDS_Mesh* GetMesh() const { return myMeshObj->GetMesh(); } - -protected: - - SMESH_MeshObj* myMeshObj; -}; - - -/* - Class : SMESH_GroupObj - Description : Class for visualisation of groups -*/ - -class SMESH_GroupObj: public SMESH_SubMeshObj -{ -public: - SMESH_GroupObj( SMESH::SMESH_GroupBase_ptr, SMESH_MeshObj* ); - virtual ~SMESH_GroupObj(); - - virtual int GetNbEntities( const SMDSAbs_ElementType) const; - virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const; - virtual bool IsNodePrs() const; - -private: - - SMESH::SMESH_GroupBase_var myGroupServer; -}; - - -/* - Class : SMESH_subMeshObj - Description : Class for visualisation of submeshes -*/ - -class SMESH_subMeshObj : public SMESH_SubMeshObj -{ -public: - - SMESH_subMeshObj( SMESH::SMESH_subMesh_ptr, - SMESH_MeshObj* ); - virtual ~SMESH_subMeshObj(); - - virtual int GetNbEntities( const SMDSAbs_ElementType) const; - virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const; - virtual bool IsNodePrs() const; - -protected: - - SMESH::SMESH_subMesh_var mySubMeshServer; -}; - - -#endif diff --git a/src/SMDS/Makefile.in b/src/SMDS/Makefile.in deleted file mode 100644 index e066e25e0..000000000 --- a/src/SMDS/Makefile.in +++ /dev/null @@ -1,143 +0,0 @@ -# SMESH SMDS : implementaion of Salome mesh data structure -# -# 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 : Patrick GOLDBRONN (CEA) -# Module : SMESH - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl - - -@COMMENCE@ - -# Libraries targets - -LIB = libSMDS.la -LIB_SRC = \ - SMDS_MeshObject.cxx \ - SMDS_MeshElement.cxx \ - SMDS_Position.cxx \ - SMDS_EdgePosition.cxx \ - SMDS_FacePosition.cxx \ - SMDS_SpacePosition.cxx \ - SMDS_VertexPosition.cxx \ - SMDS_MeshNode.cxx \ - SMDS_MeshEdge.cxx \ - SMDS_MeshFace.cxx \ - SMDS_MeshVolume.cxx \ - SMDS_MeshElementIDFactory.cxx \ - SMDS_MeshGroup.cxx \ - SMDS_MeshIDFactory.cxx \ - SMDS_Mesh.cxx \ - SMDS_IteratorOfElements.cxx \ - SMDS_VolumeOfFaces.cxx \ - SMDS_VolumeOfNodes.cxx \ - SMDS_PolyhedralVolumeOfNodes.cxx \ - SMDS_FaceOfEdges.cxx \ - SMDS_FaceOfNodes.cxx \ - SMDS_PolygonalFaceOfNodes.cxx \ - SMDS_VolumeTool.cxx -# SMDS_Tria3OfNodes.cxx \ -# SMDS_HexahedronOfNodes.cxx - -#SMDSControl_BoundaryEdges.cxx \ -#SMDSControl_BoundaryFaces.cxx \ -#SMDSControl.cxx \ -#SMDSControl_MeshBoundary.cxx \ -#SMDSEdit_Transform.cxx \ -#SMDS_MeshNodeIDFactory.cxx \ -#SMDS_MeshPrism.cxx \ -#SMDS_MeshPyramid.cxx \ -#SMDS_MeshQuadrangle.cxx \ -#SMDS_MeshTetrahedron.cxx \ -#SMDS_MeshTriangle.cxx \ - - -LIB_CLIENT_IDL = -LIB_SERVER_IDL = - -# Executables targets -BIN = -BIN_SRC = -BIN_CLIENT_IDL = -BIN_SERVER_IDL = - -# header files -EXPORT_HEADERS= \ - SMDS_TypeOfPosition.hxx \ - SMDSAbs_ElementType.hxx \ - SMDS_EdgePosition.hxx \ - SMDS_ElemIterator.hxx \ - SMDS_FacePosition.hxx \ - SMDS_Mesh.hxx \ - SMDS_MeshEdge.hxx \ - SMDS_MeshElement.hxx \ - SMDS_MeshElementIDFactory.hxx \ - SMDS_MeshFace.hxx \ - SMDS_MeshGroup.hxx \ - SMDS_MeshIDFactory.hxx \ - SMDS_MeshNode.hxx \ - SMDS_MeshObject.hxx \ - SMDS_MeshVolume.hxx \ - SMDS_Position.hxx \ - SMDS_SpacePosition.hxx \ - SMDS_VertexPosition.hxx \ - SMDS_Iterator.hxx \ - SMDS_IteratorOfElements.hxx \ - SMDS_VolumeOfFaces.hxx \ - SMDS_VolumeOfNodes.hxx \ - SMDS_PolyhedralVolumeOfNodes.hxx \ - SMDS_FaceOfEdges.hxx \ - SMDS_FaceOfNodes.hxx \ - SMDS_PolygonalFaceOfNodes.hxx \ - SMDS_VolumeTool.hxx -# SMDS_Tria3OfNodes.hxx \ -# SMDS_HexahedronOfNodes.hxx - -#SMDSControl_BoundaryEdges.hxx \ -#SMDSControl_BoundaryFaces.hxx \ -#SMDSControl.hxx \ -#SMDSControl_MeshBoundary.hxx \ -#SMDSEdit_Transform.hxx \ -#SMDS_MeshPrism.hxx \ -#SMDS_MeshPyramid.hxx \ -#SMDS_MeshQuadrangle.hxx \ -#SMDS_MeshTetrahedron.hxx \ -#SMDS_MeshTriangle.hxx \ -#SMDS_MeshNodeIDFactory.hxx - -# additionnal information to compil and link file -CPPFLAGS += -I${KERNEL_ROOT_DIR}/include/salome $(OCC_INCLUDES) $(BOOST_CPPFLAGS) -CXXFLAGS += -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS += -L${KERNEL_ROOT_DIR}/lib/salome $(OCC_KERNEL_LIBS) - - -# additional file to be cleaned -MOSTLYCLEAN = -CLEAN = -DISTCLEAN = - -@CONCLUDE@ diff --git a/src/SMDS/SMDSAbs_ElementType.hxx b/src/SMDS/SMDSAbs_ElementType.hxx deleted file mode 100644 index c474a4e55..000000000 --- a/src/SMDS/SMDSAbs_ElementType.hxx +++ /dev/null @@ -1,41 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE -// -// 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 or email : webmaster@opencascade.org -// -// -// -// File : SMDSAbs_ElementType.hxx -// Module : SMESH - -#ifndef _SMDSAbs_ElementType_HeaderFile -#define _SMDSAbs_ElementType_HeaderFile - -/////////////////////////////////////////////////////////////////////////////// -/// Type (node, edge, face or volume) of elements -/////////////////////////////////////////////////////////////////////////////// -enum SMDSAbs_ElementType -{ - SMDSAbs_All, - SMDSAbs_Node, - SMDSAbs_Edge, - SMDSAbs_Face, - SMDSAbs_Volume -}; - -#endif diff --git a/src/SMDS/SMDS_EdgePosition.cxx b/src/SMDS/SMDS_EdgePosition.cxx deleted file mode 100644 index 82c92b398..000000000 --- a/src/SMDS/SMDS_EdgePosition.cxx +++ /dev/null @@ -1,76 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_EdgePosition.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_EdgePosition.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : SMDS_EdgePosition -//purpose : -//======================================================================= - -SMDS_EdgePosition::SMDS_EdgePosition(const int aEdgeId, - const double aUParam):SMDS_Position(aEdgeId), myUParameter(aUParam) -{ -} - -//======================================================================= -//function : Coords -//purpose : -//======================================================================= - -const double *SMDS_EdgePosition::Coords() const -{ - static double origin[]={0,0,0}; - MESSAGE("SMDS_EdgePosition::Coords not implemented"); - return origin; -} - -/** -*/ -SMDS_TypeOfPosition SMDS_EdgePosition::GetTypeOfPosition() const -{ - return SMDS_TOP_EDGE; -} - -void SMDS_EdgePosition::SetUParameter(double aUparam) -{ - myUParameter = aUparam; -} - -//======================================================================= -//function : GetUParameter -//purpose : -//======================================================================= - -double SMDS_EdgePosition::GetUParameter() const -{ - return myUParameter; -} diff --git a/src/SMDS/SMDS_EdgePosition.hxx b/src/SMDS/SMDS_EdgePosition.hxx deleted file mode 100644 index fd297d3ab..000000000 --- a/src/SMDS/SMDS_EdgePosition.hxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_EdgePosition.hxx -// Module : SMESH - -#ifndef _SMDS_EdgePosition_HeaderFile -#define _SMDS_EdgePosition_HeaderFile - -#include "SMDS_Position.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_EdgePosition:public SMDS_Position -{ - - public: - SMDS_EdgePosition(const int aEdgeId=0, const double aUParam=0); - const virtual double * Coords() const; - SMDS_TypeOfPosition GetTypeOfPosition() const; - void SetUParameter(double aUparam); - double GetUParameter() const; - - private: - - double myUParameter; - -}; - -#endif diff --git a/src/SMDS/SMDS_ElemIterator.hxx b/src/SMDS/SMDS_ElemIterator.hxx deleted file mode 100755 index c8432afdd..000000000 --- a/src/SMDS/SMDS_ElemIterator.hxx +++ /dev/null @@ -1,40 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshElement.hxx -// Module : SMESH -// Created: 12.01.05 18:02:52 -// Author: Michael Sazonov - -#ifndef SMDS_ElemIterator_HeaderFile -#define SMDS_ElemIterator_HeaderFile - -#include "SMDS_Iterator.hxx" -#include - -class SMDS_MeshElement; - -typedef SMDS_Iterator SMDS_ElemIterator; -typedef boost::shared_ptr > SMDS_ElemIteratorPtr; - -#endif diff --git a/src/SMDS/SMDS_FaceOfEdges.cxx b/src/SMDS/SMDS_FaceOfEdges.cxx deleted file mode 100644 index 640c55d30..000000000 --- a/src/SMDS/SMDS_FaceOfEdges.cxx +++ /dev/null @@ -1,157 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_FaceOfEdges.hxx" -#include "SMDS_IteratorOfElements.hxx" -#include "SMDS_MeshNode.hxx" - -using namespace std; - -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= - -int SMDS_FaceOfEdges::NbEdges() const -{ - return myNbEdges; -} - -int SMDS_FaceOfEdges::NbFaces() const -{ - return 1; -} -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_FaceOfEdges::Print(ostream & OS) const -{ - OS << "face <" << GetID() << " > : "; - int i; - for (i = 0; i < NbEdges() - 1; i++) OS << myEdges[i] << ","; - OS << myEdges[i] << ") " << endl; -} - -SMDSAbs_ElementType SMDS_FaceOfEdges::GetType() const -{ - return SMDSAbs_Face; -} - -//======================================================================= -//function : elementsIterator -//purpose : -//======================================================================= - -class SMDS_FaceOfEdges_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshEdge* const *mySet; - int myLength; - int index; - public: - SMDS_FaceOfEdges_MyIterator(const SMDS_MeshEdge* const *s, int l): - mySet(s),myLength(l),index(0) {} - - bool more() - { - return index set1,set2; - SMDS_ElemIteratorPtr it; - const SMDS_MeshNode * n; - - it=f1.nodesIterator(); - - while(it->more()) - { - n=static_cast(it->next()); - set1.insert(*n); - } - - delete it; - it=f2.nodesIterator(); - - while(it->more()) - { - n=static_cast(it->next()); - set2.insert(*n); - } - - delete it; - return set1 - - -class SMDS_FaceOfEdges:public SMDS_MeshFace -{ - public: - void Print(std::ostream & OS) const; - SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1, - const SMDS_MeshEdge* edge2, - const SMDS_MeshEdge* edge3); - SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1, - const SMDS_MeshEdge* edge2, - const SMDS_MeshEdge* edge3, - const SMDS_MeshEdge* edge4); - - SMDSAbs_ElementType GetType() const; - int NbEdges() const; - int NbFaces() const; -// friend bool operator<(const SMDS_FaceOfEdges& e1, const SMDS_FaceOfEdges& e2); - - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - private: - const SMDS_MeshEdge* myEdges[4]; - int myNbEdges; - -}; - -#endif diff --git a/src/SMDS/SMDS_FaceOfNodes.cxx b/src/SMDS/SMDS_FaceOfNodes.cxx deleted file mode 100644 index aa6870824..000000000 --- a/src/SMDS/SMDS_FaceOfNodes.cxx +++ /dev/null @@ -1,177 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_FaceOfNodes.hxx" -#include "SMDS_IteratorOfElements.hxx" -#include "SMDS_MeshNode.hxx" -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= - -int SMDS_FaceOfNodes::NbEdges() const -{ - return NbNodes(); -} - -int SMDS_FaceOfNodes::NbFaces() const -{ - return 1; -} - -int SMDS_FaceOfNodes::NbNodes() const -{ - return myNbNodes; -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_FaceOfNodes::Print(ostream & OS) const -{ - OS << "face <" << GetID() << " > : "; - int i; - for (i = 0; i < NbNodes() - 1; i++) OS << myNodes[i] << ","; - OS << myNodes[i] << ") " << endl; -} - -//======================================================================= -//function : elementsIterator -//purpose : -//======================================================================= - -class SMDS_FaceOfNodes_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshNode* const *mySet; - int myLength; - int index; - public: - SMDS_FaceOfNodes_MyIterator(const SMDS_MeshNode* const *s, int l): - mySet(s),myLength(l),index(0) {} - - bool more() - { - return index set1,set2; - SMDS_ElemIteratorPtr it; - const SMDS_MeshNode * n; - - it=f1.nodesIterator(); - - while(it->more()) - { - n=static_cast(it->next()); - set1.insert(*n); - } - - delete it; - it=f2.nodesIterator(); - - while(it->more()) - { - n=static_cast(it->next()); - set2.insert(*n); - } - - delete it; - return set1 - -class SMDS_FaceOfNodes:public SMDS_MeshFace -{ - public: - void Print(std::ostream & OS) const; - SMDS_FaceOfNodes(const SMDS_MeshNode* node1, - const SMDS_MeshNode* node2, - const SMDS_MeshNode* node3); - SMDS_FaceOfNodes(const SMDS_MeshNode* node1, - const SMDS_MeshNode* node2, - const SMDS_MeshNode* node3, - const SMDS_MeshNode* node4); - bool ChangeNodes(const SMDS_MeshNode* nodes[], - const int nbNodes); - int NbEdges() const; - int NbFaces() const; - int NbNodes() const; - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - private: - const SMDS_MeshNode* myNodes[4]; - int myNbNodes; - -}; - -#endif diff --git a/src/SMDS/SMDS_FacePosition.cxx b/src/SMDS/SMDS_FacePosition.cxx deleted file mode 100644 index c97e64f7a..000000000 --- a/src/SMDS/SMDS_FacePosition.cxx +++ /dev/null @@ -1,98 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_FacePosition.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_FacePosition.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : SMDS_FacePosition -//purpose : -//======================================================================= - -SMDS_FacePosition::SMDS_FacePosition(const int aEdgeId, - const double aUParam, - const double aVParam) - :SMDS_Position(aEdgeId), - myUParameter(aUParam),myVParameter(aVParam) -{ -} - -//======================================================================= -//function : Coords -//purpose : -//======================================================================= -const double *SMDS_FacePosition::Coords() const -{ - static double origin[]={0,0,0}; - MESSAGE("SMDS_EdgePosition::Coords not implemented"); - return origin; -} - -/** -*/ -SMDS_TypeOfPosition SMDS_FacePosition::GetTypeOfPosition() const -{ - return SMDS_TOP_FACE; -} - -void SMDS_FacePosition::SetUParameter(double aUparam) -{ - myUParameter = aUparam; -} - -//======================================================================= -//function : SetVParameter -//purpose : -//======================================================================= - -void SMDS_FacePosition::SetVParameter(double aVparam) -{ - myVParameter = aVparam; -} - -//======================================================================= -//function : GetUParameter -//purpose : -//======================================================================= - -double SMDS_FacePosition::GetUParameter() const -{ - return myUParameter; -} - -//======================================================================= -//function : GetVParameter -//purpose : -//======================================================================= - -double SMDS_FacePosition::GetVParameter() const -{ - return myVParameter; -} diff --git a/src/SMDS/SMDS_FacePosition.hxx b/src/SMDS/SMDS_FacePosition.hxx deleted file mode 100644 index 8ca74130f..000000000 --- a/src/SMDS/SMDS_FacePosition.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_FacePosition.hxx -// Module : SMESH - -#ifndef _SMDS_FacePosition_HeaderFile -#define _SMDS_FacePosition_HeaderFile - -#include "SMDS_Position.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_FacePosition:public SMDS_Position -{ - - public: - SMDS_FacePosition(int aFaceId=0, double aUParam=0, - double aVParam=0); - const virtual double * Coords() const; - SMDS_TypeOfPosition GetTypeOfPosition() const; - void SetUParameter(double aUparam); - void SetVParameter(double aVparam); - double GetUParameter() const; - double GetVParameter() const; - - private: - double myUParameter; - double myVParameter; -}; -#endif diff --git a/src/SMDS/SMDS_Iterator.hxx b/src/SMDS/SMDS_Iterator.hxx deleted file mode 100644 index 264438c7d..000000000 --- a/src/SMDS/SMDS_Iterator.hxx +++ /dev/null @@ -1,46 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifndef _SMDS_Iterator_HeaderFile -#define _SMDS_Iterator_HeaderFile - -/////////////////////////////////////////////////////////////////////////////// -///Abstract class for iterators -///@author Jerome Robert -/////////////////////////////////////////////////////////////////////////////// -template class SMDS_Iterator -{ - public: - /// Return true if and only if there are other object in this iterator - virtual bool more()=0; - - /// Return the current object and step to the next one - virtual VALUE next()=0; - - /// Delete the current element and step to the next one - virtual void remove(){} - - /// Provide virtual destructor just for case if some derived iterator - /// must have a destructor - virtual ~SMDS_Iterator(){} -}; - -#endif diff --git a/src/SMDS/SMDS_IteratorOfElements.cxx b/src/SMDS/SMDS_IteratorOfElements.cxx deleted file mode 100644 index 472ae0d54..000000000 --- a/src/SMDS/SMDS_IteratorOfElements.cxx +++ /dev/null @@ -1,106 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_IteratorOfElements.hxx" - -bool SMDS_IteratorOfElements::subMore() -{ - if((t2Iterator.get()==NULL)||(!t2Iterator->more())) - { - if(t1Iterator->more()) - { - t2Iterator=t1Iterator->next()->elementsIterator(myType); - return subMore(); - } - else return false; - } - else return true; -} - -const SMDS_MeshElement * SMDS_IteratorOfElements::subNext() -{ - if((t2Iterator.get()==NULL)||(!t2Iterator->more())) - if(t1Iterator->more()) - t2Iterator=t1Iterator->next()->elementsIterator(myType); - return t2Iterator->next(); -} - -///////////////////////////////////////////////////////////////////////////// -/// Create an iterator which look for elements of type type which are linked -/// to the element element. it is the iterator to get connectivity of element -////////////////////////////////////////////////////////////////////////////// -SMDS_IteratorOfElements::SMDS_IteratorOfElements(const SMDS_MeshElement * element, - SMDSAbs_ElementType type, - const SMDS_ElemIteratorPtr& it) - : t1Iterator(it), - t2Iterator(SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL)), - myType(type), myElement(element), - myProxyElement(NULL) -{ - while(subMore()) - alreadyReturnedElements.insert(subNext()); - itAlreadyReturned= alreadyReturnedElements.begin(); - switch(myElement->GetType()) - { - case SMDSAbs_Node: - case SMDSAbs_Edge: myReverseIteration=true; break; - case SMDSAbs_Face: myReverseIteration=(type==SMDSAbs_Volume); break; - default: myReverseIteration=false; - } -} - -bool SMDS_IteratorOfElements::more() -{ - if(myProxyElement==NULL) - { - while(itAlreadyReturned!=alreadyReturnedElements.end()) - { - myProxyElement=*itAlreadyReturned; - itAlreadyReturned++; - - if(myReverseIteration) - { - SMDS_ElemIteratorPtr it= - myProxyElement->elementsIterator(myElement->GetType()); - while(it->more()) - { - if(it->next()==myElement) return true; - } - } - else return true; - } - myProxyElement=NULL; - return false; - } - else return true; -} - -const SMDS_MeshElement * SMDS_IteratorOfElements::next() -{ - more(); - const SMDS_MeshElement *e=myProxyElement; - myProxyElement=NULL; - return e; -} diff --git a/src/SMDS/SMDS_IteratorOfElements.hxx b/src/SMDS/SMDS_IteratorOfElements.hxx deleted file mode 100644 index faf777de9..000000000 --- a/src/SMDS/SMDS_IteratorOfElements.hxx +++ /dev/null @@ -1,52 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#include "SMDS_Iterator.hxx" -#include "SMDS_MeshElement.hxx" -#include - - -class SMDS_IteratorOfElements:public SMDS_ElemIterator -{ - public: -///////////////////////////////////////////////////////////////////////////// -/// Create an iterator which look for elements of type type which are linked -/// to the element element. it is the iterator to get connectivity of element -////////////////////////////////////////////////////////////////////////////// - SMDS_IteratorOfElements(const SMDS_MeshElement * element, - SMDSAbs_ElementType type, - const SMDS_ElemIteratorPtr& it); - bool more(); - const SMDS_MeshElement * next(); - - private: - SMDS_ElemIteratorPtr t2Iterator; - SMDS_ElemIteratorPtr t1Iterator; - SMDSAbs_ElementType myType; - const SMDS_MeshElement * myProxyElement; - const SMDS_MeshElement * myElement; - bool myReverseIteration; - - std::set alreadyReturnedElements; - std::set::iterator itAlreadyReturned; - bool subMore(); - const SMDS_MeshElement * subNext(); -}; diff --git a/src/SMDS/SMDS_Mesh.cxx b/src/SMDS/SMDS_Mesh.cxx deleted file mode 100644 index 6381e547e..000000000 --- a/src/SMDS/SMDS_Mesh.cxx +++ /dev/null @@ -1,2203 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "utilities.h" -#include "SMDS_Mesh.hxx" -#include "SMDS_VolumeOfNodes.hxx" -#include "SMDS_VolumeOfFaces.hxx" -#include "SMDS_FaceOfNodes.hxx" -#include "SMDS_FaceOfEdges.hxx" -#include "SMDS_PolyhedralVolumeOfNodes.hxx" -#include "SMDS_PolygonalFaceOfNodes.hxx" - -#include -#include -using namespace std; - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new mesh object -/////////////////////////////////////////////////////////////////////////////// -SMDS_Mesh::SMDS_Mesh() - :myParent(NULL), - myNodeIDFactory(new SMDS_MeshElementIDFactory()), - myElementIDFactory(new SMDS_MeshElementIDFactory()), - myHasConstructionEdges(false), myHasConstructionFaces(false), - myHasInverseElements(true) -{ -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new child mesh -/// Note that the tree structure of SMDS_Mesh seems to be unused in this version -/// (2003-09-08) of SMESH -/////////////////////////////////////////////////////////////////////////////// -SMDS_Mesh::SMDS_Mesh(SMDS_Mesh * parent) - :myParent(parent), myNodeIDFactory(parent->myNodeIDFactory), - myElementIDFactory(parent->myElementIDFactory), - myHasConstructionEdges(false), myHasConstructionFaces(false), - myHasInverseElements(true) -{ -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a submesh and add it to the current mesh -/////////////////////////////////////////////////////////////////////////////// - -SMDS_Mesh *SMDS_Mesh::AddSubMesh() -{ - SMDS_Mesh *submesh = new SMDS_Mesh(this); - myChildren.insert(myChildren.end(), submesh); - return submesh; -} - -/////////////////////////////////////////////////////////////////////////////// -///create a MeshNode and add it to the current Mesh -///An ID is automatically assigned to the node. -///@return : The created node -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshNode * SMDS_Mesh::AddNode(double x, double y, double z) -{ - return SMDS_Mesh::AddNodeWithID(x,y,z,myNodeIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -///create a MeshNode and add it to the current Mesh -///@param ID : The ID of the MeshNode to create -///@return : The created node or NULL if a node with this ID already exists -/////////////////////////////////////////////////////////////////////////////// -SMDS_MeshNode * SMDS_Mesh::AddNodeWithID(double x, double y, double z, int ID) -{ - // find the MeshNode corresponding to ID - const SMDS_MeshElement *node = myNodeIDFactory->MeshElement(ID); - if(!node){ - SMDS_MeshNode * node=new SMDS_MeshNode(x, y, z); - myNodes.Add(node); - myNodeIDFactory->BindID(ID,node); - return node; - }else - return NULL; -} - -/////////////////////////////////////////////////////////////////////////////// -/// create a MeshEdge and add it to the current Mesh -/// @return : The created MeshEdge -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int idnode1, int idnode2, int ID) -{ - SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - if(!node1 || !node2) return NULL; - return SMDS_Mesh::AddEdgeWithID(node1, node2, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// create a MeshEdge and add it to the current Mesh -/// @return : The created MeshEdge -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) -{ - return SMDS_Mesh::AddEdgeWithID(node1, node2, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new edge and at it to the mesh -/// @param idnode1 ID of the first node -/// @param idnode2 ID of the second node -/// @param ID ID of the edge to create -/// @return The created edge or NULL if an element with this ID already exists or -/// if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID) -{ - SMDS_MeshEdge * edge=new SMDS_MeshEdge(n1,n2); - if(myElementIDFactory->BindID(ID, edge)) { - SMDS_MeshNode *node1,*node2; - node1=const_cast(n1); - node2=const_cast(n2); - node1->AddInverseElement(edge); - node2->AddInverseElement(edge); - myEdges.Add(edge); - return edge; - } - else { - delete edge; - return NULL; - } -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its nodes. An ID is automatically affected to the -/// Created face -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3) -{ - return SMDS_Mesh::AddFaceWithID(n1,n2,n3, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its nodes IDs -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, int idnode2, int idnode3, int ID) -{ - SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - if(!node1 || !node2 || !node3) return NULL; - return SMDS_Mesh::AddFaceWithID(node1, node2, node3, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its nodes -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - int ID) -{ - SMDS_MeshFace * face=createTriangle(n1, n2, n3); - - if (!registerElement(ID, face)) { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its nodes. An ID is automatically affected to the -/// created face -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) -{ - return SMDS_Mesh::AddFaceWithID(n1,n2,n3, n4, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its nodes IDs -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - if(!node1 || !node2 || !node3 || !node4) return NULL; - return SMDS_Mesh::AddFaceWithID(node1, node2, node3, node4, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its nodes -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) -{ - SMDS_MeshFace * face=createQuadrangle(n1, n2, n3, n4); - - if (!registerElement(ID, face)) { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its edges. An ID is automatically assigned to the -/// Created face -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3) -{ - if (!hasConstructionEdges()) - return NULL; - return AddFaceWithID(e1,e2,e3, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its edges -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - int ID) -{ - if (!hasConstructionEdges()) - return NULL; - SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3); - myFaces.Add(face); - - if (!registerElement(ID, face)) { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its edges. An ID is automatically assigned to the -/// Created face -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - const SMDS_MeshEdge * e4) -{ - if (!hasConstructionEdges()) - return NULL; - return AddFaceWithID(e1,e2,e3,e4, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its edges -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - const SMDS_MeshEdge * e4, - int ID) -{ - if (!hasConstructionEdges()) - return NULL; - SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3,e4); - myFaces.Add(face); - - if (!registerElement(ID, face)) - { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron and add it to the mesh. -///@return The created tetrahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron and add it to the mesh. -///@param ID The ID of the new volume -///@return The created tetrahedron or NULL if an element with this ID already exists -///or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - if(!node1 || !node2 || !node3 || !node4) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron and add it to the mesh. -///@param ID The ID of the new volume -///@return The created tetrahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) -{ - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) { - SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3); - SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n4); - SMDS_MeshFace * f3=FindFaceOrCreate(n1,n3,n4); - SMDS_MeshFace * f4=FindFaceOrCreate(n2,n3,n4); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); - myVolumes.Add(volume); - } - else if(hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } - else { - volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid and add it to the mesh. -///Nodes 1,2,3 and 4 define the base of the pyramid -///@return The created pyramid -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid and add it to the mesh. -///Nodes 1,2,3 and 4 define the base of the pyramid -///@param ID The ID of the new volume -///@return The created pyramid or NULL if an element with this ID already exists -///or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int idnode5, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - if(!node1 || !node2 || !node3 || !node4 || !node5) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid and add it to the mesh. -///Nodes 1,2,3 and 4 define the base of the pyramid -///@param ID The ID of the new volume -///@return The created pyramid -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - int ID) -{ - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) { - SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4); - SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n5); - SMDS_MeshFace * f3=FindFaceOrCreate(n2,n3,n5); - SMDS_MeshFace * f4=FindFaceOrCreate(n3,n4,n5); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); - myVolumes.Add(volume); - } - else if(hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } - else { - volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism and add it to the mesh. -///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle. -///@return The created prism -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism and add it to the mesh. -///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle. -///@param ID The ID of the new volume -///@return The created prism or NULL if an element with this ID already exists -///or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int idnode5, - int idnode6, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6); - if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism and add it to the mesh. -///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle. -///@param ID The ID of the new volume -///@return The created prism -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - int ID) -{ - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) { - SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3); - SMDS_MeshFace * f2=FindFaceOrCreate(n4,n5,n6); - SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n5,n2); - SMDS_MeshFace * f4=FindFaceOrCreate(n2,n5,n6,n3); - SMDS_MeshFace * f5=FindFaceOrCreate(n3,n6,n4,n1); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); - myVolumes.Add(volume); - } - else if(hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } - else { - volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new hexahedron and add it to the mesh. -///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges. -///@return The created hexahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new hexahedron and add it to the mesh. -///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges. -///@param ID The ID of the new volume -///@return The created hexahedron or NULL if an element with this ID already -///exists or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int idnode5, - int idnode6, - int idnode7, - int idnode8, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6, *node7, *node8; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6); - node7 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode7); - node8 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode8); - if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6 || !node7 || !node8) - return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, - node7, node8, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new hexahedron and add it to the mesh. -///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges. -///@param ID The ID of the new volume -///@return The created prism or NULL if an element with this ID already exists -///or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, - int ID) -{ - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) { - SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4); - SMDS_MeshFace * f2=FindFaceOrCreate(n5,n6,n7,n8); - SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n8,n5); - SMDS_MeshFace * f4=FindFaceOrCreate(n1,n2,n6,n5); - SMDS_MeshFace * f5=FindFaceOrCreate(n2,n3,n7,n6); - SMDS_MeshFace * f6=FindFaceOrCreate(n3,n4,n8,n7); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); - myVolumes.Add(volume); - } - else if(hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } - else { -// volume=new SMDS_HexahedronOfNodes(n1,n2,n3,n4,n5,n6,n7,n8); - volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron defined by its faces and add it to the mesh. -///@return The created tetrahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4) -{ - if (!hasConstructionFaces()) - return NULL; - return AddVolumeWithID(f1,f2,f3,f4, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron defined by its faces and add it to the mesh. -///@param ID The ID of the new volume -///@return The created tetrahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - int ID) -{ - if (!hasConstructionFaces()) - return NULL; - SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4); - myVolumes.Add(volume); - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid defined by its faces and add it to the mesh. -///@return The created pyramid -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5) -{ - if (!hasConstructionFaces()) - return NULL; - return AddVolumeWithID(f1,f2,f3,f4,f5, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid defined by its faces and add it to the mesh. -///@param ID The ID of the new volume -///@return The created pyramid -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - int ID) -{ - if (!hasConstructionFaces()) - return NULL; - SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); - myVolumes.Add(volume); - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism defined by its faces and add it to the mesh. -///@return The created prism -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - const SMDS_MeshFace * f6) -{ - if (!hasConstructionFaces()) - return NULL; - return AddVolumeWithID(f1,f2,f3,f4,f5,f6, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism defined by its faces and add it to the mesh. -///@param ID The ID of the new volume -///@return The created prism -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - const SMDS_MeshFace * f6, - int ID) -{ - if (!hasConstructionFaces()) - return NULL; - SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); - myVolumes.Add(volume); - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a polygon defined by its nodes IDs -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID (std::vector nodes_ids, - const int ID) -{ - int nbNodes = nodes_ids.size(); - std::vector nodes (nbNodes); - for (int i = 0; i < nbNodes; i++) { - nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]); - if (!nodes[i]) return NULL; - } - return SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a polygon defined by its nodes -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID - (std::vector nodes, - const int ID) -{ - SMDS_MeshFace * face; - - if (hasConstructionEdges()) - { - MESSAGE("Error : Not implemented"); - return NULL; - } - else - { - face = new SMDS_PolygonalFaceOfNodes(nodes); - myFaces.Add(face); - } - - if (!registerElement(ID, face)) { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a polygon defined by its nodes. -/// An ID is automatically affected to the created face. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddPolygonalFace (std::vector nodes) -{ - return SMDS_Mesh::AddPolygonalFaceWithID(nodes, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new polyhedral volume and add it to the mesh. -/// @param ID The ID of the new volume -/// @return The created volume or NULL if an element with this ID already exists -/// or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddPolyhedralVolumeWithID - (std::vector nodes_ids, - std::vector quantities, - const int ID) -{ - int nbNodes = nodes_ids.size(); - std::vector nodes (nbNodes); - for (int i = 0; i < nbNodes; i++) { - nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]); - if (!nodes[i]) return NULL; - } - return SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new polyhedral volume and add it to the mesh. -/// @param ID The ID of the new volume -/// @return The created volume -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID - (std::vector nodes, - std::vector quantities, - const int ID) -{ - SMDS_MeshVolume* volume; - if (hasConstructionFaces()) { - MESSAGE("Error : Not implemented"); - return NULL; - } else if (hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } else { - volume = new SMDS_PolyhedralVolumeOfNodes(nodes, quantities); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new polyhedral volume and add it to the mesh. -/// @return The created volume -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolume - (std::vector nodes, - std::vector quantities) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID); - if (v == NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Registers element with the given ID, maintains inverse connections -/////////////////////////////////////////////////////////////////////////////// -bool SMDS_Mesh::registerElement(int ID, SMDS_MeshElement * element) -{ - if (myElementIDFactory->BindID(ID, element)) { - SMDS_ElemIteratorPtr it = element->nodesIterator(); - while (it->more()) { - SMDS_MeshNode *node = static_cast - (const_cast(it->next())); - node->AddInverseElement(element); - } - return true; - } - return false; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the node whose ID is 'ID'. -/////////////////////////////////////////////////////////////////////////////// -const SMDS_MeshNode * SMDS_Mesh::FindNode(int ID) const -{ - return (const SMDS_MeshNode *)myNodeIDFactory->MeshElement(ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a triangle and add it to the current mesh. This methode do not bind a -///ID to the create triangle. -/////////////////////////////////////////////////////////////////////////////// -SMDS_MeshFace * SMDS_Mesh::createTriangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3) -{ - if(hasConstructionEdges()) - { - SMDS_MeshEdge *edge1, *edge2, *edge3; - edge1=FindEdgeOrCreate(node1,node2); - edge2=FindEdgeOrCreate(node2,node3); - edge3=FindEdgeOrCreate(node3,node1); - - SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3); - myFaces.Add(face); - return face; - } - else - { - SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3); - myFaces.Add(face); - return face; - } -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a quadrangle and add it to the current mesh. This methode do not bind -///a ID to the create triangle. -/////////////////////////////////////////////////////////////////////////////// -SMDS_MeshFace * SMDS_Mesh::createQuadrangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4) -{ - if(hasConstructionEdges()) - { - SMDS_MeshEdge *edge1, *edge2, *edge3, *edge4; - edge1=FindEdgeOrCreate(node1,node2); - edge2=FindEdgeOrCreate(node2,node3); - edge3=FindEdgeOrCreate(node3,node4); - edge4=FindEdgeOrCreate(node4,node1); - - SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3,edge4); - myFaces.Add(face); - return face; - } - else - { - SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3,node4); - myFaces.Add(face); - return face; - } -} - -/////////////////////////////////////////////////////////////////////////////// -/// Remove a node and all the elements which own this node -/////////////////////////////////////////////////////////////////////////////// - -void SMDS_Mesh::RemoveNode(const SMDS_MeshNode * node) -{ - RemoveElement(node, true); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Remove an edge and all the elements which own this edge -/////////////////////////////////////////////////////////////////////////////// - -void SMDS_Mesh::RemoveEdge(const SMDS_MeshEdge * edge) -{ - RemoveElement(edge,true); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Remove an face and all the elements which own this face -/////////////////////////////////////////////////////////////////////////////// - -void SMDS_Mesh::RemoveFace(const SMDS_MeshFace * face) -{ - RemoveElement(face, true); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Remove a volume -/////////////////////////////////////////////////////////////////////////////// - -void SMDS_Mesh::RemoveVolume(const SMDS_MeshVolume * volume) -{ - RemoveElement(volume, true); -} - -//======================================================================= -//function : RemoveFromParent -//purpose : -//======================================================================= - -bool SMDS_Mesh::RemoveFromParent() -{ - if (myParent==NULL) return false; - else return (myParent->RemoveSubMesh(this)); -} - -//======================================================================= -//function : RemoveSubMesh -//purpose : -//======================================================================= - -bool SMDS_Mesh::RemoveSubMesh(const SMDS_Mesh * aMesh) -{ - bool found = false; - - list::iterator itmsh=myChildren.begin(); - for (; itmsh!=myChildren.end() && !found; itmsh++) - { - SMDS_Mesh * submesh = *itmsh; - if (submesh == aMesh) - { - found = true; - myChildren.erase(itmsh); - } - } - - return found; -} - -//======================================================================= -//function : ChangeElementNodes -//purpose : -//======================================================================= - -bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, - const SMDS_MeshNode * nodes[], - const int nbnodes) -{ - // keep current nodes of elem - set oldNodes; - SMDS_ElemIteratorPtr itn = elem->nodesIterator(); - while(itn->more()) - oldNodes.insert( itn->next() ); - - // change nodes - bool Ok = false; - switch ( elem->GetType() ) - { - case SMDSAbs_Edge: { - if ( nbnodes == 2 ) { - const SMDS_MeshEdge* edge = dynamic_cast( elem ); - if ( edge ) - Ok = const_cast( edge )->ChangeNodes( nodes[0], nodes[1] ); - } - break; - } - case SMDSAbs_Face: { - const SMDS_FaceOfNodes* face = dynamic_cast( elem ); - if ( face ) { - Ok = const_cast( face )->ChangeNodes( nodes, nbnodes ); - } else { - /// ??? begin - const SMDS_PolygonalFaceOfNodes* face = dynamic_cast(elem); - if (face) { - Ok = const_cast(face)->ChangeNodes(nodes, nbnodes); - } - /// ??? end - } - break; - } - //case SMDSAbs_PolygonalFace: { - // const SMDS_PolygonalFaceOfNodes* face = dynamic_cast(elem); - // if (face) { - // Ok = const_cast(face)->ChangeNodes(nodes, nbnodes); - // } - // break; - //} - case SMDSAbs_Volume: { - const SMDS_VolumeOfNodes* vol = dynamic_cast( elem ); - if ( vol ) - Ok = const_cast( vol )->ChangeNodes( nodes, nbnodes ); - break; - } - default: - MESSAGE ( "WRONG ELEM TYPE"); - } - - if ( Ok ) { // update InverseElements - - // AddInverseElement to new nodes - for ( int i = 0; i < nbnodes; i++ ) - if ( oldNodes.find( nodes[i] ) == oldNodes.end() ) - // new node - const_cast( nodes[i] )->AddInverseElement( elem ); - else - // remove from oldNodes a node that remains in elem - oldNodes.erase( nodes[i] ); - - - // RemoveInverseElement from the nodes removed from elem - set::iterator it; - for ( it = oldNodes.begin(); it != oldNodes.end(); it++ ) - { - SMDS_MeshNode * n = static_cast - (const_cast( *it )); - n->RemoveInverseElement( elem ); - } - } - - //MESSAGE ( "::ChangeNodes() Ok = " << Ok); - - return Ok; -} - -//======================================================================= -//function : ChangePolyhedronNodes -//purpose : to change nodes of polyhedral volume -//======================================================================= -bool SMDS_Mesh::ChangePolyhedronNodes (const SMDS_MeshElement * elem, - std::vector nodes, - std::vector quantities) -{ - if (elem->GetType() != SMDSAbs_Volume) { - MESSAGE("WRONG ELEM TYPE"); - return false; - } - - const SMDS_PolyhedralVolumeOfNodes* vol = dynamic_cast(elem); - if (!vol) { - return false; - } - - // keep current nodes of elem - set oldNodes; - SMDS_ElemIteratorPtr itn = elem->nodesIterator(); - while (itn->more()) { - oldNodes.insert(itn->next()); - } - - // change nodes - bool Ok = const_cast(vol)->ChangeNodes(nodes, quantities); - if (!Ok) { - return false; - } - - // update InverseElements - - // AddInverseElement to new nodes - int nbnodes = nodes.size(); - for (int i = 0; i < nbnodes; i++) { - if (oldNodes.find(nodes[i]) == oldNodes.end()) { - // new node - const_cast(nodes[i])->AddInverseElement(elem); - } else { - // remove from oldNodes a node that remains in elem - oldNodes.erase(nodes[i]); - } - } - - // RemoveInverseElement from the nodes removed from elem - set::iterator it; - for (it = oldNodes.begin(); it != oldNodes.end(); it++) { - SMDS_MeshNode * n = static_cast - (const_cast( *it )); - n->RemoveInverseElement(elem); - } - - return Ok; -} - -//======================================================================= -//function : FindEdge -//purpose : -//======================================================================= - -const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2) const -{ - const SMDS_MeshNode * node1=FindNode(idnode1); - const SMDS_MeshNode * node2=FindNode(idnode2); - if((node1==NULL)||(node2==NULL)) return NULL; - return FindEdge(node1,node2); -} - -//#include "Profiler.h" -const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) -{ - const SMDS_MeshEdge * toReturn=NULL; - //PROFILER_Init(); - //PROFILER_Set(); - SMDS_ElemIteratorPtr it1=node1->edgesIterator(); - //PROFILER_Get(0); - //PROFILER_Set(); - while(it1->more()) - { - const SMDS_MeshEdge * e=static_cast - (it1->next()); - SMDS_ElemIteratorPtr it2=e->nodesIterator(); - while(it2->more()) - { - if(it2->next()->GetID()==node2->GetID()) - { - toReturn=e; - break; - } - } - } - //PROFILER_Get(1); - return toReturn; -} - - -SMDS_MeshEdge* SMDS_Mesh::FindEdgeOrCreate(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) -{ - SMDS_MeshEdge * toReturn=NULL; - toReturn=const_cast(FindEdge(node1,node2)); - if(toReturn==NULL) - { - toReturn=new SMDS_MeshEdge(node1,node2); - myEdges.Add(toReturn); - } - return toReturn; -} - -//======================================================================= -//function : FindFace -//purpose : -//======================================================================= - -const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, - int idnode3) const -{ - const SMDS_MeshNode * node1=FindNode(idnode1); - const SMDS_MeshNode * node2=FindNode(idnode2); - const SMDS_MeshNode * node3=FindNode(idnode3); - if((node1==NULL)||(node2==NULL)||(node3==NULL)) return NULL; - return FindFace(node1, node2, node3); -} - -const SMDS_MeshFace* SMDS_Mesh::FindFace( - const SMDS_MeshNode *node1, - const SMDS_MeshNode *node2, - const SMDS_MeshNode *node3) -{ - const SMDS_MeshFace * face; - const SMDS_MeshElement * node; - bool node2found, node3found; - - SMDS_ElemIteratorPtr it1=node1->facesIterator(); - while(it1->more()) - { - face=static_cast(it1->next()); - if(face->NbNodes()!=3) continue; - SMDS_ElemIteratorPtr it2=face->nodesIterator(); - node2found=false; - node3found=false; - while(it2->more()) - { - node=it2->next(); - if(node->GetID()==node2->GetID()) node2found=true; - if(node->GetID()==node3->GetID()) node3found=true; - } - if(node2found&&node3found) - return face; - } - return NULL; -} - -SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate( - const SMDS_MeshNode *node1, - const SMDS_MeshNode *node2, - const SMDS_MeshNode *node3) -{ - SMDS_MeshFace * toReturn=NULL; - toReturn=const_cast(FindFace(node1,node2,node3)); - if(toReturn==NULL) - { - toReturn=createTriangle(node1,node2,node3); - } - return toReturn; -} - -//======================================================================= -//function : FindFace -//purpose : -//======================================================================= - -const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, int idnode3, - int idnode4) const -{ - const SMDS_MeshNode * node1=FindNode(idnode1); - const SMDS_MeshNode * node2=FindNode(idnode2); - const SMDS_MeshNode * node3=FindNode(idnode3); - const SMDS_MeshNode * node4=FindNode(idnode4); - if((node1==NULL)||(node2==NULL)||(node3==NULL)||(node4==NULL)) return NULL; - return FindFace(node1, node2, node3, node4); -} - -const SMDS_MeshFace* SMDS_Mesh::FindFace( - const SMDS_MeshNode *node1, - const SMDS_MeshNode *node2, - const SMDS_MeshNode *node3, - const SMDS_MeshNode *node4) -{ - const SMDS_MeshFace * face; - const SMDS_MeshElement * node; - bool node2found, node3found, node4found; - SMDS_ElemIteratorPtr it1=node1->facesIterator(); - while(it1->more()) - { - face=static_cast(it1->next()); - if(face->NbNodes()!=4) continue; - SMDS_ElemIteratorPtr it2=face->nodesIterator(); - node2found=false; - node3found=false; - node4found=false; - while(it2->more()) - { - node=it2->next(); - if(node->GetID()==node2->GetID()) node2found=true; - if(node->GetID()==node3->GetID()) node3found=true; - if(node->GetID()==node4->GetID()) node4found=true; - } - if(node2found&&node3found&&node4found) - return face; - } - return NULL; -} - -SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate( - const SMDS_MeshNode *node1, - const SMDS_MeshNode *node2, - const SMDS_MeshNode *node3, - const SMDS_MeshNode *node4) -{ - SMDS_MeshFace * toReturn=NULL; - toReturn=const_cast(FindFace(node1,node2,node3,node4)); - if(toReturn==NULL) - { - toReturn=createQuadrangle(node1,node2,node3,node4); - } - return toReturn; -} - -//======================================================================= -//function : FindElement -//purpose : -//======================================================================= - -const SMDS_MeshElement* SMDS_Mesh::FindElement(int IDelem) const -{ - return myElementIDFactory->MeshElement(IDelem); -} - -//======================================================================= -//function : FindFace -//purpose : find polygon -//======================================================================= - -const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector nodes_ids) const -{ - int nbnodes = nodes_ids.size(); - std::vector poly_nodes (nbnodes); - for (int inode = 0; inode < nbnodes; inode++) { - const SMDS_MeshNode * node = FindNode(nodes_ids[inode]); - if (node == NULL) return NULL; - } - return FindFace(poly_nodes); -} - -const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector nodes) -{ - int nbNodes = nodes.size(); - if (nbNodes < 1) return NULL; - - bool isFound = true; - const SMDS_MeshFace * face; - set faces; - - for (int inode = 0; inode < nbNodes && isFound; inode++) { - set new_faces; - - SMDS_ElemIteratorPtr itF = nodes[inode]->facesIterator(); - while (itF->more()) { - face = static_cast(itF->next()); - if (face->NbNodes() == nbNodes) { - if (inode == 0 || faces.find(face) != faces.end()) { - new_faces.insert(face); - } - } - } - faces = new_faces; - if (new_faces.size() == 0) { - isFound = false; - } - } - - if (isFound) - return face; - - return NULL; -} - -//======================================================================= -//function : DumpNodes -//purpose : -//======================================================================= - -void SMDS_Mesh::DumpNodes() const -{ - MESSAGE("dump nodes of mesh : "); - SMDS_NodeIteratorPtr itnode=nodesIterator(); - while(itnode->more()) MESSAGE(itnode->next()); -} - -//======================================================================= -//function : DumpEdges -//purpose : -//======================================================================= - -void SMDS_Mesh::DumpEdges() const -{ - MESSAGE("dump edges of mesh : "); - SMDS_EdgeIteratorPtr itedge=edgesIterator(); - while(itedge->more()) MESSAGE(itedge->next()); -} - -//======================================================================= -//function : DumpFaces -//purpose : -//======================================================================= - -void SMDS_Mesh::DumpFaces() const -{ - MESSAGE("dump faces of mesh : "); - SMDS_FaceIteratorPtr itface=facesIterator(); - while(itface->more()) MESSAGE(itface->next()); -} - -//======================================================================= -//function : DumpVolumes -//purpose : -//======================================================================= - -void SMDS_Mesh::DumpVolumes() const -{ - MESSAGE("dump volumes of mesh : "); - SMDS_VolumeIteratorPtr itvol=volumesIterator(); - while(itvol->more()) MESSAGE(itvol->next()); -} - -//======================================================================= -//function : DebugStats -//purpose : -//======================================================================= - -void SMDS_Mesh::DebugStats() const -{ - MESSAGE("Debug stats of mesh : "); - - MESSAGE("===== NODES ====="<more()) - { - const SMDS_MeshNode *node = itnode->next(); - - sizeofnodes += sizeof(*node); - - SMDS_ElemIteratorPtr it = node->GetInverseElementIterator(); - while(it->more()) - { - const SMDS_MeshElement *me = it->next(); - sizeofnodes += sizeof(me); - } - - } - - SMDS_FaceIteratorPtr itface=facesIterator(); - while(itface->more()) - { - const SMDS_MeshElement *face = itface->next(); - sizeoffaces += sizeof(*face); - - } - MESSAGE("total size of node elements = " << sizeofnodes);; - MESSAGE("total size of face elements = " << sizeoffaces);; - - //#endif -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of nodes -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbNodes() const -{ - return myNodes.Size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of edges (including construction edges) -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbEdges() const -{ - return myEdges.Size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of faces (including construction faces) -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbFaces() const -{ - return myFaces.Size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of volumes -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbVolumes() const -{ - return myVolumes.Size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of child mesh of this mesh. -/// Note that the tree structure of SMDS_Mesh seems to be unused in this version -/// (2003-09-08) of SMESH -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbSubMesh() const -{ - return myChildren.size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Destroy the mesh and all its elements -/// All pointer on elements owned by this mesh become illegals. -/////////////////////////////////////////////////////////////////////////////// -SMDS_Mesh::~SMDS_Mesh() -{ - list::iterator itc=myChildren.begin(); - while(itc!=myChildren.end()) - { - delete *itc; - itc++; - } - - SetOfNodes::Iterator itn(myNodes); - for (; itn.More(); itn.Next()) - delete itn.Value(); - - SetOfEdges::Iterator ite(myEdges); - for (; ite.More(); ite.Next()) - { - SMDS_MeshElement* elem = ite.Value(); - if(myParent!=NULL) - myElementIDFactory->ReleaseID(elem->GetID()); - delete elem; - } - - SetOfFaces::Iterator itf(myFaces); - for (; itf.More(); itf.Next()) - { - SMDS_MeshElement* elem = itf.Value(); - if(myParent!=NULL) - myElementIDFactory->ReleaseID(elem->GetID()); - delete elem; - } - - SetOfVolumes::Iterator itv(myVolumes); - for (; itv.More(); itv.Next()) - { - SMDS_MeshElement* elem = itv.Value(); - if(myParent!=NULL) - myElementIDFactory->ReleaseID(elem->GetID()); - delete elem; - } - - if(myParent==NULL) - { - delete myNodeIDFactory; - delete myElementIDFactory; - } -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return true if this mesh create faces with edges. -/// A false returned value mean that faces are created with nodes. A concequence -/// is, iteration on edges (SMDS_Element::edgesIterator) will be unavailable. -/////////////////////////////////////////////////////////////////////////////// -bool SMDS_Mesh::hasConstructionEdges() -{ - return myHasConstructionEdges; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return true if this mesh create volumes with faces -/// A false returned value mean that volumes are created with nodes or edges. -/// (see hasConstructionEdges) -/// A concequence is, iteration on faces (SMDS_Element::facesIterator) will be -/// unavailable. -/////////////////////////////////////////////////////////////////////////////// -bool SMDS_Mesh::hasConstructionFaces() -{ - return myHasConstructionFaces; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return true if nodes are linked to the finit elements, they are belonging to. -/// Currently, It always return true. -/////////////////////////////////////////////////////////////////////////////// -bool SMDS_Mesh::hasInverseElements() -{ - return myHasInverseElements; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Make this mesh creating construction edges (see hasConstructionEdges) -/// @param b true to have construction edges, else false. -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::setConstructionEdges(bool b) -{ - myHasConstructionEdges=b; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Make this mesh creating construction faces (see hasConstructionFaces) -/// @param b true to have construction faces, else false. -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::setConstructionFaces(bool b) -{ - myHasConstructionFaces=b; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Make this mesh creating link from nodes to elements (see hasInverseElements) -/// @param b true to link nodes to elements, else false. -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::setInverseElements(bool b) -{ - if(!b) MESSAGE("Error : inverseElement=false not implemented"); - myHasInverseElements=b; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return an iterator on nodes of the current mesh factory -/////////////////////////////////////////////////////////////////////////////// -class SMDS_Mesh_MyNodeIterator:public SMDS_NodeIterator -{ - SMDS_ElemIteratorPtr myIterator; - public: - SMDS_Mesh_MyNodeIterator(const SMDS_ElemIteratorPtr& it):myIterator(it) - {} - - bool more() - { - return myIterator->more(); - } - - const SMDS_MeshNode* next() - { - return static_cast(myIterator->next()); - } -}; - -SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator() const -{ - return SMDS_NodeIteratorPtr - (new SMDS_Mesh_MyNodeIterator(myNodeIDFactory->elementsIterator())); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return an iterator on elements of the current mesh factory -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator() const -{ - return myElementIDFactory->elementsIterator(); -} - -/////////////////////////////////////////////////////////////////////////////// -///Return an iterator on edges of the current mesh. -/////////////////////////////////////////////////////////////////////////////// -class SMDS_Mesh_MyEdgeIterator:public SMDS_EdgeIterator -{ - typedef SMDS_Mesh::SetOfEdges SetOfEdges; - SetOfEdges::Iterator myIterator; - public: - SMDS_Mesh_MyEdgeIterator(const SetOfEdges& s):myIterator(s) - {} - - bool more() - { - while(myIterator.More()) - { - if(myIterator.Value()->GetID()!=-1) - return true; - myIterator.Next(); - } - return false; - } - - const SMDS_MeshEdge* next() - { - const SMDS_MeshEdge* current = myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator() const -{ - return SMDS_EdgeIteratorPtr(new SMDS_Mesh_MyEdgeIterator(myEdges)); -} - -/////////////////////////////////////////////////////////////////////////////// -///Return an iterator on faces of the current mesh. -/////////////////////////////////////////////////////////////////////////////// -class SMDS_Mesh_MyFaceIterator:public SMDS_FaceIterator -{ - typedef SMDS_Mesh::SetOfFaces SetOfFaces; - SetOfFaces::Iterator myIterator; - public: - SMDS_Mesh_MyFaceIterator(const SetOfFaces& s):myIterator(s) - {} - - bool more() - { - while(myIterator.More()) - { - if(myIterator.Value()->GetID()!=-1) - return true; - myIterator.Next(); - } - return false; - } - - const SMDS_MeshFace* next() - { - const SMDS_MeshFace* current = myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator() const -{ - return SMDS_FaceIteratorPtr(new SMDS_Mesh_MyFaceIterator(myFaces)); -} - -/////////////////////////////////////////////////////////////////////////////// -///Return an iterator on volumes of the current mesh. -/////////////////////////////////////////////////////////////////////////////// -class SMDS_Mesh_MyVolumeIterator:public SMDS_VolumeIterator -{ - typedef SMDS_Mesh::SetOfVolumes SetOfVolumes; - SetOfVolumes::Iterator myIterator; - public: - SMDS_Mesh_MyVolumeIterator(const SetOfVolumes& s):myIterator(s) - {} - - bool more() - { - return myIterator.More() != Standard_False; - } - - const SMDS_MeshVolume* next() - { - const SMDS_MeshVolume* current = myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_VolumeIteratorPtr SMDS_Mesh::volumesIterator() const -{ - return SMDS_VolumeIteratorPtr(new SMDS_Mesh_MyVolumeIterator(myVolumes)); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Do intersection of sets (more than 2) -/////////////////////////////////////////////////////////////////////////////// -static set * intersectionOfSets( - set vs[], int numberOfSets) -{ - set* rsetA=new set(vs[0]); - set* rsetB; - - for(int i=0; i(); - set_intersection( - rsetA->begin(), rsetA->end(), - vs[i+1].begin(), vs[i+1].end(), - inserter(*rsetB, rsetB->begin())); - delete rsetA; - rsetA=rsetB; - } - return rsetA; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the list of finit elements owning the given element -/////////////////////////////////////////////////////////////////////////////// -static set * getFinitElements(const SMDS_MeshElement * element) -{ - int numberOfSets=element->NbNodes(); - set *initSet = new set[numberOfSets]; - - SMDS_ElemIteratorPtr itNodes=element->nodesIterator(); - - int i=0; - while(itNodes->more()) - { - const SMDS_MeshNode * n=static_cast(itNodes->next()); - SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator(); - - //initSet[i]=set(); - while(itFe->more()) - initSet[i].insert(itFe->next()); - - i++; - } - set *retSet=intersectionOfSets(initSet, numberOfSets); - delete [] initSet; - return retSet; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the list of nodes used only by the given elements -/////////////////////////////////////////////////////////////////////////////// -static set * getExclusiveNodes( - set& elements) -{ - set * toReturn=new set(); - set::iterator itElements=elements.begin(); - - while(itElements!=elements.end()) - { - SMDS_ElemIteratorPtr itNodes = (*itElements)->nodesIterator(); - itElements++; - - while(itNodes->more()) - { - const SMDS_MeshNode * n=static_cast(itNodes->next()); - SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator(); - set s; - while(itFe->more()) - s.insert(itFe->next()); - if(s==elements) toReturn->insert(n); - } - } - return toReturn; -} - -/////////////////////////////////////////////////////////////////////////////// -///Find the children of an element that are made of given nodes -///@param setOfChildren The set in which matching children will be inserted -///@param element The element were to search matching children -///@param nodes The nodes that the children must have to be selected -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren, - const SMDS_MeshElement * element, set& nodes) -{ - - switch(element->GetType()) - { - case SMDSAbs_Node: - MESSAGE("Internal Error: This should not append"); - break; - case SMDSAbs_Edge: - { - SMDS_ElemIteratorPtr itn=element->nodesIterator(); - while(itn->more()) - { - const SMDS_MeshElement * e=itn->next(); - if(nodes.find(e)!=nodes.end()) - { - setOfChildren.insert(element); - break; - } - } - } break; - case SMDSAbs_Face: - { - SMDS_ElemIteratorPtr itn=element->nodesIterator(); - while(itn->more()) - { - const SMDS_MeshElement * e=itn->next(); - if(nodes.find(e)!=nodes.end()) - { - setOfChildren.insert(element); - break; - } - } - if(hasConstructionEdges()) - { - SMDS_ElemIteratorPtr ite=element->edgesIterator(); - while(ite->more()) - addChildrenWithNodes(setOfChildren, ite->next(), nodes); - } - } break; - case SMDSAbs_Volume: - { - if(hasConstructionFaces()) - { - SMDS_ElemIteratorPtr ite=element->facesIterator(); - while(ite->more()) - addChildrenWithNodes(setOfChildren, ite->next(), nodes); - } - else if(hasConstructionEdges()) - { - SMDS_ElemIteratorPtr ite=element->edgesIterator(); - while(ite->more()) - addChildrenWithNodes(setOfChildren, ite->next(), nodes); - } - } - } -} - -/////////////////////////////////////////////////////////////////////////////// -///@param elem The element to delete -///@param removenodes if true remaining nodes will be removed -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, - const bool removenodes) -{ - list removedElems; - list removedNodes; - RemoveElement( elem, removedElems, removedNodes, removenodes ); -} - -/////////////////////////////////////////////////////////////////////////////// -///@param elem The element to delete -///@param removedElems contains all removed elements -///@param removedNodes contains all removed nodes -///@param removenodes if true remaining nodes will be removed -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, - list& removedElems, - list& removedNodes, - bool removenodes) -{ - // get finite elements built on elem - set * s1; - if (!hasConstructionEdges() && elem->GetType() == SMDSAbs_Edge || - !hasConstructionFaces() && elem->GetType() == SMDSAbs_Face || - elem->GetType() == SMDSAbs_Volume) - { - s1 = new set(); - s1->insert(elem); - } - else - s1 = getFinitElements(elem); - - // get exclusive nodes (which would become free afterwards) - set * s2; - if (elem->GetType() == SMDSAbs_Node) // a node is removed - { - // do not remove nodes except elem - s2 = new set(); - s2->insert(elem); - removenodes = true; - } - else - s2 = getExclusiveNodes(*s1); - - // form the set of finite and construction elements to remove - set s3; - set::iterator it=s1->begin(); - while(it!=s1->end()) - { - addChildrenWithNodes(s3, *it ,*s2); - s3.insert(*it); - it++; - } - if(elem->GetType()!=SMDSAbs_Node) s3.insert(elem); - - // remove finite and construction elements - it=s3.begin(); - while(it!=s3.end()) - { - // Remove element from of its nodes - SMDS_ElemIteratorPtr itn=(*it)->nodesIterator(); - while(itn->more()) - { - SMDS_MeshNode * n = static_cast - (const_cast(itn->next())); - n->RemoveInverseElement( (*it) ); - } - - switch((*it)->GetType()) - { - case SMDSAbs_Node: - MESSAGE("Internal Error: This should not happen"); - break; - case SMDSAbs_Edge: - myEdges.Remove(static_cast - (const_cast(*it))); - break; - case SMDSAbs_Face: - myFaces.Remove(static_cast - (const_cast(*it))); - break; - case SMDSAbs_Volume: - myVolumes.Remove(static_cast - (const_cast(*it))); - break; - } - //MESSAGE( "SMDS: RM elem " << (*it)->GetID() ); - removedElems.push_back( (*it) ); - myElementIDFactory->ReleaseID((*it)->GetID()); - delete (*it); - it++; - } - - // remove exclusive (free) nodes - if(removenodes) - { - it=s2->begin(); - while(it!=s2->end()) - { - //MESSAGE( "SMDS: RM node " << (*it)->GetID() ); - myNodes.Remove(static_cast - (const_cast(*it))); - myNodeIDFactory->ReleaseID((*it)->GetID()); - removedNodes.push_back( (*it) ); - delete *it; - it++; - } - } - - delete s2; - delete s1; -} - -/*! - * Checks if the element is present in mesh. - * Useful to determine dead pointers. - */ -bool SMDS_Mesh::Contains (const SMDS_MeshElement* elem) const -{ - // we should not imply on validity of *elem, so iterate on containers - // of all types in the hope of finding somewhere there - SMDS_NodeIteratorPtr itn = nodesIterator(); - while (itn->more()) - if (elem == itn->next()) - return true; - SMDS_EdgeIteratorPtr ite = edgesIterator(); - while (ite->more()) - if (elem == ite->next()) - return true; - SMDS_FaceIteratorPtr itf = facesIterator(); - while (itf->more()) - if (elem == itf->next()) - return true; - SMDS_VolumeIteratorPtr itv = volumesIterator(); - while (itv->more()) - if (elem == itv->next()) - return true; - return false; -} - -//======================================================================= -//function : MaxNodeID -//purpose : -//======================================================================= - -int SMDS_Mesh::MaxNodeID() const -{ - return myNodeIDFactory->GetMaxID(); -} - -//======================================================================= -//function : MinNodeID -//purpose : -//======================================================================= - -int SMDS_Mesh::MinNodeID() const -{ - return myNodeIDFactory->GetMinID(); -} - -//======================================================================= -//function : MaxElementID -//purpose : -//======================================================================= - -int SMDS_Mesh::MaxElementID() const -{ - return myElementIDFactory->GetMaxID(); -} - -//======================================================================= -//function : MinElementID -//purpose : -//======================================================================= - -int SMDS_Mesh::MinElementID() const -{ - return myElementIDFactory->GetMinID(); -} - -//======================================================================= -//function : Renumber -//purpose : Renumber all nodes or elements. -//======================================================================= - -void SMDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID) -{ - if ( deltaID == 0 ) - return; - - SMDS_MeshElementIDFactory * idFactory = - isNodes ? myNodeIDFactory : myElementIDFactory; - - // get existing elements in the order of ID increasing - map elemMap; - SMDS_ElemIteratorPtr idElemIt = idFactory->elementsIterator(); - while ( idElemIt->more() ) { - SMDS_MeshElement* elem = const_cast(idElemIt->next()); - int id = elem->GetID(); - elemMap.insert(map::value_type(id, elem)); - } - // release their ids - map::iterator elemIt = elemMap.begin(); - for ( ; elemIt != elemMap.end(); elemIt++ ) - { - int id = (*elemIt).first; - idFactory->ReleaseID( id ); - } - // set new IDs - int ID = startID; - elemIt = elemMap.begin(); - for ( ; elemIt != elemMap.end(); elemIt++ ) - { - idFactory->BindID( ID, (*elemIt).second ); - ID += deltaID; - } -} - -//======================================================================= -//function : GetElementType -//purpose : Return type of element or node with id -//======================================================================= - -SMDSAbs_ElementType SMDS_Mesh::GetElementType( const int id, const bool iselem ) const -{ - SMDS_MeshElement* elem = 0; - if( iselem ) - elem = myElementIDFactory->MeshElement( id ); - else - elem = myNodeIDFactory->MeshElement( id ); - - if( !elem ) - { - //throw SALOME_Exception(LOCALIZED ("this element isn't exist")); - return SMDSAbs_All; - } - else - return elem->GetType(); -} \ No newline at end of file diff --git a/src/SMDS/SMDS_Mesh.hxx b/src/SMDS/SMDS_Mesh.hxx deleted file mode 100644 index 612082ce4..000000000 --- a/src/SMDS/SMDS_Mesh.hxx +++ /dev/null @@ -1,362 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_Mesh.hxx -// Module : SMESH - -#ifndef _SMDS_Mesh_HeaderFile -#define _SMDS_Mesh_HeaderFile - -#include "SMDS_MeshNode.hxx" -#include "SMDS_MeshEdge.hxx" -#include "SMDS_MeshFace.hxx" -#include "SMDS_MeshVolume.hxx" -#include "SMDS_MeshElementIDFactory.hxx" -#include "SMDS_ElemIterator.hxx" -#include - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -#include -#include -#include - -typedef SMDS_Iterator SMDS_NodeIterator; -typedef boost::shared_ptr > SMDS_NodeIteratorPtr; -typedef SMDS_Iterator SMDS_EdgeIterator; -typedef boost::shared_ptr > SMDS_EdgeIteratorPtr; -typedef SMDS_Iterator SMDS_FaceIterator; -typedef boost::shared_ptr > SMDS_FaceIteratorPtr; -typedef SMDS_Iterator SMDS_VolumeIterator; -typedef boost::shared_ptr > SMDS_VolumeIteratorPtr; - -class SMDS_WNT_EXPORT SMDS_Mesh:public SMDS_MeshObject{ -public: - - SMDS_Mesh(); - - SMDS_NodeIteratorPtr nodesIterator() const; - SMDS_EdgeIteratorPtr edgesIterator() const; - SMDS_FaceIteratorPtr facesIterator() const; - SMDS_VolumeIteratorPtr volumesIterator() const; - SMDS_ElemIteratorPtr elementsIterator() const; - - SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const; - - SMDS_Mesh *AddSubMesh(); - - virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID); - virtual SMDS_MeshNode* AddNode(double x, double y, double z); - - virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); - virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID); - virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - - virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID); - virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - int ID); - virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3); - - virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID); - virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID); - virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - - virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, int ID); - virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3); - - virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - const SMDS_MeshEdge * e4, int ID); - virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - const SMDS_MeshEdge * e4); - - virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID); - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - - virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int ID); - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5); - - virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int n6, int ID); - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6); - - virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int n6, int n7, int n8, int ID); - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, - int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8); - - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4); - - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5); - - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - const SMDS_MeshFace * f6, int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - const SMDS_MeshFace * f6); - - virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector nodes_ids, - const int ID); - - virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector nodes, - const int ID); - - virtual SMDS_MeshFace* AddPolygonalFace (std::vector nodes); - - virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID - (std::vector nodes_ids, - std::vector quantities, - const int ID); - - virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID - (std::vector nodes, - std::vector quantities, - const int ID); - - virtual SMDS_MeshVolume* AddPolyhedralVolume - (std::vector nodes, - std::vector quantities); - - virtual void RemoveElement(const SMDS_MeshElement * elem, - std::list& removedElems, - std::list& removedNodes, - const bool removenodes = false); - virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false); - virtual void RemoveNode(const SMDS_MeshNode * node); - virtual void RemoveEdge(const SMDS_MeshEdge * edge); - virtual void RemoveFace(const SMDS_MeshFace * face); - virtual void RemoveVolume(const SMDS_MeshVolume * volume); - - virtual bool RemoveFromParent(); - virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh); - - static bool ChangeElementNodes(const SMDS_MeshElement * elem, - const SMDS_MeshNode * nodes[], - const int nbnodes); - static bool ChangePolyhedronNodes(const SMDS_MeshElement * elem, - std::vector nodes, - std::vector quantities); - - virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1); - // Renumber all nodes or elements. - - const SMDS_MeshNode *FindNode(int idnode) const; - const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const; - const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const; - const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const; - const SMDS_MeshElement *FindElement(int IDelem) const; - static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3); - static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3, - const SMDS_MeshNode *n4); - - const SMDS_MeshFace *FindFace(std::vector nodes_ids) const; - static const SMDS_MeshFace* FindFace(std::vector nodes); - - int MaxNodeID() const; - int MinNodeID() const; - int MaxElementID() const; - int MinElementID() const; - - - int NbNodes() const; - int NbEdges() const; - int NbFaces() const; - int NbVolumes() const; - int NbSubMesh() const; - void DumpNodes() const; - void DumpEdges() const; - void DumpFaces() const; - void DumpVolumes() const; - void DebugStats() const; - SMDS_Mesh *boundaryFaces(); - SMDS_Mesh *boundaryEdges(); - virtual ~SMDS_Mesh(); - bool hasConstructionEdges(); - bool hasConstructionFaces(); - bool hasInverseElements(); - void setConstructionEdges(bool); - void setConstructionFaces(bool); - void setInverseElements(bool); - - /*! - * Checks if the element is present in mesh. - * Useful to determine dead pointers. - * Use this function for debug purpose only! Do not check in the code - * using it even in _DEBUG_ mode - */ - bool Contains (const SMDS_MeshElement* elem) const; - - typedef NCollection_Map SetOfNodes; - typedef NCollection_Map SetOfEdges; - typedef NCollection_Map SetOfFaces; - typedef NCollection_Map SetOfVolumes; - -private: - SMDS_Mesh(SMDS_Mesh * parent); - - SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3); - SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4); - SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3); - SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3, - const SMDS_MeshNode *n4); - - bool registerElement(int ID, SMDS_MeshElement * element); - - void addChildrenWithNodes(std::set& setOfChildren, - const SMDS_MeshElement * element, - std::set& nodes); - - // Fields PRIVATE - - SetOfNodes myNodes; - SetOfEdges myEdges; - SetOfFaces myFaces; - SetOfVolumes myVolumes; - SMDS_Mesh *myParent; - std::list myChildren; - SMDS_MeshElementIDFactory *myNodeIDFactory; - SMDS_MeshElementIDFactory *myElementIDFactory; - - bool myHasConstructionEdges; - bool myHasConstructionFaces; - bool myHasInverseElements; -}; - - -#endif diff --git a/src/SMDS/SMDS_MeshEdge.cxx b/src/SMDS/SMDS_MeshEdge.cxx deleted file mode 100644 index 66c8ae3d5..000000000 --- a/src/SMDS/SMDS_MeshEdge.cxx +++ /dev/null @@ -1,150 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshEdge.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshEdge.hxx" -#include "SMDS_IteratorOfElements.hxx" -#include "SMDS_MeshNode.hxx" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshEdge -//purpose : -//======================================================================= - -SMDS_MeshEdge::SMDS_MeshEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) -{ - myNodes[0]=node1; - myNodes[1]=node2; -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_MeshEdge::Print(ostream & OS) const -{ - OS << "edge <" << GetID() << "> : (" << myNodes[0] << " , " << myNodes[1] << - ") " << endl; -} - -int SMDS_MeshEdge::NbNodes() const -{ - return 2; -} - -int SMDS_MeshEdge::NbEdges() const -{ - return 1; -} - -SMDSAbs_ElementType SMDS_MeshEdge::GetType() const -{ - return SMDSAbs_Edge; -} - -class SMDS_MeshEdge_MyNodeIterator:public SMDS_ElemIterator -{ - const SMDS_MeshNode *const* myNodes; - int myIndex; - public: - SMDS_MeshEdge_MyNodeIterator(const SMDS_MeshNode * const* nodes): - myNodes(nodes),myIndex(0) {} - - bool more() - { - return myIndex<2; - } - - const SMDS_MeshElement* next() - { - myIndex++; - return myNodes[myIndex-1]; - } -}; - -SMDS_ElemIteratorPtr SMDS_MeshEdge:: - elementsIterator(SMDSAbs_ElementType type) const -{ - switch(type) - { - case SMDSAbs_Edge: - return SMDS_MeshElement::elementsIterator(SMDSAbs_Edge); - case SMDSAbs_Node: - return SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes)); - default: - return SMDS_ElemIteratorPtr - (new SMDS_IteratorOfElements - (this,type, SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes)))); - } -} - -bool operator<(const SMDS_MeshEdge & e1, const SMDS_MeshEdge & e2) -{ - int id11=e1.myNodes[0]->GetID(); - int id21=e2.myNodes[0]->GetID(); - int id12=e1.myNodes[1]->GetID(); - int id22=e2.myNodes[1]->GetID(); - int tmp; - - if(id11>=id12) - { - tmp=id11; - id11=id12; - id12=tmp; - } - if(id21>=id22) - { - tmp=id21; - id21=id22; - id22=tmp; - } - - if(id11 - -class SMDS_MeshEdge:public SMDS_MeshElement -{ - - public: - SMDS_MeshEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2); - bool ChangeNodes(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2); - void Print(std::ostream & OS) const; - - SMDSAbs_ElementType GetType() const; - int NbNodes() const; - int NbEdges() const; - friend bool operator<(const SMDS_MeshEdge& e1, const SMDS_MeshEdge& e2); - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - private: - const SMDS_MeshNode* myNodes[2]; - -}; -#endif diff --git a/src/SMDS/SMDS_MeshElement.cxx b/src/SMDS/SMDS_MeshElement.cxx deleted file mode 100644 index 8d4d9b75d..000000000 --- a/src/SMDS/SMDS_MeshElement.cxx +++ /dev/null @@ -1,194 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_MeshEdge.hxx" -#include "SMDS_MeshFace.hxx" -#include "SMDS_MeshVolume.hxx" -#include "utilities.h" - -using namespace std; - -SMDS_MeshElement::SMDS_MeshElement(int ID):myID(ID) -{ -} - -void SMDS_MeshElement::Print(ostream & OS) const -{ - OS << "dump of mesh element" << endl; -} - -ostream & operator <<(ostream & OS, const SMDS_MeshElement * ME) -{ - ME->Print(OS); - return OS; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create an iterator which iterate on nodes owned by the element. -/// This method call elementsIterator(). -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_MeshElement::nodesIterator() const -{ - return elementsIterator(SMDSAbs_Node); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create an iterator which iterate on edges linked with or owned by the element. -/// This method call elementsIterator(). -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_MeshElement::edgesIterator() const -{ - return elementsIterator(SMDSAbs_Edge); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create an iterator which iterate on faces linked with or owned by the element. -/// This method call elementsIterator(). -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_MeshElement::facesIterator() const -{ - return elementsIterator(SMDSAbs_Face); -} - -/////////////////////////////////////////////////////////////////////////////// -///Return The number of nodes owned by the current element -/////////////////////////////////////////////////////////////////////////////// -int SMDS_MeshElement::NbNodes() const -{ - int nbnodes=0; - SMDS_ElemIteratorPtr it=nodesIterator(); - while(it->more()) - { - it->next(); - nbnodes++; - } - return nbnodes; -} - -/////////////////////////////////////////////////////////////////////////////// -///Return the number of edges owned by or linked with the current element -/////////////////////////////////////////////////////////////////////////////// -int SMDS_MeshElement::NbEdges() const -{ - int nbedges=0; - SMDS_ElemIteratorPtr it=edgesIterator(); - while(it->more()) - { - it->next(); - nbedges++; - } - return nbedges; -} - -/////////////////////////////////////////////////////////////////////////////// -///Return the number of faces owned by or linked with the current element -/////////////////////////////////////////////////////////////////////////////// -int SMDS_MeshElement::NbFaces() const -{ - int nbfaces=0; - SMDS_ElemIteratorPtr it=facesIterator(); - while(it->more()) - { - it->next(); - nbfaces++; - } - return nbfaces; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create an iterator which iterate on elements linked with the current element. -///@param type The of elements on which you want to iterate -///@return A smart pointer to iterator, you are not to take care of freeing memory -/////////////////////////////////////////////////////////////////////////////// -class SMDS_MeshElement_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshElement * myElement; - bool myMore; - public: - SMDS_MeshElement_MyIterator(const SMDS_MeshElement * element): - myElement(element),myMore(true) {} - - bool more() - { - return myMore; - } - - const SMDS_MeshElement* next() - { - myMore=false; - return myElement; - } -}; -SMDS_ElemIteratorPtr SMDS_MeshElement:: - elementsIterator(SMDSAbs_ElementType type) const -{ - /** @todo Check that iterator in the child classes return elements - in the same order for each different implementation (i.e: SMDS_VolumeOfNodes - and SMDS_VolumeOfFaces */ - - if(type==GetType()) - return SMDS_ElemIteratorPtr(new SMDS_MeshElement_MyIterator(this)); - else - { - MESSAGE("Iterator not implemented"); - return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL); - } -} - -/////////////////////////////////////////////////////////////////////////////// -///Return the ID of the element -/////////////////////////////////////////////////////////////////////////////// -int SMDS_MeshElement::GetID() const -{ - return myID; -} - -bool operator<(const SMDS_MeshElement& e1, const SMDS_MeshElement& e2) -{ - if(e1.GetType()!=e2.GetType()) return false; - switch(e1.GetType()) - { - case SMDSAbs_Node: - return static_cast(e1) < - static_cast(e2); - - case SMDSAbs_Edge: - return static_cast(e1) < - static_cast(e2); - - case SMDSAbs_Face: - return static_cast(e1) < - static_cast(e2); - - case SMDSAbs_Volume: - return static_cast(e1) < - static_cast(e2); - - default : MESSAGE("Internal Error"); - } - return false; -} diff --git a/src/SMDS/SMDS_MeshElement.hxx b/src/SMDS/SMDS_MeshElement.hxx deleted file mode 100644 index 73870b707..000000000 --- a/src/SMDS/SMDS_MeshElement.hxx +++ /dev/null @@ -1,87 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshElement.hxx -// Module : SMESH - -#ifndef _SMDS_MeshElement_HeaderFile -#define _SMDS_MeshElement_HeaderFile - -#include "SMDSAbs_ElementType.hxx" -#include "SMDS_MeshObject.hxx" -#include "SMDS_ElemIterator.hxx" -#include "SMDS_MeshElementIDFactory.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -#include -#include - -class SMDS_MeshNode; -class SMDS_MeshEdge; -class SMDS_MeshFace; - -/////////////////////////////////////////////////////////////////////////////// -/// Base class for elements -/////////////////////////////////////////////////////////////////////////////// -class SMDS_WNT_EXPORT SMDS_MeshElement:public SMDS_MeshObject -{ - - public: - SMDS_ElemIteratorPtr nodesIterator() const; - SMDS_ElemIteratorPtr edgesIterator() const; - SMDS_ElemIteratorPtr facesIterator() const; - virtual SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - virtual int NbNodes() const; - virtual int NbEdges() const; - virtual int NbFaces() const; - int GetID() const; - - ///Return the type of the current element - virtual SMDSAbs_ElementType GetType() const = 0; - virtual bool IsPoly() const { return false; }; - - friend std::ostream & operator <<(std::ostream & OS, const SMDS_MeshElement *); - friend bool SMDS_MeshElementIDFactory::BindID(int ID,SMDS_MeshElement*elem); - - protected: - SMDS_MeshElement(int ID=-1); - virtual void Print(std::ostream & OS) const; - - private: - int myID; -}; - -#endif diff --git a/src/SMDS/SMDS_MeshElementIDFactory.cxx b/src/SMDS/SMDS_MeshElementIDFactory.cxx deleted file mode 100644 index 8fc09230b..000000000 --- a/src/SMDS/SMDS_MeshElementIDFactory.cxx +++ /dev/null @@ -1,169 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshElementIDFactory.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshElementIDFactory.hxx" -#include "SMDS_MeshElement.hxx" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshElementIDFactory -//purpose : -//======================================================================= -SMDS_MeshElementIDFactory::SMDS_MeshElementIDFactory(): - SMDS_MeshIDFactory(), - myMin(0), myMax(0) -{ -} - -//======================================================================= -//function : BindID -//purpose : -//======================================================================= -bool SMDS_MeshElementIDFactory::BindID(int ID, SMDS_MeshElement * elem) -{ - if (myIDElements.IsBound(ID)) - return false; - myIDElements.Bind(ID,elem); - elem->myID=ID; - updateMinMax (ID); - return true; -} - -//======================================================================= -//function : MeshElement -//purpose : -//======================================================================= -SMDS_MeshElement* SMDS_MeshElementIDFactory::MeshElement(int ID) -{ - if (!myIDElements.IsBound(ID)) - return NULL; - return myIDElements.Find(ID); -} - - -//======================================================================= -//function : GetFreeID -//purpose : -//======================================================================= -int SMDS_MeshElementIDFactory::GetFreeID() -{ - int ID; - do { - ID = SMDS_MeshIDFactory::GetFreeID(); - } while (myIDElements.IsBound(ID)); - return ID; -} - -//======================================================================= -//function : ReleaseID -//purpose : -//======================================================================= -void SMDS_MeshElementIDFactory::ReleaseID(const int ID) -{ - myIDElements.UnBind(ID); - SMDS_MeshIDFactory::ReleaseID(ID); - if (ID == myMax) - myMax = 0; - if (ID == myMin) - myMin = 0; -} - -//======================================================================= -//function : GetMaxID -//purpose : -//======================================================================= - -int SMDS_MeshElementIDFactory::GetMaxID() const -{ - if (myMax == 0) - updateMinMax(); - return myMax; -} - -//======================================================================= -//function : GetMinID -//purpose : -//======================================================================= - -int SMDS_MeshElementIDFactory::GetMinID() const -{ - if (myMin == 0) - updateMinMax(); - return myMin; -} - -//======================================================================= -//function : updateMinMax -//purpose : -//======================================================================= - -void SMDS_MeshElementIDFactory::updateMinMax() const -{ - myMin = IntegerLast(); - myMax = 0; - SMDS_IdElementMap::Iterator it(myIDElements); - for (; it.More(); it.Next()) - updateMinMax (it.Key()); - if (myMin == IntegerLast()) - myMin = 0; -} - -//======================================================================= -//function : elementsIterator -//purpose : Return an iterator on elements of the factory -//======================================================================= - -class SMDS_Fact_MyElemIterator:public SMDS_ElemIterator -{ - SMDS_IdElementMap::Iterator myIterator; - public: - SMDS_Fact_MyElemIterator(const SMDS_IdElementMap& s):myIterator(s) - {} - - bool more() - { - return myIterator.More() != Standard_False; - } - - const SMDS_MeshElement* next() - { - const SMDS_MeshElement* current = myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_ElemIteratorPtr SMDS_MeshElementIDFactory::elementsIterator() const -{ - return SMDS_ElemIteratorPtr - (new SMDS_Fact_MyElemIterator(myIDElements)); -} diff --git a/src/SMDS/SMDS_MeshElementIDFactory.hxx b/src/SMDS/SMDS_MeshElementIDFactory.hxx deleted file mode 100644 index 526bcb5a0..000000000 --- a/src/SMDS/SMDS_MeshElementIDFactory.hxx +++ /dev/null @@ -1,63 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshElementIDFactory.hxx -// Module : SMESH - -#ifndef _SMDS_MeshElementIDFactory_HeaderFile -#define _SMDS_MeshElementIDFactory_HeaderFile - -#include "SMDS_MeshIDFactory.hxx" -#include "SMDS_ElemIterator.hxx" - -#include - -class SMDS_MeshElement; - -typedef NCollection_DataMap SMDS_IdElementMap; - -class SMDS_MeshElementIDFactory:public SMDS_MeshIDFactory -{ -public: - SMDS_MeshElementIDFactory(); - bool BindID(int ID, SMDS_MeshElement * elem); - SMDS_MeshElement * MeshElement(int ID); - virtual int GetFreeID(); - virtual void ReleaseID(int ID); - int GetMaxID() const; - int GetMinID() const; - SMDS_ElemIteratorPtr elementsIterator() const; -private: - void updateMinMax() const; - void updateMinMax(int id) const - { - if (id > myMax) myMax = id; - if (id < myMin) myMin = id; - } - - SMDS_IdElementMap myIDElements; - mutable int myMin, myMax; - -}; - -#endif diff --git a/src/SMDS/SMDS_MeshFace.cxx b/src/SMDS/SMDS_MeshFace.cxx deleted file mode 100644 index b7014293a..000000000 --- a/src/SMDS/SMDS_MeshFace.cxx +++ /dev/null @@ -1,27 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#include "SMDS_MeshFace.hxx" - -SMDSAbs_ElementType SMDS_MeshFace::GetType() const -{ - return SMDSAbs_Face; -} diff --git a/src/SMDS/SMDS_MeshFace.hxx b/src/SMDS/SMDS_MeshFace.hxx deleted file mode 100644 index 36f2fa542..000000000 --- a/src/SMDS/SMDS_MeshFace.hxx +++ /dev/null @@ -1,38 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshFace.hxx -// Module : SMESH - -#ifndef _SMDS_MeshFace_HeaderFile -#define _SMDS_MeshFace_HeaderFile - -#include "SMDS_MeshElement.hxx" - -class SMDS_MeshFace:public SMDS_MeshElement -{ - public: - SMDSAbs_ElementType GetType() const; -}; - -#endif diff --git a/src/SMDS/SMDS_MeshGroup.cxx b/src/SMDS/SMDS_MeshGroup.cxx deleted file mode 100644 index 0cb481c50..000000000 --- a/src/SMDS/SMDS_MeshGroup.cxx +++ /dev/null @@ -1,163 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE -// -// 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 or email : webmaster@opencascade.org -// -// -// -// File : SMDS_MeshGroup.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshGroup.hxx" -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshGroup -//purpose : -//======================================================================= - -SMDS_MeshGroup::SMDS_MeshGroup(const SMDS_Mesh * theMesh, - const SMDSAbs_ElementType theType) - :myMesh(theMesh),myType(theType), myParent(NULL) -{ -} - -//======================================================================= -//function : SMDS_MeshGroup -//purpose : -//======================================================================= - -SMDS_MeshGroup::SMDS_MeshGroup(SMDS_MeshGroup * theParent, - const SMDSAbs_ElementType theType) - :myMesh(theParent->myMesh),myType(theType), myParent(theParent) -{ -} - -//======================================================================= -//function : AddSubGroup -//purpose : -//======================================================================= - -const SMDS_MeshGroup *SMDS_MeshGroup::AddSubGroup - (const SMDSAbs_ElementType theType) -{ - const SMDS_MeshGroup * subgroup = new SMDS_MeshGroup(this,theType); - myChildren.insert(myChildren.end(),subgroup); - return subgroup; -} - -//======================================================================= -//function : RemoveSubGroup -//purpose : -//======================================================================= - -bool SMDS_MeshGroup::RemoveSubGroup(const SMDS_MeshGroup * theGroup) -{ - bool found = false; - list::iterator itgroup; - for(itgroup=myChildren.begin(); itgroup!=myChildren.end(); itgroup++) - { - const SMDS_MeshGroup* subgroup=*itgroup; - if (subgroup == theGroup) - { - found = true; - myChildren.erase(itgroup); - } - } - - return found; -} - -//======================================================================= -//function : RemoveFromParent -//purpose : -//======================================================================= - -bool SMDS_MeshGroup::RemoveFromParent() -{ - - if (myParent==NULL) return false; - else - { - return (myParent->RemoveSubGroup(this)); - } -} -//======================================================================= -//function : Clear -//purpose : -//======================================================================= - -void SMDS_MeshGroup::Clear() -{ - myElements.clear(); - myType = SMDSAbs_All; -} - -//======================================================================= -//function : Add -//purpose : -//======================================================================= - -void SMDS_MeshGroup::Add(const SMDS_MeshElement * theElem) -{ - // the type of the group is determined by the first element added - if (myElements.empty()) myType = theElem->GetType(); - else if (theElem->GetType() != myType) - MESSAGE("SMDS_MeshGroup::Add : Type Mismatch "<GetType()<<"!="< - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_MeshGroup:public SMDS_MeshObject -{ - public: - SMDS_MeshGroup(const SMDS_Mesh * theMesh, - const SMDSAbs_ElementType theType = SMDSAbs_All); - const SMDS_MeshGroup * AddSubGroup - (const SMDSAbs_ElementType theType = SMDSAbs_All); - virtual bool RemoveSubGroup(const SMDS_MeshGroup* theGroup); - virtual bool RemoveFromParent(); - - const SMDS_Mesh* GetMesh() const { return myMesh; } - - void SetType (const SMDSAbs_ElementType theType); - void Clear(); - void Add(const SMDS_MeshElement * theElem); - void Remove(const SMDS_MeshElement * theElem); - bool IsEmpty() const { return myElements.empty(); } - int Extent() const { return myElements.size(); } - - SMDSAbs_ElementType GetType() const { return myType; } - - bool Contains(const SMDS_MeshElement * theElem) const; - - void InitIterator() const - { const_cast(myIterator) = myElements.begin(); } - - bool More() const { return myIterator != myElements.end(); } - - const SMDS_MeshElement* Next() const - { return *(const_cast(myIterator))++; } - - private: - SMDS_MeshGroup(SMDS_MeshGroup* theParent, - const SMDSAbs_ElementType theType = SMDSAbs_All); - - typedef std::set::const_iterator TIterator; - const SMDS_Mesh * myMesh; - SMDSAbs_ElementType myType; - std::set myElements; - SMDS_MeshGroup * myParent; - std::list myChildren; - TIterator myIterator; -}; -#endif diff --git a/src/SMDS/SMDS_MeshIDFactory.cxx b/src/SMDS/SMDS_MeshIDFactory.cxx deleted file mode 100644 index 536b2f783..000000000 --- a/src/SMDS/SMDS_MeshIDFactory.cxx +++ /dev/null @@ -1,83 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshIDFactory.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - - -#include "SMDS_MeshIDFactory.hxx" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshIDFactory -//purpose : -//======================================================================= - -SMDS_MeshIDFactory::SMDS_MeshIDFactory():myMaxID(0) -{ -} - -int SMDS_MeshIDFactory::GetFreeID() -{ - if (myPoolOfID.empty()) return ++myMaxID; - else - { - set::iterator i = myPoolOfID.begin(); - int ID = *i;//myPoolOfID.top(); - myPoolOfID.erase( i );//myPoolOfID.pop(); - return ID; - } -} - -//======================================================================= -//function : ReleaseID -//purpose : -//======================================================================= -void SMDS_MeshIDFactory::ReleaseID(const int ID) -{ - if ( ID > 0 ) - { - if ( ID < myMaxID ) - { - myPoolOfID.insert(ID); - } - else if ( ID == myMaxID ) - { - --myMaxID; - if ( !myPoolOfID.empty() ) // assure that myMaxID is not in myPoolOfID - { - set::iterator i = --myPoolOfID.end(); - while ( i != myPoolOfID.begin() && myMaxID == *i ) { - --myMaxID; --i; - } - if ( myMaxID == *i ) - --myMaxID; // begin of myPoolOfID reached - else - ++i; - myPoolOfID.erase( i, myPoolOfID.end() ); - } - } - } -} diff --git a/src/SMDS/SMDS_MeshIDFactory.hxx b/src/SMDS/SMDS_MeshIDFactory.hxx deleted file mode 100644 index 8a6425ac2..000000000 --- a/src/SMDS/SMDS_MeshIDFactory.hxx +++ /dev/null @@ -1,46 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshIDFactory.hxx -// Module : SMESH - -#ifndef _SMDS_MeshIDFactory_HeaderFile -#define _SMDS_MeshIDFactory_HeaderFile - -#include "SMDS_MeshObject.hxx" -#include - - -class SMDS_MeshIDFactory:public SMDS_MeshObject -{ - public: - virtual int GetFreeID(); - virtual void ReleaseID(int ID); - - protected: - SMDS_MeshIDFactory(); - int myMaxID; - std::set myPoolOfID; -}; - -#endif diff --git a/src/SMDS/SMDS_MeshNode.cxx b/src/SMDS/SMDS_MeshNode.cxx deleted file mode 100644 index 06ab12173..000000000 --- a/src/SMDS/SMDS_MeshNode.cxx +++ /dev/null @@ -1,246 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshNode.hxx" -#include "SMDS_SpacePosition.hxx" -#include "SMDS_IteratorOfElements.hxx" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshNode -//purpose : -//======================================================================= - -SMDS_MeshNode::SMDS_MeshNode(double x, double y, double z): - myX(x), myY(y), myZ(z), - myPosition(SMDS_SpacePosition::originSpacePosition()) -{ -} - -//======================================================================= -//function : RemoveInverseElement -//purpose : -//======================================================================= - -void SMDS_MeshNode::RemoveInverseElement(const SMDS_MeshElement * parent) -{ - NCollection_List::Iterator it(myInverseElements); - while (it.More()) { - const SMDS_MeshElement* elem = it.Value(); - if (elem == parent) - myInverseElements.Remove(it); - else - it.Next(); - } -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_MeshNode::Print(ostream & OS) const -{ - OS << "Node <" << GetID() << "> : X = " << myX << " Y = " - << myY << " Z = " << myZ << endl; -} - -//======================================================================= -//function : SetPosition -//purpose : -//======================================================================= - -void SMDS_MeshNode::SetPosition(const SMDS_PositionPtr& aPos) -{ - myPosition = aPos; -} - -//======================================================================= -//function : GetPosition -//purpose : -//======================================================================= - -const SMDS_PositionPtr& SMDS_MeshNode::GetPosition() const -{ - return myPosition; -} - -class SMDS_MeshNode_MyInvIterator:public SMDS_ElemIterator -{ - NCollection_List::Iterator myIterator; - public: - SMDS_MeshNode_MyInvIterator(const NCollection_List& s): - myIterator(s) - {} - - bool more() - { - return myIterator.More() != Standard_False; - } - - const SMDS_MeshElement* next() - { - const SMDS_MeshElement* current=myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_ElemIteratorPtr SMDS_MeshNode:: - GetInverseElementIterator() const -{ - return SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyInvIterator(myInverseElements)); -} - -// Same as GetInverseElementIterator but the create iterator only return -// wanted type elements. -class SMDS_MeshNode_MyIterator:public SMDS_ElemIterator -{ - NCollection_List mySet; - NCollection_List::Iterator myIterator; - public: - SMDS_MeshNode_MyIterator(SMDSAbs_ElementType type, - const NCollection_List& s) - { - const SMDS_MeshElement * e; - bool toInsert; - NCollection_List::Iterator it(s); - for(; it.More(); it.Next()) - { - e=it.Value(); - switch(type) - { - case SMDSAbs_Edge: toInsert=true; break; - case SMDSAbs_Face: toInsert=(e->GetType()!=SMDSAbs_Edge); break; - case SMDSAbs_Volume: toInsert=(e->GetType()==SMDSAbs_Volume); break; - } - if(toInsert) mySet.Append(e); - } - myIterator.Init(mySet); - } - - bool more() - { - return myIterator.More() != Standard_False; - } - - const SMDS_MeshElement* next() - { - const SMDS_MeshElement* current=myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_ElemIteratorPtr SMDS_MeshNode:: - elementsIterator(SMDSAbs_ElementType type) const -{ - if(type==SMDSAbs_Node) - return SMDS_MeshElement::elementsIterator(SMDSAbs_Node); - else - return SMDS_ElemIteratorPtr - (new SMDS_IteratorOfElements - (this,type, - SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyIterator(type, myInverseElements)))); -} - -int SMDS_MeshNode::NbNodes() const -{ - return 1; -} - -double SMDS_MeshNode::X() const -{ - return myX; -} - -double SMDS_MeshNode::Y() const -{ - return myY; -} - -double SMDS_MeshNode::Z() const -{ - return myZ; -} - -void SMDS_MeshNode::setXYZ(double x, double y, double z) -{ - myX=x; - myY=y; - myZ=z; -} - -SMDSAbs_ElementType SMDS_MeshNode::GetType() const -{ - return SMDSAbs_Node; -} - -//======================================================================= -//function : AddInverseElement -//purpose : -//======================================================================= -void SMDS_MeshNode::AddInverseElement(const SMDS_MeshElement* ME) -{ - NCollection_List::Iterator it(myInverseElements); - for (; it.More(); it.Next()) { - const SMDS_MeshElement* elem = it.Value(); - if (elem == ME) - return; - } - myInverseElements.Append(ME); -} - -//======================================================================= -//function : ClearInverseElements -//purpose : -//======================================================================= -void SMDS_MeshNode::ClearInverseElements() -{ - myInverseElements.Clear(); -} - -bool SMDS_MeshNode::emptyInverseElements() -{ - return myInverseElements.IsEmpty() != Standard_False; -} - -/////////////////////////////////////////////////////////////////////////////// -/// To be used with STL set -/////////////////////////////////////////////////////////////////////////////// -bool operator<(const SMDS_MeshNode& e1, const SMDS_MeshNode& e2) -{ - return e1.GetID() - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_MeshNode:public SMDS_MeshElement -{ - - public: - SMDS_MeshNode(double x, double y, double z); - void Print(std::ostream & OS) const; - double X() const; - double Y() const; - double Z() const; - void AddInverseElement(const SMDS_MeshElement * ME); - void RemoveInverseElement(const SMDS_MeshElement * parent); - void ClearInverseElements(); - bool emptyInverseElements(); - SMDS_ElemIteratorPtr GetInverseElementIterator() const; - void SetPosition(const SMDS_PositionPtr& aPos); - const SMDS_PositionPtr& GetPosition() const; - SMDSAbs_ElementType GetType() const; - int NbNodes() const; - void setXYZ(double x, double y, double z); - friend bool operator<(const SMDS_MeshNode& e1, const SMDS_MeshNode& e2); - - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - private: - double myX, myY, myZ; - SMDS_PositionPtr myPosition; - NCollection_List myInverseElements; -}; - -#endif diff --git a/src/SMDS/SMDS_MeshObject.cxx b/src/SMDS/SMDS_MeshObject.cxx deleted file mode 100644 index b822b8098..000000000 --- a/src/SMDS/SMDS_MeshObject.cxx +++ /dev/null @@ -1,28 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshObject.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_MeshObject.hxx" diff --git a/src/SMDS/SMDS_MeshObject.hxx b/src/SMDS/SMDS_MeshObject.hxx deleted file mode 100644 index f734309cf..000000000 --- a/src/SMDS/SMDS_MeshObject.hxx +++ /dev/null @@ -1,48 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshObject.hxx -// Module : SMESH - -#ifndef _SMDS_MeshObject_HeaderFile -#define _SMDS_MeshObject_HeaderFile - - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_MeshObject -{ - public: - virtual ~SMDS_MeshObject() {} -}; -#endif diff --git a/src/SMDS/SMDS_MeshVolume.cxx b/src/SMDS/SMDS_MeshVolume.cxx deleted file mode 100644 index 561f0dccb..000000000 --- a/src/SMDS/SMDS_MeshVolume.cxx +++ /dev/null @@ -1,38 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshVolume.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_MeshVolume.hxx" -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -SMDSAbs_ElementType SMDS_MeshVolume::GetType() const -{ - return SMDSAbs_Volume; -} - diff --git a/src/SMDS/SMDS_MeshVolume.hxx b/src/SMDS/SMDS_MeshVolume.hxx deleted file mode 100644 index c543c3001..000000000 --- a/src/SMDS/SMDS_MeshVolume.hxx +++ /dev/null @@ -1,38 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_MeshVolume.hxx -// Module : SMESH - -#ifndef _SMDS_MeshVolume_HeaderFile -#define _SMDS_MeshVolume_HeaderFile - -#include "SMDS_MeshElement.hxx" - -class SMDS_MeshVolume:public SMDS_MeshElement -{ - - public: - SMDSAbs_ElementType GetType() const; -}; -#endif diff --git a/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx b/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx deleted file mode 100644 index 38abf18c2..000000000 --- a/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx +++ /dev/null @@ -1,174 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_PolygonalFaceOfNodes.hxx" - -#include "SMDS_IteratorOfElements.hxx" -//#include "SMDS_MeshNode.hxx" -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -SMDS_PolygonalFaceOfNodes::SMDS_PolygonalFaceOfNodes - (std::vector nodes) -{ - myNodes = nodes; -} - -//======================================================================= -//function : GetType -//purpose : -//======================================================================= -SMDSAbs_ElementType SMDS_PolygonalFaceOfNodes::GetType() const -{ - return SMDSAbs_Face; - //return SMDSAbs_PolygonalFace; -} - -//======================================================================= -//function : ChangeNodes -//purpose : -//======================================================================= -bool SMDS_PolygonalFaceOfNodes::ChangeNodes (std::vector nodes) -{ - if (nodes.size() < 3) - return false; - - myNodes = nodes; - - return true; -} - -//======================================================================= -//function : ChangeNodes -//purpose : to support the same interface, as SMDS_FaceOfNodes -//======================================================================= -bool SMDS_PolygonalFaceOfNodes::ChangeNodes (const SMDS_MeshNode* nodes[], - const int nbNodes) -{ - if (nbNodes < 3) - return false; - - myNodes.resize(nbNodes); - int i = 0; - for (; i < nbNodes; i++) { - myNodes[i] = nodes[i]; - } - - return true; -} - -//======================================================================= -//function : NbNodes -//purpose : -//======================================================================= -int SMDS_PolygonalFaceOfNodes::NbNodes() const -{ - return myNodes.size(); -} - -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= -int SMDS_PolygonalFaceOfNodes::NbEdges() const -{ - return NbNodes(); -} - -//======================================================================= -//function : NbFaces -//purpose : -//======================================================================= -int SMDS_PolygonalFaceOfNodes::NbFaces() const -{ - return 1; -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= -void SMDS_PolygonalFaceOfNodes::Print(ostream & OS) const -{ - OS << "polygonal face <" << GetID() << " > : "; - int i, nbNodes = myNodes.size(); - for (i = 0; i < nbNodes - 1; i++) - OS << myNodes[i] << ","; - OS << myNodes[i] << ") " << endl; -} - -//======================================================================= -//function : elementsIterator -//purpose : -//======================================================================= -class SMDS_PolygonalFaceOfNodes_MyIterator:public SMDS_ElemIterator -{ - //const SMDS_MeshNode* const *mySet; - const std::vector mySet; - //int myLength; - int index; - public: - //SMDS_PolygonalFaceOfNodes_MyIterator(const SMDS_MeshNode* const *s, int l): - // mySet(s),myLength(l),index(0) {} - SMDS_PolygonalFaceOfNodes_MyIterator(const std::vector s): - mySet(s),index(0) {} - - bool more() - { - return index < mySet.size(); - } - - const SMDS_MeshElement* next() - { - index++; - return mySet[index-1]; - } -}; - -SMDS_ElemIteratorPtr SMDS_PolygonalFaceOfNodes::elementsIterator - (SMDSAbs_ElementType type) const -{ - switch(type) - { - case SMDSAbs_Face: - return SMDS_MeshElement::elementsIterator(SMDSAbs_Face); - case SMDSAbs_Node: - return SMDS_ElemIteratorPtr(new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes)); - case SMDSAbs_Edge: - MESSAGE("Error : edge iterator for SMDS_PolygonalFaceOfNodes not implemented"); - break; - default: - return SMDS_ElemIteratorPtr - (new SMDS_IteratorOfElements - (this,type,SMDS_ElemIteratorPtr - (new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes)))); - } - return SMDS_ElemIteratorPtr(); -} diff --git a/src/SMDS/SMDS_PolygonalFaceOfNodes.hxx b/src/SMDS/SMDS_PolygonalFaceOfNodes.hxx deleted file mode 100644 index 567746259..000000000 --- a/src/SMDS/SMDS_PolygonalFaceOfNodes.hxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifndef _SMDS_PolygonalFaceOfNodes_HeaderFile -#define _SMDS_PolygonalFaceOfNodes_HeaderFile - -#include "SMDS_MeshFace.hxx" -//#include "SMDS_FaceOfNodes.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_Iterator.hxx" - -#include - -//class SMDS_PolygonalFaceOfNodes:public SMDS_FaceOfNodes -class SMDS_PolygonalFaceOfNodes:public SMDS_MeshFace -{ - public: - SMDS_PolygonalFaceOfNodes (std::vector nodes); - - virtual SMDSAbs_ElementType GetType() const; - virtual bool IsPoly() const { return true; }; - - bool ChangeNodes (std::vector nodes); - - bool ChangeNodes (const SMDS_MeshNode* nodes[], - const int nbNodes); - // to support the same interface, as SMDS_FaceOfNodes - - virtual int NbNodes() const; - virtual int NbEdges() const; - virtual int NbFaces() const; - - virtual void Print (std::ostream & OS) const; - - protected: - virtual SMDS_ElemIteratorPtr elementsIterator (SMDSAbs_ElementType type) const; - - private: - std::vector myNodes; -}; - -#endif diff --git a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx b/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx deleted file mode 100644 index 84ce2134d..000000000 --- a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx +++ /dev/null @@ -1,190 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_PolyhedralVolumeOfNodes.hxx" -#include "SMDS_MeshNode.hxx" -#include "utilities.h" - -#include - -using namespace std; - -//======================================================================= -//function : Constructor -//purpose : Create a volume of many faces -//======================================================================= -SMDS_PolyhedralVolumeOfNodes::SMDS_PolyhedralVolumeOfNodes - (std::vector nodes, - std::vector quantities) -: SMDS_VolumeOfNodes(NULL, NULL, NULL, NULL) -{ - ChangeNodes(nodes, quantities); -} - -//======================================================================= -//function : GetType -//purpose : -//======================================================================= -SMDSAbs_ElementType SMDS_PolyhedralVolumeOfNodes::GetType() const -{ -// return SMDSAbs_PolyhedralVolume; - return SMDSAbs_Volume; -} - -//======================================================================= -//function : ChangeNodes -//purpose : -//======================================================================= -bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (std::vector nodes, - std::vector quantities) -{ - myNodesByFaces = nodes; - myQuantities = quantities; - - // Init fields of parent class - int aNbNodes = 0; - std::set aSet; - int nodes_len = nodes.size(); - for (int j = 0; j < nodes_len; j++) { - if (aSet.find(nodes[j]) == aSet.end()) { - aSet.insert(nodes[j]); - aNbNodes++; - } - } - - int k = 0; -#ifndef WNT - const SMDS_MeshNode* aNodes [aNbNodes]; -#else - const SMDS_MeshNode** aNodes = (const SMDS_MeshNode **)new SMDS_MeshNode*[aNbNodes]; -#endif - std::set::iterator anIter = aSet.begin(); - for (; anIter != aSet.end(); anIter++, k++) { - aNodes[k] = *anIter; - } - - //SMDS_VolumeOfNodes::ChangeNodes(aNodes, aNbNodes); - delete [] myNodes; - //myNbNodes = nodes.size(); - myNbNodes = aNbNodes; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - for (int i = 0; i < myNbNodes; i++) { - //myNodes[i] = nodes[i]; - myNodes[i] = aNodes[i]; - } - -#ifdef WNT - delete [] aNodes; -#endif - - return true; -} - -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= -int SMDS_PolyhedralVolumeOfNodes::NbEdges() const -{ - int nbEdges = 0; - - for (int ifa = 0; ifa < myQuantities.size(); ifa++) { - nbEdges += myQuantities[ifa]; - } - nbEdges /= 2; - - return nbEdges; -} - -//======================================================================= -//function : NbFaces -//purpose : -//======================================================================= -int SMDS_PolyhedralVolumeOfNodes::NbFaces() const -{ - return myQuantities.size(); -} - -//======================================================================= -//function : NbFaceNodes -//purpose : -//======================================================================= -int SMDS_PolyhedralVolumeOfNodes::NbFaceNodes (const int face_ind) const -{ - if (face_ind < 1 || myQuantities.size() < face_ind) - return 0; - return myQuantities[face_ind - 1]; -} - -//======================================================================= -//function : GetFaceNode -//purpose : -//======================================================================= -const SMDS_MeshNode* SMDS_PolyhedralVolumeOfNodes::GetFaceNode (const int face_ind, - const int node_ind) const -{ - if (node_ind < 1 || NbFaceNodes(face_ind) < node_ind) - return NULL; - - int i, first_node = 0; - for (i = 0; i < face_ind - 1; i++) { - first_node += myQuantities[i]; - } - - return myNodesByFaces[first_node + node_ind - 1]; -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= -void SMDS_PolyhedralVolumeOfNodes::Print (ostream & OS) const -{ - OS << "polyhedral volume <" << GetID() << "> : "; - - int faces_len = myQuantities.size(); - //int nodes_len = myNodesByFaces.size(); - int cur_first_node = 0; - - int i, j; - for (i = 0; i < faces_len; i++) { - OS << "face_" << i << " ("; - for (j = 0; j < myQuantities[i] - 1; j++) { - OS << myNodesByFaces[cur_first_node + j] << ","; - } - OS << myNodesByFaces[cur_first_node + j] << ") "; - cur_first_node += myQuantities[i]; - } -} - -//======================================================================= -//function : ChangeNodes -//purpose : usage disabled -//======================================================================= -bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (const SMDS_MeshNode* nodes[], - const int nbNodes) -{ - return false; -} diff --git a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx b/src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx deleted file mode 100644 index baecaf339..000000000 --- a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx +++ /dev/null @@ -1,77 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_PolyhedralVolumeOfNodes.hxx -// Module : SMESH - -#ifndef _SMDS_PolyhedralVolumeOfNodes_HeaderFile -#define _SMDS_PolyhedralVolumeOfNodes_HeaderFile - -#include "SMDS_VolumeOfNodes.hxx" - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif -class SMDS_WNT_EXPORT SMDS_PolyhedralVolumeOfNodes:public SMDS_VolumeOfNodes -{ - public: - SMDS_PolyhedralVolumeOfNodes (std::vector nodes, - std::vector quantities); - - //virtual ~SMDS_PolyhedralVolumeOfNodes(); - - virtual SMDSAbs_ElementType GetType() const; - virtual bool IsPoly() const { return true; }; - - bool ChangeNodes (std::vector nodes, - std::vector quantities); - - //virtual int NbNodes() const; - virtual int NbEdges() const; - virtual int NbFaces() const; - - int NbFaceNodes (const int face_ind) const; - // 1 <= face_ind <= NbFaces() - - const SMDS_MeshNode* GetFaceNode (const int face_ind, const int node_ind) const; - // 1 <= face_ind <= NbFaces() - // 1 <= node_ind <= NbFaceNodes() - - virtual void Print (std::ostream & OS) const; - - protected: - //virtual SMDS_ElemIteratorPtr elementsIterator (SMDSAbs_ElementType type) const; - - private: - // usage disabled - bool ChangeNodes (const SMDS_MeshNode* nodes[], - const int nbNodes); - - private: - std::vector myNodesByFaces; - std::vector myQuantities; -}; - -#endif diff --git a/src/SMDS/SMDS_Position.cxx b/src/SMDS/SMDS_Position.cxx deleted file mode 100644 index 926aa4bf9..000000000 --- a/src/SMDS/SMDS_Position.cxx +++ /dev/null @@ -1,76 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_Position.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_Position.hxx" - -//======================================================================= -//function : SMDS_Position -//purpose : -//======================================================================= - -SMDS_Position::SMDS_Position(int aShapeId) :myShapeId(aShapeId) -{ -} - -//======================================================================= -//function : SetShapeId -//purpose : -//======================================================================= - -void SMDS_Position::SetShapeId(int aShapeId) -{ - myShapeId = aShapeId; -} - -//======================================================================= -//function : GetShapeId -//purpose : -//======================================================================= - -int SMDS_Position::GetShapeId() const -{ - return myShapeId; -} - -//======================================================================= -//function : GetDim -//purpose : -//======================================================================= - -int SMDS_Position::GetDim() const -{ -// switch ( GetTypeOfPosition() ) { -// case SMDS_TOP_UNSPEC: return -1; -// case SMDS_TOP_VERTEX: return 0; -// case SMDS_TOP_EDGE: return 1; -// case SMDS_TOP_FACE: return 2; -// case SMDS_TOP_3DSPACE: return 3; -// } - return GetTypeOfPosition(); -} - - diff --git a/src/SMDS/SMDS_Position.hxx b/src/SMDS/SMDS_Position.hxx deleted file mode 100644 index 9b11dc6f9..000000000 --- a/src/SMDS/SMDS_Position.hxx +++ /dev/null @@ -1,68 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_Position.hxx -// Module : SMESH - -#ifndef _SMDS_Position_HeaderFile -#define _SMDS_Position_HeaderFile - -#include "SMDS_TypeOfPosition.hxx" -#include - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_Position; -typedef boost::shared_ptr SMDS_PositionPtr; - - -class SMDS_WNT_EXPORT SMDS_Position -{ - - public: - const virtual double * Coords() const = 0; - virtual SMDS_TypeOfPosition GetTypeOfPosition() const = 0; - virtual int GetDim() const; - void SetShapeId(int aShapeId); - int GetShapeId() const; - virtual ~SMDS_Position() {} - - protected: - SMDS_Position(int aShapeId); - - private: - int myShapeId; -}; - - -#endif diff --git a/src/SMDS/SMDS_SpacePosition.cxx b/src/SMDS/SMDS_SpacePosition.cxx deleted file mode 100644 index 7ce582f91..000000000 --- a/src/SMDS/SMDS_SpacePosition.cxx +++ /dev/null @@ -1,59 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_SpacePosition.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_SpacePosition.hxx" - -//======================================================================= -//function : SMDS_SpacePosition -//purpose : -//======================================================================= - -SMDS_SpacePosition::SMDS_SpacePosition(double x, double y, double z): - SMDS_Position(0) -{ - myCoords[0]=x; - myCoords[1]=y; - myCoords[2]=z; -} - -/** -*/ -SMDS_TypeOfPosition SMDS_SpacePosition::GetTypeOfPosition() const -{ - return SMDS_TOP_3DSPACE; -} - -const double * SMDS_SpacePosition::Coords() const -{ - return myCoords; -} - -SMDS_PositionPtr SMDS_SpacePosition::originSpacePosition() -{ - static SMDS_PositionPtr staticpos (new SMDS_SpacePosition()); - return staticpos; -} diff --git a/src/SMDS/SMDS_SpacePosition.hxx b/src/SMDS/SMDS_SpacePosition.hxx deleted file mode 100644 index f4c7bff1a..000000000 --- a/src/SMDS/SMDS_SpacePosition.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_SpacePosition.hxx -// Module : SMESH - -#ifndef _SMDS_SpacePosition_HeaderFile -#define _SMDS_SpacePosition_HeaderFile - -#include "SMDS_Position.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_SpacePosition:public SMDS_Position -{ - - public: - SMDS_SpacePosition(double x=0, double y=0, double z=0); - const virtual double * Coords() const; - virtual inline SMDS_TypeOfPosition GetTypeOfPosition() const; - inline void SetCoords(const double x, const double y, const double z); - static SMDS_PositionPtr originSpacePosition(); - private: - double myCoords[3]; -}; - -#endif diff --git a/src/SMDS/SMDS_TypeOfPosition.hxx b/src/SMDS/SMDS_TypeOfPosition.hxx deleted file mode 100644 index 8c0631bfc..000000000 --- a/src/SMDS/SMDS_TypeOfPosition.hxx +++ /dev/null @@ -1,39 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_TypeOfPosition.hxx -// Module : SMESH - -#ifndef _SMDS_TypeOfPosition_HeaderFile -#define _SMDS_TypeOfPosition_HeaderFile - -enum SMDS_TypeOfPosition // Value is equal to shape dimention -{ - SMDS_TOP_UNSPEC = -1, - SMDS_TOP_VERTEX = 0, - SMDS_TOP_EDGE = 1, - SMDS_TOP_FACE = 2, - SMDS_TOP_3DSPACE = 3 -}; - -#endif diff --git a/src/SMDS/SMDS_VertexPosition.cxx b/src/SMDS/SMDS_VertexPosition.cxx deleted file mode 100644 index 022f76ad3..000000000 --- a/src/SMDS/SMDS_VertexPosition.cxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_VertexPosition.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_VertexPosition.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : SMDS_VertexPosition -//purpose : -//======================================================================= - -SMDS_VertexPosition:: SMDS_VertexPosition(const int aVertexId) - :SMDS_Position(aVertexId) -{ -} - -//======================================================================= -//function : Coords -//purpose : -//======================================================================= - -const double *SMDS_VertexPosition::Coords() const -{ - const static double origin[]={0,0,0}; - MESSAGE("SMDS_VertexPosition::Coords not implemented"); - return origin; -} - - -SMDS_TypeOfPosition SMDS_VertexPosition::GetTypeOfPosition() const -{ - return SMDS_TOP_VERTEX; -} diff --git a/src/SMDS/SMDS_VertexPosition.hxx b/src/SMDS/SMDS_VertexPosition.hxx deleted file mode 100644 index 68c1e3a58..000000000 --- a/src/SMDS/SMDS_VertexPosition.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_VertexPosition.hxx -// Module : SMESH - -#ifndef _SMDS_VertexPosition_HeaderFile -#define _SMDS_VertexPosition_HeaderFile - -#include "SMDS_Position.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_VertexPosition:public SMDS_Position -{ - - public: - SMDS_TypeOfPosition GetTypeOfPosition() const; - SMDS_VertexPosition(int aVertexId=0); - const double *Coords() const; -}; - -#endif diff --git a/src/SMDS/SMDS_VolumeOfFaces.cxx b/src/SMDS/SMDS_VolumeOfFaces.cxx deleted file mode 100644 index 51e71f86c..000000000 --- a/src/SMDS/SMDS_VolumeOfFaces.cxx +++ /dev/null @@ -1,138 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 : SMDS_VolumeOfFaces.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_VolumeOfFaces.hxx" -#include "SMDS_IteratorOfElements.hxx" - -using namespace std; - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_VolumeOfFaces::Print(ostream & OS) const -{ - OS << "volume <" << GetID() << "> : "; - int i; - for (i = 0; i < NbFaces()-1; ++i) OS << myFaces[i] << ","; - OS << myFaces[i]<< ") " << endl; -} - - -int SMDS_VolumeOfFaces::NbFaces() const -{ - return myNbFaces; -} - -class SMDS_VolumeOfFaces_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshFace* const *mySet; - int myLength; - int index; - public: - SMDS_VolumeOfFaces_MyIterator(const SMDS_MeshFace* const *s, int l): - mySet(s),myLength(l),index(0) {} - - bool more() - { - return index - - -class SMDS_VolumeOfFaces:public SMDS_MeshVolume -{ - - public: - SMDS_VolumeOfFaces(const SMDS_MeshFace * face1, - const SMDS_MeshFace * face2, - const SMDS_MeshFace * face3, - const SMDS_MeshFace * face4); - SMDS_VolumeOfFaces(const SMDS_MeshFace * face1, - const SMDS_MeshFace * face2, - const SMDS_MeshFace * face3, - const SMDS_MeshFace * face4, - const SMDS_MeshFace * face5); - SMDS_VolumeOfFaces(const SMDS_MeshFace * face1, - const SMDS_MeshFace * face2, - const SMDS_MeshFace * face3, - const SMDS_MeshFace * face4, - const SMDS_MeshFace * face5, - const SMDS_MeshFace * face6); - - void Print(std::ostream & OS) const; - - int NbFaces() const; - - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - const SMDS_MeshFace * myFaces[6]; - int myNbFaces; -}; -#endif diff --git a/src/SMDS/SMDS_VolumeOfNodes.cxx b/src/SMDS/SMDS_VolumeOfNodes.cxx deleted file mode 100644 index cd893f484..000000000 --- a/src/SMDS/SMDS_VolumeOfNodes.cxx +++ /dev/null @@ -1,212 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// 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 - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_VolumeOfNodes.hxx" -#include "SMDS_MeshNode.hxx" -#include "utilities.h" - -using namespace std; - -/////////////////////////////////////////////////////////////////////////////// -/// Create an hexahedron. node 1,2,3,4 and 5,6,7,8 are quadrangle and -/// 5,1 and 7,3 are an edges. -/////////////////////////////////////////////////////////////////////////////// -SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4, - const SMDS_MeshNode * node5, - const SMDS_MeshNode * node6, - const SMDS_MeshNode * node7, - const SMDS_MeshNode * node8) -{ - myNbNodes = 8; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - myNodes[0]=node1; - myNodes[1]=node2; - myNodes[2]=node3; - myNodes[3]=node4; - myNodes[4]=node5; - myNodes[5]=node6; - myNodes[6]=node7; - myNodes[7]=node8; -} - -SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4) -{ - myNbNodes = 4; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - myNodes[0]=node1; - myNodes[1]=node2; - myNodes[2]=node3; - myNodes[3]=node4; -} - -SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4, - const SMDS_MeshNode * node5) -{ - myNbNodes = 5; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - myNodes[0]=node1; - myNodes[1]=node2; - myNodes[2]=node3; - myNodes[3]=node4; - myNodes[4]=node5; -} - -SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4, - const SMDS_MeshNode * node5, - const SMDS_MeshNode * node6) -{ - myNbNodes = 6; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - myNodes[0]=node1; - myNodes[1]=node2; - myNodes[2]=node3; - myNodes[3]=node4; - myNodes[4]=node5; - myNodes[5]=node6; -} - -bool SMDS_VolumeOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[], - const int nbNodes) -{ - if (nbNodes < 4 || nbNodes > 8 || nbNodes == 7) - return false; - - delete [] myNodes; - myNbNodes = nbNodes; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - for ( int i = 0; i < nbNodes; i++ ) - myNodes[ i ] = nodes [ i ]; - - return true; -} - -SMDS_VolumeOfNodes::~SMDS_VolumeOfNodes() -{ - if (myNodes != NULL) { - delete [] myNodes; - myNodes = NULL; - } -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_VolumeOfNodes::Print(ostream & OS) const -{ - OS << "volume <" << GetID() << "> : "; - int i; - for (i = 0; i < NbNodes(); ++i) OS << myNodes[i] << ","; - OS << myNodes[NbNodes()-1]<< ") " << endl; -} - -int SMDS_VolumeOfNodes::NbFaces() const -{ - switch(NbNodes()) - { - case 4: return 4; - case 5: return 5; - case 6: return 5; - case 8: return 6; - default: MESSAGE("invalid number of nodes"); - } - return 0; -} - -int SMDS_VolumeOfNodes::NbNodes() const -{ - return myNbNodes; -} - -int SMDS_VolumeOfNodes::NbEdges() const -{ - switch(NbNodes()) - { - case 4: return 6; - case 5: return 8; - case 6: return 9; - case 8: return 12; - default: MESSAGE("invalid number of nodes"); - } - return 0; -} - -class SMDS_VolumeOfNodes_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshNode* const* mySet; - int myLength; - int index; - public: - SMDS_VolumeOfNodes_MyIterator(const SMDS_MeshNode* const* s, int l): - mySet(s),myLength(l),index(0) {} - - bool more() - { - return index -#include - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -// ========================================================================= -// -// Class providing topological and other information about SMDS_MeshVolume: -// allows iteration on faces or, to be precise, on nodes of volume sides; -// provides info on nodes connection etc. -// -// ========================================================================= - -class SMDS_WNT_EXPORT SMDS_VolumeTool -{ - public: - - enum VolumeType { UNKNOWN = -1, TETRA = 0, PYRAM, PENTA, HEXA, POLYHEDA }; - - SMDS_VolumeTool (); - ~SMDS_VolumeTool (); - SMDS_VolumeTool (const SMDS_MeshElement* theVolume); - - bool Set (const SMDS_MeshElement* theVolume); - // Set volume. - // Return false if theVolume is not of type SMDSAbs_Volume - - // ----------------------- - // general info - // ----------------------- - - VolumeType GetVolumeType() const; - - bool IsForward() const { return myVolForward; } - // Check volume orientation. can be changed by Inverse(). - // See node order of forward volumes at the file bottom - - void Inverse(); - // Change nodes order as if the volume changes its orientation: - // top and bottom faces are reversed. - // Result of IsForward() and methods returning nodes change - - const SMDS_MeshNode** GetNodes() { return myVolumeNodes; } - // Return array of volume nodes - - int NbNodes() { return myVolumeNbNodes; } - // Return array of volume nodes - - double GetSize() const; - // Return element volume - - bool GetBaryCenter (double & X, double & Y, double & Z) const; - - - // ----------------------- - // info on node connection - // ----------------------- - - bool IsLinked (const SMDS_MeshNode* theNode1, - const SMDS_MeshNode* theNode2) const; - // Return true if theNode1 is linked with theNode2. - - bool IsLinked (const int theNode1Index, - const int theNode2Index) const; - // Return true if the node with theNode1Index is linked - // with the node with theNode2Index - - int GetNodeIndex(const SMDS_MeshNode* theNode) const; - // Return an index of theNode - - // ------------- - // info on faces - // ------------- - - void SetExternalNormal (); - // Node order in faces will be so that faces normals are external. - - int NbFaces() const { return myNbFaces; } - // Return number of faces of the volume. In the following - // methods 0 <= faceIndex < NbFaces() - - int NbFaceNodes( int faceIndex ); - // Return number of nodes in the array of face nodes - - const int* GetFaceNodesIndices( int faceIndex ); - // Return the array of face nodes indices - // To comfort link iteration, the array - // length == NbFaceNodes( faceIndex ) + 1 and - // the last node index == the first one. - - const SMDS_MeshNode** GetFaceNodes( int faceIndex ); - // Return the array of face nodes. - // To comfort link iteration, the array - // length == NbFaceNodes( faceIndex ) + 1 and - // the last node == the first one. - // WARNING: do not modify the array, some methods - // work basing on its contents - - bool GetFaceNodes (int faceIndex, - std::set& theFaceNodes ); - // Return a set of face nodes. - - bool IsFaceExternal( int faceIndex ); - // Check normal orientation of a face. - // SetExternalNormal() is taken into account. - - bool IsFreeFace( int faceIndex ); - // Check that all volumes built on the face nodes lays on one side - - bool GetFaceNormal (int faceIndex, double & X, double & Y, double & Z); - // Return a normal to a face - - double GetFaceArea( int faceIndex ); - // Return face area - - int GetOppFaceIndex( int faceIndex ) const; - // Return index of the opposite face if it exists, else -1. - - int GetFaceIndex( const std::set& theFaceNodes ); - // Return index of a face formed by theFaceNodes. - // Return -1 if a face not found - - //int GetFaceIndex( const std::set& theFaceNodesIndices ); - // Return index of a face formed by theFaceNodesIndices - // Return -1 if a face not found - - // ------------------------ - // static methods for faces - // ------------------------ - - static VolumeType GetType(int nbNodes); - // return VolumeType by nb of nodes in a volume - - static int NbFaces( VolumeType type ); - // return nb of faces by volume type - - static const int* GetFaceNodesIndices(VolumeType type, - int faceIndex, - bool external); - // Return the array of face nodes indices - // To comfort link iteration, the array - // length == NbFaceNodes( faceIndex ) + 1 and - // the last node index == the first one. - - static int NbFaceNodes(VolumeType type, - int faceIndex ); - // Return number of nodes in the array of face nodes - - private: - - bool setFace( int faceIndex ); - - const SMDS_MeshElement* myVolume; - const SMDS_PolyhedralVolumeOfNodes* myPolyedre; - - bool myVolForward; - int myNbFaces; - int myVolumeNbNodes; - const SMDS_MeshNode** myVolumeNodes; - - bool myExternalFaces; - - int myCurFace; - int myFaceNbNodes; - int* myFaceNodeIndices; - const SMDS_MeshNode** myFaceNodes; - -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// -// ORDER OF NODES OF FORWARD ELEMENT -// -/////////////////////////////////////////////////////////////////////////// -/* -// N3 -// + -// /|\ -// / | \ -// / | \ -// N0 +---|---+ N1 TETRAHEDRON -// \ | / -// \ | / -// \ | / -// \|/ -// + -// N2 - -// + N4 -// /|\ -// / | \ -// / | \ -// / | \ -// N3 +---------+ N5 -// | | | -// | + N1 | -// | / \ | PENTAHEDRON -// | / \ | -// | / \ | -// |/ \| -// N0 +---------+ N2 - -// N5+----------+N6 -// /| /| -// / | / | -// / | / | -// N4+----------+N7 | -// | | | | HEXAHEDRON -// | | | | -// | | | | -// | N1+------|---+N2 -// | / | / -// | / | / -// |/ |/ -// N0+----------+N3 -// -*/ diff --git a/src/SMESH/SMESH_1D_Algo.cxx b/src/SMESH/SMESH_1D_Algo.cxx deleted file mode 100644 index 37567a536..000000000 --- a/src/SMESH/SMESH_1D_Algo.cxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_1D_Algo.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_1D_Algo.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_subMesh.hxx" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Algo(hypId, studyId, gen) -{ -// _compatibleHypothesis.push_back("hypothese_1D_bidon"); - _type = ALGO_1D; - gen->_map1D_Algo[hypId] = this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_1D_Algo::~SMESH_1D_Algo() -{ -} - diff --git a/src/SMESH/SMESH_1D_Algo.hxx b/src/SMESH/SMESH_1D_Algo.hxx deleted file mode 100644 index 378ed7545..000000000 --- a/src/SMESH/SMESH_1D_Algo.hxx +++ /dev/null @@ -1,42 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_1D_Algo.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_1D_ALGO_HXX_ -#define _SMESH_1D_ALGO_HXX_ - -#include "SMESH_Algo.hxx" - -class SMESH_1D_Algo: - public SMESH_Algo -{ -public: - SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen); - virtual ~SMESH_1D_Algo(); -}; - -#endif diff --git a/src/SMESH/SMESH_2D_Algo.cxx b/src/SMESH/SMESH_2D_Algo.cxx deleted file mode 100644 index d1084f7d4..000000000 --- a/src/SMESH/SMESH_2D_Algo.cxx +++ /dev/null @@ -1,92 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_2D_Algo.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_2D_Algo.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_subMesh.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Algo(hypId, studyId, gen) -{ -// _compatibleHypothesis.push_back("hypothese_2D_bidon"); - _type = ALGO_2D; - gen->_map2D_Algo[hypId] = this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_2D_Algo::~SMESH_2D_Algo() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_2D_Algo::NumberOfWires(const TopoDS_Shape& S) -{ - int i = 0; - for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next()) - i++; - return i; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_2D_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W) -{ - int nbPoints = 0; - for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) - { - const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); - int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes(); - //SCRUTE(nb); - nbPoints += nb +1; // internal points plus 1 vertex of 2 (last point ?) - } - //SCRUTE(nbPoints); - return nbPoints; -} diff --git a/src/SMESH/SMESH_2D_Algo.hxx b/src/SMESH/SMESH_2D_Algo.hxx deleted file mode 100644 index 5c904e22e..000000000 --- a/src/SMESH/SMESH_2D_Algo.hxx +++ /dev/null @@ -1,46 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_2D_Algo.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_2D_ALGO_HXX_ -#define _SMESH_2D_ALGO_HXX_ - -#include "SMESH_Algo.hxx" -#include - -class SMESH_2D_Algo: - public SMESH_Algo -{ -public: - SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen); - virtual ~SMESH_2D_Algo(); - - int NumberOfWires(const TopoDS_Shape& S); - int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W); -}; - -#endif diff --git a/src/SMESH/SMESH_3D_Algo.cxx b/src/SMESH/SMESH_3D_Algo.cxx deleted file mode 100644 index d42680f62..000000000 --- a/src/SMESH/SMESH_3D_Algo.cxx +++ /dev/null @@ -1,58 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_3D_Algo.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_3D_Algo.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_subMesh.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Algo(hypId, studyId, gen) -{ -// _compatibleHypothesis.push_back("hypothese_3D_bidon"); - _type = ALGO_3D; - gen->_map3D_Algo[hypId] = this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_3D_Algo::~SMESH_3D_Algo() -{ -} diff --git a/src/SMESH/SMESH_3D_Algo.hxx b/src/SMESH/SMESH_3D_Algo.hxx deleted file mode 100644 index 62621ce3c..000000000 --- a/src/SMESH/SMESH_3D_Algo.hxx +++ /dev/null @@ -1,42 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_3D_Algo.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_3D_ALGO_HXX_ -#define _SMESH_3D_ALGO_HXX_ - -#include "SMESH_Algo.hxx" - -class SMESH_3D_Algo: - public SMESH_Algo -{ -public: - SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen); - virtual ~SMESH_3D_Algo(); -}; - -#endif diff --git a/src/SMESH/SMESH_Block.cxx b/src/SMESH/SMESH_Block.cxx deleted file mode 100644 index 431208fcf..000000000 --- a/src/SMESH/SMESH_Block.cxx +++ /dev/null @@ -1,1391 +0,0 @@ -// 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 : SMESH_Pattern.hxx -// Created : Mon Aug 2 10:30:00 2004 -// Author : Edward AGAPOV (eap) - -#include "SMESH_Block.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SMDS_MeshNode.hxx" -#include "SMDS_MeshVolume.hxx" -#include "SMDS_VolumeTool.hxx" -#include "utilities.h" - -#include - -using namespace std; - -#define SQRT_FUNC 1 - -//======================================================================= -//function : SMESH_Block::TEdge::GetU -//purpose : -//======================================================================= - -double SMESH_Block::TEdge::GetU( const gp_XYZ& theParams ) const -{ - double u = theParams.Coord( myCoordInd ); - if ( myC3d.IsNull() ) // if mesh block - return u; - return ( 1 - u ) * myFirst + u * myLast; -} - -//======================================================================= -//function : SMESH_Block::TEdge::Point -//purpose : -//======================================================================= - -gp_XYZ SMESH_Block::TEdge::Point( const gp_XYZ& theParams ) const -{ - double u = GetU( theParams ); - - if ( myC3d.IsNull() ) // if mesh block - return myNodes[0] * ( 1 - u ) + myNodes[1] * u; - - gp_XYZ p = myC3d->Value( u ).XYZ(); - if ( myTrsf.Form() != gp_Identity ) - myTrsf.Transforms( p ); - return p; -} - -//======================================================================= -//function : SMESH_Block::TFace::GetCoefs -//purpose : return coefficients for addition of [0-3]-th edge and vertex -//======================================================================= - -void SMESH_Block::TFace::GetCoefs(int iE, - const gp_XYZ& theParams, - double& Ecoef, - double& Vcoef ) const -{ - double dU = theParams.Coord( GetUInd() ); - double dV = theParams.Coord( GetVInd() ); - switch ( iE ) { - case 0: - Ecoef = ( 1 - dV ); // u0 - Vcoef = ( 1 - dU ) * ( 1 - dV ); break; // 00 - case 1: - Ecoef = dV; // u1 - Vcoef = dU * ( 1 - dV ); break; // 10 - case 2: - Ecoef = ( 1 - dU ); // 0v - Vcoef = dU * dV ; break; // 11 - case 3: - Ecoef = dU ; // 1v - Vcoef = ( 1 - dU ) * dV ; break; // 01 - default: ASSERT(0); - } -} - -//======================================================================= -//function : SMESH_Block::TFace::GetUV -//purpose : -//======================================================================= - -gp_XY SMESH_Block::TFace::GetUV( const gp_XYZ& theParams ) const -{ - gp_XY uv(0.,0.); - for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges - { - double Ecoef = 0, Vcoef = 0; - GetCoefs( iE, theParams, Ecoef, Vcoef ); - // edge addition - double u = theParams.Coord( myCoordInd[ iE ] ); - u = ( 1 - u ) * myFirst[ iE ] + u * myLast[ iE ]; - uv += Ecoef * myC2d[ iE ]->Value( u ).XY(); - // corner addition - uv -= Vcoef * myCorner[ iE ]; - } - return uv; -} - -//======================================================================= -//function : SMESH_Block::TFace::Point -//purpose : -//======================================================================= - -gp_XYZ SMESH_Block::TFace::Point( const gp_XYZ& theParams ) const -{ - gp_XYZ p(0.,0.,0.); - if ( myS.IsNull() ) // if mesh block - { - for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges - { - double Ecoef = 0, Vcoef = 0; - GetCoefs( iE, theParams, Ecoef, Vcoef ); - // edge addition - double u = theParams.Coord( myCoordInd[ iE ] ); - int i1 = 0, i2 = 1; - switch ( iE ) { - case 1: i1 = 3; i2 = 2; break; - case 2: i1 = 1; i2 = 2; break; - case 3: i1 = 0; i2 = 3; break; - } - p += Ecoef * ( myNodes[ i1 ] * ( 1 - u ) + myNodes[ i2 ] * u ); - // corner addition - p -= Vcoef * myNodes[ iE ]; - } - - } - else // shape block - { - gp_XY uv = GetUV( theParams ); - p = myS->Value( uv.X(), uv.Y() ).XYZ(); - if ( myTrsf.Form() != gp_Identity ) - myTrsf.Transforms( p ); - } - return p; -} - -//======================================================================= -//function : GetShapeCoef -//purpose : -//======================================================================= - -double* SMESH_Block::GetShapeCoef (const int theShapeID) -{ - static double shapeCoef[][3] = { - // V000, V100, V010, V110 - { -1,-1,-1 }, { 1,-1,-1 }, { -1, 1,-1 }, { 1, 1,-1 }, - // V001, V101, V011, V111, - { -1,-1, 1 }, { 1,-1, 1 }, { -1, 1, 1 }, { 1, 1, 1 }, - // Ex00, Ex10, Ex01, Ex11, - { 0,-1,-1 }, { 0, 1,-1 }, { 0,-1, 1 }, { 0, 1, 1 }, - // E0y0, E1y0, E0y1, E1y1, - { -1, 0,-1 }, { 1, 0,-1 }, { -1, 0, 1 }, { 1, 0, 1 }, - // E00z, E10z, E01z, E11z, - { -1,-1, 0 }, { 1,-1, 0 }, { -1, 1, 0 }, { 1, 1, 0 }, - // Fxy0, Fxy1, Fx0z, Fx1z, F0yz, F1yz, - { 0, 0,-1 }, { 0, 0, 1 }, { 0,-1, 0 }, { 0, 1, 0 }, { -1, 0, 0 }, { 1, 0, 0 }, - // ID_Shell - { 0, 0, 0 } - }; - if ( theShapeID < ID_V000 || theShapeID > ID_F1yz ) - return shapeCoef[ ID_Shell - 1 ]; - - return shapeCoef[ theShapeID - 1 ]; -} - -//======================================================================= -//function : ShellPoint -//purpose : return coordinates of a point in shell -//======================================================================= - -bool SMESH_Block::ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const -{ - thePoint.SetCoord( 0., 0., 0. ); - for ( int shapeID = ID_V000; shapeID < ID_Shell; shapeID++ ) - { - // coef - double* coefs = GetShapeCoef( shapeID ); - double k = 1; - for ( int iCoef = 0; iCoef < 3; iCoef++ ) { - if ( coefs[ iCoef ] != 0 ) { - if ( coefs[ iCoef ] < 0 ) - k *= ( 1. - theParams.Coord( iCoef + 1 )); - else - k *= theParams.Coord( iCoef + 1 ); - } - } - // point on a shape - gp_XYZ Ps; - if ( shapeID < ID_Ex00 ) // vertex - VertexPoint( shapeID, Ps ); - else if ( shapeID < ID_Fxy0 ) { // edge - EdgePoint( shapeID, theParams, Ps ); - k = -k; - } else // face - FacePoint( shapeID, theParams, Ps ); - - thePoint += k * Ps; - } - return true; -} - -//======================================================================= -//function : ShellPoint -//purpose : computes coordinates of a point in shell by points on sub-shapes; -// thePointOnShape[ subShapeID ] must be a point on a subShape -//======================================================================= - -bool SMESH_Block::ShellPoint(const gp_XYZ& theParams, - const vector& thePointOnShape, - gp_XYZ& thePoint ) -{ - if ( thePointOnShape.size() < ID_F1yz ) - return false; - - double x = theParams.X(), y = theParams.Y(), z = theParams.Z(); - double x1 = 1. - x, y1 = 1. - y, z1 = 1. - z; - const vector& p = thePointOnShape; - - thePoint = - x1 * p[ID_F0yz] + x * p[ID_F1yz] - + y1 * p[ID_Fx0z] + y * p[ID_Fx1z] - + z1 * p[ID_Fxy0] + z * p[ID_Fxy1] - + x1 * (y1 * (z1 * p[ID_V000] + z * p[ID_V001]) - + y * (z1 * p[ID_V010] + z * p[ID_V011])) - + x * (y1 * (z1 * p[ID_V100] + z * p[ID_V101]) - + y * (z1 * p[ID_V110] + z * p[ID_V111])); - thePoint -= - x1 * (y1 * p[ID_E00z] + y * p[ID_E01z]) - + x * (y1 * p[ID_E10z] + y * p[ID_E11z]) - + y1 * (z1 * p[ID_Ex00] + z * p[ID_Ex01]) - + y * (z1 * p[ID_Ex10] + z * p[ID_Ex11]) - + z1 * (x1 * p[ID_E0y0] + x * p[ID_E1y0]) - + z * (x1 * p[ID_E0y1] + x * p[ID_E1y1]); - - return true; -} - -//======================================================================= -//function : NbVariables -//purpose : -//======================================================================= - -Standard_Integer SMESH_Block::NbVariables() const -{ - return 3; -} - -//======================================================================= -//function : NbEquations -//purpose : -//======================================================================= - -Standard_Integer SMESH_Block::NbEquations() const -{ - return 1; -} - -//======================================================================= -//function : Value -//purpose : -//======================================================================= - -Standard_Boolean SMESH_Block::Value(const math_Vector& theXYZ, math_Vector& theFxyz) -{ - gp_XYZ P, params( theXYZ(1), theXYZ(2), theXYZ(3) ); - if ( params.IsEqual( myParam, DBL_MIN )) { // same param - theFxyz( 1 ) = myValues[ 0 ]; - } - else { - ShellPoint( params, P ); - gp_Vec dP( P - myPoint ); - theFxyz(1) = SQRT_FUNC ? dP.SquareMagnitude() : dP.Magnitude(); - } - return true; -} - -//======================================================================= -//function : Derivatives -//purpose : -//======================================================================= - -Standard_Boolean SMESH_Block::Derivatives(const math_Vector& XYZ,math_Matrix& Df) -{ - MESSAGE( "SMESH_Block::Derivatives()"); - math_Vector F(1,3); - return Values(XYZ,F,Df); -} - -//======================================================================= -//function : Values -//purpose : -//======================================================================= - -Standard_Boolean SMESH_Block::Values(const math_Vector& theXYZ, - math_Vector& theFxyz, - math_Matrix& theDf) -{ -// MESSAGE( endl<<"SMESH_Block::Values( "< DBL_MIN ) - dPi /= mag; - drv[ iP - 1 ] = dPi; - } - for ( int iP = 0; iP < 3; iP++ ) { - if ( iP == myFaceIndex ) - theDf( 1, iP + 1 ) = myFaceParam; - else { - // like IntAna_IntConicQuad::Perform (const gp_Lin& L, const gp_Pln& P) - // where L is (P -> myPoint), P is defined by the 2 other derivative direction - int iPrev = ( iP ? iP - 1 : 2 ); - int iNext = ( iP == 2 ? 0 : iP + 1 ); - gp_Vec plnNorm = drv[ iPrev ].Crossed( drv [ iNext ] ); - double Direc = plnNorm * drv[ iP ]; - if ( Abs(Direc) <= DBL_MIN ) - theDf( 1, iP + 1 ) = dP * drv[ iP ]; - else { - double Dis = plnNorm * P - plnNorm * myPoint; - theDf( 1, iP + 1 ) = Dis/Direc; - } - } - } - //myNbIterations +=3; // how many time call ShellPoint() - - // store better values - myParam = params; - myValues[0]= theFxyz(1); - myValues[1]= theDf(1,1); - myValues[2]= theDf(1,2); - myValues[3]= theDf(1,3); - -// SCRUTE( theFxyz(1) ); -// SCRUTE( theDf( 1,1 )); -// SCRUTE( theDf( 1,2 )); -// SCRUTE( theDf( 1,3 )); - } - - return true; -} - -//======================================================================= -//function : ComputeParameters -//purpose : compute point parameters in the block -//======================================================================= - -bool SMESH_Block::ComputeParameters(const gp_Pnt& thePoint, - gp_XYZ& theParams, - const int theShapeID) -{ - if ( VertexParameters( theShapeID, theParams )) - return true; - - if ( IsEdgeID( theShapeID )) { - TEdge& e = myEdge[ theShapeID - ID_Ex00 ]; - GeomAdaptor_Curve curve( e.myC3d ); - double f = Min( e.myFirst, e.myLast ), l = Max( e.myFirst, e.myLast ); - Extrema_ExtPC anExtPC( thePoint, curve, f, l ); - int i, nb = anExtPC.IsDone() ? anExtPC.NbExt() : 0; - for ( i = 1; i <= nb; i++ ) { - if ( anExtPC.IsMin( i )) - return EdgeParameters( theShapeID, anExtPC.Point( i ).Parameter(), theParams ); - } - return false; - } - -// MESSAGE( endl<<"SMESH_Block::ComputeParameters( " -// < zero ) { - par = v0P.Dot( v01 ) / len2; - if ( par < 0 || par > 1 ) { - needGrid = true; - break; - } - } - start( iParam ) += par; - } - start( iParam ) /= 4.; - } - if ( needGrid ) { - // compute nodes of 3 x 3 x 3 grid - int iNode = 0; - for ( double x = 0.25; x < 0.9; x += 0.25 ) - for ( double y = 0.25; y < 0.9; y += 0.25 ) - for ( double z = 0.25; z < 0.9; z += 0.25 ) { - TxyzPair & prmPtn = my3x3x3GridNodes[ iNode++ ]; - prmPtn.first.SetCoord( x, y, z ); - ShellPoint( prmPtn.first, prmPtn.second ); - } - myGridComputed = true; - } - } - if ( myGridComputed ) { - double minDist = DBL_MAX; - gp_XYZ* bestParam = 0; - for ( int iNode = 0; iNode < 27; iNode++ ) { - TxyzPair & prmPtn = my3x3x3GridNodes[ iNode ]; - double dist = ( thePoint.XYZ() - prmPtn.second ).SquareModulus(); - if ( dist < minDist ) { - minDist = dist; - bestParam = & prmPtn.first; - } - } - start( 1 ) = bestParam->X(); - start( 2 ) = bestParam->Y(); - start( 3 ) = bestParam->Z(); - } - - int myFaceIndex = -1; - if ( isOnFace ) { - // put a point on the face - for ( int iCoord = 0; iCoord < 3; iCoord++ ) - if ( coef[ iCoord ] ) { - myFaceIndex = iCoord; - myFaceParam = ( coef[ myFaceIndex ] < 0.5 ) ? 0.0 : 1.0; - start( iCoord + 1 ) = myFaceParam; - } - } - math_Vector low ( 1, 3, 0.0 ); - math_Vector up ( 1, 3, 1.0 ); - math_Vector tol ( 1, 3, 1e-4 ); - math_FunctionSetRoot paramSearch( *this, tol ); - - int nbLoops = 0; - while ( myValues[0] > 1e-1 && nbLoops++ < 10 ) { - paramSearch.Perform ( *this, start, low, up ); - if ( !paramSearch.IsDone() ) { - //MESSAGE( " !paramSearch.IsDone() " ); - } - else { - //MESSAGE( " NB ITERATIONS: " << paramSearch.NbIterations() ); - } - start( 1 ) = myParam.X(); - start( 2 ) = myParam.Y(); - start( 3 ) = myParam.Z(); - //MESSAGE( "Distance: " << ( SQRT_FUNC ? sqrt(myValues[0]) : myValues[0] )); - } -// MESSAGE( endl << myParam.X() << " " << myParam.Y() << " " << myParam.Z() << endl); -// mySumDist += myValues[0]; -// MESSAGE( " TOTAL NB ITERATIONS: " << myNbIterations << -// " DIST: " << ( SQRT_FUNC ? sqrt(mySumDist) : mySumDist )); - - - theParams = myParam; - - return true; -} - -//======================================================================= -//function : VertexParameters -//purpose : return parameters of a vertex given by TShapeID -//======================================================================= - -bool SMESH_Block::VertexParameters(const int theVertexID, gp_XYZ& theParams) -{ - switch ( theVertexID ) { - case ID_V000: theParams.SetCoord(0., 0., 0.); return true; - case ID_V100: theParams.SetCoord(1., 0., 0.); return true; - case ID_V110: theParams.SetCoord(1., 1., 0.); return true; - case ID_V010: theParams.SetCoord(0., 1., 0.); return true; - default:; - } - return false; -} - -//======================================================================= -//function : EdgeParameters -//purpose : return parameters of a point given by theU on edge -//======================================================================= - -bool SMESH_Block::EdgeParameters(const int theEdgeID, const double theU, gp_XYZ& theParams) -{ - if ( IsEdgeID( theEdgeID )) { - vector< int > vertexVec; - GetEdgeVertexIDs( theEdgeID, vertexVec ); - VertexParameters( vertexVec[0], theParams ); - TEdge& e = myEdge[ theEdgeID - ID_Ex00 ]; - double param = ( theU - e.myFirst ) / ( e.myLast - e.myFirst ); - theParams.SetCoord( e.myCoordInd, param ); - return true; - } - return false; -} - -//======================================================================= -//function : GetStateNumber -//purpose : -//======================================================================= - -Standard_Integer SMESH_Block::GetStateNumber () -{ -// MESSAGE( endl<<"SMESH_Block::GetStateNumber( "< 26 || id < 0 ) { - MESSAGE( "GetShapeIDByParams() = " << id - <<" "<< theCoord.X() <<" "<< theCoord.Y() <<" "<< theCoord.Z() ); - } - - return id + 1; // shape ids start at 1 -} - - -//======================================================================= -//function : getOrderedEdges -//purpose : return nb wires and a list of oredered edges -//======================================================================= - -static int getOrderedEdges (const TopoDS_Face& theFace, - const TopoDS_Vertex& theFirstVertex, - list< TopoDS_Edge >& theEdges, - list< int > & theNbVertexInWires) -{ - // put wires in a list, so that an outer wire comes first - list aWireList; - TopoDS_Wire anOuterWire = BRepTools::OuterWire( theFace ); - aWireList.push_back( anOuterWire ); - for ( TopoDS_Iterator wIt (theFace); wIt.More(); wIt.Next() ) - if ( !anOuterWire.IsSame( wIt.Value() )) - aWireList.push_back( TopoDS::Wire( wIt.Value() )); - - // loop on edges of wires - theNbVertexInWires.clear(); - list::iterator wlIt = aWireList.begin(); - for ( ; wlIt != aWireList.end(); wlIt++ ) - { - int iE; - BRepTools_WireExplorer wExp( *wlIt, theFace ); - for ( iE = 0; wExp.More(); wExp.Next(), iE++ ) - { - TopoDS_Edge edge = wExp.Current(); - edge = TopoDS::Edge( edge.Oriented( wExp.Orientation() )); - theEdges.push_back( edge ); - } - theNbVertexInWires.push_back( iE ); - iE = 0; - if ( wlIt == aWireList.begin() && theEdges.size() > 1 ) { // the outer wire - // orient closed edges - list< TopoDS_Edge >::iterator eIt, eIt2; - for ( eIt = theEdges.begin(); eIt != theEdges.end(); eIt++ ) - { - TopoDS_Edge& edge = *eIt; - if ( TopExp::FirstVertex( edge ).IsSame( TopExp::LastVertex( edge ) )) - { - eIt2 = eIt; - bool isNext = ( eIt2 == theEdges.begin() ); - TopoDS_Edge edge2 = isNext ? *(++eIt2) : *(--eIt2); - double f1,l1,f2,l2; - Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface( edge, theFace, f1,l1 ); - Handle(Geom2d_Curve) c2 = BRep_Tool::CurveOnSurface( edge2, theFace, f2,l2 ); - gp_Pnt2d pf = c1->Value( edge.Orientation() == TopAbs_FORWARD ? f1 : l1 ); - gp_Pnt2d pl = c1->Value( edge.Orientation() == TopAbs_FORWARD ? l1 : f1 ); - bool isFirst = ( edge2.Orientation() == TopAbs_FORWARD ? isNext : !isNext ); - gp_Pnt2d p2 = c2->Value( isFirst ? f2 : l2 ); - isFirst = ( p2.SquareDistance( pf ) < p2.SquareDistance( pl )); - if ( isNext ? isFirst : !isFirst ) - edge.Reverse(); - } - } - // rotate theEdges until it begins from theFirstVertex - if ( ! theFirstVertex.IsNull() ) - while ( !theFirstVertex.IsSame( TopExp::FirstVertex( theEdges.front(), true ))) - { - theEdges.splice(theEdges.end(), theEdges, - theEdges.begin(), ++ theEdges.begin()); - if ( iE++ > theNbVertexInWires.back() ) - break; // break infinite loop - } - } - } - - return aWireList.size(); -} - -//======================================================================= -//function : LoadMeshBlock -//purpose : prepare to work with theVolume -//======================================================================= - -#define gpXYZ(n) gp_XYZ(n->X(),n->Y(),n->Z()) - -bool SMESH_Block::LoadMeshBlock(const SMDS_MeshVolume* theVolume, - const int theNode000Index, - const int theNode001Index, - vector& theOrderedNodes) -{ - MESSAGE(" ::LoadMeshBlock()"); - - myNbIterations = 0; - mySumDist = 0; - myGridComputed = false; - - SMDS_VolumeTool vTool; - if (!vTool.Set( theVolume ) || vTool.NbNodes() != 8 || - !vTool.IsLinked( theNode000Index, theNode001Index )) { - MESSAGE(" Bad arguments "); - return false; - } - vTool.SetExternalNormal(); - // In terms of indices used for access to nodes and faces in SMDS_VolumeTool: - int V000, V100, V010, V110, V001, V101, V011, V111; // 8 vertices - int Fxy0, Fxy1; // bottom and top faces - // vertices of faces - vector vFxy0, vFxy1; - - V000 = theNode000Index; - V001 = theNode001Index; - - // get faces sharing V000 and V001 - list fV000, fV001; - int i, iF, iE, iN; - for ( iF = 0; iF < vTool.NbFaces(); ++iF ) { - const int* nid = vTool.GetFaceNodesIndices( iF ); - for ( iN = 0; iN < 4; ++iN ) - if ( nid[ iN ] == V000 ) { - fV000.push_back( iF ); - } else if ( nid[ iN ] == V001 ) { - fV001.push_back( iF ); - } - } - - // find the bottom (Fxy0), the top (Fxy1) faces - list::iterator fIt1, fIt2, Fxy0Pos; - for ( fIt1 = fV000.begin(); fIt1 != fV000.end(); fIt1++) { - fIt2 = std::find( fV001.begin(), fV001.end(), *fIt1 ); - if ( fIt2 != fV001.end() ) { // *fIt1 is in the both lists - fV001.erase( fIt2 ); // erase Fx0z or F0yz from fV001 - } else { // *fIt1 is in fV000 only - Fxy0Pos = fIt1; // points to Fxy0 - } - } - Fxy0 = *Fxy0Pos; - Fxy1 = fV001.front(); - const SMDS_MeshNode** nn = vTool.GetNodes(); - - // find bottom veritices, their order is that a face normal is external - vFxy0.resize(4); - const int* nid = vTool.GetFaceNodesIndices( Fxy0 ); - for ( i = 0; i < 4; ++i ) - if ( nid[ i ] == V000 ) - break; - for ( iN = 0; iN < 4; ++iN, ++i ) { - if ( i == 4 ) i = 0; - vFxy0[ iN ] = nid[ i ]; - } - // find top veritices, their order is that a face normal is external - vFxy1.resize(4); - nid = vTool.GetFaceNodesIndices( Fxy1 ); - for ( i = 0; i < 4; ++i ) - if ( nid[ i ] == V001 ) - break; - for ( iN = 0; iN < 4; ++iN, ++i ) { - if ( i == 4 ) i = 0; - vFxy1[ iN ] = nid[ i ]; - } - // find indices of the rest veritices - V100 = vFxy0[3]; - V010 = vFxy0[1]; - V110 = vFxy0[2]; - V101 = vFxy1[1]; - V011 = vFxy1[3]; - V111 = vFxy1[2]; - - // set points coordinates - myPnt[ ID_V000 - 1 ] = gpXYZ( nn[ V000 ] ); - myPnt[ ID_V100 - 1 ] = gpXYZ( nn[ V100 ] ); - myPnt[ ID_V010 - 1 ] = gpXYZ( nn[ V010 ] ); - myPnt[ ID_V110 - 1 ] = gpXYZ( nn[ V110 ] ); - myPnt[ ID_V001 - 1 ] = gpXYZ( nn[ V001 ] ); - myPnt[ ID_V101 - 1 ] = gpXYZ( nn[ V101 ] ); - myPnt[ ID_V011 - 1 ] = gpXYZ( nn[ V011 ] ); - myPnt[ ID_V111 - 1 ] = gpXYZ( nn[ V111 ] ); - - // fill theOrderedNodes - theOrderedNodes.resize( 8 ); - theOrderedNodes[ 0 ] = nn[ V000 ]; - theOrderedNodes[ 1 ] = nn[ V100 ]; - theOrderedNodes[ 2 ] = nn[ V010 ]; - theOrderedNodes[ 3 ] = nn[ V110 ]; - theOrderedNodes[ 4 ] = nn[ V001 ]; - theOrderedNodes[ 5 ] = nn[ V101 ]; - theOrderedNodes[ 6 ] = nn[ V011 ]; - theOrderedNodes[ 7 ] = nn[ V111 ]; - - // fill edges - myEdge[ ID_Ex00 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ]; - myEdge[ ID_Ex00 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V100 - 1 ]; - - myEdge[ ID_Ex10 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V010 - 1 ]; - myEdge[ ID_Ex10 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V110 - 1 ]; - - myEdge[ ID_Ex01 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V001 - 1 ]; - myEdge[ ID_Ex01 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V101 - 1 ]; - - myEdge[ ID_Ex11 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V011 - 1 ]; - myEdge[ ID_Ex11 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ]; - - myEdge[ ID_E0y0 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ]; - myEdge[ ID_E0y0 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V010 - 1 ]; - - myEdge[ ID_E1y0 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V100 - 1 ]; - myEdge[ ID_E1y0 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V110 - 1 ]; - - myEdge[ ID_E0y1 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V001 - 1 ]; - myEdge[ ID_E0y1 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V011 - 1 ]; - - myEdge[ ID_E1y1 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V101 - 1 ]; - myEdge[ ID_E1y1 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ]; - - myEdge[ ID_E00z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ]; - myEdge[ ID_E00z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V001 - 1 ]; - - myEdge[ ID_E10z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V100 - 1 ]; - myEdge[ ID_E10z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V101 - 1 ]; - - myEdge[ ID_E01z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V010 - 1 ]; - myEdge[ ID_E01z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V011 - 1 ]; - - myEdge[ ID_E11z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V110 - 1 ]; - myEdge[ ID_E11z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ]; - - for ( iE = ID_Ex00; iE <= ID_E11z; ++iE ) - myEdge[ iE - ID_Ex00 ].myCoordInd = GetCoordIndOnEdge( iE ); - - // fill faces corners - for ( iF = ID_Fxy0; iF < ID_Shell; ++iF ) - { - TFace& tFace = myFace[ iF - ID_Fxy0 ]; - vector< int > edgeIdVec(4, -1); - GetFaceEdgesIDs( iF, edgeIdVec ); - tFace.myNodes[ 0 ] = myEdge[ edgeIdVec [ 0 ] - ID_Ex00 ].myNodes[ 1 ]; - tFace.myNodes[ 1 ] = myEdge[ edgeIdVec [ 0 ] - ID_Ex00 ].myNodes[ 0 ]; - tFace.myNodes[ 2 ] = myEdge[ edgeIdVec [ 1 ] - ID_Ex00 ].myNodes[ 0 ]; - tFace.myNodes[ 3 ] = myEdge[ edgeIdVec [ 1 ] - ID_Ex00 ].myNodes[ 1 ]; - tFace.myCoordInd[ 0 ] = GetCoordIndOnEdge( edgeIdVec[ 0 ] ); - tFace.myCoordInd[ 1 ] = GetCoordIndOnEdge( edgeIdVec[ 1 ] ); - tFace.myCoordInd[ 2 ] = GetCoordIndOnEdge( edgeIdVec[ 2 ] ); - tFace.myCoordInd[ 3 ] = GetCoordIndOnEdge( edgeIdVec[ 3 ] ); - } - - return true; -} - -//======================================================================= -//function : LoadBlockShapes -//purpose : add sub-shapes of theBlock to theShapeIDMap so that they get -// IDs acoording to enum TShapeID -//======================================================================= - -bool SMESH_Block::LoadBlockShapes(const TopoDS_Shell& theShell, - const TopoDS_Vertex& theVertex000, - const TopoDS_Vertex& theVertex001, - TopTools_IndexedMapOfOrientedShape& theShapeIDMap ) -{ - MESSAGE(" ::LoadBlockShapes()"); - - myShell = theShell; - myNbIterations = 0; - mySumDist = 0; - myGridComputed = false; - - // 8 vertices - TopoDS_Shape V000, V100, V010, V110, V001, V101, V011, V111; - // 12 edges - TopoDS_Shape Ex00, Ex10, Ex01, Ex11; - TopoDS_Shape E0y0, E1y0, E0y1, E1y1; - TopoDS_Shape E00z, E10z, E01z, E11z; - // 6 faces - TopoDS_Shape Fxy0, Fx0z, F0yz, Fxy1, Fx1z, F1yz; - - // nb of faces bound to a vertex in TopTools_IndexedDataMapOfShapeListOfShape - // filled by TopExp::MapShapesAndAncestors() - const int NB_FACES_BY_VERTEX = 6; - - TopTools_IndexedDataMapOfShapeListOfShape vfMap; - TopExp::MapShapesAndAncestors( myShell, TopAbs_VERTEX, TopAbs_FACE, vfMap ); - if ( vfMap.Extent() != 8 ) { - MESSAGE(" Wrong nb of vertices in the block: " << vfMap.Extent() ); - return false; - } - - V000 = theVertex000; - V001 = theVertex001; - - if ( V000.IsNull() ) { - // find vertex 000 - the one with smallest coordinates - double minVal = DBL_MAX, minX, val; - for ( int i = 1; i <= 8; i++ ) { - const TopoDS_Vertex& v = TopoDS::Vertex( vfMap.FindKey( i )); - gp_Pnt P = BRep_Tool::Pnt( v ); - val = P.X() + P.Y() + P.Z(); - if ( val < minVal || ( val == minVal && P.X() < minX )) { - V000 = v; - minVal = val; - minX = P.X(); - } - } - // find vertex 001 - the one on the most vertical edge passing through V000 - TopTools_IndexedDataMapOfShapeListOfShape veMap; - TopExp::MapShapesAndAncestors( myShell, TopAbs_VERTEX, TopAbs_EDGE, veMap ); - gp_Vec dir001 = gp::DZ(); - gp_Pnt p000 = BRep_Tool::Pnt( TopoDS::Vertex( V000 )); - double maxVal = -DBL_MAX; - TopTools_ListIteratorOfListOfShape eIt ( veMap.FindFromKey( V000 )); - for ( ; eIt.More(); eIt.Next() ) { - const TopoDS_Edge& e = TopoDS::Edge( eIt.Value() ); - TopoDS_Vertex v = TopExp::FirstVertex( e ); - if ( v.IsSame( V000 )) - v = TopExp::LastVertex( e ); - val = dir001 * gp_Vec( p000, BRep_Tool::Pnt( v )).Normalized(); - if ( val > maxVal ) { - V001 = v; - maxVal = val; - } - } - } - - // find the bottom (Fxy0), Fx0z and F0yz faces - - const TopTools_ListOfShape& f000List = vfMap.FindFromKey( V000 ); - const TopTools_ListOfShape& f001List = vfMap.FindFromKey( V001 ); - if (f000List.Extent() != NB_FACES_BY_VERTEX || - f001List.Extent() != NB_FACES_BY_VERTEX ) { - MESSAGE(" LoadBlockShapes() " << f000List.Extent() << " " << f001List.Extent()); - return false; - } - TopTools_ListIteratorOfListOfShape f001It, f000It ( f000List ); - int i, j, iFound1, iFound2; - for ( j = 0; f000It.More(); f000It.Next(), j++ ) - { - if ( NB_FACES_BY_VERTEX == 6 && j % 2 ) continue; // each face encounters twice - const TopoDS_Shape& F = f000It.Value(); - for ( i = 0, f001It.Initialize( f001List ); f001It.More(); f001It.Next(), i++ ) { - if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice - if ( F.IsSame( f001It.Value() )) - break; - } - if ( f001It.More() ) // Fx0z or F0yz found - if ( Fx0z.IsNull() ) { - Fx0z = F; - iFound1 = i; - } else { - F0yz = F; - iFound2 = i; - } - else // F is the bottom face - Fxy0 = F; - } - if ( Fxy0.IsNull() || Fx0z.IsNull() || F0yz.IsNull() ) { - MESSAGE( Fxy0.IsNull() <<" "<< Fx0z.IsNull() <<" "<< F0yz.IsNull() ); - return false; - } - - // choose the top face (Fxy1) - for ( i = 0, f001It.Initialize( f001List ); f001It.More(); f001It.Next(), i++ ) { - if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice - if ( i != iFound1 && i != iFound2 ) - break; - } - Fxy1 = f001It.Value(); - if ( Fxy1.IsNull() ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - - // find bottom edges and veritices - list< TopoDS_Edge > eList; - list< int > nbVertexInWires; - getOrderedEdges( TopoDS::Face( Fxy0 ), TopoDS::Vertex( V000 ), eList, nbVertexInWires ); - if ( nbVertexInWires.size() != 1 || nbVertexInWires.front() != 4 ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - list< TopoDS_Edge >::iterator elIt = eList.begin(); - for ( i = 0; elIt != eList.end(); elIt++, i++ ) - switch ( i ) { - case 0: E0y0 = *elIt; V010 = TopExp::LastVertex( *elIt, true ); break; - case 1: Ex10 = *elIt; V110 = TopExp::LastVertex( *elIt, true ); break; - case 2: E1y0 = *elIt; V100 = TopExp::LastVertex( *elIt, true ); break; - case 3: Ex00 = *elIt; break; - default:; - } - if ( i != 4 || E0y0.IsNull() || Ex10.IsNull() || E1y0.IsNull() || Ex00.IsNull() ) { - MESSAGE(" LoadBlockShapes() error, eList.size()=" << eList.size()); - return false; - } - - - // find top edges and veritices - eList.clear(); - getOrderedEdges( TopoDS::Face( Fxy1 ), TopoDS::Vertex( V001 ), eList, nbVertexInWires ); - if ( nbVertexInWires.size() != 1 || nbVertexInWires.front() != 4 ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - for ( i = 0, elIt = eList.begin(); elIt != eList.end(); elIt++, i++ ) - switch ( i ) { - case 0: Ex01 = *elIt; V101 = TopExp::LastVertex( *elIt, true ); break; - case 1: E1y1 = *elIt; V111 = TopExp::LastVertex( *elIt, true ); break; - case 2: Ex11 = *elIt; V011 = TopExp::LastVertex( *elIt, true ); break; - case 3: E0y1 = *elIt; break; - default:; - } - if ( i != 4 || Ex01.IsNull() || E1y1.IsNull() || Ex11.IsNull() || E0y1.IsNull() ) { - MESSAGE(" LoadBlockShapes() error, eList.size()=" << eList.size()); - return false; - } - - // swap Fx0z and F0yz if necessary - TopExp_Explorer exp( Fx0z, TopAbs_VERTEX ); - for ( ; exp.More(); exp.Next() ) // Fx0z shares V101 and V100 - if ( V101.IsSame( exp.Current() ) || V100.IsSame( exp.Current() )) - break; // V101 or V100 found - if ( !exp.More() ) { // not found - TopoDS_Shape f = Fx0z; Fx0z = F0yz; F0yz = f; - } - - // find Fx1z and F1yz faces - const TopTools_ListOfShape& f111List = vfMap.FindFromKey( V111 ); - const TopTools_ListOfShape& f110List = vfMap.FindFromKey( V110 ); - if (f111List.Extent() != NB_FACES_BY_VERTEX || - f110List.Extent() != NB_FACES_BY_VERTEX ) { - MESSAGE(" LoadBlockShapes() " << f111List.Extent() << " " << f110List.Extent()); - return false; - } - TopTools_ListIteratorOfListOfShape f111It, f110It ( f110List); - for ( j = 0 ; f110It.More(); f110It.Next(), j++ ) { - if ( NB_FACES_BY_VERTEX == 6 && j % 2 ) continue; // each face encounters twice - const TopoDS_Shape& F = f110It.Value(); - for ( i = 0, f111It.Initialize( f111List ); f111It.More(); f111It.Next(), i++ ) { - if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice - if ( F.IsSame( f111It.Value() )) { // Fx1z or F1yz found - if ( Fx1z.IsNull() ) - Fx1z = F; - else - F1yz = F; - } - } - } - if ( Fx1z.IsNull() || F1yz.IsNull() ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - - // swap Fx1z and F1yz if necessary - for ( exp.Init( Fx1z, TopAbs_VERTEX ); exp.More(); exp.Next() ) - if ( V010.IsSame( exp.Current() ) || V011.IsSame( exp.Current() )) - break; - if ( !exp.More() ) { - TopoDS_Shape f = Fx1z; Fx1z = F1yz; F1yz = f; - } - - // find vertical edges - for ( exp.Init( Fx0z, TopAbs_EDGE ); exp.More(); exp.Next() ) { - const TopoDS_Edge& edge = TopoDS::Edge( exp.Current() ); - const TopoDS_Shape& vFirst = TopExp::FirstVertex( edge, true ); - if ( vFirst.IsSame( V001 )) - E00z = edge; - else if ( vFirst.IsSame( V100 )) - E10z = edge; - } - if ( E00z.IsNull() || E10z.IsNull() ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - for ( exp.Init( Fx1z, TopAbs_EDGE ); exp.More(); exp.Next() ) { - const TopoDS_Edge& edge = TopoDS::Edge( exp.Current() ); - const TopoDS_Shape& vFirst = TopExp::FirstVertex( edge, true ); - if ( vFirst.IsSame( V111 )) - E11z = edge; - else if ( vFirst.IsSame( V010 )) - E01z = edge; - } - if ( E01z.IsNull() || E11z.IsNull() ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - - // load shapes in theShapeIDMap - - theShapeIDMap.Clear(); - - theShapeIDMap.Add(V000.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V100.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V010.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V110.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V001.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V101.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V011.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V111.Oriented( TopAbs_FORWARD )); - - theShapeIDMap.Add(Ex00); - theShapeIDMap.Add(Ex10); - theShapeIDMap.Add(Ex01); - theShapeIDMap.Add(Ex11); - - theShapeIDMap.Add(E0y0); - theShapeIDMap.Add(E1y0); - theShapeIDMap.Add(E0y1); - theShapeIDMap.Add(E1y1); - - theShapeIDMap.Add(E00z); - theShapeIDMap.Add(E10z); - theShapeIDMap.Add(E01z); - theShapeIDMap.Add(E11z); - - theShapeIDMap.Add(Fxy0); - theShapeIDMap.Add(Fxy1); - theShapeIDMap.Add(Fx0z); - theShapeIDMap.Add(Fx1z); - theShapeIDMap.Add(F0yz); - theShapeIDMap.Add(F1yz); - - theShapeIDMap.Add(myShell); - - if ( theShapeIDMap.Extent() != 27 ) { - MESSAGE("LoadBlockShapes() " << theShapeIDMap.Extent() ); - return false; - } - - // store shapes geometry - for ( int shapeID = 1; shapeID < theShapeIDMap.Extent(); shapeID++ ) - { - const TopoDS_Shape& S = theShapeIDMap( shapeID ); - switch ( S.ShapeType() ) - { - case TopAbs_VERTEX: { - - if ( shapeID > ID_V111 ) { - MESSAGE(" shapeID =" << shapeID ); - return false; - } - myPnt[ shapeID - ID_V000 ] = - BRep_Tool::Pnt( TopoDS::Vertex( S )).XYZ(); - break; - } - case TopAbs_EDGE: { - - const TopoDS_Edge& edge = TopoDS::Edge( S ); - if ( shapeID < ID_Ex00 || shapeID > ID_E11z || edge.IsNull() ) { - MESSAGE(" shapeID =" << shapeID ); - return false; - } - TEdge& tEdge = myEdge[ shapeID - ID_Ex00 ]; - tEdge.myCoordInd = GetCoordIndOnEdge( shapeID ); - TopLoc_Location loc; - tEdge.myC3d = BRep_Tool::Curve( edge, loc, tEdge.myFirst, tEdge.myLast ); - if ( !IsForwardEdge( edge, theShapeIDMap )) - Swap( tEdge.myFirst, tEdge.myLast ); - tEdge.myTrsf = loc; - break; - } - case TopAbs_FACE: { - - const TopoDS_Face& face = TopoDS::Face( S ); - if ( shapeID < ID_Fxy0 || shapeID > ID_F1yz || face.IsNull() ) { - MESSAGE(" shapeID =" << shapeID ); - return false; - } - TFace& tFace = myFace[ shapeID - ID_Fxy0 ]; - // pcurves - vector< int > edgeIdVec(4, -1); - GetFaceEdgesIDs( shapeID, edgeIdVec ); - for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges - { - const TopoDS_Edge& edge = TopoDS::Edge( theShapeIDMap( edgeIdVec[ iE ])); - tFace.myCoordInd[ iE ] = GetCoordIndOnEdge( edgeIdVec[ iE ] ); - tFace.myC2d[ iE ] = - BRep_Tool::CurveOnSurface( edge, face, tFace.myFirst[iE], tFace.myLast[iE] ); - if ( !IsForwardEdge( edge, theShapeIDMap )) - Swap( tFace.myFirst[ iE ], tFace.myLast[ iE ] ); - } - // 2d corners - tFace.myCorner[ 0 ] = tFace.myC2d[ 0 ]->Value( tFace.myFirst[0] ).XY(); - tFace.myCorner[ 1 ] = tFace.myC2d[ 0 ]->Value( tFace.myLast[0] ).XY(); - tFace.myCorner[ 2 ] = tFace.myC2d[ 1 ]->Value( tFace.myLast[1] ).XY(); - tFace.myCorner[ 3 ] = tFace.myC2d[ 1 ]->Value( tFace.myFirst[1] ).XY(); - // sufrace - TopLoc_Location loc; - tFace.myS = BRep_Tool::Surface( face, loc ); - tFace.myTrsf = loc; - break; - } - default: break; - } - } // loop on shapes in theShapeIDMap - - return true; -} - -//======================================================================= -//function : GetFaceEdgesIDs -//purpose : return edges IDs in the order u0, u1, 0v, 1v -// u0 means "|| u, v == 0" -//======================================================================= - -void SMESH_Block::GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec ) -{ - edgeVec.resize( 4 ); - switch ( faceID ) { - case ID_Fxy0: - edgeVec[ 0 ] = ID_Ex00; - edgeVec[ 1 ] = ID_Ex10; - edgeVec[ 2 ] = ID_E0y0; - edgeVec[ 3 ] = ID_E1y0; - break; - case ID_Fxy1: - edgeVec[ 0 ] = ID_Ex01; - edgeVec[ 1 ] = ID_Ex11; - edgeVec[ 2 ] = ID_E0y1; - edgeVec[ 3 ] = ID_E1y1; - break; - case ID_Fx0z: - edgeVec[ 0 ] = ID_Ex00; - edgeVec[ 1 ] = ID_Ex01; - edgeVec[ 2 ] = ID_E00z; - edgeVec[ 3 ] = ID_E10z; - break; - case ID_Fx1z: - edgeVec[ 0 ] = ID_Ex10; - edgeVec[ 1 ] = ID_Ex11; - edgeVec[ 2 ] = ID_E01z; - edgeVec[ 3 ] = ID_E11z; - break; - case ID_F0yz: - edgeVec[ 0 ] = ID_E0y0; - edgeVec[ 1 ] = ID_E0y1; - edgeVec[ 2 ] = ID_E00z; - edgeVec[ 3 ] = ID_E01z; - break; - case ID_F1yz: - edgeVec[ 0 ] = ID_E1y0; - edgeVec[ 1 ] = ID_E1y1; - edgeVec[ 2 ] = ID_E10z; - edgeVec[ 3 ] = ID_E11z; - break; - default: - MESSAGE(" GetFaceEdgesIDs(), wrong face ID: " << faceID ); - } -} - -//======================================================================= -//function : GetEdgeVertexIDs -//purpose : return vertex IDs of an edge -//======================================================================= - -void SMESH_Block::GetEdgeVertexIDs (const int edgeID, vector< int >& vertexVec ) -{ - vertexVec.resize( 2 ); - switch ( edgeID ) { - - case ID_Ex00: - vertexVec[ 0 ] = ID_V000; - vertexVec[ 1 ] = ID_V100; - break; - case ID_Ex10: - vertexVec[ 0 ] = ID_V010; - vertexVec[ 1 ] = ID_V110; - break; - case ID_Ex01: - vertexVec[ 0 ] = ID_V001; - vertexVec[ 1 ] = ID_V101; - break; - case ID_Ex11: - vertexVec[ 0 ] = ID_V011; - vertexVec[ 1 ] = ID_V111; - break; - - case ID_E0y0: - vertexVec[ 0 ] = ID_V000; - vertexVec[ 1 ] = ID_V010; - break; - case ID_E1y0: - vertexVec[ 0 ] = ID_V100; - vertexVec[ 1 ] = ID_V110; - break; - case ID_E0y1: - vertexVec[ 0 ] = ID_V001; - vertexVec[ 1 ] = ID_V011; - break; - case ID_E1y1: - vertexVec[ 0 ] = ID_V101; - vertexVec[ 1 ] = ID_V111; - break; - - case ID_E00z: - vertexVec[ 0 ] = ID_V000; - vertexVec[ 1 ] = ID_V001; - break; - case ID_E10z: - vertexVec[ 0 ] = ID_V100; - vertexVec[ 1 ] = ID_V101; - break; - case ID_E01z: - vertexVec[ 0 ] = ID_V010; - vertexVec[ 1 ] = ID_V011; - break; - case ID_E11z: - vertexVec[ 0 ] = ID_V110; - vertexVec[ 1 ] = ID_V111; - break; - default: - MESSAGE(" GetEdgeVertexIDs(), wrong edge ID: " << edgeID ); - } -} - diff --git a/src/SMESH/SMESH_Block.hxx b/src/SMESH/SMESH_Block.hxx deleted file mode 100644 index 155104866..000000000 --- a/src/SMESH/SMESH_Block.hxx +++ /dev/null @@ -1,275 +0,0 @@ -// 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 : SMESH_Block.hxx -// Created : Tue Nov 30 12:42:18 2004 -// Author : Edward AGAPOV (eap) - - -#ifndef SMESH_Block_HeaderFile -#define SMESH_Block_HeaderFile - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -class SMDS_MeshVolume; -class SMDS_MeshNode; - -// ========================================================= -// class calculating coordinates of 3D points by normalized -// parameters inside the block and vice versa -// ========================================================= - -class SMESH_Block: public math_FunctionSetWithDerivatives -{ - public: - enum TShapeID { // ids of the block sub-shapes - ID_NONE = 0, - - ID_V000 = 1, ID_V100, ID_V010, ID_V110, ID_V001, ID_V101, ID_V011, ID_V111, - - ID_Ex00, ID_Ex10, ID_Ex01, ID_Ex11, - ID_E0y0, ID_E1y0, ID_E0y1, ID_E1y1, - ID_E00z, ID_E10z, ID_E01z, ID_E11z, - - ID_Fxy0, ID_Fxy1, ID_Fx0z, ID_Fx1z, ID_F0yz, ID_F1yz, - - ID_Shell - }; - - - public: // methods about ids of the block sub-shapes - - static int NbVertices() { return 8; } - static int NbEdges() { return 12; } - static int NbFaces() { return 6; } - static int NbSubShapes() { return ID_Shell; } - // to avoid magic numbers when allocating memory for subshapes - - static inline bool IsVertexID( int theShapeID ) - { return ( theShapeID >= ID_V000 && theShapeID <= ID_V111 ); } - - static inline bool IsEdgeID( int theShapeID ) - { return ( theShapeID >= ID_Ex00 && theShapeID <= ID_E11z ); } - - static inline bool IsFaceID( int theShapeID ) - { return ( theShapeID >= ID_Fxy0 && theShapeID <= ID_F1yz ); } - - static int ShapeIndex( int theShapeID ) - { - if ( IsVertexID( theShapeID )) return theShapeID - ID_V000; - if ( IsEdgeID( theShapeID )) return theShapeID - ID_Ex00; - if ( IsFaceID( theShapeID )) return theShapeID - ID_Fxy0; - return 0; - } - // return index [0-...] for each type of sub-shapes, - // for example : - // ShapeIndex( ID_Ex00 ) == 0 - // ShapeIndex( ID_Ex10 ) == 1 - - static void GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec ); - // return edges IDs of a face in the order u0, u1, 0v, 1v - - static void GetEdgeVertexIDs (const int edgeID, vector< int >& vertexVec ); - // return vertex IDs of an edge - - static int GetCoordIndOnEdge (const int theEdgeID) - { return (theEdgeID < ID_E0y0) ? 1 : (theEdgeID < ID_E00z) ? 2 : 3; } - // return an index of a coordinate which varies along the edge - - static double* GetShapeCoef (const int theShapeID); - // for theShapeID( TShapeID ), returns 3 coefficients used - // to compute an addition of an on-theShape point to coordinates - // of an in-shell point. If an in-shell point has parameters (Px,Py,Pz), - // then the addition of a point P is computed as P*kx*ky*kz and ki is - // defined by the returned coef like this: - // ki = (coef[i] == 0) ? 1 : (coef[i] < 0) ? 1 - Pi : Pi - - static int GetShapeIDByParams ( const gp_XYZ& theParams ); - // define an id of the block sub-shape by point parameters - - static ostream& DumpShapeID (const int theBlockShapeID, ostream& stream); - // DEBUG: dump an id of a block sub-shape - - - public: // initialization - - SMESH_Block (): myNbIterations(0), mySumDist(0.) {} - - bool LoadBlockShapes(const TopoDS_Shell& theShell, - const TopoDS_Vertex& theVertex000, - const TopoDS_Vertex& theVertex001, - TopTools_IndexedMapOfOrientedShape& theShapeIDMap ); - // add sub-shapes of theBlock to theShapeIDMap so that they get - // IDs acoording to enum TShapeID - - bool LoadMeshBlock(const SMDS_MeshVolume* theVolume, - const int theNode000Index, - const int theNode001Index, - vector& theOrderedNodes); - // prepare to work with theVolume and - // return nodes in the order of TShapeID enum - - - public: // define coordinates by parameters - - bool VertexPoint( const int theVertexID, gp_XYZ& thePoint ) const { - if ( !IsVertexID( theVertexID )) return false; - thePoint = myPnt[ theVertexID - ID_V000 ]; return true; - } - // return vertex coordinates, parameters are defined by theVertexID - - bool EdgePoint( const int theEdgeID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const { - if ( !IsEdgeID( theEdgeID )) return false; - thePoint = myEdge[ theEdgeID - ID_Ex00 ].Point( theParams ); return true; - } - // return coordinates of a point on edge - - bool FacePoint( const int theFaceID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const { - if ( !IsFaceID ( theFaceID )) return false; - thePoint = myFace[ theFaceID - ID_Fxy0 ].Point( theParams ); return true; - } - // return coordinates of a point on face - - bool ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const; - // return coordinates of a point in shell - - static bool ShellPoint(const gp_XYZ& theParams, - const vector& thePointOnShape, - gp_XYZ& thePoint ); - // computes coordinates of a point in shell by points on sub-shapes; - // thePointOnShape[ subShapeID ] must be a point on a subShape; - // thePointOnShape.size() == ID_Shell, thePointOnShape[0] not used - - - public: // define parameters by coordinates - - bool ComputeParameters (const gp_Pnt& thePoint, - gp_XYZ& theParams, - const int theShapeID = ID_Shell); - // compute point parameters in the block. - // Note: for edges, it is better to use EdgeParameters() - - bool VertexParameters(const int theVertexID, gp_XYZ& theParams); - // return parameters of a vertex given by TShapeID - - bool EdgeParameters(const int theEdgeID, const double theU, gp_XYZ& theParams); - // return parameters of a point given by theU on edge - - - public: // services - - static bool IsForwardEdge (const TopoDS_Edge & theEdge, - TopTools_IndexedMapOfOrientedShape& theShapeIDMap) { - int v1ID = theShapeIDMap.FindIndex( TopExp::FirstVertex( theEdge ).Oriented( TopAbs_FORWARD )); - int v2ID = theShapeIDMap.FindIndex( TopExp::LastVertex( theEdge ).Oriented( TopAbs_FORWARD )); - return ( v1ID < v2ID ); - } - // Return true if an in-block parameter increases along theEdge curve - - static void Swap(double& a, double& b) { double tmp = a; a = b; b = tmp; } - - - public: - // methods of math_FunctionSetWithDerivatives used internally - // to define parameters by coordinates - Standard_Integer NbVariables() const; - Standard_Integer NbEquations() const; - Standard_Boolean Value(const math_Vector& X,math_Vector& F) ; - Standard_Boolean Derivatives(const math_Vector& X,math_Matrix& D) ; - Standard_Boolean Values(const math_Vector& X,math_Vector& F,math_Matrix& D) ; - Standard_Integer GetStateNumber (); - - private: - - struct TEdge { - int myCoordInd; - double myFirst; - double myLast; - Handle(Geom_Curve) myC3d; - gp_Trsf myTrsf; - double GetU( const gp_XYZ& theParams ) const; - gp_XYZ Point( const gp_XYZ& theParams ) const; - // if mesh volume - gp_XYZ myNodes[2]; - }; - - struct TFace { - // 4 edges in the order u0, u1, 0v, 1v - int myCoordInd[ 4 ]; - double myFirst [ 4 ]; - double myLast [ 4 ]; - Handle(Geom2d_Curve) myC2d [ 4 ]; - // 4 corner points in the order 00, 10, 11, 01 - gp_XY myCorner [ 4 ]; - // surface - Handle(Geom_Surface) myS; - gp_Trsf myTrsf; - gp_XY GetUV( const gp_XYZ& theParams ) const; - gp_XYZ Point( const gp_XYZ& theParams ) const; - int GetUInd() const { return myCoordInd[ 0 ]; } - int GetVInd() const { return myCoordInd[ 2 ]; } - void GetCoefs( int i, const gp_XYZ& theParams, double& eCoef, double& vCoef ) const; - // if mesh volume - gp_XYZ myNodes[4]; - }; - - TopoDS_Shell myShell; - // geometry in the order as in TShapeID: - // 8 vertices - gp_XYZ myPnt[ 8 ]; - // 12 edges - TEdge myEdge[ 12 ]; - // 6 faces - TFace myFace[ 6 ]; - - // for param computation - - int myFaceIndex; - double myFaceParam; - int myNbIterations; - double mySumDist; - - gp_XYZ myPoint; // the given point - gp_XYZ myParam; // the best parameters guess - double myValues[ 4 ]; // values computed at myParam - - typedef pair TxyzPair; - TxyzPair my3x3x3GridNodes[ 27 ]; - bool myGridComputed; -}; - - -#endif diff --git a/src/SMESH/SMESH_Group.cxx b/src/SMESH/SMESH_Group.cxx deleted file mode 100644 index 49cade122..000000000 --- a/src/SMESH/SMESH_Group.cxx +++ /dev/null @@ -1,66 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Group.cxx -// Author : Michael Sazonov (OCC) -// Module : SMESH -// $Header$ - -#include "SMESH_Group.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESHDS_Group.hxx" -#include "SMESHDS_GroupOnGeom.hxx" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Group::SMESH_Group (int theID, - const SMESH_Mesh* theMesh, - const SMDSAbs_ElementType theType, - const char* theName, - const TopoDS_Shape& theShape) - : myName(theName) -{ - if ( theShape.IsNull() ) - myGroupDS = new SMESHDS_Group (theID, - const_cast(theMesh)->GetMeshDS(), - theType); - else - myGroupDS = new SMESHDS_GroupOnGeom (theID, - const_cast(theMesh)->GetMeshDS(), - theType, - theShape); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Group::~SMESH_Group () -{ - delete myGroupDS; -} diff --git a/src/SMESH/SMESH_Group.hxx b/src/SMESH/SMESH_Group.hxx deleted file mode 100644 index 26493e4e0..000000000 --- a/src/SMESH/SMESH_Group.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Group.hxx -// Author : Michael Sazonov (OCC) -// Module : SMESH -// $Header$ - -#ifndef _SMESH_Group_HeaderFile -#define _SMESH_Group_HeaderFile - -#include -#include -#include - - -class SMESHDS_GroupBase; -class SMESH_Mesh; - -class SMESH_Group -{ - public: - - SMESH_Group (int theID, - const SMESH_Mesh* theMesh, - const SMDSAbs_ElementType theType, - const char* theName, - const TopoDS_Shape& theShape = TopoDS_Shape()); - ~SMESH_Group (); - - void SetName (const char* theName) { myName = theName; } - - const char* GetName () const { return myName.c_str(); } - - SMESHDS_GroupBase * GetGroupDS () { return myGroupDS; } - - private: - SMESH_Group (const SMESH_Group& theOther); - // prohibited copy constructor - SMESH_Group& operator = (const SMESH_Group& theOther); - // prohibited assign operator - - SMESHDS_GroupBase * myGroupDS; - std::string myName; - -}; - -#endif diff --git a/src/SMESH/SMESH_HypoFilter.cxx b/src/SMESH/SMESH_HypoFilter.cxx deleted file mode 100644 index ff14016d8..000000000 --- a/src/SMESH/SMESH_HypoFilter.cxx +++ /dev/null @@ -1,305 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_HypoFilter.cxx -// Module : SMESH -// $Header$ - -#include "SMESH_HypoFilter.hxx" - -#include "SMESH_Hypothesis.hxx" -#include "SMESH_subMesh.hxx" - -using namespace std; - - -//======================================================================= -//function : NamePredicate::Value -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::NamePredicate::IsOk (const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& /*aShape*/ ) const -{ - return ( _name == aHyp->GetName() ); -} - -//======================================================================= -//function : TypePredicate::Value -//purpose : -//======================================================================= - -int SMESH_HypoFilter::TypePredicate::Value( const SMESH_Hypothesis* aHyp ) const -{ - return aHyp->GetType(); -}; - -//======================================================================= -//function : DimPredicate::Value -//purpose : -//======================================================================= - -int SMESH_HypoFilter::DimPredicate::Value( const SMESH_Hypothesis* aHyp ) const -{ - return aHyp->GetDim(); -} - -//======================================================================= -//function : ApplicablePredicate::IsOk -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::ApplicablePredicate::IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& /*aShape*/) const -{ - return SMESH_subMesh::IsApplicableHypotesis( aHyp, (TopAbs_ShapeEnum)_shapeType ); -}; - -//======================================================================= -//function : ApplicablePredicate::ApplicablePredicate -//purpose : -//======================================================================= - -SMESH_HypoFilter::ApplicablePredicate::ApplicablePredicate( const TopoDS_Shape& theShape ) -{ - _shapeType = ( theShape.IsNull() ? TopAbs_SHAPE : theShape.ShapeType()); -} - -//======================================================================= -//function : InstancePredicate::IsOk -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::InstancePredicate::IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& /*aShape*/) const -{ - return _hypo == aHyp; -} - -//======================================================================= -//function : IsAssignedToPredicate::IsOk -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::IsAssignedToPredicate::IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const -{ - return ( !_mainShape.IsNull() && !aShape.IsNull() && _mainShape.IsSame( aShape )); -} - -//======================================================================= -//function : SMESH_HypoFilter -//purpose : -//======================================================================= - -SMESH_HypoFilter::SMESH_HypoFilter() -{ -} - -//======================================================================= -//function : SMESH_HypoFilter -//purpose : -//======================================================================= - -SMESH_HypoFilter::SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate ) -{ - add( notNagate ? AND : AND_NOT, aPredicate ); -} - -//======================================================================= -//function : And -//purpose : -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::And( SMESH_HypoPredicate* aPredicate ) -{ - add( AND, aPredicate ); - return *this; -} - -//======================================================================= -//function : AndNot -//purpose : -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::AndNot( SMESH_HypoPredicate* aPredicate ) -{ - add( AND_NOT, aPredicate ); - return *this; -} - -//======================================================================= -//function : Or -//purpose : -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::Or( SMESH_HypoPredicate* aPredicate ) -{ - add( OR, aPredicate ); - return *this; -} - -//======================================================================= -//function : OrNot -//purpose : Return predicates -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::OrNot( SMESH_HypoPredicate* aPredicate ) -{ - add( OR_NOT, aPredicate ); - return *this; -} - -//======================================================================= -//function : Is -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::Is(const SMESH_Hypothesis* theHypo) -{ - return new InstancePredicate( theHypo ); -} - -//======================================================================= -//function : IsAlgo -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::IsAlgo() -{ - return new TypePredicate( MORE, SMESHDS_Hypothesis::PARAM_ALGO ); -} - -//======================================================================= -//function : IsGlobal -//purpose : -//======================================================================= - - SMESH_HypoPredicate* SMESH_HypoFilter::IsGlobal(const TopoDS_Shape& theMainShape) -{ - return new IsAssignedToPredicate( theMainShape ); -} - -//======================================================================= -//function : IsAssignedTo -//purpose : -//======================================================================= - - SMESH_HypoPredicate* SMESH_HypoFilter::IsAssignedTo(const TopoDS_Shape& theShape) -{ - return new IsAssignedToPredicate( theShape ); -} - -//======================================================================= -//function : HasName -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::HasName(const string & theName) -{ - return new NamePredicate( theName ); -} - -//======================================================================= -//function : HasDim -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::HasDim(const int theDim) -{ - return new DimPredicate( EQUAL, theDim ); -} - -//======================================================================= -//function : IsApplicableTo -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::IsApplicableTo(const TopoDS_Shape& theShape) -{ - return new ApplicablePredicate( theShape ); -} - -//======================================================================= -//function : HasType -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::HasType(const int theHypType) -{ - return new TypePredicate( EQUAL, theHypType ); -} - -//======================================================================= -//function : IsOk -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::IsOk (const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const -{ - if ( myPredicates.empty() ) - return true; - - bool ok = ( myPredicates.front()->_logical_op <= AND_NOT ); - list::const_iterator pred = myPredicates.begin(); - for ( ; pred != myPredicates.end(); ++pred ) - { - bool ok2 = (*pred)->IsOk( aHyp, aShape ); - switch ( (*pred)->_logical_op ) { - case AND: ok = ok && ok2; break; - case AND_NOT: ok = ok && !ok2; break; - case OR: ok = ok || ok2; break; - case OR_NOT: ok = ok || !ok2; break; - default:; - } - } - return ok; -} - -//======================================================================= -//function : Init -//purpose : -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::Init ( SMESH_HypoPredicate* aPredicate, bool notNagate ) -{ - list::const_iterator pred = myPredicates.begin(); - for ( ; pred != myPredicates.end(); ++pred ) - delete *pred; - - add( notNagate ? AND : AND_NOT, aPredicate ); - return *this; -} - - -//======================================================================= -//function : IsOk -//purpose : -//======================================================================= - -SMESH_HypoFilter::~SMESH_HypoFilter() -{ - Init(0); -} - diff --git a/src/SMESH/SMESH_HypoFilter.hxx b/src/SMESH/SMESH_HypoFilter.hxx deleted file mode 100644 index 6bc34bf53..000000000 --- a/src/SMESH/SMESH_HypoFilter.hxx +++ /dev/null @@ -1,164 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_HypoFilter.hxx -// Module : SMESH -// $Header$ - - -#ifndef SMESH_HypoFilter_HeaderFile -#define SMESH_HypoFilter_HeaderFile - -// =========================== -// Filter of SMESH_Hypothesis -// =========================== - -#include -#include -#include - -class SMESH_HypoFilter; -class SMESH_Hypothesis; - -class SMESH_HypoPredicate { - public: - virtual bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const = 0; - // check aHyp or/and aShape it is assigned to - virtual ~SMESH_HypoPredicate() {} - private: - int _logical_op; - friend class SMESH_HypoFilter; -}; - -class SMESH_HypoFilter: public SMESH_HypoPredicate -{ - public: - // Create and add predicates. - // Added predicates will be destroyed by filter when it dies - SMESH_HypoFilter(); - SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate = true ); - // notNagate==false means !aPredicate->IsOk() - SMESH_HypoFilter & Init ( SMESH_HypoPredicate* aPredicate, bool notNagate = true ); - SMESH_HypoFilter & And ( SMESH_HypoPredicate* aPredicate ); - SMESH_HypoFilter & AndNot( SMESH_HypoPredicate* aPredicate ); - SMESH_HypoFilter & Or ( SMESH_HypoPredicate* aPredicate ); - SMESH_HypoFilter & OrNot ( SMESH_HypoPredicate* aPredicate ); - - // Create predicates - static SMESH_HypoPredicate* IsAlgo(); - static SMESH_HypoPredicate* IsApplicableTo(const TopoDS_Shape& theShape); - static SMESH_HypoPredicate* IsAssignedTo(const TopoDS_Shape& theShape); - static SMESH_HypoPredicate* Is(const SMESH_Hypothesis* theHypo); - static SMESH_HypoPredicate* IsGlobal(const TopoDS_Shape& theMainShape); - static SMESH_HypoPredicate* HasName(const std::string & theName); - static SMESH_HypoPredicate* HasDim(const int theDim); - static SMESH_HypoPredicate* HasType(const int theHypType); - - bool IsOk (const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - // check aHyp or/and aShape it is assigned to - - ~SMESH_HypoFilter(); - - - protected: - // fields - - std::list myPredicates; - - // private methods - - enum Logical { AND, AND_NOT, OR, OR_NOT }; - enum Comparison { EQUAL, NOT_EQUAL, MORE, LESS }; - - SMESH_HypoFilter(const SMESH_HypoFilter& other){} - - void add( Logical bool_op, SMESH_HypoPredicate* pred ) - { - if ( pred ) { - pred->_logical_op = bool_op; - myPredicates.push_back( pred ); - } - } - - // predicates implementation - - template - struct templPredicate: public SMESH_HypoPredicate { - Comparison _comp; - TValue _val; - virtual TValue Value(const SMESH_Hypothesis* aHyp) const = 0; - virtual bool IsOk(const SMESH_Hypothesis* aHyp, const TopoDS_Shape& ) const - { - if ( _comp == EQUAL ) return _val == Value( aHyp ); - else if ( _comp == NOT_EQUAL ) return _val != Value( aHyp ); - else if ( _comp == MORE ) return _val < Value( aHyp ); - else return _val > Value( aHyp ); - } - }; - - struct NamePredicate : public SMESH_HypoPredicate { - std::string _name; - NamePredicate( std::string name ): _name(name){} - bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - }; - - struct TypePredicate : public templPredicate< int > { - TypePredicate( Comparison comp, int hypType ) - { _comp = comp; _val = hypType; } - int Value( const SMESH_Hypothesis* aHyp ) const; - }; - - struct DimPredicate : public templPredicate< int > { - DimPredicate( Comparison comp, int dim ) - { _comp = comp; _val = dim; } - int Value( const SMESH_Hypothesis* aHyp ) const; - }; - - struct ApplicablePredicate : public SMESH_HypoPredicate { - int _shapeType; - ApplicablePredicate( const TopoDS_Shape& theShape ); - bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - }; - - struct InstancePredicate : public SMESH_HypoPredicate { - const SMESH_Hypothesis* _hypo; - InstancePredicate( const SMESH_Hypothesis* hypo ):_hypo(hypo){} - bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - }; - - struct IsAssignedToPredicate : public SMESH_HypoPredicate { - TopoDS_Shape _mainShape; - IsAssignedToPredicate( const TopoDS_Shape& mainShape ):_mainShape(mainShape){} - bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - }; - -}; - - -#endif diff --git a/src/SMESH/SMESH_Hypothesis.cxx b/src/SMESH/SMESH_Hypothesis.cxx deleted file mode 100644 index 0107c3e36..000000000 --- a/src/SMESH/SMESH_Hypothesis.cxx +++ /dev/null @@ -1,162 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_Hypothesis.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -using namespace std; -#include "SMESH_Hypothesis.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_subMesh.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Hypothesis::SMESH_Hypothesis(int hypId, - int studyId, - SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId) -{ - //MESSAGE("SMESH_Hypothesis::SMESH_Hypothesis"); - _gen = gen; - _studyId = studyId; - StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId); - myStudyContext->mapHypothesis[_hypId] = this; - _type = PARAM_ALGO; - _shapeType = 0; // to be set by algo with TopAbs_Enum - _param_algo_dim = -1; // to be set by algo parameter -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Hypothesis::~SMESH_Hypothesis() -{ - MESSAGE("SMESH_Hypothesis::~SMESH_Hypothesis"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_Hypothesis::GetDim() const -{ - int dim = -1; - switch (_type) - { - case ALGO_1D: dim = 1; break; - case ALGO_2D: dim = 2; break; - case ALGO_3D: dim = 3; break; - case PARAM_ALGO: dim = _param_algo_dim; break; - } - return dim; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_Hypothesis::GetShapeType() const -{ - return _shapeType; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_Hypothesis::GetStudyId() const -{ - return _studyId; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Hypothesis::NotifySubMeshesHypothesisModification() -{ - MESSAGE("SMESH_Hypothesis::NotifySubMeshesHypothesisModification"); - - // for all meshes in study - - StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId); - map::iterator itm; - for (itm = myStudyContext->mapMesh.begin(); - itm != myStudyContext->mapMesh.end(); - itm++) - { - SMESH_Mesh* mesh = (*itm).second; - const list& subMeshes = - mesh->GetSubMeshUsingHypothesis(this); - - //for all subMeshes using hypothesis - - list::const_iterator its; - for (its = subMeshes.begin(); its != subMeshes.end(); its++) - (*its)->ComputeStateEngine(SMESH_subMesh::MODIF_HYP); - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const char* SMESH_Hypothesis::GetLibName() const -{ -// MESSAGE("SMESHDS_Hypothesis::GetLibName"); -// SCRUTE(_LibName); -// SCRUTE(&_LibName); - return _libName.c_str(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Hypothesis::SetLibName(const char* theLibName) -{ -// MESSAGE("SMESHDS_Hypothesis::SetLibName"); - _libName = string(theLibName); -} diff --git a/src/SMESH/SMESH_Hypothesis.hxx b/src/SMESH/SMESH_Hypothesis.hxx deleted file mode 100644 index 1d881a680..000000000 --- a/src/SMESH/SMESH_Hypothesis.hxx +++ /dev/null @@ -1,74 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_Hypothesis.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_HYPOTHESIS_HXX_ -#define _SMESH_HYPOTHESIS_HXX_ - -#include "SMESHDS_Hypothesis.hxx" - -class SMESH_Gen; - -class SMESH_Hypothesis: public SMESHDS_Hypothesis -{ -public: - enum Hypothesis_Status // in the order of severity - { - HYP_OK, - HYP_MISSING, // algo misses a hypothesis - HYP_CONCURENT, // several applicable hypotheses - HYP_BAD_PARAMETER,// hypothesis has a bad parameter value - HYP_UNKNOWN_FATAL,// --- all statuses below should be considered as fatal - // for Add/RemoveHypothesis operations - HYP_INCOMPATIBLE, // hypothesis does not fit algo - HYP_NOTCONFORM, // not conform mesh is produced appling a hypothesis - HYP_ALREADY_EXIST,// such hypothesis already exist - HYP_BAD_DIM // bad dimension - }; - static bool IsStatusFatal(Hypothesis_Status theStatus) - { return theStatus >= HYP_UNKNOWN_FATAL; } - - SMESH_Hypothesis(int hypId, int studyId, SMESH_Gen* gen); - virtual ~SMESH_Hypothesis(); - int GetDim() const; - int GetStudyId() const; - void NotifySubMeshesHypothesisModification(); - int GetShapeType() const; - const char* GetLibName() const; - void SetLibName(const char* theLibName); - -protected: - SMESH_Gen* _gen; - int _studyId; - int _shapeType; - int _param_algo_dim; - -private: - std::string _libName; -}; - -#endif diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx deleted file mode 100644 index ffd77cd55..000000000 --- a/src/SMESH/SMESH_Mesh.cxx +++ /dev/null @@ -1,1430 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_Mesh.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_Hypothesis.hxx" -#include "SMESH_Group.hxx" -#include "SMESH_HypoFilter.hxx" -#include "SMESHDS_Group.hxx" -#include "SMESHDS_Script.hxx" -#include "SMESHDS_GroupOnGeom.hxx" -#include "SMDS_MeshVolume.hxx" - -#include "utilities.h" - -#include "DriverMED_W_SMESHDS_Mesh.h" -#include "DriverDAT_W_SMDS_Mesh.h" -#include "DriverUNV_W_SMDS_Mesh.h" -#include "DriverSTL_W_SMDS_Mesh.h" - -#include "DriverMED_R_SMESHDS_Mesh.h" -#include "DriverUNV_R_SMDS_Mesh.h" -#include "DriverSTL_R_SMDS_Mesh.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "Utils_ExceptHandlers.hxx" - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Mesh::SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, SMESHDS_Document * myDocument) -: _groupId( 0 ) -{ - INFOS("SMESH_Mesh::SMESH_Mesh(int localId)"); - _id = localId; - _studyId = studyId; - _gen = gen; - _myDocument = myDocument; - _idDoc = _myDocument->NewMesh(); - _myMeshDS = _myDocument->GetMesh(_idDoc); - _isShapeToMesh = false; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Mesh::~SMESH_Mesh() -{ - INFOS("SMESH_Mesh::~SMESH_Mesh"); - - // delete groups - map < int, SMESH_Group * >::iterator itg; - for (itg = _mapGroup.begin(); itg != _mapGroup.end(); itg++) { - SMESH_Group *aGroup = (*itg).second; - delete aGroup; - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape) -{ - if(MYDEBUG) MESSAGE("SMESH_Mesh::ShapeToMesh"); - - if ( !_myMeshDS->ShapeToMesh().IsNull() && aShape.IsNull() ) - { - // removal of a shape to mesh, delete objects referring to sub-shapes: - // - sub-meshes - map ::iterator i_sm = _mapSubMesh.begin(); - for ( ; i_sm != _mapSubMesh.end(); ++i_sm ) - delete i_sm->second; - _mapSubMesh.clear(); - // - groups on geometry - map ::iterator i_gr = _mapGroup.begin(); - while ( i_gr != _mapGroup.end() ) { - if ( dynamic_cast( i_gr->second->GetGroupDS() )) { - _myMeshDS->RemoveGroup( i_gr->second->GetGroupDS() ); - delete i_gr->second; - _mapGroup.erase( i_gr++ ); - } - else - i_gr++; - } - _mapPropagationChains.Clear(); - } - else - { - if (_isShapeToMesh) - throw SALOME_Exception(LOCALIZED ("a shape to mesh has already been defined")); - } - _isShapeToMesh = true; - _myMeshDS->ShapeToMesh(aShape); - - // fill _mapAncestors - _mapAncestors.Clear(); - int desType, ancType; - for ( desType = TopAbs_EDGE; desType > TopAbs_COMPOUND; desType-- ) - for ( ancType = desType - 1; ancType >= TopAbs_COMPOUND; ancType-- ) - TopExp::MapShapesAndAncestors ( aShape, - (TopAbs_ShapeEnum) desType, - (TopAbs_ShapeEnum) ancType, - _mapAncestors ); - - // NRI : 24/02/03 - //EAP: 1/9/04 TopExp::MapShapes(aShape, _subShapes); USE the same map of _myMeshDS -} - -//======================================================================= -//function : UNVToMesh -//purpose : -//======================================================================= - -int SMESH_Mesh::UNVToMesh(const char* theFileName) -{ - if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "<NbNodes() = "<<_myMeshDS->NbNodes()); - MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); - MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); - MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); - } - return 1; -} - -//======================================================================= -//function : MEDToMesh -//purpose : -//======================================================================= - -int SMESH_Mesh::MEDToMesh(const char* theFileName, const char* theMeshName) -{ - if(MYDEBUG) MESSAGE("MEDToMesh - theFileName = "<NbNodes() = "<<_myMeshDS->NbNodes()); - MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); - MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); - MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); - } - - // Reading groups (sub-meshes are out of scope of MED import functionality) - list aGroupNames = myReader.GetGroupNamesAndTypes(); - if(MYDEBUG) MESSAGE("MEDToMesh - Nb groups = "<::iterator name_type = aGroupNames.begin(); - for ( ; name_type != aGroupNames.end(); name_type++ ) { - SMESH_Group* aGroup = AddGroup( name_type->second, name_type->first.c_str(), anId ); - if ( aGroup ) { - if(MYDEBUG) MESSAGE("MEDToMesh - group added: "<first.c_str()); - SMESHDS_Group* aGroupDS = dynamic_cast( aGroup->GetGroupDS() ); - if ( aGroupDS ) { - aGroupDS->SetStoreName( name_type->first.c_str() ); - myReader.GetGroup( aGroupDS ); - } - } - } - return (int) status; -} - -//======================================================================= -//function : STLToMesh -//purpose : -//======================================================================= - -int SMESH_Mesh::STLToMesh(const char* theFileName) -{ - if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "<NbNodes() = "<<_myMeshDS->NbNodes()); - MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); - MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); - MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); - } - return 1; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Hypothesis::Hypothesis_Status - SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, - int anHypId ) throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::AddHypothesis"); - - SMESH_subMesh *subMesh = GetSubMesh(aSubShape); - SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS(); - if ( subMeshDS && subMeshDS->IsComplexSubmesh() ) // group of sub-shapes and maybe of not sub- - { - MESSAGE("AddHypothesis() to complex submesh"); - // return the worst but not fatal state of all group memebers - SMESH_Hypothesis::Hypothesis_Status aBestRet, aWorstNotFatal, ret; - aBestRet = SMESH_Hypothesis::HYP_BAD_DIM; - aWorstNotFatal = SMESH_Hypothesis::HYP_OK; - for ( TopoDS_Iterator itS ( aSubShape ); itS.More(); itS.Next()) - { - if ( !GetMeshDS()->ShapeToIndex( itS.Value() )) - continue; // not sub-shape - ret = AddHypothesis( itS.Value(), anHypId ); - if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal ) - aWorstNotFatal = ret; - if ( ret < aBestRet ) - aBestRet = ret; - } - if ( SMESH_Hypothesis::IsStatusFatal( aBestRet )) - return aBestRet; - return aWorstNotFatal; - } - - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - { - if(MYDEBUG) MESSAGE("Hypothesis ID does not give an hypothesis"); - if(MYDEBUG) { - SCRUTE(_studyId); - SCRUTE(anHypId); - } - throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - } - - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - MESSAGE( "SMESH_Mesh::AddHypothesis " << anHyp->GetName() ); - - bool isGlobalHyp = IsMainShape( aSubShape ); - - // NotConformAllowed can be only global - if ( !isGlobalHyp ) - { - string hypName = anHyp->GetName(); - if ( hypName == "NotConformAllowed" ) - { - if(MYDEBUG) MESSAGE( "Hypotesis can be only global" ); - return SMESH_Hypothesis::HYP_INCOMPATIBLE; - } - } - - // shape - - int event; - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::ADD_HYP; - else - event = SMESH_subMesh::ADD_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); - - // subShapes - if (!SMESH_Hypothesis::IsStatusFatal(ret) && - !subMesh->IsApplicableHypotesis( anHyp )) // is added on father - { - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::ADD_FATHER_HYP; - else - event = SMESH_subMesh::ADD_FATHER_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret2 = - subMesh->SubMeshesAlgoStateEngine(event, anHyp); - if (ret2 > ret) - ret = ret2; - - // check concurent hypotheses on ansestors - if (ret < SMESH_Hypothesis::HYP_CONCURENT && !isGlobalHyp ) - { - const map < int, SMESH_subMesh * >& smMap = subMesh->DependsOn(); - map < int, SMESH_subMesh * >::const_iterator smIt = smMap.begin(); - for ( ; smIt != smMap.end(); smIt++ ) { - if ( smIt->second->IsApplicableHypotesis( anHyp )) { - ret2 = smIt->second->CheckConcurentHypothesis( anHyp->GetType() ); - if (ret2 > ret) { - ret = ret2; - break; - } - } - } - } - } - - if(MYDEBUG) subMesh->DumpAlgoState(true); - SCRUTE(ret); - return ret; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Hypothesis::Hypothesis_Status - SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, - int anHypId)throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::RemoveHypothesis"); - - SMESH_subMesh *subMesh = GetSubMesh(aSubShape); - SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS(); - if ( subMeshDS && subMeshDS->IsComplexSubmesh() ) - { - // return the worst but not fatal state of all group memebers - SMESH_Hypothesis::Hypothesis_Status aBestRet, aWorstNotFatal, ret; - aBestRet = SMESH_Hypothesis::HYP_BAD_DIM; - aWorstNotFatal = SMESH_Hypothesis::HYP_OK; - for ( TopoDS_Iterator itS ( aSubShape ); itS.More(); itS.Next()) - { - if ( !GetMeshDS()->ShapeToIndex( itS.Value() )) - continue; // not sub-shape - ret = RemoveHypothesis( itS.Value(), anHypId ); - if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal ) - aWorstNotFatal = ret; - if ( ret < aBestRet ) - aBestRet = ret; - } - if ( SMESH_Hypothesis::IsStatusFatal( aBestRet )) - return aBestRet; - return aWorstNotFatal; - } - - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - int hypType = anHyp->GetType(); - if(MYDEBUG) SCRUTE(hypType); - int event; - - // shape - - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::REMOVE_HYP; - else - event = SMESH_subMesh::REMOVE_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); - - // there may appear concurrent hyps that were covered by the removed hyp - if (ret < SMESH_Hypothesis::HYP_CONCURENT && - subMesh->IsApplicableHypotesis( anHyp ) && - subMesh->CheckConcurentHypothesis( anHyp->GetType() ) != SMESH_Hypothesis::HYP_OK) - ret = SMESH_Hypothesis::HYP_CONCURENT; - - // subShapes - if (!SMESH_Hypothesis::IsStatusFatal(ret) && - !subMesh->IsApplicableHypotesis( anHyp )) // is removed from father - { - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::REMOVE_FATHER_HYP; - else - event = SMESH_subMesh::REMOVE_FATHER_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret2 = - subMesh->SubMeshesAlgoStateEngine(event, anHyp); - if (ret2 > ret) // more severe - ret = ret2; - - // check concurent hypotheses on ansestors - if (ret < SMESH_Hypothesis::HYP_CONCURENT && !IsMainShape( aSubShape ) ) - { - const map < int, SMESH_subMesh * >& smMap = subMesh->DependsOn(); - map < int, SMESH_subMesh * >::const_iterator smIt = smMap.begin(); - for ( ; smIt != smMap.end(); smIt++ ) { - if ( smIt->second->IsApplicableHypotesis( anHyp )) { - ret2 = smIt->second->CheckConcurentHypothesis( anHyp->GetType() ); - if (ret2 > ret) { - ret = ret2; - break; - } - } - } - } - } - - if(MYDEBUG) subMesh->DumpAlgoState(true); - if(MYDEBUG) SCRUTE(ret); - return ret; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_Mesh * SMESH_Mesh::GetMeshDS() -{ - return _myMeshDS; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const list& -SMESH_Mesh::GetHypothesisList(const TopoDS_Shape & aSubShape) const - throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->GetHypothesis(aSubShape); -} - -//======================================================================= -//function : GetHypothesis -//purpose : -//======================================================================= - -const SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const TopoDS_Shape & aSubShape, - const SMESH_HypoFilter& aFilter, - const bool andAncestors) const -{ - { - const list& hypList = _myMeshDS->GetHypothesis(aSubShape); - list::const_iterator hyp = hypList.begin(); - for ( ; hyp != hypList.end(); hyp++ ) { - const SMESH_Hypothesis * h = static_cast( *hyp ); - if ( aFilter.IsOk( h, aSubShape)) - return h; - } - } - if ( andAncestors ) - { - TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape )); - for (; it.More(); it.Next() ) - { - const list& hypList = _myMeshDS->GetHypothesis(it.Value()); - list::const_iterator hyp = hypList.begin(); - for ( ; hyp != hypList.end(); hyp++ ) { - const SMESH_Hypothesis * h = static_cast( *hyp ); - if (aFilter.IsOk( h, it.Value() )) - return h; - } - } - } - return 0; -} - -//======================================================================= -//function : GetHypotheses -//purpose : -//======================================================================= - -bool SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, - const SMESH_HypoFilter& aFilter, - list & aHypList, - const bool andAncestors) const -{ - int nbHyp = 0; - { - const list& hypList = _myMeshDS->GetHypothesis(aSubShape); - list::const_iterator hyp = hypList.begin(); - for ( ; hyp != hypList.end(); hyp++ ) - if ( aFilter.IsOk (static_cast( *hyp ), aSubShape)) { - aHypList.push_back( *hyp ); - nbHyp++; - } - } - // get hypos from shape of one type only: if any hypo is found on edge, do - // not look up on faces - if ( !nbHyp && andAncestors ) - { - TopTools_MapOfShape map; - TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape )); - int shapeType = it.More() ? it.Value().ShapeType() : TopAbs_SHAPE; - for (; it.More(); it.Next() ) - { - if ( nbHyp && shapeType != it.Value().ShapeType() ) - break; - shapeType = it.Value().ShapeType(); - if ( !map.Add( it.Value() )) - continue; - const list& hypList = _myMeshDS->GetHypothesis(it.Value()); - list::const_iterator hyp = hypList.begin(); - for ( ; hyp != hypList.end(); hyp++ ) - if (aFilter.IsOk( static_cast( *hyp ), it.Value() )) { - aHypList.push_back( *hyp ); - nbHyp++; - } - } - } - return nbHyp; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const list & SMESH_Mesh::GetLog() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::GetLog"); - return _myMeshDS->GetScript()->GetCommands(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESH_Mesh::ClearLog() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::ClearLog"); - _myMeshDS->GetScript()->Clear(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_Mesh::GetId() -{ - if(MYDEBUG) MESSAGE("SMESH_Mesh::GetId"); - return _id; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Gen *SMESH_Mesh::GetGen() -{ - return _gen; -} - -//============================================================================= -/*! - * Get or Create the SMESH_subMesh object implementation - */ -//============================================================================= - -SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) -throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - SMESH_subMesh *aSubMesh; - int index = _myMeshDS->ShapeToIndex(aSubShape); - - // for submeshes on GEOM Group - if ( !index && aSubShape.ShapeType() == TopAbs_COMPOUND ) { - TopoDS_Iterator it( aSubShape ); - if ( it.More() ) - index = _myMeshDS->AddCompoundSubmesh( aSubShape, it.Value().ShapeType() ); - } - - if (_mapSubMesh.find(index) != _mapSubMesh.end()) - { - aSubMesh = _mapSubMesh[index]; - } - else - { - aSubMesh = new SMESH_subMesh(index, this, _myMeshDS, aSubShape); - _mapSubMesh[index] = aSubMesh; - } - return aSubMesh; -} - -//============================================================================= -/*! - * Get the SMESH_subMesh object implementation. Dont create it, return null - * if it does not exist. - */ -//============================================================================= - -SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const TopoDS_Shape & aSubShape) -throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - bool isFound = false; - SMESH_subMesh *aSubMesh = NULL; - - int index = _myMeshDS->ShapeToIndex(aSubShape); - if (_mapSubMesh.find(index) != _mapSubMesh.end()) - { - aSubMesh = _mapSubMesh[index]; - isFound = true; - } - if (!isFound) - aSubMesh = NULL; - return aSubMesh; -} - -//============================================================================= -/*! - * Get the SMESH_subMesh object implementation. Dont create it, return null - * if it does not exist. - */ -//============================================================================= - -SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const int aShapeID) -throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - - map ::iterator i_sm = _mapSubMesh.find(aShapeID); - if (i_sm == _mapSubMesh.end()) - return NULL; - return i_sm->second; -} - -//======================================================================= -//function : IsUsedHypothesis -//purpose : Return True if anHyp is used to mesh aSubShape -//======================================================================= - -bool SMESH_Mesh::IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, - const TopoDS_Shape & aSubShape) -{ - SMESH_Hypothesis* hyp = static_cast(anHyp); - // check if anHyp is applicable to aSubShape - SMESH_subMesh * subMesh = GetSubMeshContaining( aSubShape ); - if ( !subMesh || !subMesh->IsApplicableHypotesis( hyp )) - return false; - - SMESH_Algo *algo = _gen->GetAlgo(*this, aSubShape); - - // algorithm - if (anHyp->GetType() > SMESHDS_Hypothesis::PARAM_ALGO) - return ( anHyp == algo ); - - // algorithm parameter - if (algo) - { - // look trough hypotheses used by algo - const list &usedHyps = - algo->GetUsedHypothesis(*this, aSubShape); - return ( find( usedHyps.begin(), usedHyps.end(), anHyp ) != usedHyps.end() ); - } - - // look through all assigned hypotheses - SMESH_HypoFilter filter( SMESH_HypoFilter::Is( hyp )); - return GetHypothesis( aSubShape, filter, true ); -} - - -//============================================================================= -/*! - * - */ -//============================================================================= - -const list < SMESH_subMesh * >& - SMESH_Mesh::GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp) -throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::GetSubMeshUsingHypothesis"); - map < int, SMESH_subMesh * >::iterator itsm; - _subMeshesUsingHypothesisList.clear(); - for (itsm = _mapSubMesh.begin(); itsm != _mapSubMesh.end(); itsm++) - { - SMESH_subMesh *aSubMesh = (*itsm).second; - if ( IsUsedHypothesis ( anHyp, aSubMesh->GetSubShape() )) - _subMeshesUsingHypothesisList.push_back(aSubMesh); - } - return _subMeshesUsingHypothesisList; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Mesh::ExportMED(const char *file, - const char* theMeshName, - bool theAutoGroups, - int theVersion) - throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - DriverMED_W_SMESHDS_Mesh myWriter; - myWriter.SetFile ( file, MED::EVersion(theVersion) ); - myWriter.SetMesh ( _myMeshDS ); - if ( !theMeshName ) - myWriter.SetMeshId ( _idDoc ); - else { - myWriter.SetMeshId ( -1 ); - myWriter.SetMeshName( theMeshName ); - } - - if ( theAutoGroups ) { - myWriter.AddGroupOfNodes(); - myWriter.AddGroupOfEdges(); - myWriter.AddGroupOfFaces(); - myWriter.AddGroupOfVolumes(); - } - - for ( map::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) { - SMESH_Group* aGroup = it->second; - SMESHDS_GroupBase* aGroupDS = aGroup->GetGroupDS(); - if ( aGroupDS ) { - aGroupDS->SetStoreName( aGroup->GetName() ); - myWriter.AddGroup( aGroupDS ); - } - } - - myWriter.Perform(); -} - -void SMESH_Mesh::ExportDAT(const char *file) throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - DriverDAT_W_SMDS_Mesh myWriter; - myWriter.SetFile(string(file)); - myWriter.SetMesh(_myMeshDS); - myWriter.SetMeshId(_idDoc); - myWriter.Perform(); -} - -void SMESH_Mesh::ExportUNV(const char *file) throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - DriverUNV_W_SMDS_Mesh myWriter; - myWriter.SetFile(string(file)); - myWriter.SetMesh(_myMeshDS); - myWriter.SetMeshId(_idDoc); - myWriter.Perform(); -} - -void SMESH_Mesh::ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - DriverSTL_W_SMDS_Mesh myWriter; - myWriter.SetFile(string(file)); - myWriter.SetIsAscii( isascii ); - myWriter.SetMesh(_myMeshDS); - myWriter.SetMeshId(_idDoc); - myWriter.Perform(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbNodes() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbNodes(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbEdges() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbEdges(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbFaces() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbFaces(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of 3 nodes faces in the mesh. This method run in O(n) -/////////////////////////////////////////////////////////////////////////////// -int SMESH_Mesh::NbTriangles() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - - SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); - //while(itFaces->more()) if(itFaces->next()->NbNodes()==3) Nb++; - const SMDS_MeshFace * curFace; - while (itFaces->more()) { - curFace = itFaces->next(); - if (!curFace->IsPoly() && curFace->NbNodes() == 3) Nb++; - } - return Nb; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of 4 nodes faces in the mesh. This method run in O(n) -/////////////////////////////////////////////////////////////////////////////// -int SMESH_Mesh::NbQuadrangles() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - - SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); - //while(itFaces->more()) if(itFaces->next()->NbNodes()==4) Nb++; - const SMDS_MeshFace * curFace; - while (itFaces->more()) { - curFace = itFaces->next(); - if (!curFace->IsPoly() && curFace->NbNodes() == 4) Nb++; - } - return Nb; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of polygonal faces in the mesh. This method run in O(n) -/////////////////////////////////////////////////////////////////////////////// -int SMESH_Mesh::NbPolygons() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_FaceIteratorPtr itFaces = _myMeshDS->facesIterator(); - while (itFaces->more()) - if (itFaces->next()->IsPoly()) Nb++; - return Nb; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbVolumes() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbVolumes(); -} - -int SMESH_Mesh::NbTetras() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==4) Nb++; - const SMDS_MeshVolume * curVolume; - while (itVolumes->more()) { - curVolume = itVolumes->next(); - if (!curVolume->IsPoly() && curVolume->NbNodes() == 4) Nb++; - } - return Nb; -} - -int SMESH_Mesh::NbHexas() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==8) Nb++; - const SMDS_MeshVolume * curVolume; - while (itVolumes->more()) { - curVolume = itVolumes->next(); - if (!curVolume->IsPoly() && curVolume->NbNodes() == 8) Nb++; - } - return Nb; -} - -int SMESH_Mesh::NbPyramids() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==5) Nb++; - const SMDS_MeshVolume * curVolume; - while (itVolumes->more()) { - curVolume = itVolumes->next(); - if (!curVolume->IsPoly() && curVolume->NbNodes() == 5) Nb++; - } - return Nb; -} - -int SMESH_Mesh::NbPrisms() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==6) Nb++; - const SMDS_MeshVolume * curVolume; - while (itVolumes->more()) { - curVolume = itVolumes->next(); - if (!curVolume->IsPoly() && curVolume->NbNodes() == 6) Nb++; - } - return Nb; -} - -int SMESH_Mesh::NbPolyhedrons() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes = _myMeshDS->volumesIterator(); - while (itVolumes->more()) - if (itVolumes->next()->IsPoly()) Nb++; - return Nb; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbSubMesh() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbSubMesh(); -} - -//======================================================================= -//function : IsNotConformAllowed -//purpose : check if a hypothesis alowing notconform mesh is present -//======================================================================= - -bool SMESH_Mesh::IsNotConformAllowed() const -{ - if(MYDEBUG) MESSAGE("SMESH_Mesh::IsNotConformAllowed"); - - SMESH_HypoFilter filter( SMESH_HypoFilter::HasName( "NotConformAllowed" )); - return GetHypothesis( _myMeshDS->ShapeToMesh(), filter, false ); -} - -//======================================================================= -//function : IsMainShape -//purpose : -//======================================================================= - -bool SMESH_Mesh::IsMainShape(const TopoDS_Shape& theShape) const -{ - return theShape.IsSame(_myMeshDS->ShapeToMesh() ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType, - const char* theName, - int& theId, - const TopoDS_Shape& theShape) -{ - if (_mapGroup.find(_groupId) != _mapGroup.end()) - return NULL; - theId = _groupId; - SMESH_Group* aGroup = new SMESH_Group (theId, this, theType, theName, theShape); - GetMeshDS()->AddGroup( aGroup->GetGroupDS() ); - _mapGroup[_groupId++] = aGroup; - return aGroup; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Group* SMESH_Mesh::GetGroup (const int theGroupID) -{ - if (_mapGroup.find(theGroupID) == _mapGroup.end()) - return NULL; - return _mapGroup[theGroupID]; -} - - -//============================================================================= -/*! - * - */ -//============================================================================= - -list SMESH_Mesh::GetGroupIds() -{ - list anIds; - for ( map::const_iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) - anIds.push_back( it->first ); - - return anIds; -} - - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Mesh::RemoveGroup (const int theGroupID) -{ - if (_mapGroup.find(theGroupID) == _mapGroup.end()) - return; - GetMeshDS()->RemoveGroup( _mapGroup[theGroupID]->GetGroupDS() ); - _mapGroup.erase (theGroupID); - delete _mapGroup[theGroupID]; -} - -//============================================================================= -/*! - * IsLocal1DHypothesis - * Returns a local 1D hypothesis used for theEdge - */ -//============================================================================= -const SMESH_Hypothesis* SMESH_Mesh::IsLocal1DHypothesis (const TopoDS_Shape& theEdge) -{ - SMESH_HypoFilter hypo ( SMESH_HypoFilter::HasDim( 1 )); - hypo.AndNot( hypo.IsAlgo() ).AndNot( hypo.IsAssignedTo( GetMeshDS()->ShapeToMesh() )); - - return GetHypothesis( theEdge, hypo, true ); -} - -//============================================================================= -/*! - * IsPropagationHypothesis - */ -//============================================================================= -bool SMESH_Mesh::IsPropagationHypothesis (const TopoDS_Shape& theEdge) -{ - return _mapPropagationChains.Contains(theEdge); -} - -//============================================================================= -/*! - * IsPropagatedHypothesis - */ -//============================================================================= -bool SMESH_Mesh::IsPropagatedHypothesis (const TopoDS_Shape& theEdge, - TopoDS_Shape& theMainEdge) -{ - int nbChains = _mapPropagationChains.Extent(); - for (int i = 1; i <= nbChains; i++) { - //const TopTools_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i); - const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i); - if (aChain.Contains(theEdge)) { - theMainEdge = _mapPropagationChains.FindKey(i); - return true; - } - } - - return false; -} -//============================================================================= -/*! - * IsReversedInChain - */ -//============================================================================= - -bool SMESH_Mesh::IsReversedInChain (const TopoDS_Shape& theEdge, - const TopoDS_Shape& theMainEdge) -{ - if ( !theMainEdge.IsNull() && !theEdge.IsNull() && - _mapPropagationChains.Contains( theMainEdge )) - { - const SMESH_IndexedMapOfShape& aChain = - _mapPropagationChains.FindFromKey( theMainEdge ); - int index = aChain.FindIndex( theEdge ); - if ( index ) - return aChain(index).Orientation() == TopAbs_REVERSED; - } - return false; -} - -//============================================================================= -/*! - * CleanMeshOnPropagationChain - */ -//============================================================================= -void SMESH_Mesh::CleanMeshOnPropagationChain (const TopoDS_Shape& theMainEdge) -{ - const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromKey(theMainEdge); - int i, nbEdges = aChain.Extent(); - for (i = 1; i <= nbEdges; i++) { - TopoDS_Shape anEdge = aChain.FindKey(i); - SMESH_subMesh *subMesh = GetSubMesh(anEdge); - SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS(); - if (subMeshDS && subMeshDS->NbElements() > 0) { - subMesh->ComputeStateEngine(SMESH_subMesh::CLEANDEP); - } - } -} - -//============================================================================= -/*! - * RebuildPropagationChains - * Rebuild all existing propagation chains. - * Have to be used, if 1D hypothesis have been assigned/removed to/from any edge - */ -//============================================================================= -bool SMESH_Mesh::RebuildPropagationChains() -{ - bool ret = true; - - // Clean all chains, because they can be not up-to-date - int i, nbChains = _mapPropagationChains.Extent(); - for (i = 1; i <= nbChains; i++) { - TopoDS_Shape aMainEdge = _mapPropagationChains.FindKey(i); - CleanMeshOnPropagationChain(aMainEdge); - _mapPropagationChains.ChangeFromIndex(i).Clear(); - } - - // Build all chains - for (i = 1; i <= nbChains; i++) { - TopoDS_Shape aMainEdge = _mapPropagationChains.FindKey(i); - if (!BuildPropagationChain(aMainEdge)) - ret = false; - CleanMeshOnPropagationChain(aMainEdge); - } - - return ret; -} - -//============================================================================= -/*! - * RemovePropagationChain - * Have to be used, if Propagation hypothesis is removed from - */ -//============================================================================= -bool SMESH_Mesh::RemovePropagationChain (const TopoDS_Shape& theMainEdge) -{ - if (!_mapPropagationChains.Contains(theMainEdge)) - return false; - - // Clean mesh elements and nodes, built on the chain - CleanMeshOnPropagationChain(theMainEdge); - - // Clean the chain - _mapPropagationChains.ChangeFromKey(theMainEdge).Clear(); - - // Remove the chain from the map - int i = _mapPropagationChains.FindIndex(theMainEdge); - if ( i == _mapPropagationChains.Extent() ) - _mapPropagationChains.RemoveLast(); - else { - TopoDS_Vertex anEmptyShape; - BRep_Builder BB; - BB.MakeVertex(anEmptyShape, gp_Pnt(0,0,0), 0.1); - SMESH_IndexedMapOfShape anEmptyMap; - _mapPropagationChains.Substitute(i, anEmptyShape, anEmptyMap); - } - - return true; -} - -//============================================================================= -/*! - * BuildPropagationChain - */ -//============================================================================= -bool SMESH_Mesh::BuildPropagationChain (const TopoDS_Shape& theMainEdge) -{ - if (theMainEdge.ShapeType() != TopAbs_EDGE) return true; - - // Add new chain, if there is no - if (!_mapPropagationChains.Contains(theMainEdge)) { - SMESH_IndexedMapOfShape aNewChain; - _mapPropagationChains.Add(theMainEdge, aNewChain); - } - - // Check presence of 1D hypothesis to be propagated - const SMESH_Hypothesis* aMainHyp = IsLocal1DHypothesis(theMainEdge); - if (!aMainHyp) { - MESSAGE("Warning: There is no 1D hypothesis to propagate. Please, assign."); - return true; - } - - // Edges, on which the 1D hypothesis will be propagated from - SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.ChangeFromKey(theMainEdge); - if (aChain.Extent() > 0) { - CleanMeshOnPropagationChain(theMainEdge); - aChain.Clear(); - } - - // At first put in the chain - aChain.Add(theMainEdge); - - // List of edges, added to chain on the previous cycle pass - TopTools_ListOfShape listPrevEdges; - listPrevEdges.Append(theMainEdge.Oriented( TopAbs_FORWARD )); - -// 5____4____3____4____5____6 -// | | | | | | -// | | | | | | -// 4____3____2____3____4____5 -// | | | | | | Number in the each knot of -// | | | | | | grid indicates cycle pass, -// 3____2____1____2____3____4 on which corresponding edge -// | | | | | | (perpendicular to the plane -// | | | | | | of view) will be found. -// 2____1____0____1____2____3 -// | | | | | | -// | | | | | | -// 3____2____1____2____3____4 - - // Collect all edges pass by pass - while (listPrevEdges.Extent() > 0) { - // List of edges, added to chain on this cycle pass - TopTools_ListOfShape listCurEdges; - - // Find the next portion of edges - TopTools_ListIteratorOfListOfShape itE (listPrevEdges); - for (; itE.More(); itE.Next()) { - TopoDS_Shape anE = itE.Value(); - - // Iterate on faces, having edge - TopTools_ListIteratorOfListOfShape itA (GetAncestors(anE)); - for (; itA.More(); itA.Next()) { - TopoDS_Shape aW = itA.Value(); - - // There are objects of different type among the ancestors of edge - if (aW.ShapeType() == TopAbs_WIRE) { - TopoDS_Shape anOppE; - - BRepTools_WireExplorer aWE (TopoDS::Wire(aW)); - Standard_Integer nb = 1, found = 0; - TopTools_Array1OfShape anEdges (1,4); - for (; aWE.More(); aWE.Next(), nb++) { - if (nb > 4) { - found = 0; - break; - } - anEdges(nb) = aWE.Current(); - if (!_mapAncestors.Contains(anEdges(nb))) { - MESSAGE("WIRE EXPLORER HAVE GIVEN AN INVALID EDGE !!!"); - break; - } - if (anEdges(nb).IsSame(anE)) found = nb; - } - - if (nb == 5 && found > 0) { - // Quadrangle face found, get an opposite edge - Standard_Integer opp = found + 2; - if (opp > 4) opp -= 4; - anOppE = anEdges(opp); - - // add anOppE to aChain if ... - if (!aChain.Contains(anOppE)) { // ... anOppE is not in aChain - if (!IsLocal1DHypothesis(anOppE)) { // ... no other 1d hyp on anOppE - TopoDS_Shape aMainEdgeForOppEdge; // ... no other hyp is propagated to anOppE - if (!IsPropagatedHypothesis(anOppE, aMainEdgeForOppEdge)) - { - // Add found edge to the chain oriented so that to - // have it co-directed with a forward MainEdge - TopAbs_Orientation ori = anE.Orientation(); - if ( anEdges(opp).Orientation() == anEdges(found).Orientation() ) - ori = TopAbs::Reverse( ori ); - anOppE.Orientation( ori ); - aChain.Add(anOppE); - listCurEdges.Append(anOppE); - } - else { - // Collision! - MESSAGE("Error: Collision between propagated hypotheses"); - CleanMeshOnPropagationChain(theMainEdge); - aChain.Clear(); - return ( aMainHyp == IsLocal1DHypothesis(aMainEdgeForOppEdge) ); - } - } - } - } // if (nb == 5 && found > 0) - } // if (aF.ShapeType() == TopAbs_WIRE) - } // for (; itF.More(); itF.Next()) - } // for (; itE.More(); itE.Next()) - - listPrevEdges = listCurEdges; - } // while (listPrevEdges.Extent() > 0) - - CleanMeshOnPropagationChain(theMainEdge); - return true; -} - -//======================================================================= -//function : GetAncestors -//purpose : return list of ancestors of theSubShape in the order -// that lower dimention shapes come first. -//======================================================================= - -const TopTools_ListOfShape& SMESH_Mesh::GetAncestors(const TopoDS_Shape& theS) const -{ - if ( _mapAncestors.Contains( theS ) ) - return _mapAncestors.FindFromKey( theS ); - - static TopTools_ListOfShape emptyList; - return emptyList; -} - -//======================================================================= -//function : Dump -//purpose : dumps contents of mesh to stream [ debug purposes ] -//======================================================================= -ostream& SMESH_Mesh::Dump(ostream& save) -{ - save << "========================== Dump contents of mesh ==========================" << endl; - save << "1) Total number of nodes: " << NbNodes() << endl; - save << "2) Total number of edges: " << NbEdges() << endl; - save << "3) Total number of faces: " << NbFaces() << endl; - if ( NbFaces() > 0 ) { - int nb3 = NbTriangles(); - int nb4 = NbQuadrangles(); - save << "3.1.) Number of triangles: " << nb3 << endl; - save << "3.2.) Number of quadrangles: " << nb4 << endl; - if ( nb3 + nb4 != NbFaces() ) { - map myFaceMap; - SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); - while( itFaces->more( ) ) { - int nbNodes = itFaces->next()->NbNodes(); - if ( myFaceMap.find( nbNodes ) == myFaceMap.end() ) - myFaceMap[ nbNodes ] = 0; - myFaceMap[ nbNodes ] = myFaceMap[ nbNodes ] + 1; - } - save << "3.3.) Faces in detail: " << endl; - map ::iterator itF; - for (itF = myFaceMap.begin(); itF != myFaceMap.end(); itF++) - save << "--> nb nodes: " << itF->first << " - nb elemens: " << itF->second << endl; - } - } - save << "4) Total number of volumes: " << NbVolumes() << endl; - if ( NbVolumes() > 0 ) { - int nb8 = NbHexas(); - int nb4 = NbTetras(); - int nb5 = NbPyramids(); - int nb6 = NbPrisms(); - save << "4.1.) Number of hexahedrons: " << nb8 << endl; - save << "4.2.) Number of tetrahedrons: " << nb4 << endl; - save << "4.3.) Number of prisms: " << nb6 << endl; - save << "4.4.) Number of pyramides: " << nb5 << endl; - if ( nb8 + nb4 + nb5 + nb6 != NbVolumes() ) { - map myVolumesMap; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - while( itVolumes->more( ) ) { - int nbNodes = itVolumes->next()->NbNodes(); - if ( myVolumesMap.find( nbNodes ) == myVolumesMap.end() ) - myVolumesMap[ nbNodes ] = 0; - myVolumesMap[ nbNodes ] = myVolumesMap[ nbNodes ] + 1; - } - save << "4.5.) Volumes in detail: " << endl; - map ::iterator itV; - for (itV = myVolumesMap.begin(); itV != myVolumesMap.end(); itV++) - save << "--> nb nodes: " << itV->first << " - nb elemens: " << itV->second << endl; - } - } - save << "===========================================================================" << endl; - return save; -} - -//======================================================================= -//function : GetElementType -//purpose : Returns type of mesh element with certain id -//======================================================================= -SMDSAbs_ElementType SMESH_Mesh::GetElementType( const int id, const bool iselem ) -{ - return _myMeshDS->GetElementType( id, iselem ); -} diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx deleted file mode 100644 index 5054e0038..000000000 --- a/src/SMESH/SMESH_Mesh.hxx +++ /dev/null @@ -1,256 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_Mesh.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MESH_HXX_ -#define _SMESH_MESH_HXX_ - -#include "SMESH_Hypothesis.hxx" -//#include "SMESH_subMesh.hxx" - -#include "SMESHDS_Document.hxx" -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_Command.hxx" -#include "SMDSAbs_ElementType.hxx" - -//#include "NMTTools_IndexedDataMapOfShapeIndexedMapOfShape.hxx" -#include "SMESH_IndexedDataMapOfShapeIndexedMapOfShape.hxx" - -#include "Utils_SALOME_Exception.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -class SMESH_Gen; -class SMESH_Group; -class TopTools_ListOfShape; -class SMESH_subMesh; -class SMESH_HypoFilter; - -//typedef NMTTools_IndexedDataMapOfShapeIndexedMapOfShape IndexedMapOfChain; -typedef SMESH_IndexedDataMapOfShapeIndexedMapOfShape IndexedMapOfChain; - -class SMESH_Mesh -{ - SMESH_Mesh(); - SMESH_Mesh(const SMESH_Mesh&); -public: - SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, - SMESHDS_Document * myDocument); - - virtual ~SMESH_Mesh(); - - void ShapeToMesh(const TopoDS_Shape & aShape); - - int UNVToMesh(const char* theFileName); - /*! - * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value - */ - int MEDToMesh(const char* theFileName, const char* theMeshName); - - int STLToMesh(const char* theFileName); - - SMESH_Hypothesis::Hypothesis_Status - AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId) - throw(SALOME_Exception); - - SMESH_Hypothesis::Hypothesis_Status - RemoveHypothesis(const TopoDS_Shape & aSubShape, int anHypId) - throw(SALOME_Exception); - - const list & - GetHypothesisList(const TopoDS_Shape & aSubShape) const - throw(SALOME_Exception); - - const SMESH_Hypothesis * GetHypothesis(const TopoDS_Shape & aSubShape, - const SMESH_HypoFilter& aFilter, - const bool andAncestors) const; - - bool GetHypotheses(const TopoDS_Shape & aSubShape, - const SMESH_HypoFilter& aFilter, - list & aHypList, - const bool andAncestors) const; - - const list & GetLog() throw(SALOME_Exception); - - void ClearLog() throw(SALOME_Exception); - - int GetId(); - - SMESHDS_Mesh * GetMeshDS(); - - SMESH_Gen *GetGen(); - - SMESH_subMesh *GetSubMesh(const TopoDS_Shape & aSubShape) - throw(SALOME_Exception); - - SMESH_subMesh *GetSubMeshContaining(const TopoDS_Shape & aSubShape) - throw(SALOME_Exception); - - SMESH_subMesh *GetSubMeshContaining(const int aShapeID) - throw(SALOME_Exception); - - const list < SMESH_subMesh * >& - GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp) - throw(SALOME_Exception); - - bool IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, - const TopoDS_Shape & aSubShape); - // Return True if anHyp is used to mesh aSubShape - - bool IsNotConformAllowed() const; - // check if a hypothesis alowing notconform mesh is present - - bool IsMainShape(const TopoDS_Shape& theShape) const; - - const TopTools_ListOfShape& GetAncestors(const TopoDS_Shape& theSubShape) const; - // return list of ancestors of theSubShape in the order - // that lower dimention shapes come first. - - void ExportMED(const char *file, - const char* theMeshName = NULL, - bool theAutoGroups = true, - int theVersion = 0) - throw(SALOME_Exception); - - void ExportDAT(const char *file) throw(SALOME_Exception); - void ExportUNV(const char *file) throw(SALOME_Exception); - void ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception); - - int NbNodes() throw(SALOME_Exception); - - int NbEdges() throw(SALOME_Exception); - - int NbFaces() throw(SALOME_Exception); - - int NbTriangles() throw(SALOME_Exception); - - int NbQuadrangles() throw(SALOME_Exception); - - int NbPolygons() throw(SALOME_Exception); - - int NbVolumes() throw(SALOME_Exception); - - int NbTetras() throw(SALOME_Exception); - - int NbHexas() throw(SALOME_Exception); - - int NbPyramids() throw(SALOME_Exception); - - int NbPrisms() throw(SALOME_Exception); - - int NbPolyhedrons() throw(SALOME_Exception); - - int NbSubMesh() throw(SALOME_Exception); - - int NbGroup() const { return _mapGroup.size(); } - - SMESH_Group* AddGroup (const SMDSAbs_ElementType theType, - const char* theName, - int& theId, - const TopoDS_Shape& theShape=TopoDS_Shape()); - - SMESH_Group* GetGroup (const int theGroupID); - - list GetGroupIds(); - - void RemoveGroup (const int theGroupID); - - // Propagation hypothesis management - - const SMESH_Hypothesis* IsLocal1DHypothesis (const TopoDS_Shape& theEdge); - // Returns a local 1D hypothesis used for theEdge. - - bool IsPropagationHypothesis (const TopoDS_Shape& theEdge); - // Returns true, if a local Propagation hypothesis is set directly on - - bool IsPropagatedHypothesis (const TopoDS_Shape& theEdge, - TopoDS_Shape& theMainEdge); - // Returns true, if a local 1D hypothesis is - // propagated on from some other edge. - // Returns through the edge, from - // which the 1D hypothesis is propagated on - - bool IsReversedInChain (const TopoDS_Shape& theEdge, - const TopoDS_Shape& theMainEdge); - // Returns true if theEdge should be reversed to be - // co-directed with theMainEdge - - bool RebuildPropagationChains(); - bool RemovePropagationChain (const TopoDS_Shape& theMainEdge); - bool BuildPropagationChain (const TopoDS_Shape& theMainEdge); - - SMDSAbs_ElementType GetElementType( const int id, const bool iselem ); - - // - - ostream& Dump(ostream & save); - -private: - // Propagation hypothesis management - void CleanMeshOnPropagationChain(const TopoDS_Shape& theMainEdge); - // - -private: - int _id; // id given by creator (unique within the creator instance) - int _studyId; - int _idDoc; // id given by SMESHDS_Document - int _groupId; // id generator for group objects - bool _isShapeToMesh;// set to true when a shape is given (only once) - list _subMeshesUsingHypothesisList; - SMESHDS_Document * _myDocument; - SMESHDS_Mesh * _myMeshDS; - map _mapSubMesh; - map _mapGroup; - SMESH_Gen * _gen; - - TopTools_IndexedDataMapOfShapeListOfShape _mapAncestors; - - IndexedMapOfChain _mapPropagationChains; // Propagation hypothesis management -}; - -#endif diff --git a/src/SMESH/SMESH_subMesh.hxx b/src/SMESH/SMESH_subMesh.hxx deleted file mode 100644 index 8251c6b94..000000000 --- a/src/SMESH/SMESH_subMesh.hxx +++ /dev/null @@ -1,182 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : SMESH_subMesh.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_SUBMESH_HXX_ -#define _SMESH_SUBMESH_HXX_ - -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_SubMesh.hxx" -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" -#include -#include -#include - -#include -#include -#include - -class SMESH_Mesh; -class SMESH_Hypothesis; -class SMESH_Algo; -class SMESH_Gen; - -class SMESH_subMesh -{ - public: - SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS, - const TopoDS_Shape & aSubShape); - virtual ~ SMESH_subMesh(); - - int GetId() const; - - // bool Contains(const TopoDS_Shape & aSubShape) - // throw (SALOME_Exception); - - SMESH_Mesh* GetFather() { return _father; } - - SMESHDS_SubMesh * GetSubMeshDS(); - - SMESHDS_SubMesh* CreateSubMeshDS(); - // Explicit SMESHDS_SubMesh creation method, required for persistence mechanism - - SMESH_subMesh *GetFirstToCompute(); - - const map < int, SMESH_subMesh * >&DependsOn(); - //const map < int, SMESH_subMesh * >&Dependants(); - - const TopoDS_Shape & GetSubShape(); - -// bool _vertexSet; // only for vertex subMesh, set to false for dim > 0 - - enum compute_state - { - NOT_READY, READY_TO_COMPUTE, - COMPUTE_OK, FAILED_TO_COMPUTE - }; - enum algo_state - { - NO_ALGO, MISSING_HYP, HYP_OK - }; - enum algo_event - { - ADD_HYP, ADD_ALGO, - REMOVE_HYP, REMOVE_ALGO, - ADD_FATHER_HYP, ADD_FATHER_ALGO, - REMOVE_FATHER_HYP, REMOVE_FATHER_ALGO - }; - enum compute_event - { - MODIF_HYP, MODIF_ALGO_STATE, COMPUTE, - CLEAN, CLEANDEP, SUBMESH_COMPUTED, SUBMESH_RESTORED, - MESH_ENTITY_REMOVED, CHECK_COMPUTE_STATE - }; - - SMESH_Hypothesis::Hypothesis_Status - AlgoStateEngine(int event, SMESH_Hypothesis * anHyp); - - SMESH_Hypothesis::Hypothesis_Status - SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp); - - int GetAlgoState() { return _algoState; } - - void DumpAlgoState(bool isMain); - - bool ComputeStateEngine(int event); - - int GetComputeState() - { - return _computeState; - }; - - bool IsConform(const SMESH_Algo* theAlgo); - // check if a conform mesh will be produced by the Algo - - bool CanAddHypothesis(const SMESH_Hypothesis* theHypothesis) const; - // return true if theHypothesis can be attached to me: - // its dimention is checked - - static bool IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis, - const TopAbs_ShapeEnum theShapeType); - - bool IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis) const - { return IsApplicableHypotesis( theHypothesis, _subShape.ShapeType() ); } - // return true if theHypothesis can be used to mesh me: - // its shape type is checked - - SMESH_Hypothesis::Hypothesis_Status CheckConcurentHypothesis (const int theHypType); - // check if there are several applicable hypothesis on fathers - - protected: - void InsertDependence(const TopoDS_Shape aSubShape); - - bool SubMeshesComputed(); - - bool SubMeshesReady(); - - void RemoveSubMeshElementsAndNodes(); - void UpdateDependantsState(const compute_event theEvent); - void UpdateSubMeshState(const compute_state theState); - void ComputeSubMeshStateEngine(int event); - void CleanDependants(); - void CleanDependsOn(); - void SetAlgoState(int state); - - bool IsMeshComputed() const; - // check if _subMeshDS contains mesh elements - - TopoDS_Shape GetCollection(SMESH_Gen * theGen, SMESH_Algo* theAlgo); - // return a shape containing all sub-shapes of the MainShape that can be - // meshed at once along with _subShape - - bool ApplyToCollection (SMESH_Algo* theAlgo, - const TopoDS_Shape& theCollection); - // Apply theAlgo to all subshapes in theCollection - - const SMESH_Hypothesis* GetSimilarAttached(const TopoDS_Shape& theShape, - const SMESH_Hypothesis * theHyp, - const int theHypType = 0); - // return a hypothesis attached to theShape. - // If theHyp is provided, similar but not same hypotheses - // is returned; else an applicable ones having theHypType - // is returned - - TopoDS_Shape _subShape; - SMESHDS_Mesh * _meshDS; - SMESHDS_SubMesh * _subMeshDS; - int _Id; - SMESH_Mesh *_father; - map < int, SMESH_subMesh * >_mapDepend; - bool _dependenceAnalysed; - - int _algoState; - int _computeState; - -}; - -#endif diff --git a/src/SMESHDS/Makefile.in b/src/SMESHDS/Makefile.in deleted file mode 100644 index 50d4fa742..000000000 --- a/src/SMESHDS/Makefile.in +++ /dev/null @@ -1,83 +0,0 @@ -# SMESH SMESHDS : management of mesh data and SMESH document -# -# 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 : Patrick GOLDBRONN (CEA) -# Module : SMESH - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl - - -@COMMENCE@ - -# Libraries targets - -LIB = libSMESHDS.la -LIB_SRC = \ - SMESHDS_Document.cxx \ - SMESHDS_Hypothesis.cxx \ - SMESHDS_Script.cxx \ - SMESHDS_Command.cxx \ - SMESHDS_SubMesh.cxx \ - SMESHDS_Mesh.cxx \ - SMESHDS_GroupBase.cxx \ - SMESHDS_Group.cxx \ - SMESHDS_GroupOnGeom.cxx - -LIB_CLIENT_IDL = -LIB_SERVER_IDL = - -# Executables targets -BIN = -BIN_SRC = -BIN_CLIENT_IDL = -BIN_SERVER_IDL = - -# header files -EXPORT_HEADERS= \ - SMESHDS_Document.hxx \ - SMESHDS_Hypothesis.hxx \ - SMESHDS_Mesh.hxx \ - SMESHDS_Script.hxx \ - SMESHDS_Command.hxx \ - SMESHDS_CommandType.hxx \ - SMESHDS_SubMesh.hxx \ - SMESHDS_GroupBase.hxx \ - SMESHDS_Group.hxx \ - SMESHDS_GroupOnGeom.hxx - -# additionnal information to compil and link file -CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) -CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS += $(OCC_KERNEL_LIBS) -lSMDS - - -# additional file to be cleaned -MOSTLYCLEAN = -CLEAN = -DISTCLEAN = - -@CONCLUDE@ diff --git a/src/SMESHDS/SMESHDS_Command.cxx b/src/SMESHDS/SMESHDS_Command.cxx deleted file mode 100644 index b55b5af1c..000000000 --- a/src/SMESHDS/SMESHDS_Command.cxx +++ /dev/null @@ -1,410 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESH_Command.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_Command.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : -//purpose : -//======================================================================= -SMESHDS_Command::SMESHDS_Command(const SMESHDS_CommandType aType):myType(aType), -myNumber(0) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddNode(int NewNodeID, double x, double y, double z) -{ - if (!myType == SMESHDS_AddNode) - { - MESSAGE("SMESHDS_Command::AddNode : Bad Type"); - return; - } - myIntegers.push_back(NewNodeID); - myReals.push_back(x); - myReals.push_back(y); - myReals.push_back(z); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::MoveNode(int NodeID, double x, double y, double z) -{ - if (!myType == SMESHDS_MoveNode) - { - MESSAGE("SMESHDS_Command::MoveNode : Bad Type"); - return; - } - myIntegers.push_back(NodeID); - myReals.push_back(x); - myReals.push_back(y); - myReals.push_back(z); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddEdge(int NewEdgeID, int idnode1, int idnode2) -{ - if (!myType == SMESHDS_AddEdge) - { - MESSAGE("SMESHDS_Command::AddEdge : Bad Type"); - return; - } - myIntegers.push_back(NewEdgeID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddFace(int NewFaceID, - int idnode1, int idnode2, int idnode3) -{ - if (!myType == SMESHDS_AddTriangle) - { - MESSAGE("SMESHDS_Command::AddFace : Bad Type"); - return; - } - myIntegers.push_back(NewFaceID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddFace(int NewFaceID, - int idnode1, int idnode2, int idnode3, int idnode4) -{ - if (!myType == SMESHDS_AddQuadrangle) - { - MESSAGE("SMESHDS_Command::AddFace : Bad Type"); - return; - } - myIntegers.push_back(NewFaceID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddVolume(int NewVolID, - int idnode1, int idnode2, int idnode3, int idnode4) -{ - if (!myType == SMESHDS_AddTetrahedron) - { - MESSAGE("SMESHDS_Command::AddVolume : Bad Type"); - return; - } - myIntegers.push_back(NewVolID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddVolume(int NewVolID, - int idnode1, int idnode2, int idnode3, int idnode4, int idnode5) -{ - if (!myType == SMESHDS_AddPyramid) - { - MESSAGE("SMESHDS_Command::AddVolume : Bad Type"); - return; - } - myIntegers.push_back(NewVolID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myIntegers.push_back(idnode5); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddVolume(int NewVolID, - int idnode1, - int idnode2, int idnode3, int idnode4, int idnode5, int idnode6) -{ - if (!myType == SMESHDS_AddPrism) - { - MESSAGE("SMESHDS_Command::AddVolume : Bad Type"); - return; - } - myIntegers.push_back(NewVolID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myIntegers.push_back(idnode5); - myIntegers.push_back(idnode6); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddVolume(int NewVolID, - int idnode1, - int idnode2, - int idnode3, - int idnode4, int idnode5, int idnode6, int idnode7, int idnode8) -{ - if (!myType == SMESHDS_AddHexahedron) - { - MESSAGE("SMESHDS_Command::AddVolume : Bad Type"); - return; - } - myIntegers.push_back(NewVolID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myIntegers.push_back(idnode5); - myIntegers.push_back(idnode6); - myIntegers.push_back(idnode7); - myIntegers.push_back(idnode8); - myNumber++; -} - -//======================================================================= -//function : AddPolygonalFace -//purpose : -//======================================================================= -void SMESHDS_Command::AddPolygonalFace (const int ElementID, - std::vector nodes_ids) -{ - if (!myType == SMESHDS_AddPolygon) { - MESSAGE("SMESHDS_Command::AddPolygonalFace : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - - int i, nbNodes = nodes_ids.size(); - myIntegers.push_back(nbNodes); - for (i = 0; i < nbNodes; i++) { - myIntegers.push_back(nodes_ids[i]); - } - - myNumber++; -} - -//======================================================================= -//function : AddPolyhedralVolume -//purpose : -//======================================================================= -void SMESHDS_Command::AddPolyhedralVolume (const int ElementID, - std::vector nodes_ids, - std::vector quantities) -{ - if (!myType == SMESHDS_AddPolyhedron) { - MESSAGE("SMESHDS_Command::AddPolyhedralVolume : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - - int i, nbNodes = nodes_ids.size(); - myIntegers.push_back(nbNodes); - for (i = 0; i < nbNodes; i++) { - myIntegers.push_back(nodes_ids[i]); - } - - int nbFaces = quantities.size(); - myIntegers.push_back(nbFaces); - for (i = 0; i < nbFaces; i++) { - myIntegers.push_back(quantities[i]); - } - - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::RemoveNode(int NodeID) -{ - if (!myType == SMESHDS_RemoveNode) - { - MESSAGE("SMESHDS_Command::RemoveNode : Bad Type"); - return; - } - myIntegers.push_back(NodeID); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::RemoveElement(int ElementID) -{ - if (!myType == SMESHDS_RemoveElement) - { - MESSAGE("SMESHDS_Command::RemoveElement : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - myNumber++; -} - -//======================================================================= -//function : ChangeElementNodes -//purpose : -//======================================================================= - -void SMESHDS_Command::ChangeElementNodes(int ElementID, int nodes[], int nbnodes) -{ - if (!myType == SMESHDS_ChangeElementNodes) - { - MESSAGE("SMESHDS_Command::ChangeElementNodes : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - myIntegers.push_back(nbnodes); - for ( int i = 0; i < nbnodes; i++ ) - myIntegers.push_back( nodes[ i ] ); - - myNumber++; -} - -//======================================================================= -//function : ChangePolyhedronNodes -//purpose : -//======================================================================= -void SMESHDS_Command::ChangePolyhedronNodes (const int ElementID, - std::vector nodes_ids, - std::vector quantities) -{ - if (myType != SMESHDS_ChangePolyhedronNodes) - { - MESSAGE("SMESHDS_Command::ChangePolyhedronNodes : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - - int i, nbNodes = nodes_ids.size(); - myIntegers.push_back(nbNodes); - for (i = 0; i < nbNodes; i++) { - myIntegers.push_back(nodes_ids[i]); - } - - int nbFaces = quantities.size(); - myIntegers.push_back(nbFaces); - for (i = 0; i < nbFaces; i++) { - myIntegers.push_back(quantities[i]); - } - - myNumber++; -} - -//======================================================================= -//function : Renumber -//purpose : -//======================================================================= - -void SMESHDS_Command::Renumber (const bool isNodes, const int startID, const int deltaID) -{ - if (!myType == SMESHDS_Renumber) - { - MESSAGE("SMESHDS_Command::Renumber : Bad Type"); - return; - } - myIntegers.push_back(isNodes); - myIntegers.push_back(startID); - myIntegers.push_back(deltaID); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -SMESHDS_CommandType SMESHDS_Command::GetType() -{ - return myType; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -int SMESHDS_Command::GetNumber() -{ - return myNumber; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -const list < int >&SMESHDS_Command::GetIndexes() -{ - return myIntegers; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -const list < double >&SMESHDS_Command::GetCoords() -{ - return myReals; -} diff --git a/src/SMESHDS/SMESHDS_Command.hxx b/src/SMESHDS/SMESHDS_Command.hxx deleted file mode 100644 index 3ecd762f3..000000000 --- a/src/SMESHDS/SMESHDS_Command.hxx +++ /dev/null @@ -1,76 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESHDS_Command.hxx -// Module : SMESH - -#ifndef _SMESHDS_Command_HeaderFile -#define _SMESHDS_Command_HeaderFile - -#include "SMESHDS_CommandType.hxx" -#include -#include - -class SMESHDS_Command -{ - - public: - SMESHDS_Command(const SMESHDS_CommandType aType); - void AddNode(int NewNodeID, double x, double y, double z); - void AddEdge(int NewEdgeID, int idnode1, int idnode2); - void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3); - void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3, - int idnode4); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6, int idnode7, int idnode8); - void AddPolygonalFace (const int ElementID, - std::vector nodes_ids); - void AddPolyhedralVolume (const int ElementID, - std::vector nodes_ids, - std::vector quantities); - void MoveNode(int NewNodeID, double x, double y, double z); - void RemoveNode(int NodeID); - void RemoveElement(int ElementID); - void ChangeElementNodes(int ElementID, int nodes[], int nbnodes); - void ChangePolyhedronNodes(const int ElementID, - std::vector nodes_ids, - std::vector quantities); - void Renumber (const bool isNodes, const int startID, const int deltaID); - SMESHDS_CommandType GetType(); - int GetNumber(); - const std::list & GetIndexes(); - const std::list & GetCoords(); - ~SMESHDS_Command(); - private: - SMESHDS_CommandType myType; - int myNumber; - std::list myReals; - std::list myIntegers; -}; -#endif diff --git a/src/SMESHDS/SMESHDS_CommandType.hxx b/src/SMESHDS/SMESHDS_CommandType.hxx deleted file mode 100644 index f2c505b1f..000000000 --- a/src/SMESHDS/SMESHDS_CommandType.hxx +++ /dev/null @@ -1,52 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESHDS_CommandType.hxx -// Module : SMESH - -#ifndef _SMESHDS_CommandType_HeaderFile -#define _SMESHDS_CommandType_HeaderFile - -//#include - -enum SMESHDS_CommandType { - SMESHDS_AddNode, - SMESHDS_AddEdge, - SMESHDS_AddTriangle, - SMESHDS_AddQuadrangle, - SMESHDS_AddPolygon, - SMESHDS_AddTetrahedron, - SMESHDS_AddPyramid, - SMESHDS_AddPrism, - SMESHDS_AddHexahedron, - SMESHDS_AddPolyhedron, - SMESHDS_RemoveNode, - SMESHDS_RemoveElement, - SMESHDS_MoveNode, - SMESHDS_ChangeElementNodes, - SMESHDS_ChangePolyhedronNodes, - SMESHDS_Renumber -}; - - -#endif diff --git a/src/SMESHDS/SMESHDS_Document.cxx b/src/SMESHDS/SMESHDS_Document.cxx deleted file mode 100644 index f533a72a7..000000000 --- a/src/SMESHDS/SMESHDS_Document.cxx +++ /dev/null @@ -1,192 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESHDS_Document.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_Document.hxx" -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : Create -//purpose : -//======================================================================= -SMESHDS_Document::SMESHDS_Document(int UserID):myUserID(UserID) -{ -} - -//======================================================================= -//function : NewMesh -//purpose : -//======================================================================= -int SMESHDS_Document::NewMesh() -{ - static int NewMeshID = 0; - NewMeshID++; - SMESHDS_Mesh *aNewMesh = new SMESHDS_Mesh(NewMeshID); - myMeshes[NewMeshID] = aNewMesh; - return NewMeshID; -} - -//======================================================================= -//function : GetMesh -//purpose : -//======================================================================= -SMESHDS_Mesh *SMESHDS_Document::GetMesh(int MeshID) -{ - map::iterator it=myMeshes.find(MeshID); - if (it==myMeshes.end()) - { - MESSAGE("SMESHDS_Document::GetMesh : ID not found"); - return NULL; - } - else return (*it).second; -} - -//======================================================================= -//function : RemoveMesh -//purpose : -//======================================================================= -void SMESHDS_Document::RemoveMesh(int MeshID) -{ - map::iterator it=myMeshes.find(MeshID); - if (it==myMeshes.end()) - MESSAGE("SMESHDS_Document::RemoveMesh : ID not found"); - myMeshes.erase(it); -} - -//======================================================================= -//function : AddHypothesis -//purpose : -//======================================================================= -void SMESHDS_Document::AddHypothesis(SMESHDS_Hypothesis * H) -{ - myHypothesis[H->GetID()]=H; -} - -//======================================================================= -//function : GetHypothesis -//purpose : -//======================================================================= -SMESHDS_Hypothesis * SMESHDS_Document::GetHypothesis(int HypID) -{ - map::iterator it=myHypothesis.find(HypID); - if (it==myHypothesis.end()) - { - MESSAGE("SMESHDS_Document::GetHypothesis : ID not found"); - return NULL; - } - else return (*it).second; -} - -//======================================================================= -//function : RemoveHypothesis -//purpose : -//======================================================================= -void SMESHDS_Document::RemoveHypothesis(int HypID) -{ - map::iterator it=myHypothesis.find(HypID); - if (it==myHypothesis.end()) - MESSAGE("SMESHDS_Document::RemoveHypothesis : ID not found"); - myHypothesis.erase(it); -} - -//======================================================================= -//function : NbMeshes -//purpose : -//======================================================================= -int SMESHDS_Document::NbMeshes() -{ - return myMeshes.size(); -} - -//======================================================================= -//function : NbHypothesis -//purpose : -//======================================================================= -int SMESHDS_Document::NbHypothesis() -{ - return myHypothesis.size(); -} - -//======================================================================= -//function : InitMeshesIterator -//purpose : -//======================================================================= -void SMESHDS_Document::InitMeshesIterator() -{ - myMeshesIt=myMeshes.begin(); -} - -//======================================================================= -//function : NextMesh -//purpose : -//======================================================================= -SMESHDS_Mesh * SMESHDS_Document::NextMesh() -{ - SMESHDS_Mesh * toReturn=(*myMeshesIt).second; - myMeshesIt++; - return toReturn; -} - -//======================================================================= -//function : MoreMesh -//purpose : -//======================================================================= -bool SMESHDS_Document::MoreMesh() -{ - return myMeshesIt!=myMeshes.end(); -} - -//======================================================================= -//function : InitHypothesisIterator -//purpose : -//======================================================================= -void SMESHDS_Document::InitHypothesisIterator() -{ - myHypothesisIt=myHypothesis.begin(); -} - -//======================================================================= -//function : NextMesh -//purpose : -//======================================================================= -SMESHDS_Hypothesis * SMESHDS_Document::NextHypothesis() -{ - SMESHDS_Hypothesis * toReturn=(*myHypothesisIt).second; - myHypothesisIt++; - return toReturn; -} - -//======================================================================= -//function : MoreMesh -//purpose : -//======================================================================= -bool SMESHDS_Document::MoreHypothesis() -{ - return myHypothesisIt!=myHypothesis.end(); -} diff --git a/src/SMESHDS/SMESHDS_Document.hxx b/src/SMESHDS/SMESHDS_Document.hxx deleted file mode 100644 index e95269f11..000000000 --- a/src/SMESHDS/SMESHDS_Document.hxx +++ /dev/null @@ -1,63 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESHDS_Document.hxx -// Module : SMESH - -#ifndef _SMESHDS_Document_HeaderFile -#define _SMESHDS_Document_HeaderFile - -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_Hypothesis.hxx" -#include - - -class SMESHDS_Document -{ - public: - SMESHDS_Document(int UserID); - int NewMesh(); - void RemoveMesh(int MeshID); - SMESHDS_Mesh * GetMesh(int MeshID); - void AddHypothesis(SMESHDS_Hypothesis * H); - void RemoveHypothesis(int HypID); - SMESHDS_Hypothesis * GetHypothesis(int HypID); - int NbMeshes(); - int NbHypothesis(); - void InitMeshesIterator(); - SMESHDS_Mesh * NextMesh(); - bool MoreMesh(); - void InitHypothesisIterator(); - SMESHDS_Hypothesis * NextHypothesis(); - bool MoreHypothesis(); - ~SMESHDS_Document(); - - private: - int myUserID; - std::map myMeshes; - std::map myHypothesis; - std::map::iterator myMeshesIt; - std::map::iterator myHypothesisIt; -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_Group.cxx b/src/SMESHDS/SMESHDS_Group.cxx deleted file mode 100644 index 9c7dfa4a9..000000000 --- a/src/SMESHDS/SMESHDS_Group.cxx +++ /dev/null @@ -1,164 +0,0 @@ -// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Group.cxx -// Module : SMESH -// $Header$ - -#include "SMESHDS_Group.hxx" -#include "SMESHDS_Mesh.hxx" - -using namespace std; - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_Group::SMESHDS_Group (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType) - : SMESHDS_GroupBase(theID,theMesh,theType), - myGroup(theMesh,theType) -{ -} - -//======================================================================= -//function : Extent -//purpose : -//======================================================================= - -int SMESHDS_Group::Extent() -{ - return myGroup.Extent(); -} - -//======================================================================= -//function : IsEmpty -//purpose : -//======================================================================= - -bool SMESHDS_Group::IsEmpty() -{ - return myGroup.IsEmpty(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool SMESHDS_Group::Contains (const int theID) -{ - const SMDS_MeshElement* aElem = findInMesh (theID); - if (aElem) - return myGroup.Contains(aElem); - return false; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool SMESHDS_Group::Add (const int theID) -{ - const SMDS_MeshElement* aElem = findInMesh (theID); - if (!aElem || myGroup.Contains(aElem)) - return false; - - if (myGroup.IsEmpty()) - SetType( aElem->GetType() ); - - myGroup.Add (aElem); - resetIterator(); - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool SMESHDS_Group::Remove (const int theID) -{ - const SMDS_MeshElement* aElem = findInMesh (theID); - if (!aElem || !myGroup.Contains(aElem)) - return false; - myGroup.Remove (aElem); - resetIterator(); - return true; -} - -//======================================================================= -//function : Clear -//purpose : -//======================================================================= - -void SMESHDS_Group::Clear() -{ - myGroup.Clear(); - resetIterator(); -} - -// ===================== -// class MyGroupIterator -// ===================== - -class MyGroupIterator: public SMDS_ElemIterator -{ - const SMDS_MeshGroup& myGroup; - public: - MyGroupIterator(const SMDS_MeshGroup& group): myGroup(group) { myGroup.InitIterator(); } - bool more() { return myGroup.More(); } - const SMDS_MeshElement* next() { return myGroup.Next(); } -}; - -//======================================================================= -//function : GetElements -//purpose : -//======================================================================= - -SMDS_ElemIteratorPtr SMESHDS_Group::GetElements() -{ - return SMDS_ElemIteratorPtr( new MyGroupIterator ( myGroup )); -} - -//======================================================================= -//function : SetType -//purpose : -//======================================================================= - -void SMESHDS_Group::SetType(SMDSAbs_ElementType theType) -{ - if ( myGroup.IsEmpty() || GetType() == SMDSAbs_All ) { - SMESHDS_GroupBase::SetType( theType ); - myGroup.SetType ( theType ); - } - else - SMESHDS_GroupBase::SetType( myGroup.GetType() ); -} - diff --git a/src/SMESHDS/SMESHDS_Group.hxx b/src/SMESHDS/SMESHDS_Group.hxx deleted file mode 100644 index b318a0f97..000000000 --- a/src/SMESHDS/SMESHDS_Group.hxx +++ /dev/null @@ -1,68 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Group.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESHDS_Group_HeaderFile -#define _SMESHDS_Group_HeaderFile - -#include -#include "SMESHDS_GroupBase.hxx" -#include "SMDS_MeshGroup.hxx" - -class SMESHDS_Mesh; - -class SMESHDS_Group : public SMESHDS_GroupBase -{ - public: - - SMESHDS_Group (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType); - - virtual void SetType(SMDSAbs_ElementType theType); - - virtual int Extent(); - - virtual bool IsEmpty(); - - virtual bool Contains (const int theID); - - virtual SMDS_ElemIteratorPtr GetElements(); - - bool SMESHDS_Group::Add (const int theID); - - bool SMESHDS_Group::Remove (const int theID); - - void Clear(); - - SMDS_MeshGroup& SMDSGroup() { return myGroup; } - - private: - - SMDS_MeshGroup myGroup; - -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_GroupBase.cxx b/src/SMESHDS/SMESHDS_GroupBase.cxx deleted file mode 100644 index c4adcc53b..000000000 --- a/src/SMESHDS/SMESHDS_GroupBase.cxx +++ /dev/null @@ -1,150 +0,0 @@ -// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Group.cxx -// Module : SMESH -// $Header$ - -#include "SMESHDS_GroupBase.hxx" -#include "SMESHDS_Mesh.hxx" - -#include "utilities.h" - -using namespace std; - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_GroupBase::SMESHDS_GroupBase (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType): - myID(theID), myMesh(theMesh), myType(theType), myStoreName(""), - myCurIndex(0), myCurID(-1) -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESHDS_GroupBase::GetID (const int theIndex) -{ - if (myCurIndex < 1 || myCurIndex > theIndex) { - myIterator = GetElements(); - myCurIndex = 0; - myCurID = -1; - } - while (myCurIndex < theIndex && myIterator->more()) { - myCurIndex++; - myCurID = myIterator->next()->GetID(); - } - return myCurIndex == theIndex ? myCurID : -1; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const SMDS_MeshElement* SMESHDS_GroupBase::findInMesh (const int theID) const -{ - SMDSAbs_ElementType aType = GetType(); - const SMDS_MeshElement* aElem = NULL; - if (aType == SMDSAbs_Node) { - aElem = GetMesh()->FindNode(theID); - } - else if (aType != SMDSAbs_All) { - aElem = GetMesh()->FindElement(theID); - if (aElem && aType != aElem->GetType()) - aElem = NULL; - } - return aElem; -} - -//============================================================================= -/*! - * Internal method: resets cached iterator, should be called by ancestors - * when they are modified (ex: Add() or Remove() ) - */ -//============================================================================= -void SMESHDS_GroupBase::resetIterator() -{ - myCurIndex = 0; - myCurID = -1; -} - -//======================================================================= -//function : Extent -//purpose : -//======================================================================= - -int SMESHDS_GroupBase::Extent() -{ - SMDS_ElemIteratorPtr it = GetElements(); - int nb = 0; - if ( it ) - for ( ; it->more(); it->next() ) - nb++; - return nb; -} - -//======================================================================= -//function : IsEmpty -//purpose : -//======================================================================= - -bool SMESHDS_GroupBase::IsEmpty() -{ - SMDS_ElemIteratorPtr it = GetElements(); - return ( !it || !it->more() ); -} - -//======================================================================= -//function : Contains -//purpose : -//======================================================================= - -bool SMESHDS_GroupBase::Contains (const int theID) -{ - SMDS_ElemIteratorPtr it = GetElements(); - bool contains = false; - if ( it ) - while ( !contains && it->more() ) - contains = ( it->next()->GetID() == theID ); - return contains; -} - -//======================================================================= -//function : SetType -//purpose : -//======================================================================= - -void SMESHDS_GroupBase::SetType(SMDSAbs_ElementType theType) -{ - myType = theType; -} diff --git a/src/SMESHDS/SMESHDS_GroupBase.hxx b/src/SMESHDS/SMESHDS_GroupBase.hxx deleted file mode 100644 index a7aa87ced..000000000 --- a/src/SMESHDS/SMESHDS_GroupBase.hxx +++ /dev/null @@ -1,90 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Group.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESHDS_GroupBase_HeaderFile -#define _SMESHDS_GroupBase_HeaderFile - -#include -#include "SMDSAbs_ElementType.hxx" -#include "SMDS_MeshElement.hxx" - -class SMESHDS_Mesh; - -class SMESHDS_GroupBase -{ - public: - - SMESHDS_GroupBase (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType); - - int GetID() const { return myID; } - - const SMESHDS_Mesh* GetMesh() const { return myMesh; } - - virtual void SetType(SMDSAbs_ElementType theType); - - SMDSAbs_ElementType GetType() const { return myType; } - - void SetStoreName (const char* theName) { myStoreName = theName; } - - const char* GetStoreName () const { return myStoreName.c_str(); } - - virtual int Extent(); - - virtual bool IsEmpty(); - - virtual bool Contains (const int theID); - - virtual SMDS_ElemIteratorPtr GetElements() = 0; - - int GetID (const int theIndex); - // use it for iterations 1..Extent() - - virtual ~SMESHDS_GroupBase() {} - - protected: - const SMDS_MeshElement* findInMesh (const int theID) const; - void resetIterator(); - - private: - SMESHDS_GroupBase (const SMESHDS_GroupBase& theOther); - // prohibited copy constructor - SMESHDS_GroupBase& operator = (const SMESHDS_GroupBase& theOther); - // prohibited assign operator - - int myID; - const SMESHDS_Mesh* myMesh; - SMDSAbs_ElementType myType; - std::string myStoreName; - // for GetID() - int myCurIndex; - int myCurID; - SMDS_ElemIteratorPtr myIterator; - -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_GroupOnGeom.cxx b/src/SMESHDS/SMESHDS_GroupOnGeom.cxx deleted file mode 100644 index 187357a67..000000000 --- a/src/SMESHDS/SMESHDS_GroupOnGeom.cxx +++ /dev/null @@ -1,112 +0,0 @@ -// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_GroupOnGeom.cxx -// Module : SMESH -// $Header$ - -#include "SMESHDS_GroupOnGeom.hxx" -#include "SMESHDS_Mesh.hxx" -#include "utilities.h" - -using namespace std; - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_GroupOnGeom::SMESHDS_GroupOnGeom (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType, - const TopoDS_Shape& theShape) - : SMESHDS_GroupBase(theID,theMesh,theType), myShape(theShape) -{ - SMESHDS_Mesh* aMesh = const_cast(theMesh); - mySubMesh = aMesh->MeshElements( aMesh->AddCompoundSubmesh( theShape )); -} - -// ===================== -// class MyGroupIterator -// ===================== - -class MyIterator: public SMDS_ElemIterator -{ - SMDSAbs_ElementType myType; - SMDS_ElemIteratorPtr myElemIt; - SMDS_NodeIteratorPtr myNodeIt; - const SMDS_MeshElement* myElem; - public: - MyIterator(SMDSAbs_ElementType type, const SMESHDS_SubMesh* subMesh) - : myType(type), myElem(0) - { - if ( subMesh ) - if ( myType == SMDSAbs_Node ) - myNodeIt = subMesh->GetNodes(); - else { - myElemIt = subMesh->GetElements(); - next(); - } - } - bool more() - { - if ( myType == SMDSAbs_Node && myNodeIt ) - return myNodeIt->more(); - return ( myElem != 0 ); - } - const SMDS_MeshElement* next() - { - if ( myType == SMDSAbs_Node && myNodeIt ) - return myNodeIt->next(); - const SMDS_MeshElement* res = myElem; - myElem = 0; - while ( myElemIt && myElemIt->more() ) { - myElem = myElemIt->next(); - if ( myElem && myElem->GetType() == myType ) - break; - else - myElem = 0; - } - return res; - } -}; - -//======================================================================= -//function : GetElements -//purpose : -//======================================================================= - -SMDS_ElemIteratorPtr SMESHDS_GroupOnGeom::GetElements() -{ - return SMDS_ElemIteratorPtr( new MyIterator ( GetType(), mySubMesh )); -} - -//======================================================================= -//function : Contains -//purpose : -//======================================================================= - -bool SMESHDS_GroupOnGeom::Contains (const int theID) -{ - return mySubMesh->Contains( findInMesh( theID )); -} diff --git a/src/SMESHDS/SMESHDS_GroupOnGeom.hxx b/src/SMESHDS/SMESHDS_GroupOnGeom.hxx deleted file mode 100644 index 6a514e2f1..000000000 --- a/src/SMESHDS/SMESHDS_GroupOnGeom.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_GroupOnGeom.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESHDS_GroupOnGeom_HeaderFile -#define _SMESHDS_GroupOnGeom_HeaderFile - -#include "SMESHDS_GroupBase.hxx" -#include - -class SMESHDS_SubMesh; - -class SMESHDS_GroupOnGeom: public SMESHDS_GroupBase -{ - public: - - SMESHDS_GroupOnGeom (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType, - const TopoDS_Shape& theShape); - - TopoDS_Shape GetShape() const { return myShape; } - - virtual bool Contains (const int theID); - - virtual SMDS_ElemIteratorPtr GetElements(); - - private: - - TopoDS_Shape myShape; - const SMESHDS_SubMesh* mySubMesh; -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_Hypothesis.cxx b/src/SMESHDS/SMESHDS_Hypothesis.cxx deleted file mode 100644 index 29501c440..000000000 --- a/src/SMESHDS/SMESHDS_Hypothesis.cxx +++ /dev/null @@ -1,98 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESHDS_Hypothesis.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#include "SMESHDS_Hypothesis.hxx" - -using namespace std; - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_Hypothesis::SMESHDS_Hypothesis(int hypId) -{ -// MESSAGE("SMESHDS_Hypothesis::SMESHDS_Hypothesis"); - _hypId = hypId; - _name = "generic"; -// SCRUTE(_name); -// SCRUTE(_hypId); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_Hypothesis::~SMESHDS_Hypothesis() -{ -// MESSAGE("SMESHDS_Hypothesis::~SMESHDS_Hypothesis"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const char* SMESHDS_Hypothesis::GetName() const -{ -// MESSAGE("SMESHDS_Hypothesis::GetName"); -// SCRUTE(_name); -// SCRUTE(&_name); - return _name.c_str(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESHDS_Hypothesis::GetID() const -{ -// MESSAGE("SMESHDS_Hypothesis::GetId"); -// SCRUTE(_hypId); - return _hypId; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESHDS_Hypothesis::GetType() const -{ -// MESSAGE("SMESHDS_Hypothesis::GetType"); -// SCRUTE(_type); - return _type; -} - diff --git a/src/SMESHDS/SMESHDS_Hypothesis.hxx b/src/SMESHDS/SMESHDS_Hypothesis.hxx deleted file mode 100644 index 9fb413fbd..000000000 --- a/src/SMESHDS/SMESHDS_Hypothesis.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESHDS_Hypothesis.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESHDS_HYPOTHESIS_HXX_ -#define _SMESHDS_HYPOTHESIS_HXX_ - -#include -#include - -class SMESHDS_Hypothesis -{ -public: - SMESHDS_Hypothesis(int hypId); - virtual ~SMESHDS_Hypothesis(); - - const char* GetName() const; - int GetID() const; - int GetType() const; - - virtual std::ostream & SaveTo(std::ostream & save)=0; - virtual std::istream & LoadFrom(std::istream & load)=0; - -enum hypothesis_type {PARAM_ALGO, ALGO, ALGO_1D, ALGO_2D, ALGO_3D}; - -protected: - std::string _name; - int _hypId; - int _type; -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx deleted file mode 100644 index 5f92232dd..000000000 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ /dev/null @@ -1,1065 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESH_Mesh.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_Mesh.hxx" - -#include "SMESHDS_Group.hxx" -#include "SMDS_VertexPosition.hxx" -#include "SMDS_EdgePosition.hxx" -#include "SMDS_FacePosition.hxx" -#include "SMESHDS_GroupOnGeom.hxx" -#include -#include -#include - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : Create -//purpose : -//======================================================================= -SMESHDS_Mesh::SMESHDS_Mesh(int MeshID):myMeshID(MeshID) -{ - myScript = new SMESHDS_Script(); -} - -//======================================================================= -//function : ShapeToMesh -//purpose : -//======================================================================= -void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S) -{ - if ( !myShape.IsNull() && S.IsNull() ) - { - // removal of a shape to mesh, delete ... - // - hypotheses - myShapeToHypothesis.clear(); - // - shape indices in SMDS_Position of nodes - map::iterator i_sub = myShapeIndexToSubMesh.begin(); - for ( ; i_sub != myShapeIndexToSubMesh.end(); i_sub++ ) { - if ( !i_sub->second->IsComplexSubmesh() ) { - SMDS_NodeIteratorPtr nIt = i_sub->second->GetNodes(); - while ( nIt->more() ) - nIt->next()->GetPosition()->SetShapeId( 0 ); - } - } - // - sub-meshes - myIndexToShape.Clear(); - myShapeIndexToSubMesh.clear(); - // - groups on geometry - set::iterator gr = myGroups.begin(); - while ( gr != myGroups.end() ) { - if ( dynamic_cast( *gr )) - myGroups.erase( gr++ ); - else - gr++; - } - } - else { - myShape = S; - if ( !S.IsNull() ) - TopExp::MapShapes(myShape, myIndexToShape); - } -} - -//======================================================================= -//function : AddHypothesis -//purpose : -//======================================================================= - -bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS, - const SMESHDS_Hypothesis * H) -{ - list& alist=myShapeToHypothesis[SS]; - - //Check if the Hypothesis is still present - list::iterator ith=alist.begin(); - - for (; ith!=alist.end(); ith++) - if (H == *ith) return false; - - alist.push_back(H); - return true; -} - -//======================================================================= -//function : RemoveHypothesis -//purpose : -//======================================================================= - -bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S, - const SMESHDS_Hypothesis * H) -{ - ShapeToHypothesis::iterator its=myShapeToHypothesis.find(S); - if(its!=myShapeToHypothesis.end()) - { - list::iterator ith=(*its).second.begin(); - - for (; ith!=(*its).second.end(); ith++) - if (H == *ith) - { - (*its).second.erase(ith); - return true; - } - } - return false; -} - -//======================================================================= -//function : AddNode -//purpose : -//======================================================================= -SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z){ - SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z); - if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z); - return node; -} - -SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, int ID){ - SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID); - if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z); - return node; -} - -//======================================================================= -//function : MoveNode -//purpose : -//======================================================================= -void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z) -{ - SMDS_MeshNode * node=const_cast(n); - node->setXYZ(x,y,z); - myScript->MoveNode(n->GetID(), x, y, z); -} - -//======================================================================= -//function : ChangeElementNodes -//purpose : -//======================================================================= - -bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, - const SMDS_MeshNode * nodes[], - const int nbnodes) -{ - if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes )) - return false; - - vector IDs( nbnodes ); - for ( int i = 0; i < nbnodes; i++ ) - IDs [ i ] = nodes[ i ]->GetID(); - myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes); - - return true; -} - -//======================================================================= -//function : ChangePolygonNodes -//purpose : -//======================================================================= -bool SMESHDS_Mesh::ChangePolygonNodes - (const SMDS_MeshElement * elem, - vector nodes) -{ - ASSERT(nodes.size() > 3); - - return ChangeElementNodes(elem, &nodes[0], nodes.size()); -} - -//======================================================================= -//function : ChangePolyhedronNodes -//purpose : -//======================================================================= -bool SMESHDS_Mesh::ChangePolyhedronNodes - (const SMDS_MeshElement * elem, - std::vector nodes, - std::vector quantities) -{ - ASSERT(nodes.size() > 3); - - if (!SMDS_Mesh::ChangePolyhedronNodes(elem, nodes, quantities)) - return false; - - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities); - - return true; -} - -//======================================================================= -//function : Renumber -//purpose : -//======================================================================= - -void SMESHDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID) -{ - SMDS_Mesh::Renumber( isNodes, startID, deltaID ); - myScript->Renumber( isNodes, startID, deltaID ); -} - -//======================================================================= -//function :AddEdgeWithID -//purpose : -//======================================================================= -SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID) -{ - SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID); - if(anElem) myScript->AddEdge(ID,n1,n2); - return anElem; -} - -SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID) -{ - return AddEdgeWithID(n1->GetID(), - n2->GetID(), - ID); -} - -SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2) -{ - SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2); - if(anElem) myScript->AddEdge(anElem->GetID(), - n1->GetID(), - n2->GetID()); - return anElem; -} - -//======================================================================= -//function :AddFace -//purpose : -//======================================================================= -SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int ID) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, ID); - if(anElem) myScript->AddFace(ID,n1,n2,n3); - return anElem; -} - -SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - int ID) -{ - return AddFaceWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - ID); -} - -SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3); - if(anElem) myScript->AddFace(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID()); - return anElem; -} - -//======================================================================= -//function :AddFace -//purpose : -//======================================================================= -SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int ID) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, n4, ID); - if(anElem) myScript->AddFace(ID, n1, n2, n3, n4); - return anElem; -} - -SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) -{ - return AddFaceWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - ID); -} - -SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3, n4); - if(anElem) myScript->AddFace(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID()); - return anElem; -} - -//======================================================================= -//function :AddVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int ID) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID); - if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4); - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) -{ - return AddVolumeWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - ID); -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4); - if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID()); - return anElem; -} - -//======================================================================= -//function :AddVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID); - if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5); - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - int ID) -{ - return AddVolumeWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - ID); -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5); - if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID()); - return anElem; -} - -//======================================================================= -//function :AddVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID) -{ - SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID); - if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6); - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - int ID) -{ - return AddVolumeWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - n6->GetID(), - ID); -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6); - if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - n6->GetID()); - return anElem; -} - -//======================================================================= -//function :AddVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID) -{ - SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID); - if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8); - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, - int ID) -{ - return AddVolumeWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - n6->GetID(), - n7->GetID(), - n8->GetID(), - ID); -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8); - if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - n6->GetID(), - n7->GetID(), - n8->GetID()); - return anElem; -} - -//======================================================================= -//function : AddPolygonalFace -//purpose : -//======================================================================= -SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID (std::vector nodes_ids, - const int ID) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID); - if (anElem) { - myScript->AddPolygonalFace(ID, nodes_ids); - } - return anElem; -} - -SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID - (std::vector nodes, - const int ID) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID); - if (anElem) { - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->AddPolygonalFace(ID, nodes_ids); - } - return anElem; -} - -SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFace - (std::vector nodes) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes); - if (anElem) { - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->AddPolygonalFace(anElem->GetID(), nodes_ids); - } - return anElem; -} - -//======================================================================= -//function : AddPolyhedralVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (std::vector nodes_ids, - std::vector quantities, - const int ID) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID); - if (anElem) { - myScript->AddPolyhedralVolume(ID, nodes_ids, quantities); - } - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID - (std::vector nodes, - std::vector quantities, - const int ID) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID); - if (anElem) { - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->AddPolyhedralVolume(ID, nodes_ids, quantities); - } - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume - (std::vector nodes, - std::vector quantities) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities); - if (anElem) { - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities); - } - return anElem; -} - -//======================================================================= -//function : removeFromContainers -//purpose : -//======================================================================= - -static void removeFromContainers (map & theSubMeshes, - set& theGroups, - list & theElems, - const bool isNode) -{ - if ( theElems.empty() ) - return; - - // Rm from group - // Element can belong to several groups - if ( !theGroups.empty() ) - { - set::iterator GrIt = theGroups.begin(); - for ( ; GrIt != theGroups.end(); GrIt++ ) - { - SMESHDS_Group* group = dynamic_cast( *GrIt ); - if ( !group || group->IsEmpty() ) continue; - - list::iterator elIt = theElems.begin(); - for ( ; elIt != theElems.end(); elIt++ ) - { - group->SMDSGroup().Remove( *elIt ); - if ( group->IsEmpty() ) break; - } - } - } - - // Rm from sub-meshes - // Element should belong to only one sub-mesh - map::iterator SubIt = theSubMeshes.begin(); - for ( ; SubIt != theSubMeshes.end(); SubIt++ ) - { - int size = isNode ? (*SubIt).second->NbNodes() : (*SubIt).second->NbElements(); - if ( size == 0 ) continue; - - list::iterator elIt = theElems.begin(); - while ( elIt != theElems.end() ) - { - bool removed = false; - if ( isNode ) - removed = (*SubIt).second->RemoveNode( static_cast (*elIt) ); - else - removed = (*SubIt).second->RemoveElement( *elIt ); - - if (removed) - { - elIt = theElems.erase( elIt ); - if ( theElems.empty() ) - return; // all elements are found and removed - } - else - { - elIt++ ; - } - } - } -} - -//======================================================================= -//function : RemoveNode -//purpose : -//======================================================================= -void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) -{ - myScript->RemoveNode(n->GetID()); - - list removedElems; - list removedNodes; - - SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true ); - - removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false ); - removeFromContainers( myShapeIndexToSubMesh, myGroups, removedNodes, true ); -} - -//======================================================================= -//function : RemoveElement -//purpose : -//======================================================================== -void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) -{ - if (elt->GetType() == SMDSAbs_Node) - { - RemoveNode( static_cast( elt )); - return; - } - - myScript->RemoveElement(elt->GetID()); - - list removedElems; - list removedNodes; - - SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false); - - removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false ); -} - -//======================================================================= -//function : SetNodeOnVolume -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, - const TopoDS_Shell & S) -{ - SetNodeInVolume( aNode, myIndexToShape.FindIndex(S) ); -} -//======================================================================= -//function : SetNodeOnVolume -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, - const TopoDS_Solid & S) -{ - SetNodeInVolume( aNode, myIndexToShape.FindIndex(S) ); -} - -//======================================================================= -//function : SetNodeOnFace -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode * aNode, - const TopoDS_Face & S, - double u, - double v) -{ - SetNodeOnFace( aNode, myIndexToShape.FindIndex(S), u, v ); -} - -//======================================================================= -//function : SetNodeOnEdge -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode, - const TopoDS_Edge & S, - double u) -{ - SetNodeOnEdge( aNode, myIndexToShape.FindIndex(S), u ); -} - -//======================================================================= -//function : SetNodeOnVertex -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode, - const TopoDS_Vertex & S) -{ - SetNodeOnVertex( aNode, myIndexToShape.FindIndex(S)); -} - -//======================================================================= -//function : UnSetNodeOnShape -//purpose : -//======================================================================= -void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode) -{ - MESSAGE("not implemented"); -} - -//======================================================================= -//function : SetMeshElementOnShape -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement, - const TopoDS_Shape & S) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = myIndexToShape.FindIndex(S); - - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); - - myShapeIndexToSubMesh[Index]->AddElement(anElement); -} - -//======================================================================= -//function : UnSetMeshElementOnShape -//purpose : -//======================================================================= -void SMESHDS_Mesh:: -UnSetMeshElementOnShape(const SMDS_MeshElement * anElement, - const TopoDS_Shape & S) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = myIndexToShape.FindIndex(S); - - if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]->RemoveElement(anElement); -} - -//======================================================================= -//function : ShapeToMesh -//purpose : -//======================================================================= -TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const -{ - return myShape; -} - -//======================================================================= -//function : IsGroupOfSubShapes -//purpose : return true if at least one subshape of theShape is a subshape -// of myShape or theShape == myShape -//======================================================================= - -bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const -{ - if ( myShape.IsSame( theShape )) - return true; - - for ( TopoDS_Iterator it( theShape ); it.More(); it.Next() ) { - if (myIndexToShape.Contains( it.Value() ) || - IsGroupOfSubShapes( it.Value() )) - return true; - } - - return false; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given -/// TopoDS_Shape is unknown -/////////////////////////////////////////////////////////////////////////////// -SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = ShapeToIndex(S); - TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index); - if (anIter != myShapeIndexToSubMesh.end()) - return anIter->second; - else - return NULL; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the sub mesh by Id of shape it is linked to -/////////////////////////////////////////////////////////////////////////////// -SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) - return myShapeIndexToSubMesh[Index]; - else - return NULL; -} - -//======================================================================= -//function : SubMeshIndices -//purpose : -//======================================================================= -list SMESHDS_Mesh::SubMeshIndices() -{ - list anIndices; - std::map::iterator anIter = myShapeIndexToSubMesh.begin(); - for (; anIter != myShapeIndexToSubMesh.end(); anIter++) { - anIndices.push_back((*anIter).first); - } - return anIndices; -} - -//======================================================================= -//function : GetHypothesis -//purpose : -//======================================================================= - -const list& SMESHDS_Mesh::GetHypothesis( - const TopoDS_Shape & S) const -{ - if (myShapeToHypothesis.find(S)!=myShapeToHypothesis.end()) - return myShapeToHypothesis.find(S)->second; - - static list empty; - return empty; -} - -//======================================================================= -//function : GetScript -//purpose : -//======================================================================= -SMESHDS_Script* SMESHDS_Mesh::GetScript() -{ - return myScript; -} - -//======================================================================= -//function : ClearScript -//purpose : -//======================================================================= -void SMESHDS_Mesh::ClearScript() -{ - myScript->Clear(); -} - -//======================================================================= -//function : HasMeshElements -//purpose : -//======================================================================= -bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - int Index = myIndexToShape.FindIndex(S); - return myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end(); -} - -//======================================================================= -//function : HasHypothesis -//purpose : -//======================================================================= -bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S) -{ - return myShapeToHypothesis.find(S)!=myShapeToHypothesis.end(); -} - -//======================================================================= -//function : NewSubMesh -//purpose : -//======================================================================= -SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index) -{ - SMESHDS_SubMesh* SM = 0; - TShapeIndexToSubMesh::iterator anIter = myShapeIndexToSubMesh.find(Index); - if (anIter == myShapeIndexToSubMesh.end()) - { - SM = new SMESHDS_SubMesh(); - myShapeIndexToSubMesh[Index]=SM; - } - else - SM = anIter->second; - return SM; -} - -//======================================================================= -//function : AddCompoundSubmesh -//purpose : -//======================================================================= - -int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S, - TopAbs_ShapeEnum type) -{ - int aMainIndex = 0; - if ( IsGroupOfSubShapes( S ) || (S.ShapeType() == TopAbs_VERTEX && myIndexToShape.Contains(S)) ) - { - aMainIndex = myIndexToShape.Add( S ); - bool all = ( type == TopAbs_SHAPE ); - if ( all ) // corresponding simple submesh may exist - aMainIndex = -aMainIndex; - //MESSAGE("AddCompoundSubmesh index = " << aMainIndex ); - SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex ); - if ( !aNewSub->IsComplexSubmesh() ) // is empty - { - int shapeType = all ? myShape.ShapeType() : type; - int typeLimit = all ? TopAbs_VERTEX : type; - for ( ; shapeType <= typeLimit; shapeType++ ) - { - TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType )); - for ( ; exp.More(); exp.Next() ) - { - int index = myIndexToShape.FindIndex( exp.Current() ); - if ( index ) - aNewSub->AddSubMesh( NewSubMesh( index )); - } - } - } - } - return aMainIndex; -} - -//======================================================================= -//function : IndexToShape -//purpose : -//======================================================================= -TopoDS_Shape SMESHDS_Mesh::IndexToShape(int ShapeIndex) -{ - return myIndexToShape.FindKey(ShapeIndex); -} - -//======================================================================= -//function : ShapeToIndex -//purpose : -//======================================================================= -int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const -{ - if (myShape.IsNull()) - MESSAGE("myShape is NULL"); - - int index = myIndexToShape.FindIndex(S); - - return index; -} - -//======================================================================= -//function : SetNodeOnVolume -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index) -{ - addNodeToSubmesh( aNode, Index ); -} - -//======================================================================= -//function : SetNodeOnFace -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index, double u, double v) -{ - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, u, v))); - - addNodeToSubmesh( aNode, Index ); -} - -//======================================================================= -//function : SetNodeOnEdge -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode, - int Index, - double u) -{ - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, u))); - - addNodeToSubmesh( aNode, Index ); -} - -//======================================================================= -//function : SetNodeOnVertex -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index) -{ - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index))); - - addNodeToSubmesh( aNode, Index ); -} - -//======================================================================= -//function : SetMeshElementOnShape -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement, - int Index) -{ - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); - - myShapeIndexToSubMesh[Index]->AddElement(anElement); -} - -SMESHDS_Mesh::~SMESHDS_Mesh() -{ -} diff --git a/src/SMESHDS/SMESHDS_Script.cxx b/src/SMESHDS/SMESHDS_Script.cxx deleted file mode 100644 index 369ab4697..000000000 --- a/src/SMESHDS/SMESHDS_Script.cxx +++ /dev/null @@ -1,247 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESH_Script.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_Script.hxx" - -using namespace std; - -//======================================================================= -//function : getCommand -//purpose : -//======================================================================= -SMESHDS_Command* SMESHDS_Script::getCommand(const SMESHDS_CommandType aType) -{ - SMESHDS_Command* com; - if (myCommands.empty()) - { - com = new SMESHDS_Command(aType); - myCommands.insert(myCommands.end(),com); - } - else - { - com = myCommands.back(); - if (com->GetType() != aType) - { - com = new SMESHDS_Command(aType); - myCommands.insert(myCommands.end(),com); - } - } - return com; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddNode(int NewNodeID, double x, double y, double z) -{ - getCommand(SMESHDS_AddNode)->AddNode(NewNodeID, x, y, z); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddEdge(int NewEdgeID, int idnode1, int idnode2) -{ - getCommand(SMESHDS_AddEdge)->AddEdge(NewEdgeID, idnode1, idnode2); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddFace(int NewFaceID, - int idnode1, int idnode2, int idnode3) -{ - getCommand(SMESHDS_AddTriangle)->AddFace(NewFaceID, - idnode1, idnode2, idnode3); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddFace(int NewFaceID, - int idnode1, int idnode2, - int idnode3, int idnode4) -{ - getCommand(SMESHDS_AddQuadrangle)->AddFace(NewFaceID, - idnode1, idnode2, - idnode3, idnode4); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddVolume(int NewID, - int idnode1, int idnode2, - int idnode3, int idnode4) -{ - getCommand(SMESHDS_AddTetrahedron)->AddVolume(NewID, - idnode1, idnode2, - idnode3, idnode4); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddVolume(int NewID, - int idnode1, int idnode2, - int idnode3, int idnode4, int idnode5) -{ - getCommand(SMESHDS_AddPyramid)->AddVolume(NewID, - idnode1, idnode2, - idnode3, idnode4, idnode5); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddVolume(int NewID, - int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6) -{ - getCommand(SMESHDS_AddPrism)->AddVolume(NewID, - idnode1, idnode2, idnode3, - idnode4, idnode5, idnode6); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddVolume(int NewID, - int idnode1, int idnode2, int idnode3, int idnode4, - int idnode5, int idnode6, int idnode7, int idnode8) -{ - getCommand(SMESHDS_AddHexahedron)->AddVolume(NewID, - idnode1, idnode2, idnode3, idnode4, - idnode5, idnode6, idnode7, idnode8); -} - -//======================================================================= -//function : AddPolygonalFace -//purpose : -//======================================================================= -void SMESHDS_Script::AddPolygonalFace (int NewFaceID, std::vector nodes_ids) -{ - getCommand(SMESHDS_AddPolygon)->AddPolygonalFace(NewFaceID, nodes_ids); -} - -//======================================================================= -//function : AddPolyhedralVolume -//purpose : -//======================================================================= -void SMESHDS_Script::AddPolyhedralVolume (int NewID, - std::vector nodes_ids, - std::vector quantities) -{ - getCommand(SMESHDS_AddPolyhedron)->AddPolyhedralVolume - (NewID, nodes_ids, quantities); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::MoveNode(int NewNodeID, double x, double y, double z) -{ - getCommand(SMESHDS_MoveNode)->MoveNode(NewNodeID, x, y, z); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::RemoveNode(int ID) -{ - getCommand(SMESHDS_RemoveNode)->RemoveNode(ID); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::RemoveElement(int ElementID) -{ - getCommand(SMESHDS_RemoveElement)->RemoveElement(ElementID); -} - -//======================================================================= -//function : ChangeElementNodes -//purpose : -//======================================================================= - -void SMESHDS_Script::ChangeElementNodes(int ElementID, int nodes[], int nbnodes) -{ - getCommand(SMESHDS_ChangeElementNodes)->ChangeElementNodes( ElementID, nodes, nbnodes ); -} - -//======================================================================= -//function : ChangePolyhedronNodes -//purpose : -//======================================================================= -void SMESHDS_Script::ChangePolyhedronNodes (const int ElementID, - std::vector nodes_ids, - std::vector quantities) -{ - getCommand(SMESHDS_ChangePolyhedronNodes)->ChangePolyhedronNodes - (ElementID, nodes_ids, quantities); -} - -//======================================================================= -//function : Renumber -//purpose : -//======================================================================= - -void SMESHDS_Script::Renumber (const bool isNodes, const int startID, const int deltaID) -{ - getCommand(SMESHDS_Renumber)->Renumber( isNodes, startID, deltaID ); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::Clear() -{ - myCommands.clear(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -const list& SMESHDS_Script::GetCommands() -{ - return myCommands; -} diff --git a/src/SMESHDS/SMESHDS_Script.hxx b/src/SMESHDS/SMESHDS_Script.hxx deleted file mode 100644 index 3874facfc..000000000 --- a/src/SMESHDS/SMESHDS_Script.hxx +++ /dev/null @@ -1,77 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESHDS_Script.hxx -// Module : SMESH - -#ifndef _SMESHDS_Script_HeaderFile -#define _SMESHDS_Script_HeaderFile - -#include "SMESHDS_Command.hxx" - -#include -#include - - -class SMESHDS_Script -{ - public: - void AddNode(int NewNodeID, double x, double y, double z); - void AddEdge(int NewEdgeID, int idnode1, int idnode2); - void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3); - void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3, - int idnode4); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6, int idnode7, int idnode8); - - void AddPolygonalFace (const int NewFaceID, - std::vector nodes_ids); - void AddPolyhedralVolume (const int NewVolID, - std::vector nodes_ids, - std::vector quantities); - - void MoveNode(int NewNodeID, double x, double y, double z); - void RemoveNode(int NodeID); - void RemoveElement(int ElementID); - void ChangeElementNodes(int ElementID, int nodes[], int nbnodes); - void ChangePolyhedronNodes(const int ElementID, - std::vector nodes_ids, - std::vector quantities); - void Renumber (const bool isNodes, const int startID, const int deltaID); - void Clear(); - const std::list & GetCommands(); - ~SMESHDS_Script(); - - private: - SMESHDS_Command* getCommand(const SMESHDS_CommandType aType); - - std::list myCommands; -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_SubMesh.cxx b/src/SMESHDS/SMESHDS_SubMesh.cxx deleted file mode 100644 index 5bdbfc6a4..000000000 --- a/src/SMESHDS/SMESHDS_SubMesh.cxx +++ /dev/null @@ -1,299 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESH_SubMesh.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_SubMesh.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : AddElement -//purpose : -//======================================================================= -void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) -{ - if ( !IsComplexSubmesh() ) - myElements.insert(ME); -} - -//======================================================================= -//function : RemoveElement -//purpose : -//======================================================================= -bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME) -{ - if ( !IsComplexSubmesh() && NbElements() ) - return myElements.erase(ME); - - return false; -} - -//======================================================================= -//function : AddNode -//purpose : -//======================================================================= -void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N) -{ - if ( !IsComplexSubmesh() ) - myNodes.insert(N); -} - -//======================================================================= -//function : RemoveNode -//purpose : -//======================================================================= - -bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N) -{ - if ( !IsComplexSubmesh() && NbNodes() ) - return myNodes.erase(N); - - return false; -} - -//======================================================================= -//function : NbElements -//purpose : -//======================================================================= -int SMESHDS_SubMesh::NbElements() const -{ - if ( !IsComplexSubmesh() ) - return myElements.size(); - - int nbElems = 0; -#ifndef WNT - set::iterator it = mySubMeshes.begin(); -#else - set::const_iterator it = mySubMeshes.begin(); -#endif - for ( ; it != mySubMeshes.end(); it++ ) - nbElems += (*it)->NbElements(); - - return nbElems; -} - -//======================================================================= -//function : NbNodes -//purpose : -//======================================================================= - -int SMESHDS_SubMesh::NbNodes() const -{ - if ( !IsComplexSubmesh() ) - return myNodes.size(); - - int nbElems = 0; -#ifndef WNT - set::iterator it = mySubMeshes.begin(); -#else - set::const_iterator it = mySubMeshes.begin(); -#endif - for ( ; it != mySubMeshes.end(); it++ ) - nbElems += (*it)->NbNodes(); - - return nbElems; -} - -// ===================== -// class MySetIterator -// ===================== - -template class MySetIterator:public SMDS_Iterator -{ - typedef const set TSet; - typename TSet::const_iterator myIt; - TSet& mySet; - - public: - MySetIterator(const set& s):mySet(s), myIt(s.begin()) - { - } - - bool more() - { - return myIt!=mySet.end(); - } - const T* next() - { - const T* t=*myIt; - myIt++; - return t; - } -}; - -// ===================== -// class MyIterator -// ===================== - -template class MyIterator : public SMDS_Iterator -{ - public: - MyIterator (const set& theSubMeshes) - : mySubMeshes( theSubMeshes ), mySubIt( theSubMeshes.begin() ), myMore(false) - {} - bool more() - { - while (( !myElemIt.get() || !myElemIt->more() ) && - mySubIt != mySubMeshes.end()) - { - myElemIt = getElements(*mySubIt); - mySubIt++; - } - myMore = myElemIt.get() && myElemIt->more(); - return myMore; - } - VALUE next() - { - VALUE elem = 0; - if ( myMore ) - elem = myElemIt->next(); - return elem; - } - protected: - virtual boost::shared_ptr< SMDS_Iterator > - getElements(const SMESHDS_SubMesh*) const = 0; - - private: - bool myMore; - const set& mySubMeshes; - set::const_iterator mySubIt; - boost::shared_ptr< SMDS_Iterator > myElemIt; -}; - -// ===================== -// class MyElemIterator -// ===================== - -class MyElemIterator: public MyIterator -{ - public: - MyElemIterator (const set& theSubMeshes) - :MyIterator( theSubMeshes ) {} - SMDS_ElemIteratorPtr getElements(const SMESHDS_SubMesh* theSubMesh) const - { return theSubMesh->GetElements(); } -}; - -// ===================== -// class MyNodeIterator -// ===================== - -class MyNodeIterator: public MyIterator -{ - public: - MyNodeIterator (const set& theSubMeshes) - :MyIterator( theSubMeshes ) {} - SMDS_NodeIteratorPtr getElements(const SMESHDS_SubMesh* theSubMesh) const - { return theSubMesh->GetNodes(); } -}; - -//======================================================================= -//function : GetElements -//purpose : -//======================================================================= - -SMDS_ElemIteratorPtr SMESHDS_SubMesh::GetElements() const -{ - if ( IsComplexSubmesh() ) - return SMDS_ElemIteratorPtr( new MyElemIterator( mySubMeshes )); - - return SMDS_ElemIteratorPtr(new MySetIterator(myElements)); -} - -//======================================================================= -//function : GetNodes -//purpose : -//======================================================================= - -SMDS_NodeIteratorPtr SMESHDS_SubMesh::GetNodes() const -{ - if ( IsComplexSubmesh() ) - return SMDS_NodeIteratorPtr( new MyNodeIterator( mySubMeshes )); - - return SMDS_NodeIteratorPtr(new MySetIterator(myNodes)); -} - -//======================================================================= -//function : Contains -//purpose : check if elem or node is in -//======================================================================= - -bool SMESHDS_SubMesh::Contains(const SMDS_MeshElement * ME) const -{ - // DO NOT TRY TO FIND A REMOVED ELEMENT !! - if ( !ME ) - return false; - - if ( IsComplexSubmesh() ) - { - set::const_iterator aSubIt = mySubMeshes.begin(); - for ( ; aSubIt != mySubMeshes.end(); aSubIt++ ) - if ( (*aSubIt)->Contains( ME )) - return true; - return false; - } - - if ( ME->GetType() == SMDSAbs_Node ) - { - const SMDS_MeshNode* n = static_cast( ME ); - return ( myNodes.find( n ) != myNodes.end() ); - } - - return ( myElements.find( ME ) != myElements.end() ); -} - -//======================================================================= -//function : AddSubMesh -//purpose : -//======================================================================= - -void SMESHDS_SubMesh::AddSubMesh( const SMESHDS_SubMesh* theSubMesh ) -{ - ASSERT( theSubMesh ); - mySubMeshes.insert( theSubMesh ); -} - -//======================================================================= -//function : RemoveSubMesh -//purpose : -//======================================================================= - -bool SMESHDS_SubMesh::RemoveSubMesh( const SMESHDS_SubMesh* theSubMesh ) -{ - return mySubMeshes.erase( theSubMesh ); -} - -//======================================================================= -//function : ContainsSubMesh -//purpose : -//======================================================================= - -bool SMESHDS_SubMesh::ContainsSubMesh( const SMESHDS_SubMesh* theSubMesh ) const -{ - return mySubMeshes.find( theSubMesh ) != mySubMeshes.end(); -} diff --git a/src/SMESHDS/SMESHDS_SubMesh.hxx b/src/SMESHDS/SMESHDS_SubMesh.hxx deleted file mode 100644 index ac3cd1c3f..000000000 --- a/src/SMESHDS/SMESHDS_SubMesh.hxx +++ /dev/null @@ -1,69 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// 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 : SMESHDS_SubMesh.hxx -// Module : SMESH - -#ifndef _SMESHDS_SubMesh_HeaderFile -#define _SMESHDS_SubMesh_HeaderFile - -#include "SMDS_Mesh.hxx" -#include - -#if defined WNT && defined WIN32 && defined SMESHDS_EXPORTS -#define SMESHDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMESHDS_WNT_EXPORT -#endif - -class SMESHDS_WNT_EXPORT SMESHDS_SubMesh -{ - public: - - bool IsComplexSubmesh() const { return !mySubMeshes.empty(); } - - // if !IsComplexSubmesh() - void AddElement(const SMDS_MeshElement * ME); - bool RemoveElement(const SMDS_MeshElement * ME); // ret true if ME was in - void AddNode(const SMDS_MeshNode * ME); - bool RemoveNode(const SMDS_MeshNode * ME); // ret true if ME was in - - // if IsComplexSubmesh() - void AddSubMesh( const SMESHDS_SubMesh* theSubMesh ); - bool RemoveSubMesh( const SMESHDS_SubMesh* theSubMesh ); - bool ContainsSubMesh( const SMESHDS_SubMesh* theSubMesh ) const; - - // for both types - int NbElements() const; - SMDS_ElemIteratorPtr GetElements() const; - int NbNodes() const; - SMDS_NodeIteratorPtr GetNodes() const; - bool Contains(const SMDS_MeshElement * ME) const; // check if elem or node is in - - private: - //const SMDS_Mesh * myMesh; - std::set myElements; - std::set myNodes; - std::set mySubMeshes; -}; -#endif diff --git a/src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx b/src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx deleted file mode 100644 index 79db47025..000000000 --- a/src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx +++ /dev/null @@ -1,89 +0,0 @@ -// File generated by CPPExt (Transient) -// -// Copyright (C) 1991,1995 by -// -// MATRA DATAVISION, FRANCE -// -// This software is furnished in accordance with the terms and conditions -// of the contract and with the inclusion of the above copyright notice. -// This software or any other copy thereof may not be provided or otherwise -// be made available to any other person. No title to an ownership of the -// software is hereby transferred. -// -// At the termination of the contract, the software and all copies of this -// software must be deleted. - -#ifndef _Handle_SMESH_TypeFilter_HeaderFile -#define _Handle_SMESH_TypeFilter_HeaderFile - -#ifndef _Standard_Macro_HeaderFile -#include -#endif -#ifndef _Standard_HeaderFile -#include -#endif - -#ifndef _Handle_SALOME_Filter_HeaderFile -#include "Handle_SALOME_Filter.hxx" -#endif - -class Standard_Transient; -class Handle_Standard_Type; -class Handle(SALOME_Filter); -class SMESH_TypeFilter; -Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(SMESH_TypeFilter); - -class Handle(SMESH_TypeFilter) : public Handle(SALOME_Filter) { - public: - inline void* operator new(size_t,void* anAddress) - { - return anAddress; - } - inline void* operator new(size_t size) - { - return Standard::Allocate(size); - } - inline void operator delete(void *anAddress) - { - if (anAddress) Standard::Free((Standard_Address&)anAddress); - } -// inline void operator delete(void *anAddress, size_t size) -// { -// if (anAddress) Standard::Free((Standard_Address&)anAddress,size); -// } - Handle(SMESH_TypeFilter)():Handle(SALOME_Filter)() {} - Handle(SMESH_TypeFilter)(const Handle(SMESH_TypeFilter)& aHandle) : Handle(SALOME_Filter)(aHandle) - { - } - - Handle(SMESH_TypeFilter)(const SMESH_TypeFilter* anItem) : Handle(SALOME_Filter)((SALOME_Filter *)anItem) - { - } - - Handle(SMESH_TypeFilter)& operator=(const Handle(SMESH_TypeFilter)& aHandle) - { - Assign(aHandle.Access()); - return *this; - } - - Handle(SMESH_TypeFilter)& operator=(const SMESH_TypeFilter* anItem) - { - Assign((Standard_Transient *)anItem); - return *this; - } - - SMESH_TypeFilter* operator->() - { - return (SMESH_TypeFilter *)ControlAccess(); - } - - SMESH_TypeFilter* operator->() const - { - return (SMESH_TypeFilter *)ControlAccess(); - } - - Standard_EXPORT ~Handle(SMESH_TypeFilter)(); - - Standard_EXPORT static const Handle(SMESH_TypeFilter) DownCast(const Handle(Standard_Transient)& AnObject); -}; -#endif diff --git a/src/SMESHFiltersSelection/SMESH_TypeFilter.ixx b/src/SMESHFiltersSelection/SMESH_TypeFilter.ixx deleted file mode 100644 index a01d02ee0..000000000 --- a/src/SMESHFiltersSelection/SMESH_TypeFilter.ixx +++ /dev/null @@ -1,71 +0,0 @@ -// File generated by CPPExt (Transient) -// Copyright (C) 1991,1995 by -// -// MATRA DATAVISION, FRANCE -// -// This software is furnished in accordance with the terms and conditions -// of the contract and with the inclusion of the above copyright notice. -// This software or any other copy thereof may not be provided or otherwise -// be made available to any other person. No title to an ownership of the -// software is hereby transferred. -// -// At the termination of the contract, the software and all copies of this -// software must be deleted. -// -#include "SMESH_TypeFilter.jxx" - -#ifndef _Standard_TypeMismatch_HeaderFile -#include -#endif - -SMESH_TypeFilter::~SMESH_TypeFilter() {} - - - -Standard_EXPORT Handle_Standard_Type& SMESH_TypeFilter_Type_() -{ - - static Handle_Standard_Type aType1 = STANDARD_TYPE(SALOME_Filter); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(SALOME_Filter); - static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); - static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); - if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); - - - static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; - static Handle_Standard_Type _aType = new Standard_Type("SMESH_TypeFilter", - sizeof(SMESH_TypeFilter), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); - - return _aType; -} - - -// DownCast method -// allow safe downcasting -// -const Handle(SMESH_TypeFilter) Handle(SMESH_TypeFilter)::DownCast(const Handle(Standard_Transient)& AnObject) -{ - Handle(SMESH_TypeFilter) _anOtherObject; - - if (!AnObject.IsNull()) { - if (AnObject->IsKind(STANDARD_TYPE(SMESH_TypeFilter))) { - _anOtherObject = Handle(SMESH_TypeFilter)((Handle(SMESH_TypeFilter)&)AnObject); - } - } - - return _anOtherObject ; -} -const Handle(Standard_Type)& SMESH_TypeFilter::DynamicType() const -{ - return STANDARD_TYPE(SMESH_TypeFilter) ; -} -Standard_Boolean SMESH_TypeFilter::IsKind(const Handle(Standard_Type)& AType) const -{ - return (STANDARD_TYPE(SMESH_TypeFilter) == AType || SALOME_Filter::IsKind(AType)); -} -Handle_SMESH_TypeFilter::~Handle_SMESH_TypeFilter() {} - diff --git a/src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h b/src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h deleted file mode 100644 index e2bb65a67..000000000 --- a/src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h +++ /dev/null @@ -1,94 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_CreateHypothesesDlg.h -// Author : Julia DOROVSKIKH -// Module : SMESH -// $Header$ - -#ifndef DIALOGBOX_CREATE_HYPOTHESES_H -#define DIALOGBOX_CREATE_HYPOTHESES_H - -// QT Includes -#include -#include -#include - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(GEOM_Gen) -#include CORBA_SERVER_HEADER(SMESH_Mesh) - -#include -#include - -class QButtonGroup; -class QGroupBox; -class QPushButton; -class QListView; -class QListViewItem; -class SMESHGUI; - -//================================================================================= -// class : SMESHGUI_CreateHypothesesDlg -// purpose : -//================================================================================= -class SMESHGUI_CreateHypothesesDlg : public QDialog -{ - Q_OBJECT - -public: - SMESHGUI_CreateHypothesesDlg (SMESHGUI*, - const char* name = 0, - bool modal = FALSE, - bool isAlgo = FALSE); - ~SMESHGUI_CreateHypothesesDlg (); - -private: - - void Init() ; - void closeEvent( QCloseEvent* e ) ; - void enterEvent ( QEvent * ) ; - - void InitAlgoDefinition(); - - SMESHGUI* mySMESHGUI; - bool myIsAlgo; - - QGroupBox* GroupButtons; - QPushButton* buttonCancel; - QPushButton* buttonApply; - - QGroupBox* GroupAlgorithms; - QListView* ListAlgoDefinition; - -private slots: - - void ClickOnCancel(); - void ClickOnApply(); - void ActivateThisDialog() ; - - void onSelectionChanged(); - void onDoubleClicked(QListViewItem*); -}; - -#endif // DIALOGBOX_CREATE_HYPOTHESES_H diff --git a/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx b/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx deleted file mode 100644 index c2d0185b6..000000000 --- a/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx +++ /dev/null @@ -1,963 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_EditHypothesesDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_EditHypothesesDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_GEOMGenUtils.h" -#include "SMESHGUI_HypothesesUtils.h" - -#include "SMESH_TypeFilter.hxx" -#include "SMESH_NumberFilter.hxx" - -#include "SALOME_ListIO.hxx" -#include "SALOME_ListIteratorOfListIO.hxx" - -#include "SALOMEDSClient_Study.hxx" -#include "SALOMEDSClient_AttributeIOR.hxx" -#include "SALOMEDSClient_AttributeName.hxx" - -#include "SUIT_Session.h" -#include "SUIT_OverrideCursor.h" -#include "SUIT_Operation.h" -#include "SUIT_Desktop.h" - -#include "utilities.h" - -#include "SVTK_ViewModel.h" - -// QT Includes -#include -#include -#include -#include -#include -#include - -using namespace std; - -//VRV: porting on Qt 3.0.5 -#if QT_VERSION >= 0x030005 -#include -#endif -//VRV: porting on Qt 3.0.5 - -class ListBoxIOR : public QListBoxText -{ -public: - enum { RTTI_IOR = 1000 }; - -public: - ListBoxIOR (QListBox* listbox, - const char* ior, - const QString& text = QString::null) - : QListBoxText(listbox, text), myIOR(ior) {} - virtual ~ListBoxIOR() {}; - virtual int rtti() const { return RTTI_IOR; } - const char* GetIOR() { return myIOR.c_str(); } - -private: - string myIOR; -}; - -#define ALLOW_CHANGE_SHAPE 0 - -int findItem (QListBox* listBox, const string& ior) -{ - for (int i = 0; i < listBox->count(); i++) { - if (listBox->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(listBox->item(i)); - if (anItem && ior == string(anItem->GetIOR())) - return i; - } - } - return -1; -} - -//================================================================================= -// function : SMESHGUI_EditHypothesesDlg() -// purpose : Constructs a SMESHGUI_EditHypothesesDlg which is a child of 'parent', with the -// name 'name' and widget flags set to 'f'. -// The dialog will by default be modeless, unless you set 'modal' to -// TRUE to construct a modal dialog. -//================================================================================= -SMESHGUI_EditHypothesesDlg::SMESHGUI_EditHypothesesDlg (SMESHGUI* theModule, const char* name, - bool modal, WFlags fl) - : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | - WStyle_Title | WStyle_SysMenu | WDestructiveClose), - myImportedMesh(false), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ) -{ - QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - if (!name) - setName("SMESHGUI_EditHypothesesDlg"); - setCaption(tr("SMESH_EDIT_HYPOTHESES")); - setSizeGripEnabled(TRUE); - QGridLayout* SMESHGUI_EditHypothesesDlgLayout = new QGridLayout(this); - SMESHGUI_EditHypothesesDlgLayout->setSpacing(6); - SMESHGUI_EditHypothesesDlgLayout->setMargin(11); - - /***************************************************************/ - GroupC1 = new QGroupBox(tr("SMESH_ARGUMENTS"), this, "GroupC1"); - GroupC1->setColumnLayout(0, Qt::Vertical); - GroupC1->layout()->setSpacing(0); - GroupC1->layout()->setMargin(0); - QGridLayout* GroupC1Layout = new QGridLayout(GroupC1->layout()); - GroupC1Layout->setAlignment(Qt::AlignTop); - GroupC1Layout->setSpacing(6); - GroupC1Layout->setMargin(11); - - TextLabelC1A1 = new QLabel(tr("SMESH_OBJECT_MESHorSUBMESH"), GroupC1, "TextLabelC1A1"); - GroupC1Layout->addWidget(TextLabelC1A1, 0, 0); - SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1"); - SelectButtonC1A1->setPixmap(image0); - GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1); - LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1"); - LineEditC1A1->setReadOnly(true); - GroupC1Layout->addWidget(LineEditC1A1, 0, 2); - - TextLabelC1A2 = new QLabel(tr("SMESH_OBJECT_GEOM"), GroupC1, "TextLabelC1A2"); - GroupC1Layout->addWidget(TextLabelC1A2, 1, 0); - SelectButtonC1A2 = new QPushButton(GroupC1, "SelectButtonC1A2"); - SelectButtonC1A2->setPixmap(image0); - SelectButtonC1A2->setToggleButton(FALSE); - GroupC1Layout->addWidget(SelectButtonC1A2, 1, 1); - LineEditC1A2 = new QLineEdit(GroupC1, "LineEditC1A2"); - LineEditC1A2->setReadOnly(true); - GroupC1Layout->addWidget(LineEditC1A2, 1, 2); - - SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupC1, 0, 0); - - /***************************************************************/ - GroupHypotheses = new QGroupBox(tr("SMESH_HYPOTHESES"), this, "GroupHypotheses"); - GroupHypotheses->setColumnLayout(0, Qt::Vertical); - GroupHypotheses->layout()->setSpacing(0); - GroupHypotheses->layout()->setMargin(0); - QGridLayout* grid_3 = new QGridLayout(GroupHypotheses->layout()); - grid_3->setAlignment(Qt::AlignTop); - grid_3->setSpacing(6); - grid_3->setMargin(11); - - TextHypDefinition = new QLabel(tr("SMESH_AVAILABLE"), GroupHypotheses, "TextHypDefinition"); - grid_3->addWidget(TextHypDefinition, 0, 0); - - ListHypDefinition = new QListBox(GroupHypotheses, "ListHypDefinition"); - ListHypDefinition->setMinimumSize(100, 100); - grid_3->addWidget(ListHypDefinition, 1, 0); - - TextHypAssignation = new QLabel(tr("SMESH_EDIT_USED"), GroupHypotheses, "TextHypAssignation"); - grid_3->addWidget(TextHypAssignation, 0, 1); - - ListHypAssignation = new QListBox(GroupHypotheses, "ListHypAssignation"); - ListHypAssignation->setMinimumSize(100, 100); - grid_3->addWidget(ListHypAssignation, 1, 1); - - SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupHypotheses, 1, 0); - - /***************************************************************/ - GroupAlgorithms = new QGroupBox(tr("SMESH_ADD_ALGORITHM"), this, "GroupAlgorithms"); - GroupAlgorithms->setColumnLayout(0, Qt::Vertical); - GroupAlgorithms->layout()->setSpacing(0); - GroupAlgorithms->layout()->setMargin(0); - QGridLayout* grid_4 = new QGridLayout(GroupAlgorithms->layout()); - grid_4->setAlignment(Qt::AlignTop); - grid_4->setSpacing(6); - grid_4->setMargin(11); - - TextAlgoDefinition = new QLabel(tr("SMESH_AVAILABLE"), GroupAlgorithms, "TextAlgoDefinition"); - grid_4->addWidget(TextAlgoDefinition, 0, 0); - - ListAlgoDefinition = new QListBox(GroupAlgorithms, "ListAlgoDefinition"); - ListAlgoDefinition->setMinimumSize(100, 100); - grid_4->addWidget(ListAlgoDefinition, 1, 0); - - TextAlgoAssignation = new QLabel(tr("SMESH_EDIT_USED"), GroupAlgorithms, "TextAlgoAssignation"); - grid_4->addWidget(TextAlgoAssignation, 0, 1); - - ListAlgoAssignation = new QListBox(GroupAlgorithms, "ListAlgoAssignation"); - ListAlgoAssignation ->setMinimumSize(100, 100); - grid_4->addWidget(ListAlgoAssignation, 1, 1); - - SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupAlgorithms, 2, 0); - - /***************************************************************/ - GroupButtons = new QGroupBox(this, "GroupButtons"); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - - buttonOk = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons, "buttonOk"); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(FALSE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - - buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons, "buttonApply"); - buttonApply->setAutoDefault(TRUE); - buttonApply->setDefault(FALSE); - GroupButtonsLayout->addWidget(buttonApply, 0, 1); - - GroupButtonsLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 2); - - buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons, "buttonCancel"); - buttonCancel->setAutoDefault(TRUE); - buttonCancel->setDefault(TRUE); - buttonCancel->setEnabled(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 3); - - SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupButtons, 4, 0); - - /***************************************************************/ - Init(); -} - -//================================================================================= -// function : ~SMESHGUI_EditHypothesesDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_EditHypothesesDlg::~SMESHGUI_EditHypothesesDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::Init() -{ - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - - InitHypDefinition(); - InitAlgoDefinition(); - - //myGeomFilter = new SALOME_TypeFilter ("GEOM"); - TColStd_MapOfInteger allTypesMap; - for (int i = 0; i < 10; i++) - allTypesMap.Add(i); - myGeomFilter = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, 0, allTypesMap); - myMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); - - myGeomShape = GEOM::GEOM_Object::_nil(); - myMesh = SMESH::SMESH_Mesh::_nil(); - mySubMesh = SMESH::SMESH_subMesh::_nil(); - - /* signals and slots connections */ - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - - connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - connect(SelectButtonC1A2, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - - connect(ListHypAssignation, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(removeItem(QListBoxItem*))); - connect(ListAlgoAssignation, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(removeItem(QListBoxItem*))); - - connect(ListHypDefinition, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(addItem(QListBoxItem*))); - connect(ListAlgoDefinition, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(addItem(QListBoxItem*))); - - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); - - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; - mySelectionMgr->clearFilters(); - mySelectionMgr->installFilter(myMeshOrSubMeshFilter); - - SelectionIntoArgument(); - - UpdateControlState(); -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::ClickOnOk() -{ - if (ClickOnApply()) - ClickOnCancel(); -} - -//================================================================================= -// function : ClickOnApply() -// purpose : -//================================================================================= -bool SMESHGUI_EditHypothesesDlg::ClickOnApply() -{ - if (mySMESHGUI->isActiveStudyLocked()) - return false; - - bool aRes = false; - - SUIT_OverrideCursor wc; - - SUIT_Operation* op = new SUIT_Operation - (SUIT_Session::session()->activeApplication()); - - // start transaction - op->start(); - - if (!myMesh->_is_nil()) - aRes = StoreMesh(); - else if (!mySubMesh->_is_nil()) - aRes = StoreSubMesh(); - - if (true/*aRes*/) { // abort desynchronizes contents of a Study and a mesh on server - // commit transaction - op->commit(); - InitHypAssignation(); - InitAlgoAssignation(); - } else { - // abort transaction - op->abort(); - } - - UpdateControlState(); - mySMESHGUI->updateObjBrowser(); - - return aRes; -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::ClickOnCancel() -{ - close(); -} - -//================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case -//================================================================================= -void SMESHGUI_EditHypothesesDlg::SelectionIntoArgument() -{ - QString aString = ""; - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); - - int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); - - if (myEditCurrentArgument == LineEditC1A1) { - if (nbSel != 1) { - myMesh = SMESH::SMESH_Mesh::_nil(); - mySubMesh = SMESH::SMESH_subMesh::_nil(); - aString = ""; - } else { - Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::IObjectToInterface(IO); - if (myMesh->_is_nil()) { - mySubMesh = SMESH::IObjectToInterface(IO); - if (mySubMesh->_is_nil()) { - aString = ""; - } - } - } - myEditCurrentArgument->setText(aString); - - // InitGeom() will try to retrieve a shape from myMesh or mySubMesh - myGeomShape = GEOM::GEOM_Object::_nil(); - InitGeom(); - - myImportedMesh = myGeomShape->_is_nil(); - - InitHypAssignation(); - InitAlgoAssignation(); - - } else if (myEditCurrentArgument == LineEditC1A2) { - if (nbSel != 1) { - myGeomShape = GEOM::GEOM_Object::_nil(); - } else { - Handle(SALOME_InteractiveObject) IO = aList.First(); - myGeomShape = SMESH::IObjectToInterface(IO); - } - InitGeom(); - } - - UpdateControlState(); -} - -//================================================================================= -// function : SetEditCurrentArgument() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::SetEditCurrentArgument() -{ - QPushButton* send = (QPushButton*)sender(); - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; - mySelectionMgr->clearFilters(); - mySelectionMgr->installFilter(myMeshOrSubMeshFilter); - } else if (send == SelectButtonC1A2) { - LineEditC1A2->setFocus(); - myEditCurrentArgument = LineEditC1A2; - mySelectionMgr->clearFilters(); - mySelectionMgr->installFilter(myGeomFilter); - } - SelectionIntoArgument(); -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::DeactivateActiveDialog() -{ - if (GroupC1->isEnabled()) { - disconnect(mySelectionMgr, 0, this, 0); - GroupC1->setEnabled(false); - GroupButtons->setEnabled(false); - } -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::ActivateThisDialog() -{ - mySMESHGUI->EmitSignalDeactivateDialog(); - GroupC1->setEnabled(true); - GroupButtons->setEnabled(true); - connect (mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); -} - -//================================================================================= -// function : enterEvent() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::enterEvent (QEvent*) -{ - if (!GroupC1->isEnabled()) - ActivateThisDialog(); -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::closeEvent (QCloseEvent* e) -{ - disconnect(mySelectionMgr, 0, this, 0); - mySMESHGUI->ResetState(); - mySelectionMgr->clearFilters(); - QDialog::closeEvent(e); -} - -//======================================================================= -// function : IsOld() -// purpose : -//======================================================================= -bool SMESHGUI_EditHypothesesDlg::IsOld (QListBoxItem* hypItem) -{ - if (hypItem->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* hyp = (ListBoxIOR*) hypItem; - return (myMapOldHypos.find(hyp->GetIOR()) != myMapOldHypos.end() || - myMapOldAlgos.find(hyp->GetIOR()) != myMapOldAlgos.end()); - } - - return false; -} - -//================================================================================= -// function : removeItem() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::removeItem (QListBoxItem* item) -{ - const QObject* aSender = sender(); - - if (!item) return; - - if (aSender == ListHypAssignation) { - myNbModification += IsOld(item) ? 1 : -1; - ListHypAssignation->removeItem(ListHypAssignation->index(item)); - } - else if (aSender == ListAlgoAssignation) { - myNbModification += IsOld(item) ? 1 : -1; - ListAlgoAssignation->removeItem(ListAlgoAssignation->index(item)); - } - - UpdateControlState(); -} - -//================================================================================= -// function : addItem() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::addItem (QListBoxItem* item) -{ - const QObject* aSender = sender(); - - if (!item) return; - - ListBoxIOR* i = 0; - if (item->rtti() == ListBoxIOR::RTTI_IOR) - i = (ListBoxIOR*)item; - if (!i) return; - - bool isFound = false; - - ListBoxIOR* anItem; - if (aSender == ListHypDefinition) { - for (int j = 0, n = ListHypAssignation->count(); !isFound && j < n; j++) { - if (ListHypAssignation->item(j)->rtti() == ListBoxIOR::RTTI_IOR) { - anItem = (ListBoxIOR*)ListHypAssignation->item(j); - isFound = !strcmp(anItem->GetIOR(), i->GetIOR()); - } - } - if (!isFound) - anItem = new ListBoxIOR (ListHypAssignation, - CORBA::string_dup(i->GetIOR()), - CORBA::string_dup(i->text().latin1())); - - } else if (aSender == ListAlgoDefinition) { - for (int j = 0, n = ListAlgoAssignation->count(); !isFound && j < n; j++) { - if (ListAlgoAssignation->item(j)->rtti() == ListBoxIOR::RTTI_IOR) { - anItem = (ListBoxIOR*)ListAlgoAssignation->item(j); - isFound = !strcmp(anItem->GetIOR(), i->GetIOR()); - } - } - if (!isFound) - anItem = new ListBoxIOR (ListAlgoAssignation, - CORBA::string_dup(i->GetIOR()), - CORBA::string_dup(i->text().latin1())); - } else { - } - - if (!isFound) - myNbModification += IsOld(item) ? -1 : 1; - - UpdateControlState(); -} - -//================================================================================= -// function : InitHypDefinition() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitHypDefinition() -{ - ListHypDefinition->clear(); - - _PTR(SComponent) father = SMESH::GetActiveStudyDocument()->FindComponent("SMESH"); - if (!father) - return; - - _PTR(SObject) HypothesisRoot; - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - _PTR(AttributeIOR) anIOR; - - //int Tag_HypothesisRoot = 1; - if (father->FindSubObject(1, HypothesisRoot)) { - _PTR(ChildIterator) it = - SMESH::GetActiveStudyDocument()->NewChildIterator(HypothesisRoot); - ListBoxIOR* anItem; - for (; it->More();it->Next()) { - _PTR(SObject) Obj = it->Value(); - if (Obj->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - if (Obj->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = anAttr; - anItem = new ListBoxIOR (ListHypDefinition, - anIOR->Value().c_str(), - aName->Value().c_str()); - } - } - } - } -} - -//================================================================================= -// function : InitHypAssignation() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitHypAssignation() -{ - myNbModification = 0; - - myMapOldHypos.clear(); - ListHypAssignation->clear(); - if (myImportedMesh) - return; - - _PTR(SObject) aMorSM, AHR, aRef; - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - _PTR(AttributeIOR) anIOR; - - if (!myMesh->_is_nil()) - aMorSM = SMESH::FindSObject(myMesh); - else if (!mySubMesh->_is_nil()) - aMorSM = SMESH::FindSObject(mySubMesh); - - if (aMorSM && aMorSM->FindSubObject(2, AHR)) { - _PTR(ChildIterator) it = - SMESH::GetActiveStudyDocument()->NewChildIterator(AHR); - for (; it->More();it->Next()) { - _PTR(SObject) Obj = it->Value(); - if (Obj->ReferencedObject(aRef)) { - if (aRef->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - if (aRef->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = anAttr; - ListBoxIOR* anItem = new ListBoxIOR (ListHypAssignation, - anIOR->Value().c_str(), - aName->Value().c_str()); - myMapOldHypos[ anIOR->Value() ] = ListHypAssignation->index(anItem); - } - } - } - } - } -} - -//================================================================================= -// function : InitAlgoDefinition() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitAlgoDefinition() -{ - ListAlgoDefinition->clear(); - - _PTR(SComponent) father = SMESH::GetActiveStudyDocument()->FindComponent("SMESH"); - if (!father) - return; - - _PTR(SObject) AlgorithmsRoot; - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - _PTR(AttributeIOR) anIOR; - - if (father->FindSubObject (2, AlgorithmsRoot)) { - _PTR(ChildIterator) it = - SMESH::GetActiveStudyDocument()->NewChildIterator(AlgorithmsRoot); - ListBoxIOR* anItem; - for (; it->More();it->Next()) { - _PTR(SObject) Obj = it->Value(); - if (Obj->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - if (Obj->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = anAttr; - anItem = new ListBoxIOR (ListAlgoDefinition, - anIOR->Value().c_str(), - aName->Value().c_str()); - } - } - } - } -} - -//================================================================================= -// function : InitAlgoAssignation() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitAlgoAssignation() -{ - myMapOldAlgos.clear(); - ListAlgoAssignation->clear(); - if (myImportedMesh) - return; - - _PTR(SObject) aMorSM, AHR, aRef; - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - _PTR(AttributeIOR) anIOR; - - if (!myMesh->_is_nil()) - aMorSM = SMESH::FindSObject(myMesh); - else if (!mySubMesh->_is_nil()) - aMorSM = SMESH::FindSObject(mySubMesh); - - if (aMorSM && aMorSM->FindSubObject(3, AHR)) { - _PTR(ChildIterator) it = - SMESH::GetActiveStudyDocument()->NewChildIterator(AHR); - for (; it->More();it->Next()) { - _PTR(SObject) Obj = it->Value(); - if (Obj->ReferencedObject(aRef)) { - if (aRef->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - if (aRef->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = anAttr; - ListBoxIOR* anItem = new ListBoxIOR (ListAlgoAssignation, - anIOR->Value().c_str(), - aName->Value().c_str()); - myMapOldAlgos[ anIOR->Value() ] = ListAlgoAssignation->index(anItem); - } - } - } - } - } -} - -//================================================================================= -// function : InitGeom() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitGeom() -{ - LineEditC1A2->setText(""); - - if (myGeomShape->_is_nil() && !myMesh->_is_nil()) { - _PTR(SObject) aMesh = SMESH::FindSObject(myMesh); - if (aMesh) - myGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aMesh); - } - if (myGeomShape->_is_nil() && !mySubMesh->_is_nil()) { - _PTR(SObject) aSubMesh = SMESH::FindSObject(mySubMesh); - if (aSubMesh) - myGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aSubMesh); - } - - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - if (!myGeomShape->_is_nil() && (!myMesh->_is_nil() || !mySubMesh->_is_nil())) { - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - //_PTR(SObject) aSO = aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(myGeomShape)); - _PTR(SObject) aSO = aStudy->FindObjectID(myGeomShape->GetStudyEntry()); - if (aSO) { - if (aSO->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - LineEditC1A2->setText(QString(aName->Value().c_str())); - } - } - } -} - -//================================================================================= -// function : UpdateControlState() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::UpdateControlState() -{ - // asl the check of "count" is commented because of PAL9787 - bool isEnabled = (!myMesh->_is_nil() && !myGeomShape->_is_nil() /*&& - ListHypAssignation->count() && ListAlgoAssignation->count()*/ ) - || - (!mySubMesh->_is_nil() && !myGeomShape->_is_nil() /*&& - (ListHypAssignation->count() || ListAlgoAssignation->count())*/); - - buttonOk ->setEnabled(myNbModification && isEnabled && !myImportedMesh); - buttonApply->setEnabled(myNbModification && isEnabled && !myImportedMesh); - - SelectButtonC1A2 ->setEnabled(ALLOW_CHANGE_SHAPE && !myImportedMesh); - LineEditC1A2 ->setEnabled(ALLOW_CHANGE_SHAPE && !myImportedMesh); - ListHypDefinition ->setEnabled(!myImportedMesh); - ListHypAssignation ->setEnabled(!myImportedMesh); - ListAlgoDefinition ->setEnabled(!myImportedMesh); - ListAlgoAssignation->setEnabled(!myImportedMesh); -} - -//================================================================================= -// function : StoreMesh() -// purpose : -//================================================================================= -bool SMESHGUI_EditHypothesesDlg::StoreMesh() -{ - MapIOR anOldHypos, aNewHypos; - if (myGeomShape->_is_nil()) - return false; - - // 1. Check whether the geometric shape has changed - _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh); - GEOM::GEOM_Object_var aIniGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aMeshSO); - bool bShapeChanged = aIniGeomShape->_is_nil() || - !aIniGeomShape->_is_equivalent(myGeomShape); - if (bShapeChanged) { - // VSR : TODO : Set new shape - not supported yet by SMESH engine - // 1. remove all old hypotheses and algorithms and also submeshes - // 2. set new shape - } - - int nbFail = 0; - MapIOR::iterator it; - - // 2. remove not used hypotheses from the mesh - for (it = myMapOldHypos.begin(); it != myMapOldHypos.end(); ++it) { - string ior = it->first; - int index = findItem(ListHypAssignation, ior); - if (index < 0) { - SMESH::SMESH_Hypothesis_var aHyp = - SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aMeshSO, aHyp)) - nbFail++; - } - } - } - - // 3. remove not used algorithms from the mesh - for (it = myMapOldAlgos.begin(); it != myMapOldAlgos.end(); ++it) { - string ior = it->first; - int index = findItem(ListAlgoAssignation, ior); - if (index < 0) { - SMESH::SMESH_Hypothesis_var aHyp = - SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aMeshSO, aHyp)) - nbFail++; - } - } - } - - // 4. Add new algorithms - for (int i = 0; i < ListAlgoAssignation->count(); i++) { - if (ListAlgoAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(ListAlgoAssignation->item(i)); - if (anItem) { - string ior = anItem->GetIOR(); - if (myMapOldAlgos.find(ior) == myMapOldAlgos.end()) { - SMESH::SMESH_Hypothesis_var aHyp = - SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::AddHypothesisOnMesh(myMesh, aHyp)) - nbFail++; - } - } - } - } - } - - // 5. Add new hypotheses - for (int i = 0; i < ListHypAssignation->count(); i++) { - if (ListHypAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(ListHypAssignation->item(i)); - if (anItem) { - string ior = anItem->GetIOR(); - if (myMapOldHypos.find(ior) == myMapOldHypos.end()) { - SMESH::SMESH_Hypothesis_var aHyp = - SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::AddHypothesisOnMesh(myMesh, aHyp)) - nbFail++; - } - } - } - } - } - return (nbFail == 0); -} - -//================================================================================= -// function : StoreSubMesh() -// purpose : -//================================================================================= -bool SMESHGUI_EditHypothesesDlg::StoreSubMesh() -{ - MapIOR anOldHypos, aNewHypos; - if (myGeomShape->_is_nil()) - return false; - - // 1. Check whether the geometric shape has changed - _PTR(SObject) aSubMeshSO = SMESH::FindSObject(mySubMesh); - GEOM::GEOM_Object_var aIniGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aSubMeshSO); - bool bShapeChanged = aIniGeomShape->_is_nil() || !aIniGeomShape->_is_equivalent(myGeomShape); - if (bShapeChanged) { - // VSR : TODO : Set new shape - not supported yet by engine - // 1. remove all old hypotheses and algorithms - // 2. set new shape - } - int nbFail = 0; - MapIOR::iterator it; - - // 2. remove not used hypotheses from the submesh - for (it = myMapOldHypos.begin(); it != myMapOldHypos.end(); ++it) { - string ior = it->first; - int index = findItem(ListHypAssignation, ior); - if (index < 0) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aSubMeshSO, aHyp)) - nbFail++; - } - } - } - - // 3. remove not used algorithms from the submesh - for (it = myMapOldAlgos.begin(); it != myMapOldAlgos.end(); ++it) { - string ior = it->first; - int index = findItem(ListAlgoAssignation, ior); - if (index < 0) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()){ - if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aSubMeshSO, aHyp)) - nbFail++; - } - } - } - - // 4. Add new algorithms - for (int i = 0; i < ListAlgoAssignation->count(); i++) { - if (ListAlgoAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(ListAlgoAssignation->item(i)); - if (anItem) { - string ior = anItem->GetIOR(); - if (myMapOldAlgos.find(ior) == myMapOldAlgos.end()) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()){ - if (!SMESH::AddHypothesisOnSubMesh(mySubMesh, aHyp)) - nbFail++; - } - } - } - } - } - - // 5. Add new hypotheses - for (int i = 0; i < ListHypAssignation->count(); i++) { - if (ListHypAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(ListHypAssignation->item(i)); - if (anItem) { - string ior = anItem->GetIOR(); - if (myMapOldHypos.find(ior) == myMapOldHypos.end()) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()){ - if (!SMESH::AddHypothesisOnSubMesh(mySubMesh, aHyp)) - nbFail++; - } - } - } - } - } - return (nbFail == 0); -} diff --git a/src/SMESHGUI/SMESHGUI_Filter.cxx b/src/SMESHGUI/SMESHGUI_Filter.cxx deleted file mode 100755 index 19b3fcb1a..000000000 --- a/src/SMESHGUI/SMESHGUI_Filter.cxx +++ /dev/null @@ -1,497 +0,0 @@ -// SMESHGUI_PredicateFilter : Filters for VTK viewer -// -// 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 : SMESHGUI_Filter.cxx -// Author : Sergey LITONIN -// Module : SMESH - -#include "SMESHGUI_Filter.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" - -#include "SMESH_Actor.h" -#include "SMDS_Mesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDSAbs_ElementType.hxx" - -// OCCT Includes -#include -#include - -// VTK Includes -#include - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_Filter, VTKViewer_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_PredicateFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_PredicateFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_TriangleFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_TriangleFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_FacesFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_FacesFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_VolumesFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_VolumesFilter, SMESHGUI_Filter) - -/* - Class : SMESHGUI_PredicateFilter - Description : Selection filter for VTK viewer. This class aggregate object - of SMESH_Predicate class and uses it for verification of criterion -*/ - -//======================================================================= -// name : SMESHGUI_PredicateFilter::SMESHGUI_PredicateFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_PredicateFilter::SMESHGUI_PredicateFilter() -{ -} - -SMESHGUI_PredicateFilter::~SMESHGUI_PredicateFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::IsValid -// Purpose : Verify whether entry id satisfies to criterion of the filter -//======================================================================= -bool SMESHGUI_PredicateFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 || myPred->_is_nil() ) - return false; - - SMESH_Actor* anActor = dynamic_cast( myActor ); - if ( !anActor || anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - SMESH::ElementType anElemType = myPred->GetElementType(); - int aMeshId = anElemType == SMESH::NODE ? anActor->GetNodeObjId( theCellId ) - : anActor->GetElemObjId( theCellId ); - - // if type of element != type of predicate return true because - // this predicate is not intended for filtering sush elements - const SMDS_MeshElement* anElem = anElemType == SMESH::NODE ? aMesh->FindNode( aMeshId ) - : aMesh->FindElement( aMeshId ); - if ( anElem != 0 && anElem->GetType() != (SMDSAbs_ElementType)myPred->GetElementType() ) - return true; - - return myPred->IsSatisfy( aMeshId ); -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::IsValid -// Purpose : Verify whether entry id satisfies to criterion of the filter -//======================================================================= -bool SMESHGUI_PredicateFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 || myPred->_is_nil() ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - SMESH::ElementType anElemType = myPred->GetElementType(); - - // if type of element != type of predicate return true because - // this predicate is not intended for filtering sush elements - const SMDS_MeshElement* anElem = anElemType == SMESH::NODE ? aMesh->FindNode( theObjId ) - : aMesh->FindElement( theObjId ); - if ( anElem != 0 && anElem->GetType() != (SMDSAbs_ElementType)myPred->GetElementType() ) - return true; - - return myPred->IsSatisfy( theObjId ); -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_PredicateFilter::IsNodeFilter() const -{ - return GetId() == SMESHGUI_NodeFilter; -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::SetPredicate -// Purpose : Set new pridicate to the filter -//======================================================================= -void SMESHGUI_PredicateFilter::SetPredicate( SMESH::Predicate_ptr thePred ) -{ - myPred = SMESH::Predicate::_duplicate( thePred ); -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::SetActor -// Purpose : Set new actor -//======================================================================= -void SMESHGUI_PredicateFilter::SetActor( SALOME_Actor* theActor ) -{ - if ( myActor == theActor ) - return; - SMESHGUI_Filter::SetActor( theActor ); - - if ( myActor != 0 && !myPred->_is_nil() ) - { - SALOME_Actor* sActor = dynamic_cast( myActor ); - Handle(SALOME_InteractiveObject) anIO; - if( sActor ) - anIO = sActor->getIO(); - if ( !anIO.IsNull() ) - { - SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface(anIO); - if(!aMesh->_is_nil()) - myPred->SetMesh(aMesh); - } - } -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::SetActor -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_PredicateFilter::GetId() const -{ - if ( myPred->GetElementType() == SMESH::NODE ) return SMESHGUI_NodeFilter; - else if ( myPred->GetElementType() == SMESH::EDGE ) return SMESHGUI_EdgeFilter; - else if ( myPred->GetElementType() == SMESH::FACE ) return SMESHGUI_FaceFilter; - else if ( myPred->GetElementType() == SMESH::VOLUME ) return SMESHGUI_VolumeFilter; - else if ( myPred->GetElementType() == SMESH::ALL ) return SMESHGUI_AllElementsFilter; - else return SMESHGUI_UnknownFilter; -} - - -/* - Class : SMESHGUI_QuadrangleFilter - Description : Verify whether selected cell is quadranle -*/ - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::SMESHGUI_QuadrangleFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_QuadrangleFilter::SMESHGUI_QuadrangleFilter() -: SMESHGUI_Filter() -{ -} - -SMESHGUI_QuadrangleFilter::~SMESHGUI_QuadrangleFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::IsValid -// Purpose : Verify whether selected cell is quadranle -//======================================================================= -bool SMESHGUI_QuadrangleFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 4; -} - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::IsValid -// Purpose : Verify whether selected cell is quadranle -//======================================================================= -bool SMESHGUI_QuadrangleFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 4; -} - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::SetActor -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_QuadrangleFilter::GetId() const -{ - return SMESHGUI_QuadFilter; -} - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_QuadrangleFilter::IsNodeFilter() const -{ - return false; -} - - -/* - Class : SMESHGUI_TriangleFilter - Description : Verify whether selected cell is triangle -*/ - - -//======================================================================= -// name : SMESHGUI_TriangleFilter::SMESHGUI_TriangleFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_TriangleFilter::SMESHGUI_TriangleFilter() -: SMESHGUI_Filter() -{ -} - -SMESHGUI_TriangleFilter::~SMESHGUI_TriangleFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_TriangleFilter::IsValid -// Purpose : Verify whether selected cell is triangle -//======================================================================= -bool SMESHGUI_TriangleFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 3; -} - -//======================================================================= -// name : SMESHGUI_TriangleFilter::IsValid -// Purpose : Verify whether selected cell is triangle -//======================================================================= -bool SMESHGUI_TriangleFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 3; -} - -//======================================================================= -// name : SMESHGUI_TriangleFilter::SetActor -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_TriangleFilter::GetId() const -{ - return SMESHGUI_TriaFilter; -} - -//======================================================================= -// name : SMESHGUI_TriangleFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_TriangleFilter::IsNodeFilter() const -{ - return false; -} - -/* - Class : SMESHGUI_FacesFilter - Description : Verify whether selected cell is any face -*/ - - -//======================================================================= -// name : SMESHGUI_FacesFilter::SMESHGUI_FacesFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_FacesFilter::SMESHGUI_FacesFilter() -: SMESHGUI_Filter() -{ -} - -SMESHGUI_FacesFilter::~SMESHGUI_FacesFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_FacesFilter::IsValid -// Purpose : Verify whether selected cell is face -//======================================================================= -bool SMESHGUI_FacesFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Face; -} - -//======================================================================= -// name : SMESHGUI_FacesFilter::IsValid -// Purpose : Verify whether selected cell is face -//======================================================================= -bool SMESHGUI_FacesFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - - return anElem && anElem->GetType() == SMDSAbs_Face; -} - -//======================================================================= -// name : SMESHGUI_FacesFilter::GetId -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_FacesFilter::GetId() const -{ - return SMESHGUI_FaceFilter; -} - -//======================================================================= -// name : SMESHGUI_FacesFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_FacesFilter::IsNodeFilter() const -{ - return false; -} - - -/* - Class : SMESHGUI_VolumesFilter - Description : Verify whether selected cell is any volume -*/ - - -//======================================================================= -// name : SMESHGUI_VolumesFilter::SMESHGUI_VolumesFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_VolumesFilter::SMESHGUI_VolumesFilter() -: SMESHGUI_Filter() -{ -} - -SMESHGUI_VolumesFilter::~SMESHGUI_VolumesFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_VolumesFilter::IsValid -// Purpose : Verify whether selected cell is volume -//======================================================================= -bool SMESHGUI_VolumesFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Volume; -} - -//======================================================================= -// name : SMESHGUI_VolumesFilter::IsValid -// Purpose : Verify whether selected cell is volume -//======================================================================= -bool SMESHGUI_VolumesFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - - return anElem && anElem->GetType() == SMDSAbs_Volume; -} - -//======================================================================= -// name : SMESHGUI_VolumesFilter::GetId -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_VolumesFilter::GetId() const -{ - return SMESHGUI_VolumeFilter; -} - -//======================================================================= -// name : SMESHGUI_VolumesFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_VolumesFilter::IsNodeFilter() const -{ - return false; -} diff --git a/src/SMESHGUI/SMESHGUI_Filter.h b/src/SMESHGUI/SMESHGUI_Filter.h deleted file mode 100755 index 0114f38b8..000000000 --- a/src/SMESHGUI/SMESHGUI_Filter.h +++ /dev/null @@ -1,191 +0,0 @@ -// SMESHGUI_Filter : Filters for VTK viewer -// -// 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 : SMESHGUI_Filter.h -// Author : Sergey LITONIN -// Module : SMESH - -#ifndef SMESHGUI_Filter_HeaderFile -#define SMESHGUI_Filter_HeaderFile - -#include "VTKViewer_Filter.h" - -#include -#include CORBA_SERVER_HEADER(SMESH_Filter) - -class SALOME_Actor; - -enum SMESHGUI_FilterType -{ - SMESHGUI_UnknownFilter = -1, - SMESHGUI_NodeFilter = 0, - SMESHGUI_EdgeFilter = 1, - SMESHGUI_FaceFilter = 2, - SMESHGUI_VolumeFilter = 3, - SMESHGUI_AllElementsFilter = 4, - SMESHGUI_QuadFilter = 5, - SMESHGUI_TriaFilter = 6, - SMESHGUI_LastFilter -}; - -/* - Class : SMESHGUI_Filter - Description : Base class for SMESH selection filters for VTK viewer. -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter) - -class SMESHGUI_Filter : public VTKViewer_Filter -{ - -public: - - virtual bool IsObjValid( const int theObjId ) const = 0; -public: - DEFINE_STANDARD_RTTI(SMESHGUI_Filter) -}; - -/* - Class : SMESHGUI_PredicateFilter - Description : Selection filter for VTK viewer. This class aggregate object - of SMESH_Predicate class and uses it for verification of criterion -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_PredicateFilter, SMESHGUI_Filter) - -class SMESHGUI_PredicateFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_PredicateFilter(); - virtual ~SMESHGUI_PredicateFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - void SetPredicate( SMESH::Predicate_ptr ); - - void SetActor( SALOME_Actor* ); - -private: - - SMESH::Predicate_var myPred; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_PredicateFilter) -}; - -/* - Class : SMESHGUI_QuadrangleFilter - Description : Verify whether selected cell is quadranle -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter) - -class SMESHGUI_QuadrangleFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_QuadrangleFilter(); - virtual ~SMESHGUI_QuadrangleFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_QuadrangleFilter) -}; - -/* - Class : SMESHGUI_TriangleFilter - Description : Verify whether selected cell is triangle -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_TriangleFilter, SMESHGUI_Filter) - -class SMESHGUI_TriangleFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_TriangleFilter(); - virtual ~SMESHGUI_TriangleFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_TriangleFilter) -}; - -/* - Class : SMESHGUI_FacesFilter - Description : Verify whether selected cell is any face -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_FacesFilter, SMESHGUI_Filter) - -class SMESHGUI_FacesFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_FacesFilter(); - virtual ~SMESHGUI_FacesFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_FacesFilter) -}; - -/* - Class : SMESHGUI_VolumesFilter - Description : Verify whether selected cell is any volume -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_VolumesFilter, SMESHGUI_Filter) - -class SMESHGUI_VolumesFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_VolumesFilter(); - virtual ~SMESHGUI_VolumesFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_VolumesFilter) -}; - -#endif diff --git a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx deleted file mode 100644 index a6e560ffa..000000000 --- a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx +++ /dev/null @@ -1,1133 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_FilterLibraryDlg.cxx -// Author : Sergey LITONIN -// Module : SMESH - -#include "SMESHGUI_FilterLibraryDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_FilterUtils.h" - -#include "SUIT_Session.h" -#include "SUIT_Desktop.h" -#include "SUIT_FileDlg.h" - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define SPACING 5 -#define MARGIN 10 - -/*! - * Class : SMESHGUI_FilterLibraryDlg::Dialog - * Description : Dialog for opening filter library - */ - -class SMESHGUI_FilterLibraryDlg::Dialog : public SUIT_FileDlg -{ - public: - Dialog(QWidget* theParent, const bool theToOpen); - virtual ~Dialog(); - - protected: - virtual bool acceptData(); -}; - -SMESHGUI_FilterLibraryDlg::Dialog::Dialog (QWidget* theParent, - const bool theToOpen) - : SUIT_FileDlg(theParent, theToOpen) -{ -} - -SMESHGUI_FilterLibraryDlg::Dialog::~Dialog() -{ -} - -bool SMESHGUI_FilterLibraryDlg::Dialog::acceptData() -{ -// if (mode() != QFileDialogP::AnyFile) -// return SUIT_FileDlg::acceptData(); - - return true; -} - -/*! - * Class : SMESHGUI_FilterLibraryDlg - * Description : Dialog to specify filters for VTK viewer - */ - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg -// Purpose : Constructor -//======================================================================= -SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg (SMESHGUI* theModule, - QWidget* parent, - const QValueList& theTypes, - const int theMode, - const char* theName) - : QDialog( parent, theName, true, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - construct(theTypes, theMode); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg -// Purpose : Constructor -//======================================================================= -SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg (SMESHGUI* theModule, - QWidget* parent, - const int theType, - const int theMode, - const char* theName) - : QDialog( parent, theName, true, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - QValueList aTypes; - aTypes.append(theType); - construct(aTypes, theMode); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::construct -// Purpose : Construct dialog (called by constructor) -//======================================================================= -void SMESHGUI_FilterLibraryDlg::construct (const QValueList& theTypes, - const int theMode) -{ - myTypes = theTypes; - myMode = theMode; - - QVBoxLayout* aDlgLay = new QVBoxLayout(this, MARGIN, SPACING); - - myMainFrame = createMainFrame (this); - QFrame* aBtnFrame = createButtonFrame(this); - - aDlgLay->addWidget(myMainFrame); - aDlgLay->addWidget(aBtnFrame); - - aDlgLay->setStretchFactor(myMainFrame, 1); - - Init(myTypes, myMode); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::createMainFrame -// Purpose : Create frame containing dialog's input fields -//======================================================================= -QFrame* SMESHGUI_FilterLibraryDlg::createMainFrame (QWidget* theParent) -{ - QGroupBox* aMainFrame = new QGroupBox(1, Qt::Horizontal, theParent); - aMainFrame->setFrameStyle(QFrame::NoFrame); - aMainFrame->setInsideMargin(0); - - // library name - - QGroupBox* aGrp = new QGroupBox(1, Qt::Vertical, aMainFrame); - aGrp->setFrameStyle(QFrame::NoFrame); - aGrp->setInsideMargin(0); - - new QLabel(tr("LIBRARY_FILE"), aGrp); - myFileName = new QLineEdit(aGrp); - myOpenBtn = new QPushButton(aGrp); - myOpenBtn->setPixmap(SUIT_Session::session()->resourceMgr()->loadPixmap( - "SUIT", tr("ICON_FILE_OPEN"))); - - // filters list box - - aGrp = new QGroupBox(1, Qt::Vertical, tr("FILTER_NAMES"), aMainFrame); - QFrame* aFrame = new QFrame(aGrp); - myListBox = new QListBox(aFrame); - myAddBtn = new QPushButton(tr("ADD"), aFrame); - myDeleteBtn = new QPushButton(tr("DELETE"), aFrame); - - QGridLayout* aLay = new QGridLayout(aFrame, 3, 2, 0, 5); - aLay->addMultiCellWidget(myListBox, 0, 2, 0, 0); - aLay->addWidget(myAddBtn, 0, 1); - aLay->addWidget(myDeleteBtn, 1, 1); - QSpacerItem* aVSpacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); - aLay->addItem(aVSpacer, 2, 1); - - // filter name - - myNameGrp = new QGroupBox(1, Qt::Vertical, aMainFrame); - myNameGrp->setFrameStyle(QFrame::NoFrame); - myNameGrp->setInsideMargin(0); - new QLabel(tr("FILTER_NAME"), myNameGrp); - myName = new QLineEdit(myNameGrp); - - // table - - myTable = new SMESHGUI_FilterTable( mySMESHGUI, aMainFrame, myTypes); - myTable->SetEditable(myMode == EDIT); - myTable->SetLibsEnabled(false); - - myListBox->setMinimumHeight((int)(myTable->sizeHint().height() * 0.5)); - myListBox->setRowMode(QListBox::FitToWidth); - myListBox->setSelectionMode(QListBox::Single); - - myOpenBtn->setAutoDefault(false); - myAddBtn->setAutoDefault(false); - myDeleteBtn->setAutoDefault(false); - - // connect signals and slots - - connect(myFileName, SIGNAL(returnPressed()), this, SLOT(onReturnPressed())); - connect(myOpenBtn , SIGNAL(clicked()), this, SLOT(onBrowse())); - - connect(myListBox, SIGNAL(highlighted(const QString&)), - this, SLOT(onFilterChanged(const QString&))); - - connect(myAddBtn, SIGNAL(clicked()), this, SLOT(onAddBtnPressed())); - connect(myDeleteBtn, SIGNAL(clicked()), this, SLOT(onDeleteBtnPressed())); - - connect(myName, SIGNAL(textChanged(const QString&)), - this, SLOT(onFilterNameChanged(const QString&))); - - connect(myTable, SIGNAL(EntityTypeChanged(const int)), - this, SLOT(onEntityTypeChanged(const int))); - - connect(myTable, SIGNAL(NeedValidation()), this, SLOT(onNeedValidation())); - - return aMainFrame; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::createButtonFrame -// Purpose : Create frame containing buttons -//======================================================================= -QFrame* SMESHGUI_FilterLibraryDlg::createButtonFrame (QWidget* theParent) -{ - QGroupBox* aGrp = new QGroupBox(1, Qt::Vertical, theParent); - - myButtons[ BTN_OK ] = new QPushButton(tr("SMESH_BUT_OK" ), aGrp); - myButtons[ BTN_Apply ] = new QPushButton(tr("SMESH_BUT_APPLY"), aGrp); - - QLabel* aLbl = new QLabel(aGrp); - aLbl->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - - myButtons[ BTN_Cancel ] = new QPushButton(tr("SMESH_BUT_CANCEL"), aGrp); - myButtons[ BTN_Close ] = new QPushButton(tr("SMESH_BUT_CLOSE"), aGrp); - - connect(myButtons[ BTN_OK ], SIGNAL(clicked()), SLOT(onOk())); - connect(myButtons[ BTN_Cancel ], SIGNAL(clicked()), SLOT(onClose())); - connect(myButtons[ BTN_Close ], SIGNAL(clicked()), SLOT(onClose())); - connect(myButtons[ BTN_Apply ], SIGNAL(clicked()), SLOT(onApply())); - - QMap::iterator anIter; - for (anIter = myButtons.begin(); anIter != myButtons.end(); ++anIter) - anIter.data()->setAutoDefault(false); - - updateMainButtons(); - - return aGrp; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::updateMainButtons -// Purpose : Update visibility of main buttons (OK, Cancel, Close ...) -//======================================================================= -void SMESHGUI_FilterLibraryDlg::updateMainButtons() -{ - if (myTypes.count() == 1) { - myButtons[ BTN_Cancel ]->show(); - myButtons[ BTN_Apply ]->hide(); - myButtons[ BTN_Close ]->hide(); - } else { - myButtons[ BTN_Cancel ]->hide(); - myButtons[ BTN_Apply ]->show(); - myButtons[ BTN_Close ]->show(); - } -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg -// Purpose : Destructor -//======================================================================= -SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg() -{ -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::Init -// Purpose : Init dialog fields, connect signals and slots, show dialog -//======================================================================= -void SMESHGUI_FilterLibraryDlg::Init (const int type, const int theMode) -{ - QValueList aTypes; - aTypes.append(type); - Init(aTypes, theMode); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::Init -// Purpose : Init dialog fields, connect signals and slots, show dialog -//======================================================================= -void SMESHGUI_FilterLibraryDlg::Init (const QValueList& theTypes, - const int theMode) -{ - myMode = theMode; - myTypes = theTypes; - myTable->Init(theTypes); - myCurrFilterName = ""; - myCurrFilter = -1; - myListBox->clear(); - myName->clear(); - myTable->Clear(); - - updateControlsVisibility(); - setEnabled(true); - - connect( mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate())); - connect( mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose())); - - if (myMode == ADD_TO) - { - setCaption(tr("ADD_TO_TLT")); - if (myFileName->text().isEmpty()) - myFileName->setText(getDefaultLibraryName()); - processNewLibrary(); - } - else if (myMode == COPY_FROM) - { - setCaption(tr("COPY_FROM_TLT")); - if (myFileName->text().isEmpty()) - myFileName->setText(getDefaultLibraryName()); - processNewLibrary(); - if (myListBox->count() > 0) - myListBox->setCurrentItem(0); - } - else - { - setCaption(tr("EDIT_LIB_TLT")); - if (myFileName->text().isEmpty()) - myFileName->setText(getDefaultLibraryName()); - processNewLibrary(); - if (myListBox->count() > 0) - myListBox->setCurrentItem(0); - } - - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - - this->show(); - - updateMainButtons(); - isPermissionValid(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::updateControlsVisibility -// Purpose : Update visibility of controls in accordance with myMode -//======================================================================= -void SMESHGUI_FilterLibraryDlg::updateControlsVisibility() -{ - if (myMode == ADD_TO) - { - myNameGrp->show(); - myNameGrp->setEnabled(true); - myAddBtn->hide(); - myDeleteBtn->hide(); - myTable->SetEditable(false); - } - else if (myMode == COPY_FROM) - { - myNameGrp->hide(); - myNameGrp->setEnabled(false); - myAddBtn->hide(); - myDeleteBtn->hide(); - myTable->SetEditable(false); - } - else if (myMode == EDIT) - { - myNameGrp->show(); - myNameGrp->setEnabled(true); - myAddBtn->show(); - myDeleteBtn->show(); - myTable->SetEditable(true); - } - - qApp->processEvents(); - updateGeometry(); - adjustSize(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onApply -// Purpose : SLOT called when "Apply" button pressed. -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::onApply() -{ - if (!isValid(true) || !isPermissionValid(false)) - return false; - - if (myLibrary->_is_nil()) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok); - return false; - } - - const char* aName = myFileName->text().latin1(); - if (strcmp(myLibrary->GetFileName(), aName) != 0) - myLibrary->SetFileName(aName); - - bool aResult = false; - - if (myMode == COPY_FROM || myListBox->count() == 0) { - aResult = true; - } else if (myMode == EDIT || myMode == ADD_TO) { - SMESH::Filter_var aFilter = createFilter(); - if (!myLibrary->Replace(myCurrFilterName, myName->text(), aFilter.in())) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_EDITING"), QMessageBox::Ok); - aResult = false; - } - else - aResult = true; - } - - if (aResult && myMode != COPY_FROM) - aResult = myLibrary->Save(); - - if (aResult) { - char* aFileName = myLibrary->GetFileName(); - getDefaultLibraryName() = QString(aFileName); - delete aFileName; - } else if (myMode != COPY_FROM) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_SAVING"), QMessageBox::Ok); - } else { - } - - return aResult; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onOk -// Purpose : SLOT called when "Ok" button pressed. -// Assign filters VTK viewer and close dialog -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onOk() -{ - if (onApply()) - { - disconnect( mySMESHGUI, 0, this, 0); - mySMESHGUI->ResetState(); - accept(); - } -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onClose -// Purpose : SLOT called when "Close" button pressed. Close dialog -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onClose() -{ - disconnect( mySMESHGUI, 0, this, 0); - mySMESHGUI->ResetState(); - reject(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onDeactivate -// Purpose : SLOT called when dialog must be deativated -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onDeactivate() -{ - setEnabled(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::enterEvent -// Purpose : Event filter -//======================================================================= -void SMESHGUI_FilterLibraryDlg::enterEvent(QEvent*) -{ - setEnabled(true); -} - -//================================================================================= -// function : closeEvent() -// purpose : Close dialog -//================================================================================= -void SMESHGUI_FilterLibraryDlg::closeEvent(QCloseEvent* e) -{ - onClose(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::getFileName -// Purpose : Get file name -//======================================================================= -QString SMESHGUI_FilterLibraryDlg::getFileName() const -{ - return myFileName != 0 ? myFileName->text() : QString(""); -} - -//================================================================ -// Function : setFileName -// Purpose : Set file name to line edit -//================================================================ -void SMESHGUI_FilterLibraryDlg::setFileName(const QString& txt, const bool autoExt) -{ - if (myFileName == 0) - return; - myFileName->setText(autoExt ? autoExtension(txt) : txt); -} - -//================================================================ -// Function : autoExtension -// Purpose : Append extension to the file name -//================================================================ -QString SMESHGUI_FilterLibraryDlg::autoExtension(const QString& theFileName) const -{ - QString anExt = theFileName.section('.', -1); - return anExt != "xml" && anExt != "XML" ? theFileName + ".xml" : theFileName; -} - -//================================================================ -// Function : filterWildCards -// Purpose : -//================================================================ -QStringList SMESHGUI_FilterLibraryDlg::filterWildCards(const QString& theFilter) const -{ - QStringList res; - - int b = theFilter.findRev("("); - int e = theFilter.findRev(")"); - if (b != -1 && e != -1) - { - QString content = theFilter.mid(b + 1, e - b - 1).stripWhiteSpace(); - QStringList lst = QStringList::split(" ", content); - for (QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it) - if ((*it).find(".") != -1) - res.append((*it).stripWhiteSpace()); - } - return res; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::prepareFilters -// Purpose : Prepare filters for dialog -//======================================================================= -QStringList SMESHGUI_FilterLibraryDlg::prepareFilters() const -{ - static QStringList aList; - if (aList.isEmpty()) - { - aList.append(tr("XML_FILT")); - //aList.append(tr("ALL_FILES_FILTER")); - } - - return aList; -} - -//================================================================ -// Function : onBrowse -// Purpose : SLOT. Display "Open file" dialog for chosing library name -//================================================================ -void SMESHGUI_FilterLibraryDlg::onBrowse() -{ - Dialog* aDlg = new Dialog(this, true); - aDlg->setCaption(tr("OPEN_LIBRARY")); - - //aDlg->setMode(myMode == COPY_FROM ? QFileDialogP::ExistingFile : QFileDialogP::AnyFile); - aDlg->setMode(myMode == COPY_FROM ? QFileDialog::ExistingFile : QFileDialog::AnyFile); - aDlg->setFilters(prepareFilters()); - aDlg->setSelection(getFileName()); - - QPushButton* anOkBtn = (QPushButton*)aDlg->child("OK", "QPushButton"); - if (anOkBtn != 0) - anOkBtn->setText(tr("SMESH_BUT_OK")); - - if (aDlg->exec() != Accepted) - return; - - QString fName = aDlg->selectedFile(); - - if (fName.isEmpty()) - return; - - if (QFileInfo(fName).extension().isEmpty()) - fName = autoExtension(fName); - - fName = QDir::convertSeparators(fName); - QString prev = QDir::convertSeparators(getFileName()); - - if (prev == fName) - return; - - setFileName(fName); - - QString aName = myListBox->text(myListBox->count() - 1); - processNewLibrary(); - - if (myMode == ADD_TO) - { - myTable->Copy((SMESHGUI_FilterTable*)parentWidget()); - myCurrFilterName = ""; - myCurrFilter = -1; - addFilterToLib(aName); - } - - isPermissionValid(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::processNewLibrary -// Purpose : SLOT. Calleds when file name changed -//======================================================================= -void SMESHGUI_FilterLibraryDlg::processNewLibrary() -{ - SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager(); - if (aFilterMgr->_is_nil()) - return; - - myLibrary = aFilterMgr->LoadLibrary(autoExtension(getFileName())); - if (myLibrary->_is_nil()) { - if (myMode == COPY_FROM) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_LOAD"), QMessageBox::Ok); - return; - } else { - myLibrary = aFilterMgr->CreateLibrary(); - myLibrary->SetFileName(getFileName().latin1()); - } - } - - updateList(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::updateList -// Purpose : Fill list box with filter names -//======================================================================= -void SMESHGUI_FilterLibraryDlg::updateList() -{ - QStringList aList; - SMESH::string_array_var aNames = myLibrary->GetNames((SMESH::ElementType)myTable->GetType()); - for (int i = 0, n = aNames->length(); i < n; i++) - aList.append(QString(aNames[ i ])); - myListBox->clear(); - myListBox->insertStringList(aList); - if (myListBox->count() == 0) - { - myTable->Clear(myTable->GetType()); - myName->clear(); - myName->setEnabled(false); - myTable->SetEnabled(false); - } - else - { - myName->setEnabled(true); - myTable->SetEnabled(true); - if (myListBox->count()) - { - myCurrFilterName = ""; - myListBox->setCurrentItem(0); - } - } -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::isNameValid -// Purpose : Verify validity if entered data -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::isNameValid(const bool theMess) const -{ - // verify validity of filter name - if (myName->isEnabled() && !myCurrFilterName.isEmpty()) { - QString aCurrName = myName->text(); - if (aCurrName.isEmpty()) { - if (theMess) - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("EMPTY_FILTER_NAME"), QMessageBox::Ok); - return false; - } - - SMESH::string_array_var aNames = myLibrary->GetAllNames(); - for (int f = 0, n = aNames->length(); f < n; f++) { - if (aNames[ f ] == aCurrName && aNames[ f ] != myCurrFilterName) { - if (theMess) - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("ERROR_FILTER_NAME"), QMessageBox::Ok); - return false; - } - } - } - - return true; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::isPermissionValid -// Purpose : Verify write permission on file -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::isPermissionValid(const bool theIsExistingOnly) -{ - if (myMode == COPY_FROM) - return true; - - // Verify write permission - bool isWritable = false; - - QString fName(myFileName->text()); - if (QFileInfo(fName).extension().isEmpty()) - fName = autoExtension(fName); - - fName = QDir::convertSeparators(fName); - - if (QFileInfo(fName).exists()) { - isWritable = QFileInfo(fName).isWritable(); - } else if (!theIsExistingOnly) { - QFileInfo aDirInfo(QFileInfo(fName).dirPath(true)); - isWritable = aDirInfo.isWritable(); - /*if (QDir(QFileInfo(fName).dirPath(true)).exists() || - QDir().mkdir(QFileInfo(fName).dirPath(true))) - { - QFile aFile(fName); - if (aFile.open(IO_WriteOnly)) - isWritable = true; - else - aFile.close(); - } - */ - } else { - isWritable = true; - } - - if (!isWritable) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("NO_PERMISSION"), QMessageBox::Ok); - return false; - } - - return true; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::isValid -// Purpose : Verify validity if entered data -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::isValid(const bool theMess) const -{ - // verify validity of table - if (!myTable->IsValid(theMess) || !isNameValid(theMess)) - return false; - else - return true; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onFilterChanged -// Purpose : SLOT. Called when selected filter of library changed -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onFilterChanged(const QString& theName) -{ - if (myLibrary->_is_nil()) - return; - - // Save parameters of filter if it was changed - - if (!myCurrFilterName.isEmpty() && myTable->IsEditable()) - { - if (!isValid(true)) - { - myListBox->blockSignals(true); - myListBox->setCurrentItem(myCurrFilter); - myListBox->blockSignals(false); - return; - } - - SMESH::Filter_var aFilter = createFilter(); - myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter); - } - - // Fill table with filter parameters - - SMESH::Filter_var aFilter = myLibrary->Copy(theName); - myCurrFilterName = theName; - myCurrFilter = myListBox->currentItem(); - myName->setText(theName); - - - SMESH::Filter::Criteria_var aCriteria; - - myTable->Clear(myTable->GetType()); - - if (!aFilter->GetCriteria(aCriteria)) - return; - - for (int i = 0, n = aCriteria->length(); i < n; i++) - myTable->AddCriterion(aCriteria[ i ], myTable->GetType()); - - myTable->Update(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onReturnPressed -// Purpose : SLOT. Called when enter button is pressed in library name field -// Reload library -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onReturnPressed() -{ - QString aName = myListBox->text(myListBox->count() - 1); - - processNewLibrary(); - - if (myMode == ADD_TO) - { - myTable->Copy((SMESHGUI_FilterTable*)parentWidget()); - myCurrFilterName = ""; - myCurrFilter = -1; - addFilterToLib(aName); - } - - isPermissionValid(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::enableMainButtons -// Purpose : Update state of "OK", "Cancel" buttons -//======================================================================= -void SMESHGUI_FilterLibraryDlg::enableMainButtons() -{ - /*bool isEnabled = isValid(false); - if (myButtons.contains(BTN_OK)) - myButtons[ BTN_OK ]->setEnabled(isEnabled); - else if (myButtons.contains(BTN_Apply)) - myButtons[ BTN_OK ]->setEnabled(isEnabled); - if (myButtons.contains(BTN_Cancel)) - myButtons[ BTN_Cancel ]->setEnabled(isEnabled); - else if (myButtons.contains(BTN_Close)) - myButtons[ BTN_Cancel ]->setEnabled(isEnabled); - */ -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::createFilter -// Purpose : Cerate filter in accordance with library -//======================================================================= -SMESH::Filter_ptr SMESHGUI_FilterLibraryDlg::createFilter(const int theType) -{ - int n = myTable->NumRows(theType); - - SMESH::Filter::Criteria_var aCriteria = new SMESH::Filter::Criteria; - aCriteria->length(n); - - for (int i = 0; i < n; i++) - { - SMESH::Filter::Criterion aCriterion = SMESHGUI_FilterDlg::createCriterion(); - myTable->GetCriterion(i, aCriterion); - aCriteria[ i ] = aCriterion; - } - - SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager(); - SMESH::Filter_var aFilter = aFilterMgr->CreateFilter(); - aFilter->SetCriteria(aCriteria.in()); - - return aFilter._retn(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onAddBtnPressed -// Purpose : SLOT. Called when "Add" button pressed -// Add new filter to the end of library -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onAddBtnPressed() -{ - // Save parameters of filter if it was changed - if (!myCurrFilterName.isEmpty() && myTable->IsEditable()) - { - if (!isValid(true)) - return; - - SMESH::Filter_var aFilter = createFilter(); - myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter); - } - - addFilterToLib(getDefaultFilterName()); -} - -//======================================================================= -// name : onAddBtnPressed() -// Purpose : SLOT. Called when "Add" button pressed -// Add new filter to the end of library -//======================================================================= -void SMESHGUI_FilterLibraryDlg::addFilterToLib (const QString& theName) -{ - if (myLibrary->_is_nil()) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok); - return; - } - - // create filter - SMESH::Filter_var aFilter = createFilter(); - - // if name of filter already exist in the library assign default name for the filter - QString aName(theName); - SMESH::string_array_var aNames = myLibrary->GetAllNames(); - for (int i = 0, n = aNames->length(); i < n; i++) - if (aName == QString(aNames[ i ])) - { - aName = getDefaultFilterName(); - break; - } - - // add new filter in library - bool aResult = !aFilter->GetPredicate()->_is_nil() - ? myLibrary->Add(aName.latin1(), aFilter) - : myLibrary->AddEmpty(aName.latin1(), (SMESH::ElementType)myTable->GetType()); - - if (!aResult) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_ADDING"), QMessageBox::Ok); - } - - updateList(); - myCurrFilterName = ""; - myCurrFilter = -1; - setSelected(aName); - - if (theName != aName) - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WARNING"), - tr("ASSIGN_NEW_NAME").arg(theName).arg(aName), QMessageBox::Ok); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::getDefaultLibraryName -// Purpose : Get default library name -//======================================================================= -QString& SMESHGUI_FilterLibraryDlg::getDefaultLibraryName() const -{ - static QString aName; - if (aName.isEmpty()) - { - QString aHomeDir = QDir(QDir::home()).absPath(); - aName = aHomeDir + "/" + tr ("LIB_NAME"); - } - return aName; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::getDefaultFilterName -// Purpose : Create default filter name -//======================================================================= -QString SMESHGUI_FilterLibraryDlg::getDefaultFilterName() const -{ - QString aName; - - if (myTable->GetType() == SMESH::NODE) - aName = tr("NODE"); - else if (myTable->GetType() == SMESH::EDGE) - aName = tr("EDGE"); - else if (myTable->GetType() == SMESH::FACE) - aName = tr("FACE"); - else if (myTable->GetType() == SMESH::VOLUME) - aName = tr("VOLUME"); - else if (myTable->GetType() == SMESH::ALL) - aName = tr("ELEMENT"); - else - aName = tr("SELECTION"); - - aName += tr("FILTER"); - - - QMap< QString, int > anAllNames; - SMESH::string_array_var aNames = myLibrary->GetAllNames(); - for(int i = 0, n = aNames->length(); i < n; i++) - anAllNames[ QString(aNames[ i ]) ] = -1; - - bool isNotValid = true; - int k = 1; - QString aNewName; - while (isNotValid) - { - isNotValid = false; - aNewName = aName + "_" + QString("%1").arg(k); - if (anAllNames.contains(aNewName)) - { - isNotValid = true; - k++; - } - } - - return aNewName; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::setSelected -// Purpose : set selected item in list box containing filters -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::setSelected(const QString& theName) -{ - int anIndex = getIndex(theName); - if (anIndex != -1) - { - myListBox->setCurrentItem(anIndex); - myCurrFilterName = theName; - myCurrFilter = anIndex; - } - return anIndex != -1; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::getIndex -// Purpose : Get index of the filter in list box -//======================================================================= -int SMESHGUI_FilterLibraryDlg::getIndex(const QString& theName) const -{ - for (int i = 0, n = myListBox->count(); i < n; i++) - if (myListBox->text(i) == theName) - return i; - return -1; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed -// Purpose : SLOT. Called when "Delete" button pressed -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed() -{ - if (myLibrary->_is_nil()) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok); - return; - } - - int anIndex = getIndex(myCurrFilterName); - - if (anIndex == -1 || !myLibrary->Delete(myCurrFilterName.latin1())) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_DELETING"), QMessageBox::Ok); - } else { - myCurrFilterName = ""; - myCurrFilter = -1; - myListBox->removeItem(anIndex); - - if (anIndex >= 1) - myListBox->setSelected(anIndex - 1, true); - else if (anIndex == 0 && myListBox->count() > 0) - myListBox->setSelected(0, true); - else - myTable->Clear(); - } - - myTable->SetEnabled(myListBox->count() > 0); - if (myListBox->count() == 0) { - myName->setText(""); - myName->setEnabled(false); - } -} - -//======================================================================= -// name : onFilterNameChanged() -// Purpose : SLOT. Called when name of filter changed -// Change filter name in list box -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onFilterNameChanged (const QString& theName) -{ - int aCurrItem = myListBox->currentItem(); - if (aCurrItem == -1) - return; - - myListBox->blockSignals(true); - myListBox->changeItem(theName, aCurrItem); - myListBox->blockSignals(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::SetTable -// Purpose : Set table -//======================================================================= -void SMESHGUI_FilterLibraryDlg::SetTable(const SMESHGUI_FilterTable* theTable) -{ - myTable->Copy(theTable); - myName->setText(getDefaultFilterName()); - addFilterToLib(myName->text()); - myTable->Update(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::GetTable -// Purpose : Get table -//======================================================================= -const SMESHGUI_FilterTable* SMESHGUI_FilterLibraryDlg::GetTable() const -{ - return myTable; -} - - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onEntityTypeChanged -// Purpose : SLOT. Called when entiyt type changed -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onEntityTypeChanged(const int theType) -{ - if (myLibrary->_is_nil()) - return; - - myName->clear(); - myCurrFilterName = ""; - myCurrFilter = -1; - updateList(); - if (myListBox->count()) - myListBox->setCurrentItem(0); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onNeedValidation -// Purpose : -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onNeedValidation() -{ - if (!myCurrFilterName.isEmpty()) - { - bool valid = isValid(true); - myTable->SetValidity(valid); - - if (valid) - { - SMESH::Filter_var aFilter = createFilter(myTable->GetType()); - myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter); - } - } -} diff --git a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h b/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h deleted file mode 100644 index 8fbc6f998..000000000 --- a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h +++ /dev/null @@ -1,157 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_FilterLibraryDlg.h -// Author : Sergey LITONIN -// Module : SMESH - - -#ifndef SMESHGUI_FilterLibraryDlg_H -#define SMESHGUI_FilterLibraryDlg_H - -#include -#include - -#include -#include CORBA_SERVER_HEADER(SMESH_Filter) - -class QCloseEvent; -class QListBox; -class QFrame; -class QEvent; -class QLineEdit; -class QPushButton; -class QGroupBox; - -/* - Class : SMESHGUI_FilterLibraryDlg - Description : Dialog to specify filters for VTK viewer -*/ - -class SMESHGUI_FilterLibraryDlg : public QDialog -{ - Q_OBJECT - - // Buttons - enum { BTN_OK, BTN_Cancel, BTN_Apply, BTN_Close }; - - class Dialog; - -public: - - // Mode - enum { ADD_TO, COPY_FROM, EDIT }; - -public: - - SMESHGUI_FilterLibraryDlg( SMESHGUI*, - QWidget*, - const QValueList& types, - const int mode, - const char* name = 0 ); - - SMESHGUI_FilterLibraryDlg( SMESHGUI*, - QWidget*, - const int type, - const int mode, - const char* name = 0 ); - - virtual ~SMESHGUI_FilterLibraryDlg(); - - void Init( const QValueList& types, const int theMode ); - void Init( const int type, const int theMode ); - - const SMESHGUI_FilterTable* GetTable() const; - void SetTable( const SMESHGUI_FilterTable* ); - -private: - - void closeEvent( QCloseEvent* e ) ; - void enterEvent ( QEvent * ) ; - -private slots: - - void onOk(); - bool onApply(); - void onClose(); - - void onDeactivate(); - - void onBrowse(); - void onReturnPressed(); - void onFilterChanged( const QString& ); - void onAddBtnPressed(); - void onDeleteBtnPressed(); - void onFilterNameChanged( const QString& ); - void onEntityTypeChanged( const int ); - void onNeedValidation(); - -private: - - void construct( const QValueList& types, const int mode ); - QFrame* createButtonFrame( QWidget* ); - QFrame* createMainFrame ( QWidget* ); - bool isValid( const bool theMess = true ) const; - bool isNameValid( const bool theMess = true ) const; - SMESH::Filter_ptr createFilter( const int theType = -1 ); - QStringList prepareFilters() const; - QString autoExtension( const QString& ) const; - bool setSelected( const QString& ); - int getIndex( const QString& ) const; - void updateControlsVisibility(); - void updateMainButtons(); - void enableMainButtons(); - void processNewLibrary(); - QString getFileName() const; - void setFileName( const QString& txt, const bool autoExtension = true ); - QStringList filterWildCards( const QString& theFilter ) const; - QString& getDefaultLibraryName() const; - QString getDefaultFilterName() const; - void addFilterToLib( const QString& name ); - void updateList(); - bool isPermissionValid( const bool theIsExistingOnly ); - -private: - - QFrame* myMainFrame; - QMap myButtons; - SMESHGUI_FilterTable* myTable; - QLineEdit* myFileName; - QPushButton* myOpenBtn; - QListBox* myListBox; - QPushButton* myAddBtn; - QPushButton* myDeleteBtn; - QGroupBox* myNameGrp; - QLineEdit* myName; - SMESHGUI* mySMESHGUI; - - QValueList myTypes; - int myMode; - - SMESH::FilterLibrary_var myLibrary; - QString myCurrFilterName; - int myCurrFilter; - -}; - -#endif diff --git a/src/SMESHGUI/SMESHGUI_FilterUtils.cxx b/src/SMESHGUI/SMESHGUI_FilterUtils.cxx deleted file mode 100644 index e5c529f16..000000000 --- a/src/SMESHGUI/SMESHGUI_FilterUtils.cxx +++ /dev/null @@ -1,37 +0,0 @@ -// 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 - - -#include "SMESHGUI_FilterUtils.h" - -#include "SMESHGUI.h" - -#include "utilities.h" - -namespace SMESH -{ - SMESH::FilterManager_var& GetFilterManager() - { - static SMESH::FilterManager_var aFilterManager; - if (CORBA::is_nil(aFilterManager)) { - aFilterManager = SMESHGUI::GetSMESHGen()->CreateFilterManager(); - } - return aFilterManager; - } -} diff --git a/src/SMESHGUI/SMESHGUI_FilterUtils.h b/src/SMESHGUI/SMESHGUI_FilterUtils.h deleted file mode 100644 index 6b8c75862..000000000 --- a/src/SMESHGUI/SMESHGUI_FilterUtils.h +++ /dev/null @@ -1,34 +0,0 @@ -// 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 - -#ifndef SMESHGUI_FilterUtils_HeaderFile -#define SMESHGUI_FilterUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Filter) - - -namespace SMESH{ - - SMESH::FilterManager_var& GetFilterManager(); - -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx b/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx deleted file mode 100644 index c9ffc82e6..000000000 --- a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx +++ /dev/null @@ -1,92 +0,0 @@ -// 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 - -#include - -#include "SMESHGUI_GEOMGenUtils.h" -#include "SMESHGUI_Utils.h" - -#include - -#include -#include -#include - -#include CORBA_CLIENT_HEADER(SMESH_Mesh) - - -namespace SMESH { - - GEOM::GEOM_Gen_var GetGEOMGen() - { - static GEOM::GEOM_Gen_var aGEOMGen; - - if(CORBA::is_nil(aGEOMGen)) - aGEOMGen = GeometryGUI::GetGeomGen(); - return aGEOMGen; - } - - GEOM::GEOM_Object_var GetShapeOnMeshOrSubMesh(_PTR(SObject) theMeshOrSubmesh) - { - SALOMEDS_SObject* aMeshOrSubmesh = _CAST(SObject,theMeshOrSubmesh); - if(aMeshOrSubmesh) { - CORBA::Object_var Obj = aMeshOrSubmesh->GetObject(); - if ( !CORBA::is_nil( Obj ) ) { - SMESH::SMESH_Mesh_var aMesh = - SObjectToInterface( theMeshOrSubmesh ); - if ( !aMesh->_is_nil() ) - return aMesh->GetShapeToMesh(); - SMESH::SMESH_subMesh_var aSubmesh = - SObjectToInterface( theMeshOrSubmesh ); - if ( !aSubmesh->_is_nil() ) - return aSubmesh->GetSubShape(); - } - } - return GEOM::GEOM_Object::_nil(); - } - - GEOM::GEOM_Object_ptr GetGeom (_PTR(SObject) theSO) - { - if (!theSO) - return GEOM::GEOM_Object::_nil(); - - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - if (!aStudy) - return GEOM::GEOM_Object::_nil(); - - _PTR(ChildIterator) anIter (aStudy->NewChildIterator(theSO)); - for (; anIter->More(); anIter->Next()) { - _PTR(SObject) aSObject = anIter->Value(); - _PTR(SObject) aRefSOClient; - GEOM::GEOM_Object_var aMeshShape; - - if (aSObject->ReferencedObject(aRefSOClient)) { - SALOMEDS_SObject* aRefSO = _CAST(SObject,aRefSOClient); - aMeshShape = GEOM::GEOM_Object::_narrow(aRefSO->GetObject()); - } else { - SALOMEDS_SObject* aSO = _CAST(SObject,aSObject); - aMeshShape = GEOM::GEOM_Object::_narrow(aSO->GetObject()); - } - - if (!aMeshShape->_is_nil()) - return aMeshShape._retn(); - } - return GEOM::GEOM_Object::_nil(); - } -} diff --git a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.h b/src/SMESHGUI/SMESHGUI_GEOMGenUtils.h deleted file mode 100644 index 6f2ccb9b3..000000000 --- a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.h +++ /dev/null @@ -1,39 +0,0 @@ -// 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 - -#ifndef SMESHGUI_GEOMGenUtils_HeaderFile -#define SMESHGUI_GEOMGenUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(GEOM_Gen) - -#include "SALOMEDSClient_definitions.hxx" - -class SALOMEDSClient_SObject; - -namespace SMESH -{ - GEOM::GEOM_Gen_var GetGEOMGen(); - - GEOM::GEOM_Object_var GetShapeOnMeshOrSubMesh (_PTR(SObject) theSObject); - - GEOM::GEOM_Object_ptr GetGeom (_PTR(SObject) theSO); -} - -#endif diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx deleted file mode 100644 index 9bf9e43f5..000000000 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx +++ /dev/null @@ -1,1448 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_GroupDlg.cxx -// Author : Natalia KOPNOVA -// Module : SMESH -// $Header$ - -#include "SMESHGUI_GroupDlg.h" -#include "SMESHGUI_FilterDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_GroupUtils.h" -#include "SMESHGUI_FilterUtils.h" -#include "SMESHGUI_GEOMGenUtils.h" - -#include "SMESH_TypeFilter.hxx" -#include "SMESH_Actor.h" -#include "GEOMBase.h" - -#include "SUIT_Desktop.h" -#include "SUIT_ResourceMgr.h" - -#include "SalomeApp_Tools.h" -#include "SALOMEDSClient_Study.hxx" -#include "SALOME_ListIO.hxx" -#include "SALOME_ListIteratorOfListIO.hxx" - -#include "SVTK_ViewWindow.h" -#include "SVTK_Selector.h" - -#include "utilities.h" - -// OCCT Includes -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// STL includes -#include -#include - -using namespace std; - -//================================================================================= -// function : SMESHGUI_GroupDlg() -// purpose : -//================================================================================= -SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name, - SMESH::SMESH_Mesh_ptr theMesh, bool modal, WFlags fl) - : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | - WStyle_Title | WStyle_SysMenu | WDestructiveClose), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myIsBusy( false ), - myActor( 0 ) -{ - if (!name) setName("SMESHGUI_GroupDlg"); - initDialog(true); - if (!theMesh->_is_nil()) - init(theMesh); - else { - mySelectSubMesh->setEnabled(false); - mySelectGroup->setEnabled(false); - myGeomGroupBtn->setEnabled(false); - myGeomGroupLine->setEnabled(false); - } - - mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); - - /* Move widget on the botton right corner of main widget */ - int x, y ; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg() -// purpose : -//================================================================================= -SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name, - SMESH::SMESH_Group_ptr theGroup, bool modal, WFlags fl) - : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | - WStyle_Title | WStyle_SysMenu | WDestructiveClose), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myIsBusy( false ) -{ - if (!name) setName("SMESHGUI_GroupDlg"); - - mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); - - initDialog(false); - if (!theGroup->_is_nil()) - init(theGroup); - else { - mySelectSubMesh->setEnabled(false); - mySelectGroup->setEnabled(false); - - myCurrentLineEdit = myMeshGroupLine; - setSelectionMode(5); - } - - /* Move widget on the botton right corner of main widget */ - int x, y ; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::initDialog(bool create) -{ - myFilterDlg = 0; - myCreate = create; - myCurrentLineEdit = 0; - - QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - - if (create) - setCaption(tr("SMESH_CREATE_GROUP_TITLE")); - else - setCaption(tr("SMESH_EDIT_GROUP_TITLE")); - - setSizeGripEnabled(TRUE); - - QGridLayout* aMainLayout = new QGridLayout(this, 7, 3, 11, 6); - - /***************************************************************/ - QLabel* meshGroupLab = new QLabel(this, "mesh/group label"); - if (create) - meshGroupLab->setText(tr("SMESH_MESH")); - else - meshGroupLab->setText(tr("SMESH_GROUP")); - myMeshGroupBtn = new QPushButton(this, "mesh/group button"); - myMeshGroupBtn->setPixmap(image0); - myMeshGroupLine = new QLineEdit(this, "mesh/group line"); - myMeshGroupLine->setReadOnly(true); - - /***************************************************************/ - myTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Group types"); - myTypeGroup->setTitle(tr("SMESH_ELEMENTS_TYPE")); - myTypeGroup->setExclusive(true); - - QStringList types; - types.append(tr("MESH_NODE")); - types.append(tr("SMESH_EDGE")); - types.append(tr("SMESH_FACE")); - types.append(tr("SMESH_VOLUME")); - QRadioButton* rb; - for (int i = 0; i < types.count(); i++) { - rb = new QRadioButton(types[i], myTypeGroup); - } - myTypeGroup->setEnabled(create); - myTypeId = -1; - - /***************************************************************/ - QLabel* aName = new QLabel(this, "name label"); - aName->setText(tr("SMESH_NAME")); - aName->setMinimumSize(50,0); - myName = new QLineEdit(this, "name"); - - /***************************************************************/ - myGrpTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Type of group"); - myGrpTypeGroup->setTitle(tr("SMESH_GROUP_TYPE")); - myGrpTypeGroup->setExclusive(true); - QRadioButton* rb1 = new QRadioButton( tr("SMESH_GROUP_STANDALONE"), myGrpTypeGroup); - QRadioButton* rb2 = new QRadioButton( tr("SMESH_GROUP_GEOMETRY"), myGrpTypeGroup); - myGrpTypeGroup->setEnabled(create); - myGrpTypeId = -1; - - /***************************************************************/ - myWGStack = new QWidgetStack( this, "widget stack"); - QWidget* wg1 = new QFrame( myWGStack, "first widget" ); - QWidget* wg2 = new QFrame( myWGStack, "second widget" ); - - /***************************************************************/ - QGroupBox* aContentBox = new QGroupBox(1, Qt::Horizontal, wg1, "content box"); - aContentBox->setTitle(tr("SMESH_CONTENT")); - QFrame* aContent = new QFrame(aContentBox, "content"); - QGridLayout* aLayout = new QGridLayout(aContent, 7, 4); - aLayout->setSpacing(6); - aLayout->setAutoAdd(false); - - QLabel* aLabel = new QLabel(aContent, "elements label"); - aLabel->setText(tr("SMESH_ID_ELEMENTS")); - myElements = new QListBox(aContent, "elements list"); - myElements->setSelectionMode(QListBox::Extended); - - myFilter = new QPushButton(aContent, "filter"); - myFilter->setText(tr("SMESH_BUT_FILTER")); - QPushButton* aAddBtn = new QPushButton(aContent, "add"); - aAddBtn->setText(tr("SMESH_BUT_ADD")); - QPushButton* aRemoveBtn = new QPushButton(aContent, "remove"); - aRemoveBtn->setText(tr("SMESH_BUT_REMOVE")); - QPushButton* aSortBtn = new QPushButton(aContent, "sort"); - aSortBtn->setText(tr("SMESH_BUT_SORT")); - - aLayout->addWidget(aLabel, 0, 0); - aLayout->addMultiCellWidget(myElements, 1, 6, 0, 0); - aLayout->addWidget(myFilter, 1, 2); - aLayout->addWidget(aAddBtn, 3, 2); - aLayout->addWidget(aRemoveBtn, 4, 2); - aLayout->addWidget(aSortBtn, 6, 2); - - aLayout->setColStretch(0, 1); - aLayout->addColSpacing(1, 20); - aLayout->addColSpacing(3, 20); - aLayout->setRowStretch(2, 1); - aLayout->setRowStretch(5, 1); - - /***************************************************************/ - QGroupBox* aSelectBox = new QGroupBox(3, Qt::Horizontal, wg1, "select box"); - aSelectBox->setTitle(tr("SMESH_SELECT_FROM")); - - mySelectSubMesh = new QCheckBox(aSelectBox, "submesh checkbox"); - mySelectSubMesh->setText(tr("SMESH_SUBMESH")); - mySelectSubMesh->setMinimumSize(50, 0); - mySubMeshBtn = new QPushButton(aSelectBox, "submesh button"); - mySubMeshBtn->setText(""); - mySubMeshBtn->setPixmap(image0); - mySubMeshLine = new QLineEdit(aSelectBox, "submesh line"); - mySubMeshLine->setReadOnly(true); - onSelectSubMesh(false); - - mySelectGroup = new QCheckBox(aSelectBox, "group checkbox"); - mySelectGroup->setText(tr("SMESH_GROUP")); - mySelectGroup->setMinimumSize(50, 0); - myGroupBtn = new QPushButton(aSelectBox, "group button"); - myGroupBtn->setText(""); - myGroupBtn->setPixmap(image0); - myGroupLine = new QLineEdit(aSelectBox, "group line"); - myGroupLine->setReadOnly(true); - onSelectGroup(false); - - /***************************************************************/ - QGridLayout* wg1Layout = new QGridLayout( wg1, 3, 1, 0, 6 ); - wg1Layout->addWidget(aContentBox, 0, 0); - wg1Layout->addWidget(aSelectBox, 1, 0); - wg1Layout->setRowStretch(2, 5); - - /***************************************************************/ - QLabel* geomObject = new QLabel(wg2, "geometry object label"); - geomObject->setText(tr("SMESH_OBJECT_GEOM")); - myGeomGroupBtn = new QPushButton(wg2, "geometry group button"); - myGeomGroupBtn->setText(""); - myGeomGroupBtn->setPixmap(image0); - myGeomGroupLine = new QLineEdit(wg2, "geometry group line"); - myGeomGroupLine->setReadOnly(true); //VSR ??? - onSelectGeomGroup(false); - - /***************************************************************/ - QGridLayout* wg2Layout = new QGridLayout( wg2, 2, 3, 0, 6 ); - wg2Layout->addWidget(geomObject, 0, 0); - wg2Layout->addWidget(myGeomGroupBtn, 0, 1); - wg2Layout->addWidget(myGeomGroupLine,0, 2); - wg2Layout->setRowStretch(1, 5); - - /***************************************************************/ - QVBoxLayout* dumb = new QVBoxLayout(myWGStack); - dumb->addWidget(wg1); - dumb->addWidget(wg2); - myWGStack->addWidget( wg1, myGrpTypeGroup->id(rb1) ); - myWGStack->addWidget( wg2, myGrpTypeGroup->id(rb2) ); - - /***************************************************************/ - QFrame* aButtons = new QFrame(this, "button box"); - aButtons->setFrameStyle(QFrame::Box | QFrame::Sunken); - QHBoxLayout* aBtnLayout = new QHBoxLayout(aButtons, 11, 6); - aBtnLayout->setAutoAdd(false); - - QPushButton* aOKBtn = new QPushButton(aButtons, "ok"); - aOKBtn->setText(tr("SMESH_BUT_OK")); - aOKBtn->setAutoDefault(true); - aOKBtn->setDefault(true); - QPushButton* aApplyBtn = new QPushButton(aButtons, "apply"); - aApplyBtn->setText(tr("SMESH_BUT_APPLY")); - aApplyBtn->setAutoDefault(true); - QPushButton* aCloseBtn = new QPushButton(aButtons, "close"); - aCloseBtn->setText(tr("SMESH_BUT_CLOSE")); - aCloseBtn->setAutoDefault(true); - - aBtnLayout->addWidget(aOKBtn); - aBtnLayout->addWidget(aApplyBtn); - aBtnLayout->addStretch(); - aBtnLayout->addWidget(aCloseBtn); - - /***************************************************************/ - aMainLayout->addWidget(meshGroupLab, 0, 0); - aMainLayout->addWidget(myMeshGroupBtn, 0, 1); - aMainLayout->addWidget(myMeshGroupLine, 0, 2); - aMainLayout->addMultiCellWidget(myTypeGroup, 1, 1, 0, 2); - aMainLayout->addWidget(aName, 2, 0); - aMainLayout->addWidget(myName, 2, 2); - aMainLayout->addMultiCellWidget(myGrpTypeGroup, 3, 3, 0, 2); - aMainLayout->addMultiCellWidget(myWGStack, 4, 4, 0, 2); - aMainLayout->setRowStretch( 5, 5 ); - aMainLayout->addMultiCellWidget(aButtons, 6, 6, 0, 2); - - /* signals and slots connections */ - connect(myMeshGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); - - connect(myGrpTypeGroup, SIGNAL(clicked(int)), this, SLOT(onGrpTypeChanged(int))); - - connect(myTypeGroup, SIGNAL(clicked(int)), this, SLOT(onTypeChanged(int))); - - connect(myName, SIGNAL(textChanged(const QString&)), this, SLOT(onNameChanged(const QString&))); - connect(myElements, SIGNAL(selectionChanged()), this, SLOT(onListSelectionChanged())); - - connect(myFilter, SIGNAL(clicked()), this, SLOT(setFilters())); - connect(aAddBtn, SIGNAL(clicked()), this, SLOT(onAdd())); - connect(aRemoveBtn, SIGNAL(clicked()), this, SLOT(onRemove())); - connect(aSortBtn, SIGNAL(clicked()), this, SLOT(onSort())); - - connect(mySelectSubMesh, SIGNAL(toggled(bool)), this, SLOT(onSelectSubMesh(bool))); - connect(mySelectGroup, SIGNAL(toggled(bool)), this, SLOT(onSelectGroup(bool))); - connect(mySubMeshBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); - connect(myGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); - connect(myGeomGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); - - connect(aOKBtn, SIGNAL(clicked()), this, SLOT(onOK())); - connect(aApplyBtn, SIGNAL(clicked()), this, SLOT(onApply())); - connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(onClose())); - - /* Init selection */ - mySMESHGUI->SetActiveDialogBox(this); - mySMESHGUI->SetState(800); - - mySelectionMode = -1; - myMeshFilter = new SMESH_TypeFilter(MESH); - mySubMeshFilter = new SMESH_TypeFilter(SUBMESH); - myGroupFilter = new SMESH_TypeFilter(GROUP); - - connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(onDeactivate())); - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(onClose())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged())); - - myGrpTypeGroup->setButton(myGrpTypeGroup->id(rb1)); // VSR !!! - onGrpTypeChanged(myGrpTypeGroup->id(rb1)); // VSR!!! - - if (myMesh->_is_nil() ) - myTypeGroup->setButton(0); - - updateButtons(); -} - -//================================================================================= -// function : ~SMESHGUI_GroupDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_GroupDlg::~SMESHGUI_GroupDlg() -{ - // no need to delete child widgets, Qt does it all for us - if ( myFilterDlg != 0 ) - { - myFilterDlg->reparent( 0, QPoint() ); - delete myFilterDlg; - } -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::init (SMESH::SMESH_Mesh_ptr theMesh) -{ - mySelectionMgr->installFilter(myMeshFilter); - - /* init data from current selection */ - myMesh = SMESH::SMESH_Mesh::_duplicate(theMesh); - myGroup = SMESH::SMESH_Group::_nil(); - - myActor = SMESH::FindActorByObject(myMesh); - SMESH::SetPickable(myActor); - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - if( !aList.IsEmpty() ) - { - QString aName = aList.First()->getName(); - myMeshGroupLine->setText(aName) ; - myMeshGroupLine->home( false ); - } - - myCurrentLineEdit = 0; - - myTypeGroup->setButton(0); - onTypeChanged(0); -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::init (SMESH::SMESH_Group_ptr theGroup) -{ - myMesh = theGroup->GetMesh(); - myGroup = SMESH::SMESH_Group::_duplicate(theGroup); - - myActor = SMESH::FindActorByObject(myMesh); - if ( !myActor ) - myActor = SMESH::FindActorByObject(myGroup); - SMESH::SetPickable(myActor); - - int aType = 0; - switch(theGroup->GetType()) { - case SMESH::NODE: aType= 0; break; - case SMESH::EDGE: aType = 1; break; - case SMESH::FACE: aType = 2; break; - case SMESH::VOLUME: aType = 3; break; - } - - myName->setText(myGroup->GetName()); - myName->home(false); - myMeshGroupLine->setText(myGroup->GetName()); - - myCurrentLineEdit = 0; - myTypeGroup->setButton(aType); - myElements->clear(); - setSelectionMode(aType); - myTypeId = aType; - - myIdList.clear(); - if (!theGroup->IsEmpty()) { - SMESH::long_array_var anElements = myGroup->GetListOfID(); - int k = anElements->length(); - for (int i = 0; i < k; i++) { - myIdList.append(anElements[i]); - myElements->insertItem(QString::number(anElements[i])); - } - myElements->selectAll(true); - } -} - -//================================================================================= -// function : updateButtons() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::updateButtons() -{ - bool enable; - - if (myGrpTypeId == 0) - enable = !myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0; - else if (myGrpTypeId == 1) - enable = !myName->text().stripWhiteSpace().isEmpty() && !CORBA::is_nil( myGeomGroup ); - QPushButton* aBtn; - aBtn = (QPushButton*) child("ok", "QPushButton"); - if (aBtn) aBtn->setEnabled(enable); - aBtn = (QPushButton*) child("apply", "QPushButton"); - if (aBtn) aBtn->setEnabled(enable); -} - -//================================================================================= -// function : onNameChanged() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onNameChanged (const QString& text) -{ - updateButtons(); -} - -//================================================================================= -// function : onTypeChanged() -// purpose : Group elements type radio button management -//================================================================================= -void SMESHGUI_GroupDlg::onTypeChanged (int id) -{ - if (myTypeId != id) { - myElements->clear(); - if (myCurrentLineEdit == 0) - setSelectionMode(id); - } - myTypeId = id; -} - -//================================================================================= -// function : onGrpTypeChanged() -// purpose : Group type radio button management -//================================================================================= -void SMESHGUI_GroupDlg::onGrpTypeChanged (int id) -{ - if (myGrpTypeId != id) { - myWGStack->raiseWidget( id ); - onSelectGeomGroup(id == 1); - } - myGrpTypeId = id; -} - -//================================================================================= -// function : setSelectionMode() -// purpose : Radio button management -//================================================================================= -void SMESHGUI_GroupDlg::setSelectionMode (int theMode) -{ - // PAL7314 - if (myMesh->_is_nil()) - return; - - if (mySelectionMode != theMode) { - mySelectionMgr->clearSelected(); - mySelectionMgr->clearFilters(); - SMESH::SetPointRepresentation(false); - if (theMode < 4) { - switch (theMode) { - case 0: - if (myActor) - myActor->SetPointRepresentation(true); - else - SMESH::SetPointRepresentation(true); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - break; - case 1: - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - break; - case 2: - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - break; - default: - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(VolumeSelection); - } - } else { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - if (theMode == 4) - mySelectionMgr->installFilter(mySubMeshFilter); - else if (theMode == 5) - mySelectionMgr->installFilter(myGroupFilter); - else if (theMode == 6) - mySelectionMgr->installFilter(myMeshFilter); - } - mySelectionMode = theMode; - } -} - -//================================================================================= -// function : onApply() -// purpose : -//================================================================================= -bool SMESHGUI_GroupDlg::onApply() -{ - if (mySMESHGUI->isActiveStudyLocked()) - return false; - - if (myGrpTypeId == 0 && - !myName->text().stripWhiteSpace().isEmpty() && - myElements->count() > 0) { - mySelectionMgr->clearSelected(); - if (myGroup->_is_nil()) { - SMESH::ElementType aType = SMESH::ALL; - switch(myTypeId) { - case 0: aType = SMESH::NODE; break; - case 1: aType = SMESH::EDGE; break; - case 2: aType = SMESH::FACE; break; - case 3: aType = SMESH::VOLUME; break; - } - SMESH::long_array_var anIdList = new SMESH::long_array; - int i, k = myElements->count(); - anIdList->length(k); - QListBoxItem* anItem; - for (i = 0, anItem = myElements->firstItem(); anItem != 0; i++, anItem = anItem->next()) { - anIdList[i] = anItem->text().toInt(); - } - - myGroup = SMESH::AddGroup(myMesh, aType, myName->text()); - myGroup->Add(anIdList.inout()); - - /* init for next operation */ - myName->setText(""); - myElements->clear(); - myGroup = SMESH::SMESH_Group::_nil(); - - } else { - myGroup->SetName(myName->text()); - - QValueList aAddList; - QValueList::iterator anIt; - QListBoxItem* anItem; - - for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) { - int anId = anItem->text().toInt(); - if ((anIt = myIdList.find(anId)) == myIdList.end()) - aAddList.append(anId); - else - myIdList.remove(anIt); - } - if (!aAddList.empty()) { - SMESH::long_array_var anIdList = new SMESH::long_array; - anIdList->length(aAddList.count()); - int i; - for (i = 0, anIt = aAddList.begin(); anIt != aAddList.end(); anIt++, i++) - anIdList[i] = *anIt; - myGroup->Add(anIdList.inout()); - } - if (!myIdList.empty()) { - SMESH::long_array_var anIdList = new SMESH::long_array; - anIdList->length(myIdList.count()); - int i; - for (i = 0, anIt = myIdList.begin(); anIt != myIdList.end(); anIt++, i++) - anIdList[i] = *anIt; - myGroup->Remove(anIdList.inout()); - } - /* init for next operation */ - myIdList.clear(); - for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) - myIdList.append(anItem->text().toInt()); - } - - mySMESHGUI->updateObjBrowser(true); - SMESH::UpdateView(); // asv: fix of BUG PAL5515 - mySelectionMgr->clearSelected(); - return true; - } else if (myGrpTypeId == 1 && - !myName->text().stripWhiteSpace().isEmpty() && - !CORBA::is_nil(myGeomGroup)) - { - SMESH::ElementType aType = SMESH::ALL; - switch (myTypeId) { - case 0: aType = SMESH::NODE; break; - case 1: aType = SMESH::EDGE; break; - case 2: aType = SMESH::FACE; break; - case 3: aType = SMESH::VOLUME; break; - } - - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - GEOM::GEOM_IGroupOperations_var aGroupOp = - SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); - - SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = - myMesh->CreateGroupFromGEOM(aType, myName->text(),myGeomGroup); - - mySMESHGUI->updateObjBrowser(true); - mySelectionMgr->clearSelected(); - /* init for next operation */ - myName->setText(""); - return true; - } - - return false; -} - -//================================================================================= -// function : onOK() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onOK() -{ - if ( onApply() ) - onClose(); -} - -//================================================================================= -// function : onListSelectionChanged() -// purpose : Called when selection in element list is changed -//================================================================================= -void SMESHGUI_GroupDlg::onListSelectionChanged() -{ - // MESSAGE("SMESHGUI_GroupDlg::onListSelectionChanged(); myActor = " << myActor); - if( myIsBusy || !myActor) return; - myIsBusy = true; - - if (myCurrentLineEdit == 0) { - mySelectionMgr->clearSelected(); - TColStd_MapOfInteger aIndexes; - QListBoxItem* anItem; - for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) { - if (anItem->isSelected()) { - int anId = anItem->text().toInt(); - aIndexes.Add(anId); - } - } - mySelector->AddOrRemoveIndex(myActor->getIO(), aIndexes, false); - SALOME_ListIO aList; - aList.Append(myActor->getIO()); - mySelectionMgr->setSelectedObjects(aList,false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myActor->getIO(), true, true ); - } - myIsBusy = false; -} - -//================================================================================= -// function : onObjectSelectionChanged() -// purpose : Called when selection in 3D view or ObjectBrowser is changed -//================================================================================= -void SMESHGUI_GroupDlg::onObjectSelectionChanged() -{ - if ( myIsBusy || !isEnabled()) return; - myIsBusy = true; - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - int aNbSel = aList.Extent(); - myElements->clearSelection(); - - if (myCurrentLineEdit) { - myCurrentLineEdit->setText(""); - QString aString = ""; - - if (myCurrentLineEdit == myMeshGroupLine) { - mySelectSubMesh->setEnabled(false); - mySelectGroup->setEnabled(false); - myGroupLine->setText(""); - mySubMeshLine->setText(""); - - myGeomGroupBtn->setEnabled(false); - myGeomGroupLine->setEnabled(false); - myGeomGroupLine->setText(""); - if (!myCreate) - myName->setText(""); - - myElements->clear(); - - if (aNbSel != 1 ) { - myGroup = SMESH::SMESH_Group::_nil(); - myMesh = SMESH::SMESH_Mesh::_nil(); - myIsBusy = false; - return; - } - Handle(SALOME_InteractiveObject) IO = aList.First(); - - if (myCreate) { - myMesh = SMESH::IObjectToInterface(IO); - if (myMesh->_is_nil()) - { - myIsBusy = false; - return; - } - myGroup = SMESH::SMESH_Group::_nil(); - - myActor = SMESH::FindActorByObject(myMesh); - SMESH::SetPickable(myActor); - - aString = aList.First()->getName(); - myMeshGroupLine->setText(aString) ; - myMeshGroupLine->home( false ); - - mySelectSubMesh->setEnabled(true); - mySelectGroup->setEnabled(true); - myGeomGroupBtn->setEnabled(true); - myGeomGroupLine->setEnabled(true); - updateButtons(); - } else { - SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(IO); - if (aGroup->_is_nil()) - { - myIsBusy = false; - return; - } - myIsBusy = false; - myCurrentLineEdit = 0; - init(aGroup); - myIsBusy = true; - mySelectSubMesh->setEnabled(true); - mySelectGroup->setEnabled(true); - myGeomGroupBtn->setEnabled(true); - myGeomGroupLine->setEnabled(true); - } - myCurrentLineEdit = 0; - myIsBusy = false; - if (!myCreate) - return; - - if (myTypeId == -1) - onTypeChanged(0); - else { - myElements->clear(); - setSelectionMode(myTypeId); - } - - myIsBusy = false; - return; - - } else if (myCurrentLineEdit == myGeomGroupLine) { - if (aNbSel != 1) { - myGeomGroup = GEOM::GEOM_Object::_nil(); - myIsBusy = false; - return; - } - - Standard_Boolean testResult = Standard_False; - myGeomGroup = GEOMBase::ConvertIOinGEOMObject(aList.First(), testResult); - - // Check if the object is a geometry group - if (!testResult || CORBA::is_nil(myGeomGroup)) { - myGeomGroup = GEOM::GEOM_Object::_nil(); - myIsBusy = false; - return; - } - // Check if group constructed on the same shape as a mesh or on its child - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - GEOM::GEOM_IGroupOperations_var anOp = - SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); - - // The main shape of the group - GEOM::GEOM_Object_var aGroupMainShape; - if (myGeomGroup->GetType() == 37) - aGroupMainShape = anOp->GetMainShape(myGeomGroup); - else - aGroupMainShape = GEOM::GEOM_Object::_duplicate(myGeomGroup); - _PTR(SObject) aGroupMainShapeSO = - //aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(aGroupMainShape)); - aStudy->FindObjectIOR(aGroupMainShape->GetStudyEntry()); - - // The mesh SObject - _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh); - if (!aMeshSO) { - myGeomGroup = GEOM::GEOM_Object::_nil(); - myIsBusy = false; - return; - } - _PTR(SObject) anObj, aRef; - bool isRefOrSubShape = false; - if (aMeshSO->FindSubObject(1, anObj) && anObj->ReferencedObject(aRef)) { - //if (strcmp(aRef->GetID(), aGroupMainShapeSO->GetID()) == 0) { - if (aRef->GetID() == aGroupMainShapeSO->GetID()) { - isRefOrSubShape = true; - } else { - _PTR(SObject) aFather = aGroupMainShapeSO->GetFather(); - _PTR(SComponent) aComponent = aGroupMainShapeSO->GetFatherComponent(); - //while (!isRefOrSubShape && strcmp(aFather->GetID(), aComponent->GetID()) != 0) { - while (!isRefOrSubShape && aFather->GetID() != aComponent->GetID()) { - //if (strcmp(aRef->GetID(), aFather->GetID()) == 0) - if (aRef->GetID() == aFather->GetID()) - isRefOrSubShape = true; - else - aFather = aFather->GetFather(); - } - } - } - if (!isRefOrSubShape) { - myGeomGroup = GEOM::GEOM_Object::_nil(); - myIsBusy = false; - return; - } - } - - if(aNbSel >= 1) { - if(aNbSel > 1) { - if(myCurrentLineEdit == mySubMeshLine) - aString = tr("SMESH_SUBMESH_SELECTED").arg(aNbSel); - else if(myCurrentLineEdit == myGroupLine || myCurrentLineEdit == myGeomGroupLine) - aString = tr("SMESH_GROUP_SELECTED").arg(aNbSel); - } else { - aString = aList.First()->getName(); - } - } - - myCurrentLineEdit->setText(aString); - myCurrentLineEdit->home(false); - - updateButtons(); - - } else { - if (aNbSel == 1 && myActor ) { - QString aListStr = ""; - int aNbItems = 0; - if (myTypeId == 0) { - aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); - } else { - aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr); - } - if (aNbItems > 0) { - QStringList anElements = QStringList::split(" ", aListStr); - QListBoxItem* anItem = 0; - for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) { - anItem = myElements->findItem(*it, Qt::ExactMatch); - if (anItem) myElements->setSelected(anItem, true); - } - } - } - } - - if (!myActor) { - if (!myGroup->_is_nil()) - myActor = SMESH::FindActorByObject(myGroup); - else - myActor = SMESH::FindActorByObject(myMesh); - } - - myIsBusy = false; -} - -//================================================================================= -// function : onSelectSubMesh() -// purpose : Called when selection in 3D view or ObjectBrowser is changed -//================================================================================= -void SMESHGUI_GroupDlg::onSelectSubMesh(bool on) -{ - if (on) { - if (mySelectGroup->isChecked()) { - mySelectGroup->setChecked(false); - } - //VSR: else if (mySelectGeomGroup->isChecked()) { - //VSR: mySelectGeomGroup->setChecked(false); - //VSR: } - myCurrentLineEdit = mySubMeshLine; - setSelectionMode(4); - } - else { - mySubMeshLine->setText(""); - myCurrentLineEdit = 0; - if (myTypeId != -1) - setSelectionMode(myTypeId); - } - mySubMeshBtn->setEnabled(on); - mySubMeshLine->setEnabled(on); -} - - -//================================================================================= -// function : (onSelectGroup) -// purpose : Called when selection in 3D view or ObjectBrowser is changed -//================================================================================= -void SMESHGUI_GroupDlg::onSelectGroup(bool on) -{ - if (on) { - if (mySelectSubMesh->isChecked()) { - mySelectSubMesh->setChecked(false); - } - myCurrentLineEdit = myGroupLine; - setSelectionMode(5); - } - else { - myGroupLine->setText(""); - myCurrentLineEdit = 0; - if (myTypeId != -1) - setSelectionMode(myTypeId); - } - myGroupBtn->setEnabled(on); - myGroupLine->setEnabled(on); -} - - -//================================================================================= -// function : (onSelectGeomGroup) -// purpose : Called when selection in 3D view or ObjectBrowser is changed -//================================================================================= -void SMESHGUI_GroupDlg::onSelectGeomGroup(bool on) -{ - if (on) { - if (mySelectSubMesh->isChecked()) { - mySelectSubMesh->setChecked(false); - } - else if (mySelectGroup->isChecked()) { - mySelectGroup->setChecked(false); - } - myCurrentLineEdit = myGeomGroupLine; - setSelectionMode(7); - } - else { - myGeomGroupLine->setText(""); - myCurrentLineEdit = 0; - if (myTypeId != -1) - setSelectionMode(myTypeId); - } -} - - -//================================================================================= -// function : setCurrentSelection() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::setCurrentSelection() -{ - QPushButton* send = (QPushButton*)sender(); - myCurrentLineEdit = 0; - if (send == myMeshGroupBtn) { - myCurrentLineEdit = myMeshGroupLine; - if (myCreate) - setSelectionMode(6); - else - setSelectionMode(5); - onObjectSelectionChanged(); - } - else if (send == mySubMeshBtn) { - myCurrentLineEdit = mySubMeshLine; - onObjectSelectionChanged(); - } - else if (send == myGroupBtn) { - myCurrentLineEdit = myGroupLine; - onObjectSelectionChanged(); - } - else if (send == myGeomGroupBtn) { - myCurrentLineEdit = myGeomGroupLine; - setSelectionMode(7); - onObjectSelectionChanged(); - } -} - - -//================================================================================= -// function : setFilters() -// purpose : SLOT. Called when "Filter" button pressed. -//================================================================================= -void SMESHGUI_GroupDlg::setFilters() -{ - SMESH::ElementType aType = SMESH::ALL; - switch ( myTypeId ) - { - case 0 : aType = SMESH::NODE; break; - case 1 : aType = SMESH::EDGE; break; - case 2 : aType = SMESH::FACE; break; - case 3 : aType = SMESH::VOLUME; break; - default: return; - } - - if ( myFilterDlg == 0 ) - { - myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, aType ); - connect( myFilterDlg, SIGNAL( Accepted() ), SLOT( onFilterAccepted() ) ); - } - else - myFilterDlg->Init( aType ); - - myFilterDlg->SetSelection(); - myFilterDlg->SetMesh( myMesh ); - myFilterDlg->SetSourceWg( myElements ); - - myFilterDlg->show(); -} - -//================================================================================= -// function : onFilterAccepted() -// purpose : SLOT. Called when Filter dlg closed with OK button. -// Uncheck "Select submesh" and "Select group" checkboxes -//================================================================================= -void SMESHGUI_GroupDlg::onFilterAccepted() -{ - if ( mySelectSubMesh->isChecked() || mySelectGroup->isChecked() ) - { - mySelectionMode = myTypeId; - mySelectSubMesh->setChecked( false ); - mySelectGroup->setChecked( false ); - } -} - -//================================================================================= -// function : onAdd() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onAdd() -{ - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - int aNbSel = aList.Extent(); - - if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return; - - myIsBusy = true; - - SMESH::ElementType aType = SMESH::ALL; - switch(myTypeId) { - case 0: aType = SMESH::NODE; break; - case 1: aType = SMESH::EDGE; break; - case 2: aType = SMESH::FACE; break; - case 3: aType = SMESH::VOLUME; break; - } - - if (myCurrentLineEdit == 0) { - //if (aNbSel != 1) { myIsBusy = false; return; } - QString aListStr = ""; - int aNbItems = 0; - if (myTypeId == 0) { - aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); - } - else { - aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr); - } - if (aNbItems > 0) { - QStringList anElements = QStringList::split(" ", aListStr); - QListBoxItem* anItem = 0; - for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) { - anItem = myElements->findItem(*it, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(*it); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - } else if (myCurrentLineEdit == mySubMeshLine) { - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - SALOME_ListIteratorOfListIO anIt (aList); - for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_subMesh_var aSubMesh = - SMESH::IObjectToInterface(anIt.Value()); - if (!aSubMesh->_is_nil()) { - // check if mesh is the same - if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) { - try { - SMESH::long_array_var anElements = aSubMesh->GetElementsByType(aType); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - anItem = myElements->findItem(aText, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(aText); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - catch (const SALOME::SALOME_Exception& ex) { - SalomeApp_Tools::QtCatchCorbaException(ex); - } - } - } - } - mySelectSubMesh->setChecked(false); - myIsBusy = false; - onListSelectionChanged(); - - } else if (myCurrentLineEdit == myGroupLine) { - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - SALOME_ListIteratorOfListIO anIt (aList); - for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_Group_var aGroup = - SMESH::IObjectToInterface(anIt.Value()); - if (!aGroup->_is_nil()) { - // check if mesh is the same - if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) { - SMESH::long_array_var anElements = aGroup->GetListOfID(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - anItem = myElements->findItem(aText, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(aText); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - } - } - mySelectGroup->setChecked(false); - myIsBusy = false; - onListSelectionChanged(); - - } else if (myCurrentLineEdit == myGeomGroupLine && !CORBA::is_nil(myGeomGroup)) { - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - GEOM::GEOM_IGroupOperations_var aGroupOp = - SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); - - SMESH::ElementType aGroupType = SMESH::ALL; - switch(aGroupOp->GetType(myGeomGroup)) { - case 7: aGroupType = SMESH::NODE; break; - case 6: aGroupType = SMESH::EDGE; break; - case 4: aGroupType = SMESH::FACE; break; - case 2: aGroupType = SMESH::VOLUME; break; - default: myIsBusy = false; return; - } - - if (aGroupType == aType) { - _PTR(SObject) aGroupSO = - //aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(myGeomGroup)); - aStudy->FindObjectIOR(myGeomGroup->GetStudyEntry()); - // Construct filter - SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager(); - SMESH::Filter_var aFilter = aFilterMgr->CreateFilter(); - SMESH::BelongToGeom_var aBelongToGeom = aFilterMgr->CreateBelongToGeom();; - aBelongToGeom->SetGeom(myGeomGroup); - aBelongToGeom->SetShapeName(aGroupSO->GetName().c_str()); - aBelongToGeom->SetElementType(aType); - aFilter->SetPredicate(aBelongToGeom); - - SMESH::long_array_var anElements = aFilter->GetElementsId(myMesh); - - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - anItem = myElements->findItem(aText, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(aText); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - - //VSR: mySelectGeomGroup->setChecked(false); - myIsBusy = false; - onListSelectionChanged(); - } - myIsBusy = false; - // mySelectionMgr->clearSelected(); - updateButtons(); -} - -//================================================================================= -// function : onRemove() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onRemove() -{ - myIsBusy = true; - if (myCurrentLineEdit == 0) { - for (int i = myElements->count(); i > 0; i--) { - if (myElements->isSelected(i-1)) { - myElements->removeItem(i-1); - } - } - } else { - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - int aNbSel = aList.Extent(); - - if (aNbSel == 0) { myIsBusy = false; return; } - - SMESH::ElementType aType = SMESH::ALL; - switch(myTypeId) { - case 0: aType = SMESH::NODE; break; - case 1: aType = SMESH::EDGE; break; - case 2: aType = SMESH::FACE; break; - case 3: aType = SMESH::VOLUME; break; - } - - if (myCurrentLineEdit == mySubMeshLine) { - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - SALOME_ListIteratorOfListIO anIt (aList); - for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(anIt.Value()); - if (!aSubMesh->_is_nil()) { - // check if mesh is the same - if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) { - if (aType == SMESH::NODE) { - try { - SMESH::long_array_var anElements = aSubMesh->GetNodesId(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch); - if (anItem) delete anItem; - } - } - catch (const SALOME::SALOME_Exception& ex) { - SalomeApp_Tools::QtCatchCorbaException(ex); - } - } - else { - try { - SMESH::long_array_var anElements = aSubMesh->GetElementsId(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch); - if (anItem) delete anItem; - } - } - catch (const SALOME::SALOME_Exception& ex) { - SalomeApp_Tools::QtCatchCorbaException(ex); - } - } - } - } - } - } - else if (myCurrentLineEdit == myGroupLine) { - Standard_Boolean aRes; - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - SALOME_ListIteratorOfListIO anIt (aList); - for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(anIt.Value()); - if (aRes && !aGroup->_is_nil()) { - // check if mesh is the same - if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) { - SMESH::long_array_var anElements = aGroup->GetListOfID(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch); - if (anItem) delete anItem; - } - } - } - } - } - } - myIsBusy = false; - updateButtons(); -} - -//================================================================================= -// function : onSort() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onSort() -{ - // PAL5412: sorts items in ascending by "string" value - // myElements->sort(true); - // myElements->update(); - int i, k = myElements->count(); - if (k > 0) { - myIsBusy = true; - QStringList aSelected; - std::vector anArray(k); - // QMemArray anArray(k); - QListBoxItem* anItem; - // fill the array - for (anItem = myElements->firstItem(), i = 0; anItem != 0; anItem = anItem->next(), i++) { - anArray[i] = anItem->text().toInt(); - if (anItem->isSelected()) - aSelected.append(anItem->text()); - } - // sort & update list - std::sort(anArray.begin(), anArray.end()); - // anArray.sort(); - myElements->clear(); - for (i = 0; i < k; i++) { - myElements->insertItem(QString::number(anArray[i])); - } - for (QStringList::iterator it = aSelected.begin(); it != aSelected.end(); ++it) { - anItem = myElements->findItem(*it, Qt::ExactMatch); - if (anItem) myElements->setSelected(anItem, true); - } - myIsBusy = false; - } -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::closeEvent (QCloseEvent*) -{ - onClose(); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg::onClose -// purpose : SLOT called when "Close" button pressed. Close dialog -//================================================================================= -void SMESHGUI_GroupDlg::onClose() -{ - if (SMESH::GetCurrentVtkView()) { - SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters - SMESH::SetPointRepresentation(false); - SMESH::SetPickable(); - } - - mySelectionMgr->clearSelected(); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->clearFilters(); - mySMESHGUI->ResetState(); - - reject(); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg::onDeactivate -// purpose : SLOT called when dialog must be deativated -//================================================================================= -void SMESHGUI_GroupDlg::onDeactivate() -{ - mySMESHGUI->ResetState(); - setEnabled(false); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg::enterEvent -// purpose : Event filter -//================================================================================= -void SMESHGUI_GroupDlg::enterEvent (QEvent*) -{ - if (!isEnabled()) { - mySMESHGUI->EmitSignalDeactivateDialog(); - setEnabled(true); - mySelectionMode = -1; - setSelectionMode(myTypeId); - //mySMESHGUI->SetActiveDialogBox((QDialog*)this); - mySMESHGUI->SetActiveDialogBox(this); - mySMESHGUI->SetState(800); - } -} - -//================================================================================= -// function : hideEvent -// purpose : caused by ESC key -//================================================================================= -void SMESHGUI_GroupDlg::hideEvent (QHideEvent*) -{ - if (!isMinimized()) - onClose(); -} diff --git a/src/SMESHGUI/SMESHGUI_GroupUtils.cxx b/src/SMESHGUI/SMESHGUI_GroupUtils.cxx deleted file mode 100644 index d2aa17f3a..000000000 --- a/src/SMESHGUI/SMESHGUI_GroupUtils.cxx +++ /dev/null @@ -1,53 +0,0 @@ -// 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 - - -#include "SMESHGUI_GroupUtils.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" - -#include "SUIT_Session.h" -#include "SalomeApp_Application.h" -#include "SalomeApp_Tools.h" - -#include "OB_Browser.h" - -namespace SMESH -{ - - SMESH::SMESH_Group_var AddGroup( SMESH::SMESH_Mesh_ptr theMesh, - SMESH::ElementType theType, - const char* theGroupName ) - { - SMESH::SMESH_Group_var aGroup; - try { - if ( !theMesh->_is_nil() ) - aGroup = theMesh->CreateGroup( theType, theGroupName ); - } - catch( const SALOME::SALOME_Exception& S_ex ) { - SalomeApp_Tools::QtCatchCorbaException( S_ex ); - } - //SalomeApp_Application* app = - // dynamic_cast(SUIT_Session::session()->activeApplication()); - //if (app) app->objectBrowser()->updateTree(); - SMESHGUI::GetSMESHGUI()->updateObjBrowser(); - return aGroup._retn(); - } -} diff --git a/src/SMESHGUI/SMESHGUI_GroupUtils.h b/src/SMESHGUI/SMESHGUI_GroupUtils.h deleted file mode 100644 index 9cd9783c1..000000000 --- a/src/SMESHGUI/SMESHGUI_GroupUtils.h +++ /dev/null @@ -1,36 +0,0 @@ -// 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 - -#ifndef SMESHGUI_GroupUtils_HeaderFile -#define SMESHGUI_GroupUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Group) - - -namespace SMESH{ - - SMESH::SMESH_Group_var AddGroup(SMESH::SMESH_Mesh_ptr theMesh, - SMESH::ElementType theType, - const char* theGroupName); -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_IdValidator.h b/src/SMESHGUI/SMESHGUI_IdValidator.h deleted file mode 100644 index 680dacba8..000000000 --- a/src/SMESHGUI/SMESHGUI_IdValidator.h +++ /dev/null @@ -1,68 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_IdValidator.h -// Author : Edward AGAPOV -// Module : SMESH -// $Header: /dn05/salome/PAL/SMESH/SMESH_SRC/src/SMESHGUI/SMESHGUI_IdValidator.h - -#ifndef SMESHGUI_IdValidator_HeaderFile -#define SMESHGUI_IdValidator_HeaderFile - -#include - -// validator for manual input of Ids - -class SMESHGUI_IdValidator: public QValidator -{ - public: - - SMESHGUI_IdValidator(QWidget * parent, const char * name = 0, const int maxNbId = 0): - QValidator(parent,name), myMaxNbId(maxNbId) {} - - State validate ( QString & text, int & pos) const - { - text.replace( QRegExp(" *[^0-9]+ *"), " " ); - if ( myMaxNbId && text.length() > myMaxNbId) { // truncate extra ids - int ind = 0, nbId = 0; - while ( ind < text.length() ) { - if ( text.at( ind ) != ' ' ) { - if ( ++nbId > myMaxNbId ) { - text.truncate( ind ); - break; - } - ind = text.find( ' ', ind ); - if ( ind < 0 ) break; - } - ind++; - } - } - if ( pos > text.length() ) - pos = text.length(); - return Acceptable; - } - - private: - int myMaxNbId; -}; - -#endif diff --git a/src/SMESHGUI/SMESHGUI_MeshUtils.cxx b/src/SMESHGUI/SMESHGUI_MeshUtils.cxx deleted file mode 100644 index 9c8d313c6..000000000 --- a/src/SMESHGUI/SMESHGUI_MeshUtils.cxx +++ /dev/null @@ -1,47 +0,0 @@ -// 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 - - -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_Utils.h" - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Group) - -namespace SMESH -{ - - SMESH_Mesh_var GetMeshByIO(const Handle(SALOME_InteractiveObject)& theIO) - { - CORBA::Object_var anObj = IObjectToObject(theIO); - if(!CORBA::is_nil(anObj)){ - SMESH_Mesh_var aMesh = SMESH_Mesh::_narrow(anObj); - if(!CORBA::is_nil(aMesh)) - return aMesh; - SMESH_GroupBase_var aGroup = SMESH_GroupBase::_narrow(anObj); - if(!CORBA::is_nil(aGroup)) - return aGroup->GetMesh(); - SMESH_subMesh_var aSubMesh = SMESH_subMesh::_narrow(anObj); - if(!CORBA::is_nil(aSubMesh)) - return aSubMesh->GetFather(); - } - return SMESH_Mesh::_nil(); - } - -} diff --git a/src/SMESHGUI/SMESHGUI_MeshUtils.h b/src/SMESHGUI/SMESHGUI_MeshUtils.h deleted file mode 100644 index 011de3404..000000000 --- a/src/SMESHGUI/SMESHGUI_MeshUtils.h +++ /dev/null @@ -1,36 +0,0 @@ -// 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 - -#ifndef SMESHGUI_MeshUtils_HeaderFile -#define SMESHGUI_MeshUtils_HeaderFile - -#include "SALOME_InteractiveObject.hxx" - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Mesh) - - -namespace SMESH{ - - SMESH_Mesh_var GetMeshByIO(const Handle(SALOME_InteractiveObject)& theIO); - -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_PatternUtils.cxx b/src/SMESHGUI/SMESHGUI_PatternUtils.cxx deleted file mode 100644 index 718162f2b..000000000 --- a/src/SMESHGUI/SMESHGUI_PatternUtils.cxx +++ /dev/null @@ -1,31 +0,0 @@ -// 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 - - -#include "SMESHGUI_PatternUtils.h" - -#include "SMESHGUI.h" - -namespace SMESH { - - SMESH::SMESH_Pattern_var GetPattern() - { - return SMESHGUI::GetSMESHGen()->GetPattern(); - } -} diff --git a/src/SMESHGUI/SMESHGUI_PatternUtils.h b/src/SMESHGUI/SMESHGUI_PatternUtils.h deleted file mode 100644 index fb09d01d9..000000000 --- a/src/SMESHGUI/SMESHGUI_PatternUtils.h +++ /dev/null @@ -1,34 +0,0 @@ -// 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 - -#ifndef SMESHGUI_PatternUtils_HeaderFile -#define SMESHGUI_PatternUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Pattern) - - -namespace SMESH{ - - SMESH::SMESH_Pattern_var GetPattern(); - -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_PatternWidget.cxx b/src/SMESHGUI/SMESHGUI_PatternWidget.cxx deleted file mode 100644 index 178800a62..000000000 --- a/src/SMESHGUI/SMESHGUI_PatternWidget.cxx +++ /dev/null @@ -1,165 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_PatternWidget.cxx -// Author : Michael ZORIN -// Module : SMESH -// $Header: - -#include "SMESHGUI_PatternWidget.h" - -//Qt includes -#include -#include - - -//================================================================================= -// class : SMESHGUI_PatternWidget() -// purpose : -//================================================================================= -SMESHGUI_PatternWidget::SMESHGUI_PatternWidget (QWidget* parent, const char* name, WFlags fl) - : QFrame(parent, name, WStyle_Customize) -{ - myMinU = myMinV = myMaxU = myMaxV = 0; - setMinimumHeight(150); - repaint(); -} - -//================================================================================= -// function : ~SMESHGUI_PatternWidget() -// purpose : -//================================================================================= -SMESHGUI_PatternWidget::~SMESHGUI_PatternWidget() -{ -} - -//================================================================================= -// function : SetPoints() -// purpose : -//================================================================================= -void SMESHGUI_PatternWidget::SetPoints (PointVector thePoints, - QValueVector theKeys, - ConnectivityVector theConnections) -{ - myPoints = thePoints; - myKeys = theKeys; - myConnections = theConnections; - - if (!thePoints.size()) - return; - - myMinU = myMaxU = (thePoints[0]).x; - myMinV = myMaxV = (thePoints[0]).y; - double x, y; - - for (int i = 1; i < thePoints.size(); i++) { - x = (thePoints[i]).x; - y = (thePoints[i]).y; - - if (myMinU > x) - myMinU = x; - if (myMaxU < x) - myMaxU = x; - if (myMinV > y) - myMinV = y; - if (myMaxV < y) - myMaxV = y; - } - - repaint(); -} - -static const int Shift = 4; // shift of the point number from point -static const int Border = 20; - -//================================================================================= -// function : paintEvent() -// purpose : -//================================================================================= -void SMESHGUI_PatternWidget::paintEvent (QPaintEvent*) -{ - QPainter paint (this); - paint.setBrush(Qt::SolidPattern); - - //Draw points - const int aRadius = 3; // radius of a point - - for (int i = 0; i < myKeys.size() && i < myPoints.size(); i++) { - SMESH::PointStruct aPoint = myPoints[ myKeys[i] ]; - QPoint aQPnt = MapCoords(aPoint.x, aPoint.y); - - paint.drawPie(aQPnt.x() - aRadius, aQPnt.y() - aRadius, aRadius*2, aRadius*2, 5760, 5760); - paint.drawText(aQPnt.x() + Shift, aQPnt.y() - Shift, QString::number(i+1)); - } - - //Draw lines - for (int i = 0; i < myConnections.size(); i++) { - QValueVector aCVector = myConnections[i]; - - if (aCVector.size() == 0) - continue; - - SMESH::PointStruct aPoint = myPoints[ aCVector[0] ]; - const QPoint aBeginPnt = MapCoords(aPoint.x, aPoint.y); - QPoint aFirstPnt = aBeginPnt, aSecondPnt; - - for (int j = 1; j < aCVector.size(); j++) { - aPoint = myPoints[ aCVector[j] ]; - aSecondPnt = MapCoords(aPoint.x, aPoint.y); - paint.drawLine(aFirstPnt, aSecondPnt); - aFirstPnt = aSecondPnt; - } - - paint.drawLine(aBeginPnt, aSecondPnt); - } -} - -//================================================================================= -// function : MapCoords() -// purpose : -//================================================================================= -QPoint SMESHGUI_PatternWidget::MapCoords (const double u, const double v) -{ - int aWidth = width() - 2*Border; - int aHeight = height() - 2*Border; - - double aUBound = myMaxU - myMinU; - double aVBound = myMaxV - myMinV; - - double aUScale = aWidth/aUBound; - double aVScale = aHeight/aVBound; - - double aScale; - aUScale <= aVScale ? aScale = aUScale : aScale = aVScale; - - double aUMiddle = (myMaxU + myMinU)/2; - double aVMiddle = (myMaxV + myMinV)/2; - - int x = int(aWidth/2 + (u - aUMiddle)*aScale + Border - Shift); - - int y = int(aHeight/2 + (aVMiddle - v)*aScale + Border + Shift); - - QPoint aPoint = QPoint(x, y); - - return aPoint; -} diff --git a/src/SMESHGUI/SMESHGUI_PatternWidget.h b/src/SMESHGUI/SMESHGUI_PatternWidget.h deleted file mode 100644 index ddab7433b..000000000 --- a/src/SMESHGUI/SMESHGUI_PatternWidget.h +++ /dev/null @@ -1,74 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_PatternWidget.h -// Author : Michael ZORIN -// Module : SMESH -// $Header: - -#ifndef WIDGET_PATTERN_H -#define WIDGET_PATTERN_H - -#include -#include - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) - -typedef QValueVector PointVector; -typedef QValueVector< QValueVector > ConnectivityVector; - -class QPoint; - -//================================================================================= -// class : SMESHGUI_PatternWidget -// purpose : -//================================================================================= -class SMESHGUI_PatternWidget : public QFrame -{ - Q_OBJECT - -public: - SMESHGUI_PatternWidget( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); - - ~SMESHGUI_PatternWidget(); - - void SetPoints( PointVector thePoints, QValueVector theKeys, ConnectivityVector theConnections ); - -private : - PointVector myPoints; - QValueVector myKeys; - ConnectivityVector myConnections; - - double myMinU, myMaxU, myMinV, myMaxV; - -private slots: - -protected: - void paintEvent( QPaintEvent * ); - QPoint MapCoords( const double u, const double v ); -}; - -#endif // WIDGET_PATTERN_H - diff --git a/src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx b/src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx deleted file mode 100755 index b589e15d3..000000000 --- a/src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx +++ /dev/null @@ -1,202 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_PrecisionDlg.cxx -// Author : Sergey LITONIN -// Module : SMESH - -#include "SMESHGUI_PrecisionDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_Utils.h" - -#include "SUIT_Desktop.h" -#include "SUIT_ResourceMgr.h" - -#include -#include -#include -#include -#include -#include - -#define SPACING 5 -#define MARGIN 10 -#define DEFAULT_VAL 10 -#define RANGE 128 - -/*! - * Class : SMESHGUI_PrecisionDlg - * Description : Dialog to specify precision of mesh quality controls - */ - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::SMESHGUI_PrecisionDlg -// Purpose : Constructor -//======================================================================= -SMESHGUI_PrecisionDlg::SMESHGUI_PrecisionDlg ( SMESHGUI* theModule ) - : QDialog( SMESH::GetDesktop( theModule ), "SMESHGUI_PrecisionDlg", true, - WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - setCaption(tr("CAPTION")); - - QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING); - - QFrame* aMainFrame = createMainFrame (this); - QFrame* aBtnFrame = createButtonFrame(this); - - aDlgLay->addWidget(aMainFrame); - aDlgLay->addWidget(aBtnFrame); - - aDlgLay->setStretchFactor(aMainFrame, 1); - - setMinimumWidth((int)(QFontMetrics(font()).width(tr("CAPTION")) * 1.5)); - - Init(); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::~SMESHGUI_PrecisionDlg -// Purpose : Destructor -//======================================================================= -SMESHGUI_PrecisionDlg::~SMESHGUI_PrecisionDlg() -{ -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::createButtonFrame -// Purpose : Create frame containing buttons -//======================================================================= -QFrame* SMESHGUI_PrecisionDlg::createButtonFrame (QWidget* theParent) -{ - QGroupBox* aGrp = new QGroupBox (1, Qt::Vertical, theParent); - aGrp->setFrameStyle(QFrame::NoFrame); - aGrp->setInsideMargin(0); - - myOKBtn = new QPushButton (tr("SMESH_BUT_OK"), aGrp); - - QLabel* aLbl = new QLabel (aGrp); - aLbl->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - - myCancelBtn = new QPushButton (tr("SMESH_BUT_CANCEL"), aGrp); - - connect(myOKBtn, SIGNAL(clicked()), SLOT(onOk())); - connect(myCancelBtn, SIGNAL(clicked()), SLOT(onClose())); - - return aGrp; -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg:: createMainFrame -// Purpose : Create frame containing dialog's input fields -//======================================================================= -QFrame* SMESHGUI_PrecisionDlg::createMainFrame (QWidget* theParent) -{ - QGroupBox* aGrp = new QGroupBox(2, Qt::Horizontal, theParent); - new QLabel (tr("PRECISION"), aGrp); - mySpinBox = new QSpinBox (0, RANGE, 1, aGrp); - myNotUseChk = new QCheckBox (tr("NOT_USE"), aGrp); - - connect(myNotUseChk, SIGNAL(toggled(bool)), SLOT(onNotUse())); - - return aGrp; -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::Init -// Purpose : Initialize dialog fields -//======================================================================= -void SMESHGUI_PrecisionDlg::Init() -{ - bool isOk = false; - int aVal = DEFAULT_VAL; - SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI ); - if (mgr && mgr->hasValue("SMESH", "controls_precision")) { - QString aStr = mgr->stringValue("SMESH", "controls_precision"); - aVal = aStr.toInt(&isOk); - } - - mySpinBox->setValue(isOk ? aVal : DEFAULT_VAL); - myNotUseChk->setChecked(!isOk); - - onNotUse(); - - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose())); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::onOk -// Purpose : SLOT. Called when OK button pressed -//======================================================================= -void SMESHGUI_PrecisionDlg::onOk() -{ - SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI ); - if (myNotUseChk->isChecked()) { - if (mgr) { - mgr->remove("SMESH", "controls_precision"); - } - SMESH::SetControlsPrecision(-1); - } else { - mySpinBox->clearFocus(); - int aVal = mySpinBox->value(); - if (mgr) { - mgr->setValue("SMESH", "controls_precision", QString("%1").arg(aVal)); - } - SMESH::SetControlsPrecision(aVal); - } - - disconnect(mySMESHGUI, 0, this, 0); - mySMESHGUI->ResetState() ; - accept(); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::onClose -// Purpose : SLOT. Called when "Cancel" button pressed -//======================================================================= -void SMESHGUI_PrecisionDlg::onClose() -{ - disconnect( mySMESHGUI, 0, this, 0); - reject(); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::closeEvent -// Purpose : -//======================================================================= -void SMESHGUI_PrecisionDlg::closeEvent (QCloseEvent*) -{ - onClose(); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::onNotUse -// Purpose : SLOT. Called when state of "Do not use" check box changed -//======================================================================= -void SMESHGUI_PrecisionDlg::onNotUse() -{ - mySpinBox->setEnabled(!myNotUseChk->isChecked()); -} diff --git a/src/SMESHGUI/SMESHGUI_PrecisionDlg.h b/src/SMESHGUI/SMESHGUI_PrecisionDlg.h deleted file mode 100755 index 976db3091..000000000 --- a/src/SMESHGUI/SMESHGUI_PrecisionDlg.h +++ /dev/null @@ -1,97 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_PrecisionDlg.h -// Author : Sergey LITONIN -// Module : SMESH - - -#ifndef SMESHGUI_PrecisionDlg_H -#define SMESHGUI_PrecisionDlg_H - -#include - -class QSpinBox; -class QPushButton; -class QCheckBox; -class QFrame; -class SMESHGUI; - -/* - Class : SMESHGUI_PrecisionDlg - Description : Dialog to specify precision of mesh quality controls -*/ - -class SMESHGUI_PrecisionDlg : public QDialog -{ - Q_OBJECT - -public: - SMESHGUI_PrecisionDlg( SMESHGUI* ); - - virtual ~SMESHGUI_PrecisionDlg(); - - void Init(); - -private slots: - - void onOk(); - void onClose(); - void onNotUse(); - -private: - - QFrame* createButtonFrame( QWidget* ); - QFrame* createMainFrame( QWidget* ); - void closeEvent( QCloseEvent* ); - -private: - SMESHGUI* mySMESHGUI; - QSpinBox* mySpinBox; - QPushButton* myOKBtn; - QPushButton* myCancelBtn; - QCheckBox* myNotUseChk; - -}; - -#endif - - - - - - - - - - - - - - - - - - - - diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx deleted file mode 100644 index d51137871..000000000 --- a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx +++ /dev/null @@ -1,396 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_Preferences_ColorDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_Preferences_ColorDlg.h" -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" - -#include "utilities.h" - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SUIT_Desktop.h" - -using namespace std; - -//================================================================================= -// function : SMESHGUI_Preferences_ColorDlg() -// purpose : Constructs a SMESHGUI_Preferences_ColorDlg which is a child -// of 'parent', with the name 'name' and widget flags set to 'f' -// The dialog will by default be modeless, unless you -// set'modal' to TRUE to construct a modal dialog. -//================================================================================= -SMESHGUI_Preferences_ColorDlg::SMESHGUI_Preferences_ColorDlg( SMESHGUI* theModule, const char* name) - : QDialog( SMESH::GetDesktop( theModule ), name, true, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - if (!name) - setName("SMESHGUI_Preferences_ColorDlg"); - setCaption(tr("Preferences - Set Color")); - setSizeGripEnabled(TRUE); - QGridLayout* SMESHGUI_Preferences_ColorDlgLayout = new QGridLayout(this); - SMESHGUI_Preferences_ColorDlgLayout->setSpacing(6); - SMESHGUI_Preferences_ColorDlgLayout->setMargin(11); - - ButtonGroup1 = new QButtonGroup(tr("Elements"), this, "ButtonGroup1"); - ButtonGroup1->setColumnLayout(0, Qt::Vertical); - ButtonGroup1->layout()->setSpacing(0); - ButtonGroup1->layout()->setMargin(0); - QGridLayout* ButtonGroup1Layout = new QGridLayout(ButtonGroup1->layout()); - ButtonGroup1Layout->setAlignment(Qt::AlignTop); - ButtonGroup1Layout->setSpacing(6); - ButtonGroup1Layout->setMargin(11); - - TextLabel_Fill = new QLabel(tr("Fill"), ButtonGroup1, "TextLabel_2D_Fill"); - ButtonGroup1Layout->addWidget(TextLabel_Fill, 0, 0); - - btnFillColor = new QPushButton(ButtonGroup1, "btnFillColor"); - btnFillColor->setFixedSize(QSize(25, 25)); - ButtonGroup1Layout->addWidget(btnFillColor, 0, 1); - - TextLabel_Outine = new QLabel(tr("Outline"), ButtonGroup1, "TextLabel_2D_Outine"); - ButtonGroup1Layout->addWidget(TextLabel_Outine, 0, 2); - - btnOutlineColor = new QPushButton(ButtonGroup1, "btnOutlineColor"); - btnOutlineColor->setFixedSize(QSize(25, 25)); - ButtonGroup1Layout->addWidget(btnOutlineColor, 0, 3); - - TextLabel_Width = new QLabel(tr("Width"), ButtonGroup1, "TextLabel_2D_Width"); - ButtonGroup1Layout->addWidget(TextLabel_Width, 0, 4); - - SpinBox_Width = new QSpinBox(0, 5, 1, ButtonGroup1, "SpinBox_Width"); - SpinBox_Width->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - SpinBox_Width->setWrapping(FALSE); - SpinBox_Width->setButtonSymbols(QSpinBox::PlusMinus); - ButtonGroup1Layout->addWidget(SpinBox_Width, 0, 5); - - TextLabel_BackFace = new QLabel(tr("Back Face"), ButtonGroup1, "TextLabel_BackFace"); - ButtonGroup1Layout->addWidget(TextLabel_BackFace, 1, 0); - - btnBackFaceColor = new QPushButton(ButtonGroup1, "btnBackFaceColor"); - btnBackFaceColor->setFixedSize(QSize(25, 25)); - ButtonGroup1Layout->addWidget(btnBackFaceColor, 1, 1); - - TextLabel_ShrinkCoeff = new QLabel(tr("Shrink coef."), ButtonGroup1, "TextLabel_ShrinkCoeff"); - ButtonGroup1Layout->addWidget(TextLabel_ShrinkCoeff, 2, 0); - - SpinBox_Shrink = new QSpinBox(20, 100, 1, ButtonGroup1, "SpinBox_Shrink"); - SpinBox_Shrink->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - SpinBox_Shrink->setButtonSymbols(QSpinBox::PlusMinus); - ButtonGroup1Layout->addMultiCellWidget(SpinBox_Shrink, 2, 2, 1, 5); - - SMESHGUI_Preferences_ColorDlgLayout->addWidget(ButtonGroup1, 0, 0); - - ButtonGroup2 = new QButtonGroup(tr("Nodes"), this, "ButtonGroup2"); - ButtonGroup2->setColumnLayout(0, Qt::Vertical); - ButtonGroup2->layout()->setSpacing(0); - ButtonGroup2->layout()->setMargin(0); - QGridLayout* ButtonGroup2Layout = new QGridLayout(ButtonGroup2->layout()); - ButtonGroup2Layout->setAlignment(Qt::AlignTop); - ButtonGroup2Layout->setSpacing(6); - ButtonGroup2Layout->setMargin(11); - - TextLabel_Nodes_Color = new QLabel(tr("Color"), ButtonGroup2, "TextLabel_Nodes_Color"); - ButtonGroup2Layout->addWidget(TextLabel_Nodes_Color, 0, 0); - - btnNodeColor = new QPushButton(ButtonGroup2, "btnNodeColor"); - btnNodeColor->setFixedSize(QSize(25, 25)); - ButtonGroup2Layout->addWidget(btnNodeColor, 0, 1); - - TextLabel_Nodes_Size = new QLabel(tr("Size"), ButtonGroup2, "TextLabel_Nodes_Size"); - ButtonGroup2Layout->addWidget(TextLabel_Nodes_Size, 0, 2); - - SpinBox_Nodes_Size = new QSpinBox(0, 5, 1, ButtonGroup2, "SpinBox_Nodes_Size"); - SpinBox_Nodes_Size->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - SpinBox_Nodes_Size->setWrapping(FALSE); - SpinBox_Nodes_Size->setButtonSymbols(QSpinBox::PlusMinus); - ButtonGroup2Layout->addWidget(SpinBox_Nodes_Size, 0, 3); - - SMESHGUI_Preferences_ColorDlgLayout->addWidget(ButtonGroup2, 1, 0); - - GroupButtons = new QButtonGroup(this, "GroupButtons"); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - - buttonOk = new QPushButton(tr("&OK"), GroupButtons, "buttonOk"); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - - GroupButtonsLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 1); - - buttonCancel = new QPushButton(tr("&Cancel"), GroupButtons, "buttonCancel"); - buttonCancel->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 2); - - SMESHGUI_Preferences_ColorDlgLayout->addWidget(GroupButtons, 2, 0); - - Init(); -} - -//================================================================================= -// function : ~SMESHGUI_Preferences_ColorDlg() -// purpose : Destructor -//================================================================================= -SMESHGUI_Preferences_ColorDlg::~SMESHGUI_Preferences_ColorDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::Init() -{ - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - - /* signals and slots connections */ - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - - connect(btnFillColor, SIGNAL(clicked()), this, SLOT(SelectFillColor())); - connect(btnOutlineColor, SIGNAL(clicked()), this, SLOT(SelectOutlineColor())); - connect(btnNodeColor, SIGNAL(clicked()), this, SLOT(SelectNodeColor())); - connect(btnBackFaceColor, SIGNAL(clicked()), this, SLOT(SelectBackFaceColor())); - - connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - - /* Move widget on the botton right corner of main widget */ - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); -} - -//================================================================================= -// function : SelectFillColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SelectFillColor() -{ - QColor color = btnFillColor->palette().active().button(); - color = QColorDialog::getColor(color); - if (color.isValid()) { - QPalette pal = btnFillColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnFillColor->setPalette(pal); - } -} - -//================================================================================= -// function : SelectBackFaceColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SelectBackFaceColor() -{ - QColor color = btnBackFaceColor->palette().active().button(); - color = QColorDialog::getColor(color); - if (color.isValid()) { - QPalette pal = btnBackFaceColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnBackFaceColor->setPalette(pal); - } -} - -//================================================================================= -// function : SelectOutlineColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SelectOutlineColor() -{ - QColor color = btnOutlineColor->palette().active().button(); - color = QColorDialog::getColor(color); - if (color.isValid()) { - QPalette pal = btnOutlineColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnOutlineColor->setPalette(pal); - } -} - -//================================================================================= -// function : SelectNodeColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SelectNodeColor() -{ - QColor color = btnNodeColor->palette().active().button(); - color = QColorDialog::getColor(color); - if (color.isValid()) { - QPalette pal = btnNodeColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnNodeColor->setPalette(pal); - } -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::ClickOnOk() -{ - mySMESHGUI->ResetState(); - accept(); -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::ClickOnCancel() -{ - mySMESHGUI->ResetState(); - reject(); -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::DeactivateActiveDialog() -{ -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::closeEvent (QCloseEvent*) -{ - this->ClickOnCancel(); /* same than click on cancel button */ -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::ActivateThisDialog() -{ - /* Emit a signal to deactivate any active dialog */ - mySMESHGUI->EmitSignalDeactivateDialog(); -} - -//================================================================================= -// function : SetColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SetColor (int type, QColor color) -{ - switch (type) { - case 1 : // fill - { - QPalette pal = btnFillColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnFillColor->setPalette(pal); - break; - } - case 2 : // outline - { - QPalette pal = btnOutlineColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnOutlineColor->setPalette(pal); - break; - } - case 3 : // node - { - QPalette pal = btnNodeColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnNodeColor->setPalette(pal); - break; - } - case 4 : // back face - { - QPalette pal = btnBackFaceColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnBackFaceColor->setPalette(pal); - break; - } - } -} - -//================================================================================= -// function : GetColor() -// purpose : -//================================================================================= -QColor SMESHGUI_Preferences_ColorDlg::GetColor (int type) -{ - QColor color; - switch (type) { - case 1 : color = btnFillColor->palette().active().button(); break; // fill - case 2 : color = btnOutlineColor->palette().active().button(); break; // outline - case 3 : color = btnNodeColor->palette().active().button(); break; // node - case 4 : color = btnBackFaceColor->palette().active().button(); break; // back face - } - return color; -} - -//================================================================================= -// function : SetIntValue() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SetIntValue (int type, int value) -{ - switch (type) { - case 1 : SpinBox_Width->setValue(value); break; // width - case 2 : SpinBox_Nodes_Size->setValue(value); break; // nodes size = value; break; - case 3 : SpinBox_Shrink->setValue(value); break; // shrink coeff - } -} - -//================================================================================= -// function : GetIntValue() -// purpose : -//================================================================================= -int SMESHGUI_Preferences_ColorDlg::GetIntValue (int type) -{ - int res = 0; - switch (type) { - case 1 : res = SpinBox_Width->value(); break; // width - case 2 : res = SpinBox_Nodes_Size->value(); break; // nodes size - case 3 : res = SpinBox_Shrink->value(); break; // shrink coeff - } - return res; -} diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h deleted file mode 100644 index 43702b2ac..000000000 --- a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h +++ /dev/null @@ -1,105 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_Preferences_ColorDlg.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESHGUI_PREFERENCES_COLORDLG_H -#define SMESHGUI_PREFERENCES_COLORDLG_H - -// SALOME Includes -//#include "SUIT_Config.h" -//#include "SUIT_Settings.h" - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SMESH_Gen) - -// QT Includes -#include - -class QButtonGroup; -class QFrame; -class QLabel; -class QPushButton; -class QSpinBox; -class QColor; -class SMESHGUI; - -class SMESHGUI_Preferences_ColorDlg : public QDialog -{ - Q_OBJECT - -public: - SMESHGUI_Preferences_ColorDlg( SMESHGUI*, const char* name = 0 ); - ~SMESHGUI_Preferences_ColorDlg(); - - void SetColor(int type, QColor color); - QColor GetColor(int type); - void SetIntValue(int type, int value); - int GetIntValue(int type); - -private: - void closeEvent( QCloseEvent* e ) ; - void Init(); - -private slots: -// void RadioButtonClicked(int radioButtonId); - void ClickOnOk(); - void ClickOnCancel(); - void DeactivateActiveDialog() ; - void ActivateThisDialog() ; - - void SelectFillColor(); - void SelectBackFaceColor(); - void SelectOutlineColor(); - void SelectNodeColor(); - -private: - SMESH::SMESH_Gen_var myCompMesh ; - SMESHGUI* mySMESHGUI ; - - QButtonGroup* ButtonGroup1; - QLabel* TextLabel_Fill; - QPushButton* btnFillColor; - QLabel* TextLabel_Outine; - QPushButton* btnOutlineColor; - QLabel* TextLabel_Width; - QSpinBox* SpinBox_Width; - QLabel* TextLabel_BackFace; - QPushButton* btnBackFaceColor; - QLabel* TextLabel_ShrinkCoeff; - QSpinBox* SpinBox_Shrink; - QButtonGroup* ButtonGroup2; - QLabel* TextLabel_Nodes_Color; - QPushButton* btnNodeColor; - QLabel* TextLabel_Nodes_Size; - QSpinBox* SpinBox_Nodes_Size; - QButtonGroup* GroupButtons; - QPushButton* buttonOk; - QPushButton* buttonCancel; -}; - -#endif // SMESHGUI_PREFERENCES_COLORDLG_H diff --git a/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx deleted file mode 100644 index 7606ccf2b..000000000 --- a/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx +++ /dev/null @@ -1,314 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Preferences_SelectionDlg.cxx -// Author : Natalia KOPNOVA -// Module : SMESH -// $Header$ - -#include "SMESHGUI_Preferences_SelectionDlg.h" -#include "SMESHGUI.h" - -#include "SMESHGUI_Utils.h" - -#include "SUIT_Desktop.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -//================================================================================= -// class : SMESHGUI_LineEdit -// purpose : -//================================================================================= -SMESHGUI_LineEdit::SMESHGUI_LineEdit(QWidget* parent, const char *name) - : QLineEdit(parent, name) -{ -} - -SMESHGUI_LineEdit::SMESHGUI_LineEdit(const QString& text, QWidget* parent, const char *name) - : QLineEdit(text, parent, name) -{ -} - -void SMESHGUI_LineEdit::focusOutEvent(QFocusEvent* e) -{ - const QValidator* aVal = validator(); - QString aText = text(); - int aCurPos = cursorPosition(); - if (aVal && aVal->validate(aText, aCurPos) != QValidator::Acceptable) { - QString aValid = aText; - aVal->fixup(aValid); - if (aText != aValid) { - setText(aValid); - update(); - return; - } - } - QLineEdit::focusOutEvent(e); -} - - -//================================================================================= -// class : SMESHGUI_DoubleValidator -// purpose : -//================================================================================= -SMESHGUI_DoubleValidator::SMESHGUI_DoubleValidator(QObject * parent, const char *name) - : QDoubleValidator(parent, name) -{ -} - -SMESHGUI_DoubleValidator::SMESHGUI_DoubleValidator(double bottom, double top, int decimals, - QObject * parent, const char *name) - : QDoubleValidator(bottom, top, decimals, parent, name) -{ -} - -void SMESHGUI_DoubleValidator::fixup(QString& theText) const -{ - bool ok; - double aValue = theText.toDouble(&ok); - if (ok) { - if (aValue < bottom()) - theText = QString::number(bottom(), 'g', decimals()); - if (aValue > top()) - theText = QString::number(top(), 'g', decimals()); - } -} - - -//================================================================================= -// class : SMESHGUI_Preferences_SelectionDlg() -// purpose : -//================================================================================= -SMESHGUI_Preferences_SelectionDlg::SMESHGUI_Preferences_SelectionDlg( SMESHGUI* theModule, const char* name ) - : QDialog( SMESH::GetDesktop( theModule ), name, true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - if ( !name ) setName( "SMESHGUI_Preferences_SelectionDlg" ); - setCaption( tr( "SMESH_PREF_SELECTION" ) ); - - QVBoxLayout* aMainLayout = new QVBoxLayout(this, 11, 6); - QLabel* aLabel; - - /***************************************************************/ - QGroupBox* aSelectBox = new QGroupBox(4, Qt::Horizontal, this, "selection"); - aSelectBox->setTitle(tr("SMESH_SELECTION")); - - aLabel = new QLabel(aSelectBox, "selection color label"); - aLabel->setText(tr("SMESH_OUTLINE_COLOR")); - myColor[2] = new QPushButton(aSelectBox, "outline color"); - myColor[2]->setFixedSize(QSize(25, 25)); - - aSelectBox->addSpace(0); - aSelectBox->addSpace(0); - - aLabel = new QLabel(aSelectBox, "selection color label"); - aLabel->setText(tr("SMESH_ELEMENTS_COLOR")); - myColor[1] = new QPushButton(aSelectBox, "elements color"); - myColor[1]->setFixedSize(QSize(25, 25)); - - aLabel = new QLabel(aSelectBox, "selection width label"); - aLabel->setText(tr("SMESH_WIDTH")); - myWidth[1] = new QSpinBox(0, 5, 1, aSelectBox, "selection width"); - myWidth[1]->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - myWidth[1]->setButtonSymbols(QSpinBox::PlusMinus); - myWidth[1]->setMinimumWidth(50); - - /***************************************************************/ - QGroupBox* aPreSelectBox = new QGroupBox(1, Qt::Vertical, this, "preselection"); - aPreSelectBox->setTitle(tr("SMESH_PRESELECTION")); - - aLabel = new QLabel(aPreSelectBox, "preselection color label"); - aLabel->setText(tr("SMESH_HILIGHT_COLOR")); - myColor[0] = new QPushButton(aPreSelectBox, "preselection color"); - myColor[0]->setFixedSize(QSize(25, 25)); - - aLabel = new QLabel(aPreSelectBox, "preselection width label"); - aLabel->setText(tr("SMESH_WIDTH")); - myWidth[0] = new QSpinBox(0, 5, 1, aPreSelectBox, "preselection width"); - myWidth[0]->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - myWidth[0]->setButtonSymbols(QSpinBox::PlusMinus); - myWidth[0]->setMinimumWidth(50); - - /***************************************************************/ - QGroupBox* aPrecisionBox = new QGroupBox(1, Qt::Vertical, this, "preselection"); - aPrecisionBox->setTitle(tr("SMESH_PRECISION")); - QDoubleValidator* aValidator = new SMESHGUI_DoubleValidator(aPrecisionBox); - aValidator->setBottom(0.001); - aValidator->setDecimals(6); - - aLabel = new QLabel(aPrecisionBox, "node tol label"); - aLabel->setText(tr("SMESH_NODES")); - myPrecision[0] = new SMESHGUI_LineEdit(aPrecisionBox, "node precision"); - myPrecision[0]->setValidator(aValidator); - - aLabel = new QLabel(aPrecisionBox, "item tol label"); - aLabel->setText(tr("SMESH_ELEMENTS")); - myPrecision[1] = new SMESHGUI_LineEdit(aPrecisionBox, "item precision"); - myPrecision[1]->setValidator(aValidator); - - /***************************************************************/ - QFrame* aButtons = new QFrame(this, "button box"); - aButtons->setFrameStyle(QFrame::Box | QFrame::Sunken); - QHBoxLayout* aBtnLayout = new QHBoxLayout(aButtons, 11, 6); - aBtnLayout->setAutoAdd(false); - - QPushButton* aOKBtn = new QPushButton(aButtons, "ok"); - aOKBtn->setText(tr("SMESH_BUT_OK")); - aOKBtn->setAutoDefault(true); - aOKBtn->setDefault(true); - QPushButton* aCloseBtn = new QPushButton(aButtons, "close"); - aCloseBtn->setText(tr("SMESH_BUT_CLOSE")); - aCloseBtn->setAutoDefault(true); - - aBtnLayout->addWidget(aOKBtn); - aBtnLayout->addStretch(); - aBtnLayout->addWidget(aCloseBtn); - - /***************************************************************/ - aMainLayout->addWidget(aSelectBox); - aMainLayout->addWidget(aPreSelectBox); - aMainLayout->addWidget(aPrecisionBox); - aMainLayout->addWidget(aButtons); - - for (int i = 0; i < 3; i++) - connect(myColor[i], SIGNAL(clicked()), this, SLOT(onSelectColor())); - - connect(aOKBtn, SIGNAL(clicked()), this, SLOT(accept())); - connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(reject())); - - /* Move widget on the botton right corner of main widget */ - int x, y ; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); -} - -//================================================================================= -// function : ~SMESHGUI_Preferences_SelectionDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_Preferences_SelectionDlg::~SMESHGUI_Preferences_SelectionDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::closeEvent( QCloseEvent* e ) -{ - reject(); -} - -//================================================================================= -// function : onSelectColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::onSelectColor() -{ - QPushButton* aSender = (QPushButton*)sender(); - QColor aColor = aSender->palette().active().button(); - aColor = QColorDialog::getColor(aColor, this); - if (aColor.isValid()) { - QPalette aPal = aSender->palette(); - aPal.setColor(QColorGroup::Button, aColor); - aSender->setPalette(aPal); - } -} - -//================================================================================= -// function : SetColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::SetColor(int type, QColor color) -{ - if (type > 0 && type <= 3) { - QPalette aPal = myColor[type-1]->palette(); - aPal.setColor(QColorGroup::Button, color); - myColor[type-1]->setPalette(aPal); - } -} - -//================================================================================= -// function : GetColor() -// purpose : -//================================================================================= -QColor SMESHGUI_Preferences_SelectionDlg::GetColor(int type) -{ - QColor aColor; - if (type > 0 && type <= 3) - aColor = myColor[type-1]->palette().active().button(); - return aColor; -} - -//================================================================================= -// function : SetWidth() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::SetWidth(int type, int value) -{ - if (type > 0 && type <= 2) - myWidth[type-1]->setValue(value); -} - -//================================================================================= -// function : GetWidth() -// purpose : -//================================================================================= -int SMESHGUI_Preferences_SelectionDlg::GetWidth(int type) -{ - if (type > 0 && type <= 2) - return myWidth[type-1]->value(); - return 0; -} - -//================================================================================= -// function : SetPrecision() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::SetPrecision(int type, double value) -{ - if (type > 0 && type <= 2) - myPrecision[type-1]->setText(QString::number(value)); -} - -//================================================================================= -// function : GetPrecision() -// purpose : -//================================================================================= -double SMESHGUI_Preferences_SelectionDlg::GetPrecision(int type) -{ - if (type > 0 && type <= 2) - return myPrecision[type-1]->text().toDouble(); - return 0; -} diff --git a/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h deleted file mode 100644 index 07b7a644a..000000000 --- a/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h +++ /dev/null @@ -1,99 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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.salome-platorm.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Preferences_SelectionDlg.h -// Author : Natalia KOPNOVA -// Module : SMESH -// $Header$ - -#ifndef SMESHGUI_PREFERENCES_SELECTIONDLG_H -#define SMESHGUI_PREFERENCES_SELECTIONDLG_H - - -// QT Includes -#include -#include -#include - -class QPushButton; -class QSpinBox; -class QColor; -class SMESHGUI; - -class SMESHGUI_LineEdit : public QLineEdit -{ - Q_OBJECT - - public: - SMESHGUI_LineEdit(QWidget* parent, const char* name = 0); - SMESHGUI_LineEdit(const QString& text, QWidget* parent, const char* name = 0); - - ~SMESHGUI_LineEdit() {}; - - protected: - void focusOutEvent(QFocusEvent* e); -}; - -class SMESHGUI_DoubleValidator : public QDoubleValidator -{ - Q_OBJECT - - public: - SMESHGUI_DoubleValidator(QObject* parent, const char* name = 0); - SMESHGUI_DoubleValidator(double bottom, double top, int decimals, - QObject* parent, const char* name = 0); - - ~SMESHGUI_DoubleValidator() {}; - - void fixup(QString& text) const; -}; - -class SMESHGUI_Preferences_SelectionDlg : public QDialog -{ - Q_OBJECT - -public: - SMESHGUI_Preferences_SelectionDlg( SMESHGUI*, const char* name = 0 ); - ~SMESHGUI_Preferences_SelectionDlg(); - - void SetColor(int type, QColor color); - QColor GetColor(int type); - void SetWidth(int type, int value); - int GetWidth(int type); - void SetPrecision(int type, double value); - double GetPrecision(int type); - -private: - void closeEvent( QCloseEvent* e ) ; - -private slots: - void onSelectColor(); - -private: - SMESHGUI* mySMESHGUI; - QPushButton* myColor[3]; - QSpinBox* myWidth[2]; - QLineEdit* myPrecision[2]; -}; - -#endif // SMESHGUI_PREFERENCES_SELECTIONDLG_H diff --git a/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx b/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx deleted file mode 100644 index 16529726e..000000000 --- a/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx +++ /dev/null @@ -1,486 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_RemoveElementsDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_RemoveElementsDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_IdValidator.h" - -#include "SMESH_Actor.h" -#include "SMDS_Mesh.hxx" - -#include "SUIT_ResourceMgr.h" -#include "SUIT_Desktop.h" - -#include "SVTK_Selector.h" -#include "SVTK_ViewModel.h" -#include "SVTK_ViewWindow.h" -#include "SALOME_ListIO.hxx" - -#include "utilities.h" - -// OCCT Includes -#include -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -//================================================================================= -// class : SMESHGUI_RemoveElementsDlg() -// purpose : -//================================================================================= -SMESHGUI_RemoveElementsDlg -::SMESHGUI_RemoveElementsDlg (SMESHGUI* theModule, - const char* name, - bool modal, - WFlags fl) - : QDialog(SMESH::GetDesktop(theModule), - name, - modal, - WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose), - mySelector(SMESH::GetViewWindow(theModule)->GetSelector()), - mySelectionMgr(SMESH::GetSelectionMgr(theModule)), - mySMESHGUI(theModule), - myBusy(false) -{ - QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_REM_ELEMENT"))); - QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - - if (!name) - setName("SMESHGUI_RemoveElementsDlg"); - resize(303, 185); - setCaption(tr("SMESH_REMOVE_ELEMENTS_TITLE")); - setSizeGripEnabled(TRUE); - SMESHGUI_RemoveElementsDlgLayout = new QGridLayout(this); - SMESHGUI_RemoveElementsDlgLayout->setSpacing(6); - SMESHGUI_RemoveElementsDlgLayout->setMargin(11); - - /***************************************************************/ - GroupConstructors = new QButtonGroup(this, "GroupConstructors"); - GroupConstructors->setTitle(tr("SMESH_ELEMENTS" )); - GroupConstructors->setExclusive(TRUE); - GroupConstructors->setColumnLayout(0, Qt::Vertical); - GroupConstructors->layout()->setSpacing(0); - GroupConstructors->layout()->setMargin(0); - GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout()); - GroupConstructorsLayout->setAlignment(Qt::AlignTop); - GroupConstructorsLayout->setSpacing(6); - GroupConstructorsLayout->setMargin(11); - Constructor1 = new QRadioButton(GroupConstructors, "Constructor1"); - Constructor1->setText(tr("" )); - Constructor1->setPixmap(image0); - Constructor1->setChecked(TRUE); - Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth())); - Constructor1->setMinimumSize(QSize(50, 0)); - GroupConstructorsLayout->addWidget(Constructor1, 0, 0); - QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupConstructorsLayout->addItem(spacer, 0, 1); - SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupConstructors, 0, 0); - - /***************************************************************/ - GroupButtons = new QGroupBox(this, "GroupButtons"); - GroupButtons->setGeometry(QRect(10, 10, 281, 48)); - GroupButtons->setTitle(tr("" )); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - buttonCancel = new QPushButton(GroupButtons, "buttonCancel"); - buttonCancel->setText(tr("SMESH_BUT_CLOSE" )); - buttonCancel->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 3); - buttonApply = new QPushButton(GroupButtons, "buttonApply"); - buttonApply->setText(tr("SMESH_BUT_APPLY" )); - buttonApply->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonApply, 0, 1); - QSpacerItem* spacer_9 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupButtonsLayout->addItem(spacer_9, 0, 2); - buttonOk = new QPushButton(GroupButtons, "buttonOk"); - buttonOk->setText(tr("SMESH_BUT_OK" )); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupButtons, 2, 0); - - /***************************************************************/ - GroupC1 = new QGroupBox(this, "GroupC1"); - GroupC1->setTitle(tr("SMESH_REMOVE" )); - GroupC1->setMinimumSize(QSize(0, 0)); - GroupC1->setFrameShape(QGroupBox::Box); - GroupC1->setFrameShadow(QGroupBox::Sunken); - GroupC1->setColumnLayout(0, Qt::Vertical); - GroupC1->layout()->setSpacing(0); - GroupC1->layout()->setMargin(0); - GroupC1Layout = new QGridLayout(GroupC1->layout()); - GroupC1Layout->setAlignment(Qt::AlignTop); - GroupC1Layout->setSpacing(6); - GroupC1Layout->setMargin(11); - TextLabelC1A1 = new QLabel(GroupC1, "TextLabelC1A1"); - TextLabelC1A1->setText(tr("SMESH_ID_ELEMENTS" )); - TextLabelC1A1->setMinimumSize(QSize(50, 0)); - TextLabelC1A1->setFrameShape(QLabel::NoFrame); - TextLabelC1A1->setFrameShadow(QLabel::Plain); - GroupC1Layout->addWidget(TextLabelC1A1, 0, 0); - SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1"); - SelectButtonC1A1->setText(tr("" )); - SelectButtonC1A1->setPixmap(image1); - SelectButtonC1A1->setToggleButton(FALSE); - GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1); - LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1"); - LineEditC1A1->setValidator(new SMESHGUI_IdValidator(this, "validator")); - GroupC1Layout->addWidget(LineEditC1A1, 0, 2); - SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupC1, 1, 0); - - Init(); /* Initialisations */ -} - -//================================================================================= -// function : ~SMESHGUI_RemoveElementsDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_RemoveElementsDlg::~SMESHGUI_RemoveElementsDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::Init() -{ - GroupC1->show(); - myConstructorId = 0; - Constructor1->setChecked(TRUE); - myEditCurrentArgument = LineEditC1A1; - - myNbOkElements = false; - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - myActor = 0; - myBusy = false; - - /* signals and slots connections */ - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); - - connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(myEditCurrentArgument, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); - - /* Move widget on the botton right corner of main widget */ - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); /* displays Dialog */ - - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); - - SelectionIntoArgument(); -} - -//================================================================================= -// function : ConstructorsClicked() -// purpose : Radio button management -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ConstructorsClicked (int) -{ -} - -//================================================================================= -// function : ClickOnApply() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ClickOnApply() -{ - if (mySMESHGUI->isActiveStudyLocked()) - return; - if (myNbOkElements) { - QStringList aListId = QStringList::split(" ", myEditCurrentArgument->text(), false); - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length(aListId.count()); - for (int i = 0; i < aListId.count(); i++) - anArrayOfIdeces[i] = aListId[ i ].toInt(); - - bool aResult = false; - try { - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - aResult = aMeshEditor->RemoveElements(anArrayOfIdeces.inout()); - } catch (...) { - } - - if (aResult) { - myEditCurrentArgument->clear(); - SMESH::UpdateView(); - } - } -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ClickOnOk() -{ - this->ClickOnApply(); - this->ClickOnCancel(); - - return; -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ClickOnCancel() -{ - mySelectionMgr->clearSelected(); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - disconnect(mySelectionMgr, 0, this, 0); - mySMESHGUI->ResetState(); - reject(); - return; -} - -//======================================================================= -//function : onTextChange -//purpose : -//======================================================================= -void SMESHGUI_RemoveElementsDlg::onTextChange (const QString& theNewText) -{ - if (myBusy) - return; - myBusy = true; - - myNbOkElements = 0; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - // hilight entered elements - if(myActor){ - if(SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh()){ - Handle(SALOME_InteractiveObject) anIO = myActor->getIO(); - - TColStd_MapOfInteger newIndices; - - QStringList aListId = QStringList::split(" ", theNewText, false); - for (int i = 0; i < aListId.count(); i++) { - if(const SMDS_MeshElement *anElem = aMesh->FindElement(aListId[i].toInt())) { - newIndices.Add(anElem->GetID()); - myNbOkElements++; - } - } - - mySelector->AddOrRemoveIndex(anIO,newIndices,false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight(anIO,true,true); - } - } - - if (myNbOkElements) { - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); - } - - myBusy = false; -} - -//================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case -//================================================================================= -void SMESHGUI_RemoveElementsDlg::SelectionIntoArgument() -{ - if (myBusy) return; - - // clear - - myNbOkElements = false; - myActor = 0; - - myBusy = true; - myEditCurrentArgument->setText(""); - myBusy = false; - - if (!GroupButtons->isEnabled()) // inactive - return; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - // get selected mesh - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); - - int nbSel = aList.Extent(); - if (nbSel != 1) - return; - - Handle(SALOME_InteractiveObject) anIO = aList.First(); - myMesh = SMESH::GetMeshByIO(anIO); - if (myMesh->_is_nil()) - return; - - myActor = SMESH::FindActorByEntry(anIO->getEntry()); - if (!myActor) - return; - - // get selected nodes - QString aString = ""; - int nbElems = SMESH::GetNameOfSelectedElements(mySelector,anIO,aString); - if(nbElems < 1) - return; - myBusy = true; - myEditCurrentArgument->setText(aString); - myBusy = false; - - // OK - - myNbOkElements = nbElems; - - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); -} - -//================================================================================= -// function : SetEditCurrentArgument() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::SetEditCurrentArgument() -{ - QPushButton* send = (QPushButton*)sender(); - switch (myConstructorId) - { - case 0: /* default constructor */ - { - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; - } - SelectionIntoArgument(); - break; - } - } - return; -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::DeactivateActiveDialog() -{ - if (GroupConstructors->isEnabled()) { - GroupConstructors->setEnabled(false); - GroupC1->setEnabled(false); - GroupButtons->setEnabled(false); - mySMESHGUI->ResetState(); // ?? - mySMESHGUI->SetActiveDialogBox(0); // ?? - } -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ActivateThisDialog() -{ - /* Emit a signal to deactivate the active dialog */ - mySMESHGUI->EmitSignalDeactivateDialog(); - - GroupConstructors->setEnabled(true); - GroupC1->setEnabled(true); - GroupButtons->setEnabled(true); - - mySMESHGUI->SetActiveDialogBox((QDialog*)this); // ?? - - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - - SelectionIntoArgument(); // ?? -} - -//================================================================================= -// function : enterEvent() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::enterEvent (QEvent*) -{ - if (!GroupConstructors->isEnabled()) - ActivateThisDialog(); -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::closeEvent (QCloseEvent*) -{ - /* same than click on cancel button */ - this->ClickOnCancel(); - return; -} - -//======================================================================= -//function : hideEvent -//purpose : caused by ESC key -//======================================================================= -void SMESHGUI_RemoveElementsDlg::hideEvent (QHideEvent * e) -{ - if (!isMinimized()) - ClickOnCancel(); -} diff --git a/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx deleted file mode 100644 index 5e9261eb1..000000000 --- a/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx +++ /dev/null @@ -1,489 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_RemoveNodesDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_RemoveNodesDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_IdValidator.h" - -#include "SMESH_Actor.h" -#include "SMDS_Mesh.hxx" - -#include "SUIT_ResourceMgr.h" -#include "SUIT_Desktop.h" - -#include "SVTK_Selector.h" -#include "SVTK_ViewModel.h" -#include "SVTK_ViewWindow.h" -#include "SALOME_ListIO.hxx" - -#include "utilities.h" - -// OCCT Includes -#include -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -//================================================================================= -// class : SMESHGUI_RemoveNodesDlg() -// purpose : -//================================================================================= -SMESHGUI_RemoveNodesDlg -::SMESHGUI_RemoveNodesDlg(SMESHGUI* theModule, - const char* name, - bool modal, - WFlags fl) - : QDialog(SMESH::GetDesktop(theModule), - name, - modal, - WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose), - mySelector(SMESH::GetViewWindow(theModule)->GetSelector()), - mySelectionMgr(SMESH::GetSelectionMgr(theModule)), - mySMESHGUI(theModule), - myBusy(false) -{ - QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_REM_NODE"))); - QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - - if (!name) - setName("SMESHGUI_RemoveNodesDlg"); - resize(303, 185); - setCaption(tr("SMESH_REMOVE_NODES_TITLE" )); - setSizeGripEnabled(TRUE); - SMESHGUI_RemoveNodesDlgLayout = new QGridLayout(this); - SMESHGUI_RemoveNodesDlgLayout->setSpacing(6); - SMESHGUI_RemoveNodesDlgLayout->setMargin(11); - - /***************************************************************/ - GroupConstructors = new QButtonGroup(this, "GroupConstructors"); - GroupConstructors->setTitle(tr("SMESH_NODES" )); - GroupConstructors->setExclusive(TRUE); - GroupConstructors->setColumnLayout(0, Qt::Vertical); - GroupConstructors->layout()->setSpacing(0); - GroupConstructors->layout()->setMargin(0); - GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout()); - GroupConstructorsLayout->setAlignment(Qt::AlignTop); - GroupConstructorsLayout->setSpacing(6); - GroupConstructorsLayout->setMargin(11); - Constructor1 = new QRadioButton(GroupConstructors, "Constructor1"); - Constructor1->setText(tr("" )); - Constructor1->setPixmap(image0); - Constructor1->setChecked(TRUE); - Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth())); - Constructor1->setMinimumSize(QSize(50, 0)); - GroupConstructorsLayout->addWidget(Constructor1, 0, 0); - QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupConstructorsLayout->addItem(spacer, 0, 1); - SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupConstructors, 0, 0); - - /***************************************************************/ - GroupButtons = new QGroupBox(this, "GroupButtons"); - GroupButtons->setGeometry(QRect(10, 10, 281, 48)); - GroupButtons->setTitle(tr("" )); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - buttonCancel = new QPushButton(GroupButtons, "buttonCancel"); - buttonCancel->setText(tr("SMESH_BUT_CLOSE" )); - buttonCancel->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 3); - buttonApply = new QPushButton(GroupButtons, "buttonApply"); - buttonApply->setText(tr("SMESH_BUT_APPLY" )); - buttonApply->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonApply, 0, 1); - QSpacerItem* spacer_9 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupButtonsLayout->addItem(spacer_9, 0, 2); - buttonOk = new QPushButton(GroupButtons, "buttonOk"); - buttonOk->setText(tr("SMESH_BUT_OK" )); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupButtons, 2, 0); - - /***************************************************************/ - GroupC1 = new QGroupBox(this, "GroupC1"); - GroupC1->setTitle(tr("SMESH_REMOVE" )); - GroupC1->setMinimumSize(QSize(0, 0)); - GroupC1->setFrameShape(QGroupBox::Box); - GroupC1->setFrameShadow(QGroupBox::Sunken); - GroupC1->setColumnLayout(0, Qt::Vertical); - GroupC1->layout()->setSpacing(0); - GroupC1->layout()->setMargin(0); - GroupC1Layout = new QGridLayout(GroupC1->layout()); - GroupC1Layout->setAlignment(Qt::AlignTop); - GroupC1Layout->setSpacing(6); - GroupC1Layout->setMargin(11); - TextLabelC1A1 = new QLabel(GroupC1, "TextLabelC1A1"); - TextLabelC1A1->setText(tr("SMESH_ID_NODES" )); - TextLabelC1A1->setMinimumSize(QSize(50, 0)); - TextLabelC1A1->setFrameShape(QLabel::NoFrame); - TextLabelC1A1->setFrameShadow(QLabel::Plain); - GroupC1Layout->addWidget(TextLabelC1A1, 0, 0); - SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1"); - SelectButtonC1A1->setText(tr("" )); - SelectButtonC1A1->setPixmap(image1); - SelectButtonC1A1->setToggleButton(FALSE); - GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1); - LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1"); - LineEditC1A1->setValidator(new SMESHGUI_IdValidator(this, "validator")); - GroupC1Layout->addWidget(LineEditC1A1, 0, 2); - SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupC1, 1, 0); - - Init(); /* Initialisations */ -} - -//================================================================================= -// function : ~SMESHGUI_RemoveNodesDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_RemoveNodesDlg::~SMESHGUI_RemoveNodesDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::Init() -{ - GroupC1->show(); - myConstructorId = 0; - Constructor1->setChecked(TRUE); - myEditCurrentArgument = LineEditC1A1; - - myNbOkNodes = 0; - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - myActor = 0; - myBusy = false; - - /* signals and slots connections */ - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); - - connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(myEditCurrentArgument, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); - - /* Move widget on the botton right corner of main widget */ - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); /* displays Dialog */ - - SMESH::SetPointRepresentation(true); - - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - - SelectionIntoArgument(); -} - -//================================================================================= -// function : ConstructorsClicked() -// purpose : Radio button management -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ConstructorsClicked (int) -{ -} - -//================================================================================= -// function : ClickOnApply() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ClickOnApply() -{ - if (mySMESHGUI->isActiveStudyLocked()) - return; - - if (myNbOkNodes) { - QStringList aListId = QStringList::split(" ", myEditCurrentArgument->text(), false); - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length(aListId.count()); - for (int i = 0; i < aListId.count(); i++) - anArrayOfIdeces[i] = aListId[ i ].toInt(); - - bool aResult = false; - try { - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - aResult = aMeshEditor->RemoveNodes(anArrayOfIdeces.inout()); - } catch(...) { - } - - if (aResult) { - myEditCurrentArgument->clear(); - SMESH::UpdateView(); - } - - SMESH::SetPointRepresentation(true); - } -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ClickOnOk() -{ - ClickOnApply(); - ClickOnCancel(); -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ClickOnCancel() -{ - mySelectionMgr->clearSelected(); - SMESH::SetPointRepresentation(false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - disconnect(mySelectionMgr, 0, this, 0); - mySMESHGUI->ResetState(); - reject(); -} - -//======================================================================= -//function : onTextChange -//purpose : -//======================================================================= -void SMESHGUI_RemoveNodesDlg::onTextChange (const QString& theNewText) -{ - if (myBusy) return; - myBusy = true; - - myNbOkNodes = 0; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - // hilight entered nodes - if(myActor){ - if(SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh()){ - Handle(SALOME_InteractiveObject) anIO = myActor->getIO(); - - TColStd_MapOfInteger newIndices; - - QStringList aListId = QStringList::split(" ", theNewText, false); - for (int i = 0; i < aListId.count(); i++) { - if (const SMDS_MeshNode *aNode = aMesh->FindNode(aListId[i].toInt())) { - newIndices.Add(aNode->GetID()); - myNbOkNodes++; - } - } - - mySelector->AddOrRemoveIndex(anIO,newIndices,false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight(anIO,true,true); - } - } - - if (myNbOkNodes) { - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); - } - - myBusy = false; -} - -//================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case -//================================================================================= -void SMESHGUI_RemoveNodesDlg::SelectionIntoArgument() -{ - if (myBusy) return; - - // clear - - myNbOkNodes = false; - myActor = 0; - - myBusy = true; - myEditCurrentArgument->setText(""); - myBusy = false; - - if (!GroupButtons->isEnabled()) // inactive - return; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - // get selected mesh - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); - - int nbSel = aList.Extent(); - if (nbSel != 1) - return; - - Handle(SALOME_InteractiveObject) anIO = aList.First(); - myMesh = SMESH::GetMeshByIO(anIO); - if (myMesh->_is_nil()) - return; - - myActor = SMESH::FindActorByEntry(anIO->getEntry()); - if (!myActor) - return; - - // get selected nodes - - QString aString = ""; - int nbNodes = SMESH::GetNameOfSelectedNodes(mySelector,anIO,aString); - if(nbNodes < 1) - return; - myBusy = true; - myEditCurrentArgument->setText(aString); - myBusy = false; - - // OK - - myNbOkNodes = true; - - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); -} - -//================================================================================= -// function : SetEditCurrentArgument() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::SetEditCurrentArgument() -{ - QPushButton* send = (QPushButton*)sender(); - switch (myConstructorId) - { - case 0: /* default constructor */ - { - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; - } - SelectionIntoArgument(); - break; - } - } - return; -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::DeactivateActiveDialog() -{ - if (GroupConstructors->isEnabled()) { - GroupConstructors->setEnabled(false); - GroupC1->setEnabled(false); - GroupButtons->setEnabled(false); - mySMESHGUI->ResetState(); // ?? - mySMESHGUI->SetActiveDialogBox(0); // ?? - } -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ActivateThisDialog() -{ - /* Emit a signal to deactivate the active dialog */ - mySMESHGUI->EmitSignalDeactivateDialog(); - - GroupConstructors->setEnabled(true); - GroupC1->setEnabled(true); - GroupButtons->setEnabled(true); - - mySMESHGUI->SetActiveDialogBox((QDialog*)this); // ?? - - SMESH::SetPointRepresentation(true); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - - SelectionIntoArgument(); // ?? -} - -//================================================================================= -// function : enterEvent() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::enterEvent (QEvent*) -{ - if (!GroupConstructors->isEnabled()) - ActivateThisDialog(); -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::closeEvent (QCloseEvent*) -{ - /* same than click on cancel button */ - this->ClickOnCancel(); - return; -} - -//======================================================================= -//function : hideEvent -//purpose : caused by ESC key -//======================================================================= -void SMESHGUI_RemoveNodesDlg::hideEvent (QHideEvent * e) -{ - if (!isMinimized()) - ClickOnCancel(); -} diff --git a/src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx b/src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx deleted file mode 100644 index ddfe9fbd8..000000000 --- a/src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx +++ /dev/null @@ -1,43 +0,0 @@ -// 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 - - -#include "QAD_Desktop.h" - -#include "SMESHGUI_SMESHGenUtils.h" - -#include "SALOMEconfig.h" -#include CORBA_CLIENT_HEADER(SALOMEDS) - -namespace SMESH -{ - - SMESH::SMESH_Gen_var GetSMESHGen() - { - static SMESH::SMESH_Gen_var aSMESHGen; - if(CORBA::is_nil(aSMESHGen)){ - if(QAD_Desktop* aDesktop = QAD_Application::getDesktop()){ - Engines::Component_var aComponent = aDesktop->getEngine("FactoryServer","SMESH"); - aSMESHGen = SMESH::SMESH_Gen::_narrow(aComponent); - } - } - return aSMESHGen; - } - -} diff --git a/src/SMESHGUI/SMESHGUI_SMESHGenUtils.h b/src/SMESHGUI/SMESHGUI_SMESHGenUtils.h deleted file mode 100644 index 54a8d4374..000000000 --- a/src/SMESHGUI/SMESHGUI_SMESHGenUtils.h +++ /dev/null @@ -1,35 +0,0 @@ -// 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 - -#ifndef SMESHGUI_SMESHGenUtils_HeaderFile -#define SMESHGUI_SMESHGenUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Gen) - - -namespace SMESH -{ - - SMESH::SMESH_Gen_var GetSMESHGen(); - -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_SpinBox.cxx b/src/SMESHGUI/SMESHGUI_SpinBox.cxx deleted file mode 100644 index 54c247a80..000000000 --- a/src/SMESHGUI/SMESHGUI_SpinBox.cxx +++ /dev/null @@ -1,101 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_SpinBox.cxx -// Author : Lucien PIGNOLONI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_SpinBox.h" -#include "SMESHGUI.h" - -#include -#include - -using namespace std; - -//================================================================================= -// class : SMESHGUI_SpinBox() -// purpose : constructor of specific widget accepting floats in double precision. -//================================================================================= -SMESHGUI_SpinBox::SMESHGUI_SpinBox (QWidget* parent, const char* name) - : QtxDblSpinBox(parent, name) -{ -} - -//================================================================================= -// function : SetStep() [SLOT] -// purpose : -//================================================================================= -void SMESHGUI_SpinBox::SetStep (double newStep) -{ - setLineStep(newStep); -} - -//================================================================================= -// function : ~SMESHGUI_SpinBox() -// purpose : destructor -//================================================================================= -SMESHGUI_SpinBox::~SMESHGUI_SpinBox() -{ -} - -//================================================================================= -// function : SetValue() -// purpose : -//================================================================================= -void SMESHGUI_SpinBox::SetValue (double v) -{ - setValue(v); - editor()->setCursorPosition( 0 ); -} - -//================================================================================= -// function : GetValue() -// purpose : returns a double -//================================================================================= -double SMESHGUI_SpinBox::GetValue() -{ - return value(); -} - -//================================================================================= -// function : GetString() -// purpose : returns a QString -//================================================================================= -QString SMESHGUI_SpinBox::GetString() -{ - return cleanText(); -} - -//================================================================================= -// function : RangeStepAndValidator() -// purpose : -//================================================================================= -void SMESHGUI_SpinBox::RangeStepAndValidator - (double min, double max, double step, unsigned short decimals) -{ - setRange(min, max); - setLineStep(step); - ((QDoubleValidator*)validator())->setRange(min, max, decimals); -} diff --git a/src/SMESHGUI/SMESHGUI_SpinBox.h b/src/SMESHGUI/SMESHGUI_SpinBox.h deleted file mode 100644 index 8655e4dfb..000000000 --- a/src/SMESHGUI/SMESHGUI_SpinBox.h +++ /dev/null @@ -1,58 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_SpinBox.h -// Author : Lucien PIGNOLONI -// Module : SMESH -// $Header$ - -#ifndef SMESH_SPINBOX_H -#define SMESH_SPINBOX_H - -#include - -//================================================================================= -// class : SMESHGUI_SpinBox -// purpose : Derivated from QtxDblSpinBox class -//================================================================================= -class SMESHGUI_SpinBox : public QtxDblSpinBox -{ - Q_OBJECT - -public: - SMESHGUI_SpinBox (QWidget* parent, const char* name = 0); - ~SMESHGUI_SpinBox(); - - void RangeStepAndValidator (double min = -1000000.0, - double max = +1000000.0, - double step = 100.0, - unsigned short decimals = 3); - void SetValue (double v); - double GetValue(); - QString GetString(); - QLineEdit* editor() { return QtxDblSpinBox::editor(); } - -public slots: - void SetStep (double newStep); -}; -#endif // SMESH_SPINBOX_H diff --git a/src/SMESHGUI/SMESHGUI_Swig.cxx b/src/SMESHGUI/SMESHGUI_Swig.cxx deleted file mode 100644 index d8a0805e3..000000000 --- a/src/SMESHGUI/SMESHGUI_Swig.cxx +++ /dev/null @@ -1,485 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESH_Swig.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESHGUI_Swig.hxx" - -#include "Utils_ORB_INIT.hxx" -#include "Utils_SINGLETON.hxx" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_GEOMGenUtils.h" - -// SALOME Includes -#include "SUIT_ResourceMgr.h" -#include "SUIT_Session.h" - -#include "SALOMEDS_SObject.hxx" - -#include "SalomeApp_Application.h" - -#include "utilities.h" - -// Open CASCADE Includes -#include - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SMESH_Gen) -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -static CORBA::ORB_var _orb; - -static CORBA::Object_ptr StringToObject (const char* ior) -{ - return _orb->string_to_object(ior); -} - -SMESH_Swig::SMESH_Swig() -{ - MESSAGE("Constructeur"); - setOrb(); -} - -void SMESH_Swig::Init(int studyID) -{ - MESSAGE("Init"); - SMESH::SMESH_Gen_var CompMesh = SMESHGUI::GetSMESHGen(); - GEOM::GEOM_Gen_var CompGeom = SMESH::GetGEOMGen(); - - SUIT_ResourceMgr* resMgr = SMESHGUI::resourceMgr(); - if ( resMgr ) { - resMgr->loadLanguage( QString::null, "en" ); - /*QString msg; - if (!resMgr->loadResources( "SMESH", msg )) - MESSAGE ( msg )*/ - } - - SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ); - if( !app ) - return; - - CORBA::Object_var obj = app->namingService()->Resolve("/myStudyManager"); - SALOMEDS::StudyManager_var myStudyMgr = SALOMEDS::StudyManager::_narrow(obj); - myStudy = myStudyMgr->GetStudyByID(studyID); - - CompMesh->SetCurrentStudy( myStudy.in() ); - - myStudyBuilder = myStudy->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributePixMap_var aPixmap; - - // See return value of SMESH::SMESH_Gen::ComponentDataType() - SALOMEDS::SComponent_var father = myStudy->FindComponent("SMESH"); - - if (father->_is_nil()) { - bool aLocked = myStudy->GetProperties()->IsLocked(); - if (aLocked) myStudy->GetProperties()->SetLocked(false); - father = myStudyBuilder->NewComponent("SMESH"); - anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - //NRI aName->SetValue(QObject::tr("SMESH_MEN_COMPONENT")); - SMESHGUI* gui = SMESHGUI::GetSMESHGUI(); //SRN: BugID IPAL9186, load a SMESH gui if it hasn't been loaded - if(!gui) { - SalomeApp_Application* app = dynamic_cast(SUIT_Session::session()->activeApplication()); - if(app) { - CAM_Module* module = app->module( "Mesh" ); - if(!module) module = app->loadModule("Mesh"); - gui = dynamic_cast( module ); - } - else { - MESSAGE("Can't find the application"); - } - } //SRN: BugID IPAL9186: end of a fix - aName->SetValue( gui->moduleName() ); - anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_OBJBROWSER_SMESH" ); - myStudyBuilder->DefineComponentInstance(father, CompMesh ); - if (aLocked) myStudy->GetProperties()->SetLocked(true); - } - mySComponentMesh = SALOMEDS::SComponent::_narrow( father ); - - // Tags definition - Tag_HypothesisRoot = 1; - Tag_AlgorithmsRoot = 2; - - Tag_RefOnShape = 1; - Tag_RefOnAppliedHypothesis = 2; - Tag_RefOnAppliedAlgorithms = 3; - - Tag_SubMeshOnVertex = 4; - Tag_SubMeshOnEdge = 5; - Tag_SubMeshOnFace = 6; - Tag_SubMeshOnSolid = 7; - Tag_SubMeshOnCompound = 8; -} - -SMESH_Swig::~SMESH_Swig() -{ - MESSAGE("Destructeur"); -} - -const char* SMESH_Swig::AddNewMesh(const char* IOR) -{ - MESSAGE("AddNewMesh"); - - // VSR: added temporarily - to be removed - objects are published automatically by engine - SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); - if ( !SO->_is_nil() ) - return SO->GetID(); - - //Find or Create Hypothesis root - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - SALOMEDS::SObject_var HypothesisRoot; - if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) { - HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - } - - SALOMEDS::SObject_var AlgorithmsRoot; - if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) { - AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - } - - // Add New Mesh - SALOMEDS::SObject_var newMesh = myStudyBuilder->NewObject(mySComponentMesh); - anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IOR); - return SALOMEDS::SObject::_narrow( newMesh )->GetID(); -} - -const char* SMESH_Swig::AddNewHypothesis(const char* IOR) -{ - MESSAGE("AddNewHypothesis"); - - // VSR: added temporarily - to be removed - objects are published automatically by engine - SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); - if ( !SO->_is_nil() ) - return SO->GetID(); - - //Find or Create Hypothesis root - SALOMEDS::SObject_var HypothesisRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) { - HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); - } - // Add New Hypothesis - SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - SMESH::SMESH_Hypothesis_var H = SMESH::SMESH_Hypothesis::_narrow( StringToObject(IOR) ); - QString aType = H->GetName(); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_" + aType ); -// if ( aType.compare("LocalLength") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_LENGTH" ); -// else if ( aType.compare("NumberOfSegments") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_SEGMENT" ); -// else if ( aType.compare("MaxElementArea") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_AREA" ); -// else if ( aType.compare("MaxElementVolume") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_VOLUME" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IOR); - return SALOMEDS::SObject::_narrow(newHypo)->GetID(); -} - -const char* SMESH_Swig::AddNewAlgorithms(const char* IOR) -{ - MESSAGE("AddNewAlgorithms"); - - // VSR: added temporarily - to be removed - objects are published automatically by engine - SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); - if ( !SO->_is_nil() ) - return SO->GetID(); - - //Find or Create Algorithms root - SALOMEDS::SObject_var AlgorithmsRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) { - AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" ); - } - // Add New Algorithms - SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - SMESH::SMESH_Hypothesis_var H = SMESH::SMESH_Hypothesis::_narrow( StringToObject(IOR) ); - QString aType = H->GetName(); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_" + aType ); -// if ( aType.compare("Regular_1D") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_REGULAR" ); -// else if ( aType.compare("MEFISTO_2D") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_MEFISTO" ); -// else if ( aType.compare("Quadrangle_2D") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_QUAD" ); -// else if ( aType.compare("Hexa_3D") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_HEXA" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IOR); - return SALOMEDS::SObject::_narrow(newHypo)->GetID(); -} - -void SMESH_Swig::SetShape(const char* ShapeEntry, const char* MeshEntry) -{ - SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( MeshEntry ); - SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectID( ShapeEntry ); - - if ( !SO_MorSM->_is_nil() && !SO_GeomShape->_is_nil() ) { - SALOMEDS::SObject_var SO = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnShape); - myStudyBuilder->Addreference (SO,SO_GeomShape); - } -} - -void SMESH_Swig::SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry) -{ - SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( Mesh_Or_SubMesh_Entry ); - SALOMEDS::SObject_var SO_Hypothesis = myStudy->FindObjectID( Hypothesis_Entry ); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if ( !SO_MorSM->_is_nil() && !SO_Hypothesis->_is_nil() ) { - - //Find or Create Applied Hypothesis root - SALOMEDS::SObject_var AHR; - if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedHypothesis, AHR)) { - AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_HYPOTHESIS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); - } - SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR); - myStudyBuilder->Addreference (SO,SO_Hypothesis); - } -} - -void SMESH_Swig::SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry) -{ - SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( Mesh_Or_SubMesh_Entry ); - SALOMEDS::SObject_var SO_Algorithms = myStudy->FindObjectID( Algorithms_Entry ); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if ( !SO_MorSM->_is_nil() && !SO_Algorithms->_is_nil() ) { - //Find or Create Applied Algorithms root - SALOMEDS::SObject_var AHR; - if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedAlgorithms, AHR)) { - AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_ALGORIHTMS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" ); - } - SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR); - myStudyBuilder->Addreference (SO,SO_Algorithms); - } -} - -void SMESH_Swig::UnSetHypothesis(const char* Applied_Hypothesis_Entry ) -{ - SALOMEDS::SObject_var SO_Applied_Hypothesis = myStudy->FindObjectID( Applied_Hypothesis_Entry ); - if ( !SO_Applied_Hypothesis->_is_nil() ) - myStudyBuilder->RemoveObject(SO_Applied_Hypothesis); -} - -const char* SMESH_Swig::AddSubMesh(const char* SO_Mesh_Entry, const char* SM_IOR, int ST) -{ - SALOMEDS::SObject_var SO_Mesh = myStudy->FindObjectID( SO_Mesh_Entry ); - if ( !SO_Mesh->_is_nil() ) { - - long Tag_Shape ; - Standard_CString Name; - - if (ST == TopAbs_SOLID) {Tag_Shape = Tag_SubMeshOnSolid; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnSolid"));} - else if (ST == TopAbs_FACE) {Tag_Shape = Tag_SubMeshOnFace; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnFace"));} - else if (ST == TopAbs_EDGE) {Tag_Shape = Tag_SubMeshOnEdge; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnEdge"));} - else if (ST == TopAbs_VERTEX){Tag_Shape = Tag_SubMeshOnVertex; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnVertex"));} - else { - Tag_Shape = Tag_SubMeshOnCompound; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnCompound")); - } - SALOMEDS::SObject_var SubmeshesRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - if (!SO_Mesh->FindSubObject (Tag_Shape,SubmeshesRoot )) { - SubmeshesRoot = myStudyBuilder->NewObjectToTag (SO_Mesh, Tag_Shape); - anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(Name); - anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - } - - free(Name); - - SALOMEDS::SObject_var SO = myStudyBuilder->NewObject (SubmeshesRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(SM_IOR); - return SALOMEDS::SObject::_narrow( SO )->GetID(); - } - return ""; -} - -const char* SMESH_Swig::AddSubMeshOnShape(const char* Mesh_Entry, const char* GeomShape_Entry, - const char* SM_IOR, int ST) -{ - SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectID( GeomShape_Entry ); - if ( !SO_GeomShape->_is_nil() ) { - const char * SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST); - SALOMEDS::SObject_var SO_SM = myStudy->FindObjectID( SM_Entry ); - if ( !SO_SM->_is_nil() ) { - SetShape (GeomShape_Entry, SM_Entry); - return SALOMEDS::SObject::_narrow( SO_SM )->GetID(); - } - } - return ""; -} - -void SMESH_Swig::CreateAndDisplayActor( const char* Mesh_Entry ) -{ - // SMESH_Actor* Mesh = smeshGUI->ReadScript(aM); -} - -void SMESH_Swig::SetName(const char* Entry, const char* Name) -{ - SALOMEDS::SObject_var SO = myStudy->FindObjectID( Entry ); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - if ( !SO->_is_nil() ) { - anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(Name); - } -} - -void SMESH_Swig::setOrb() -{ - try { - ORB_INIT &init = *SINGLETON_::Instance(); - ASSERT(SINGLETON_::IsAlreadyExisting()); - _orb = init( 0 , 0 ); - } catch (...) { - INFOS("internal error : orb not found"); - _orb = 0; - } - ASSERT(! CORBA::is_nil(_orb)); -} - -//================================================================================ -/*! - * \brief Set mesh icon according to compute status - * \param Mesh_Entry - entry of a mesh - * \param isComputed - is mesh computed or not - */ -//================================================================================ - -void SMESH_Swig::SetMeshIcon(const char* Mesh_Entry, const bool isComputed) -{ - SALOMEDS::SObject_var mesh_var = myStudy->FindObjectID( Mesh_Entry ); - if ( !mesh_var->_is_nil() ) { - _PTR(SObject) mesh = _PTR(SObject)(new SALOMEDS_SObject( mesh_var )); - if ( mesh ) - SMESH::ModifiedMesh( mesh, isComputed ); - } -} diff --git a/src/SMESHGUI/SMESHGUI_Swig.hxx b/src/SMESHGUI/SMESHGUI_Swig.hxx deleted file mode 100644 index e1b2ebcbc..000000000 --- a/src/SMESHGUI/SMESHGUI_Swig.hxx +++ /dev/null @@ -1,94 +0,0 @@ -// SMESH SMESH : GUI for SMESH component -// -// 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 : SMESHGUI_Swig.hxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef _SMESHGUI_SWIG_HXX_ -#define _SMESHGUI_SWIG_HXX_ - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SALOMEDS) -#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) - -class SMESH_Swig -{ -public: - SMESH_Swig(); - ~SMESH_Swig(); - - static void setOrb(); - - void Init(int studyID); - - const char* AddNewMesh(const char* IOR); - - const char* AddNewHypothesis(const char* IOR); - const char* AddNewAlgorithms(const char* IOR); - - void SetShape(const char* ShapeEntry, const char* MeshEntry); - - void SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry); - void SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry); - - void UnSetHypothesis(const char* Applied_Hypothesis_Entry ); - - const char* AddSubMesh (const char* Mesh_Entry, const char* SM_IOR, int ST); - const char* AddSubMeshOnShape (const char* Mesh_Entry, const char* GeomShape_Entry, const char* SM_IOR, int ST); - - void CreateAndDisplayActor( const char* Mesh_Entry ); - - void SetName(const char* Entry, const char* Name); - - /*! - * \brief Set mesh icon according to compute status - * \param Mesh_Entry - entry of a mesh - * \param isComputed - is mesh computed or not - */ - void SetMeshIcon(const char* Mesh_Entry, const bool isComputed); - -private: - SALOMEDS::Study_var myStudy; - SALOMEDS::StudyBuilder_var myStudyBuilder; - SALOMEDS::SComponent_var mySComponentMesh; - - // Tags definition - long Tag_HypothesisRoot; - long Tag_AlgorithmsRoot; - - long Tag_RefOnShape; - long Tag_RefOnAppliedHypothesis; - long Tag_RefOnAppliedAlgorithms; - - long Tag_SubMeshOnVertex; - long Tag_SubMeshOnEdge; - long Tag_SubMeshOnFace; - long Tag_SubMeshOnSolid; - long Tag_SubMeshOnCompound; -}; - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_Swig.i b/src/SMESHGUI/SMESHGUI_Swig.i deleted file mode 100644 index 2a99fe192..000000000 --- a/src/SMESHGUI/SMESHGUI_Swig.i +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// 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 : SMESHGUI_Swig.i -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -%{ -#include "SMESHGUI_Swig.hxx" -%} - -%include "typemaps.i" - -class SMESH_Swig -{ - public: - SMESH_Swig(); - ~SMESH_Swig(); - - void Init(int studyID); - - const char* AddNewMesh(const char* IOR); - const char* AddNewHypothesis(const char* IOR); - const char* AddNewAlgorithms(const char* IOR); - - void SetShape(const char* ShapeEntry, const char* MeshEntry); - - void SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry); - void SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry); - - void UnSetHypothesis(const char* Applied_Hypothesis_Entry ); - - const char* AddSubMesh (const char* Mesh_Entry, const char* SM_IOR, int ST); - const char* AddSubMeshOnShape (const char* Mesh_Entry, const char* GeomShape_Entry, const char* SM_IOR, int ST); - - void SetName(const char* Entry, const char* Name); - - void SetMeshIcon(const char* Mesh_Entry, const bool isComputed); -}; diff --git a/src/SMESHGUI/SMESH_icons.po b/src/SMESHGUI/SMESH_icons.po deleted file mode 100644 index 60dff5a19..000000000 --- a/src/SMESHGUI/SMESH_icons.po +++ /dev/null @@ -1,222 +0,0 @@ -# This is a Qt message file in .po format. Each msgid starts with -# a scope. This scope should *NOT* be translated - eg. "Foo::Bar" -# would be translated to "Pub", not "Foo::Pub". -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n" -"PO-Revision-Date: YYYY-MM-DD\n" -"Last-Translator: FULLNAME \n" -"Content-Type: text/plain; charset=iso-8859-1\n" - - -#----------------------------------------------------------- -# Divers Mesh -#----------------------------------------------------------- - -#ObjectBrowser Icon -msgid "ICON_OBJBROWSER_SMESH" -msgstr "mesh.png" - -#Select Icon -msgid "ICON_SELECT" -msgstr "select1.png" - -#Mesh Init -msgid "ICON_DLG_INIT_MESH" -msgstr "mesh_init.png" - -# -msgid "ICON_DLG_ADD_SUBMESH" -msgstr "mesh_add_sub.png" - -#Move Node -msgid "ICON_DLG_MOVE_NODE" -msgstr "mesh_move_node.png" - -#Remove Node -msgid "ICON_DLG_REM_NODE" -msgstr "mesh_rem_node.png" - -#Remove Element -msgid "ICON_DLG_REM_ELEMENT" -msgstr "mesh_rem_element.png" - -#Orientation -msgid "ICON_DLG_MESH_ORIENTATION" -msgstr "mesh_orientation.png" - -# -msgid "ICON_DLG_MESH_DIAGONAL" -msgstr "mesh_diagonal.png" - -#Connectivity -msgid "ICON_DLG_CONNECTIVITY" -msgstr "mesh_connectivity.png" - -#Smoothing -msgid "ICON_DLG_SMOOTHING" -msgstr "mesh_smoothing.png" - -#Renumbering nodes -msgid "ICON_DLG_RENUMBERING_NODES" -msgstr "mesh_renumbering_nodes.png" - -#Renumbering elements -msgid "ICON_DLG_RENUMBERING_ELEMENTS" -msgstr "mesh_renumbering_elements.png" - -#Rotation -msgid "ICON_DLG_ROTATION" -msgstr "mesh_rotation.png" - -#Translation by vector -msgid "ICON_SMESH_TRANSLATION_VECTOR" -msgstr "mesh_translation_vector.png" - -#Translation by two points -msgid "ICON_SMESH_TRANSLATION_POINTS" -msgstr "mesh_translation_points.png" - -#Symmetry by point -msgid "ICON_SMESH_SYMMETRY_POINT" -msgstr "mesh_symmetry_point.png" - -#Symmetry by axis -msgid "ICON_SMESH_SYMMETRY_AXIS" -msgstr "mesh_symmetry_axis.png" - -#Symmetry by plane -msgid "ICON_SMESH_SYMMETRY_PLANE" -msgstr "mesh_symmetry_plane.png" - -#Sew free borders -msgid "ICON_SMESH_SEWING_FREEBORDERS" -msgstr "mesh_sew_freeborders.png" - -#Sew conform free borders -msgid "ICON_SMESH_SEWING_CONFORM_FREEBORDERS" -msgstr "mesh_sew_conform_freeborders.png" - -#Sew border to side -msgid "ICON_SMESH_SEWING_BORDERTOSIDE" -msgstr "mesh_sew_bordertoside.png" - -#Sew side elements -msgid "ICON_SMESH_SEWING_SIDEELEMENTS" -msgstr "mesh_sew_sideelements.png" - -#Merge nodes -msgid "ICON_SMESH_MERGE_NODES" -msgstr "mesh_merge_nodes.png" - -#----------------------------------------------------------- -# Hypothesis -#----------------------------------------------------------- - -#Set Algo -msgid "ICON_DLG_ADD_ALGORITHM" -msgstr "mesh_set_algo.png" - -#Set Hypo -msgid "ICON_DLG_ADD_HYPOTHESIS" -msgstr "mesh_set_hypo.png" - -#Edit Hypo. -msgid "ICON_DLG_EDIT_MESH" -msgstr "mesh_edit.png" - - -#----------------------------------------------------------- -# Elements -#----------------------------------------------------------- - -#Vertex -msgid "ICON_DLG_NODE" -msgstr "mesh_vertex.png" - -#Line -msgid "ICON_DLG_EDGE" -msgstr "mesh_line.png" - -#triangle -msgid "ICON_DLG_TRIANGLE" -msgstr "mesh_triangle.png" - -#Quadrangle -msgid "ICON_DLG_QUADRANGLE" -msgstr "mesh_quad.png" - -#triangle -msgid "ICON_DLG_TETRAS" -msgstr "mesh_tetra.png" - -#Quadrangle -msgid "ICON_DLG_HEXAS" -msgstr "mesh_hexa.png" - - -#----------------------------------------------------------- -# ObjectBrowser -#----------------------------------------------------------- - -#mesh_tree_mesh -msgid "ICON_SMESH_TREE_MESH" -msgstr "mesh_tree_mesh.png" - -#mesh_tree_group -msgid "ICON_SMESH_TREE_GROUP" -msgstr "mesh_tree_group.png" - -#mesh_tree_algo -msgid "ICON_SMESH_TREE_ALGO" -msgstr "mesh_tree_algo.png" - -#mesh_tree_hypo -msgid "ICON_SMESH_TREE_HYPO" -msgstr "mesh_tree_hypo.png" - -#mesh_tree_mesh_warn -msgid "ICON_SMESH_TREE_MESH_WARN" -msgstr "mesh_tree_mesh_warn.png" - -#mesh_tree_mesh -msgid "ICON_SMESH_TREE_MESH_IMPORTED" -msgstr "mesh_tree_importedmesh.png" - - -#----------------------------------------------------------- -# Group -#----------------------------------------------------------- - -msgid "ICON_EDIT_GROUP" -msgstr "mesh_edit_group.png" - -msgid "ICON_CONSTRUCT_GROUP" -msgstr "mesh_make_group.png" - -#----------------------------------------------------------- -# Mesh pattern -#----------------------------------------------------------- - -msgid "ICON_PATTERN_2d" -msgstr "mesh_algo_mefisto.png" - -msgid "ICON_PATTERN_3d" -msgstr "mesh_algo_hexa.png" - -msgid "ICON_PATTERN_SAMPLE_2D" -msgstr "pattern_sample_2d.png" - -msgid "ICON_PATTERN_SAMPLE_3D" -msgstr "pattern_sample_3D.png" - -#----------------------------------------------------------- -# Add/Remove buttons -#----------------------------------------------------------- - -msgid "ICON_APPEND" -msgstr "mesh_add.png" - -msgid "ICON_REMOVE" -msgstr "mesh_remove.png" \ No newline at end of file diff --git a/src/SMESH_I/SMESH.hxx b/src/SMESH_I/SMESH.hxx deleted file mode 100644 index ea68b0445..000000000 --- a/src/SMESH_I/SMESH.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : -// -// 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 : SMESH.hxx -// Author : Michael ZORIN -// Module : SMESH -// $Header: - -#ifndef _SMESH_SMESH_HXX_ -#define _SMESH_SMESH_HXX_ - -// Tags definition -enum { - // Top level - Tag_HypothesisRoot = 1, // hypotheses root - Tag_AlgorithmsRoot = 2, // algorithms root - // Mesh/Submesh - Tag_RefOnShape = 1, // references to shape - Tag_RefOnAppliedHypothesis = 2, // applied hypotheses root - Tag_RefOnAppliedAlgorithms = 3, // applied algorithms root - // Mesh only - Tag_SubMeshOnVertex = 4, // sub-meshes roots by type - Tag_SubMeshOnEdge = 5, // ... - Tag_SubMeshOnWire = 6, // ... - Tag_SubMeshOnFace = 7, // ... - Tag_SubMeshOnShell = 8, // ... - Tag_SubMeshOnSolid = 9, // ... - Tag_SubMeshOnCompound = 10, // ... - Tag_NodeGroups = 11, // Group roots by type - Tag_EdgeGroups = 12, // ... - Tag_FaceGroups = 13, // ... - Tag_VolumeGroups = 14 // ... -}; - -#endif - diff --git a/src/SMESH_I/SMESHEngine.cxx b/src/SMESH_I/SMESHEngine.cxx deleted file mode 100644 index fc1bd440b..000000000 --- a/src/SMESH_I/SMESHEngine.cxx +++ /dev/null @@ -1,23 +0,0 @@ -// 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 - -int main(int argc, char** argv) -{ - return 1; -} diff --git a/src/SMESH_I/SMESH_1D_Algo_i.cxx b/src/SMESH_I/SMESH_1D_Algo_i.cxx deleted file mode 100644 index 06f621dc9..000000000 --- a/src/SMESH_I/SMESH_1D_Algo_i.cxx +++ /dev/null @@ -1,89 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_1D_Algo_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_1D_Algo_i.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * SMESH_1D_Algo_i::SMESH_1D_Algo_i - * - * Constructor - */ -//============================================================================= - -SMESH_1D_Algo_i::SMESH_1D_Algo_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ) -{ - MESSAGE( "SMESH_1D_Algo_i::SMESH_1D_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_1D_Algo_i::~SMESH_1D_Algo_i - * - * Destructor - */ -//============================================================================= - -SMESH_1D_Algo_i::~SMESH_1D_Algo_i() -{ - MESSAGE( "SMESH_1D_Algo_i::~SMESH_1D_Algo_i" ); -} - -//================================================================================ -/*! - * \brief Verify whether algorithm supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean SMESH_1D_Algo_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_1D; -} - - - - - - - - - - - - - - diff --git a/src/SMESH_I/SMESH_1D_Algo_i.hxx b/src/SMESH_I/SMESH_1D_Algo_i.hxx deleted file mode 100644 index 1112a4019..000000000 --- a/src/SMESH_I/SMESH_1D_Algo_i.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_1D_Algo_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_1D_ALGO_I_HXX_ -#define _SMESH_1D_ALGO_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Algo_i.hxx" - -// ====================================================== -// Generic 1D algorithm -// ====================================================== -class SMESH_1D_Algo_i: - public virtual POA_SMESH::SMESH_1D_Algo, - public virtual SMESH_Algo_i -{ -protected: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_1D_Algo_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_1D_Algo_i(); - - // Verify whether algorithm supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/SMESH_I/SMESH_2D_Algo_i.cxx b/src/SMESH_I/SMESH_2D_Algo_i.cxx deleted file mode 100644 index 00744eea4..000000000 --- a/src/SMESH_I/SMESH_2D_Algo_i.cxx +++ /dev/null @@ -1,75 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_2D_Algo_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_2D_Algo_i.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * SMESH_2D_Algo_i::SMESH_2D_Algo_i - * - * Constructor - */ -//============================================================================= - -SMESH_2D_Algo_i::SMESH_2D_Algo_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ) -{ - MESSAGE( "SMESH_2D_Algo_i::SMESH_2D_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_2D_Algo_i::~SMESH_2D_Algo_i - * - * Destructor - */ -//============================================================================= - -SMESH_2D_Algo_i::~SMESH_2D_Algo_i() -{ - MESSAGE( "SMESH_2D_Algo_i::~SMESH_2D_Algo_i" ); -} - -//================================================================================ -/*! - * \brief Verify whether algorithm supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean SMESH_2D_Algo_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_2D; -} diff --git a/src/SMESH_I/SMESH_2D_Algo_i.hxx b/src/SMESH_I/SMESH_2D_Algo_i.hxx deleted file mode 100644 index 58664c9cf..000000000 --- a/src/SMESH_I/SMESH_2D_Algo_i.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_2D_Algo_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_2D_ALGO_I_HXX_ -#define _SMESH_2D_ALGO_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Algo_i.hxx" - -// ====================================================== -// Generic 2D algorithm -// ====================================================== -class SMESH_2D_Algo_i: - public virtual POA_SMESH::SMESH_2D_Algo, - public virtual SMESH_Algo_i -{ -protected: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_2D_Algo_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_2D_Algo_i(); - - // Verify whether algorithm supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/SMESH_I/SMESH_3D_Algo_i.cxx b/src/SMESH_I/SMESH_3D_Algo_i.cxx deleted file mode 100644 index 14276fe12..000000000 --- a/src/SMESH_I/SMESH_3D_Algo_i.cxx +++ /dev/null @@ -1,76 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_3D_Algo_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_3D_Algo_i.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * SMESH_3D_Algo_i::SMESH_3D_Algo_i - * - * Constructor - */ -//============================================================================= - -SMESH_3D_Algo_i::SMESH_3D_Algo_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ) -{ - MESSAGE( "SMESH_3D_Algo_i::SMESH_3D_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_3D_Algo_i::~SMESH_3D_Algo_i - * - * Destructor - */ -//============================================================================= - -SMESH_3D_Algo_i::~SMESH_3D_Algo_i() -{ - MESSAGE( "SMESH_3D_Algo_i::~SMESH_3D_Algo_i" ); -} - -//================================================================================ -/*! - * \brief Verify whether algorithm supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean SMESH_3D_Algo_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_3D; -} - diff --git a/src/SMESH_I/SMESH_3D_Algo_i.hxx b/src/SMESH_I/SMESH_3D_Algo_i.hxx deleted file mode 100644 index 8589e166a..000000000 --- a/src/SMESH_I/SMESH_3D_Algo_i.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_3D_Algo_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_3D_ALGO_I_HXX_ -#define _SMESH_3D_ALGO_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Algo_i.hxx" - -// ====================================================== -// Generic 3D algorithm -// ====================================================== -class SMESH_3D_Algo_i: - public virtual POA_SMESH::SMESH_3D_Algo, - public virtual SMESH_Algo_i -{ -protected: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_3D_Algo_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_3D_Algo_i(); - - // Verify whether algorithm supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/SMESH_I/SMESH_Algo_i.cxx b/src/SMESH_I/SMESH_Algo_i.cxx deleted file mode 100644 index a57df7bef..000000000 --- a/src/SMESH_I/SMESH_Algo_i.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_Algo_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_Algo_i.hxx" -#include "SMESH_Algo.hxx" - -#include "utilities.h" - -#include -#include - -//============================================================================= -/*! - * SMESH_Algo_i::SMESH_Algo_i - * - * Constructor - */ -//============================================================================= - -SMESH_Algo_i::SMESH_Algo_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ) -{ - MESSAGE( "SMESH_Algo_i::SMESH_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_Algo_i::~SMESH_Algo_i - * - * Destructor - */ -//============================================================================= - -SMESH_Algo_i::~SMESH_Algo_i() -{ - MESSAGE( "SMESH_Algo_i::~SMESH_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_Algo_i::GetCompatibleHypothesis - * - * Gets list of compatible hypotheses - */ -//============================================================================= - -SMESH::ListOfHypothesisName* SMESH_Algo_i::GetCompatibleHypothesis() -{ - MESSAGE( "SMESH_Algo_i::GetCompatibleHypothesis" ); - SMESH::ListOfHypothesisName_var listOfHypothesis = new SMESH::ListOfHypothesisName; - const vector& hypList = ( ( ::SMESH_Algo* )myBaseImpl )->GetCompatibleHypothesis(); - int nbHyp = hypList.size(); - listOfHypothesis->length( nbHyp ); - for ( int i = 0; i < nbHyp; i++ ) { - listOfHypothesis[ i ] = CORBA::string_dup( hypList[ i ].c_str() ); - } - return listOfHypothesis._retn(); -} diff --git a/src/SMESH_I/SMESH_Algo_i.hxx b/src/SMESH_I/SMESH_Algo_i.hxx deleted file mode 100644 index 21630ec8a..000000000 --- a/src/SMESH_I/SMESH_Algo_i.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_Algo_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_ALGO_I_HXX_ -#define _SMESH_ALGO_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Hypothesis_i.hxx" - -// ====================================================== -// Generic algorithm -// ====================================================== -class SMESH_Algo_i: - public virtual POA_SMESH::SMESH_Algo, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_Algo_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_Algo_i(); - - // Gets list of compatible hypotheses - SMESH::ListOfHypothesisName* GetCompatibleHypothesis(); -}; - -#endif diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx deleted file mode 100644 index d3c645941..000000000 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ /dev/null @@ -1,845 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_Gen_i_1.cxx -// Created : Thu Oct 21 17:24:06 2004 -// Author : Edward AGAPOV (eap) -// Module : SMESH -// $Header: - -#include "SMESH_Gen_i.hxx" - -#include "SMESH_Mesh_i.hxx" -#include "SMESH_Hypothesis_i.hxx" -#include "SMESH_Algo_i.hxx" -#include "SMESH_Group_i.hxx" - -#include "SMESH.hxx" - -#include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) - -#include "utilities.h" -#include "Utils_ExceptHandlers.hxx" - -#include - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -//============================================================================= -/*! - * Get...Tag [ static ] - * - * Methods which determine SMESH data model structure - */ -//============================================================================= - -long SMESH_Gen_i::GetHypothesisRootTag() -{ - return Tag_HypothesisRoot; -} - -long SMESH_Gen_i::GetAlgorithmsRootTag() -{ - return Tag_AlgorithmsRoot; -} - -long SMESH_Gen_i::GetRefOnShapeTag() -{ - return Tag_RefOnShape; -} - -long SMESH_Gen_i::GetRefOnAppliedHypothesisTag() -{ - return Tag_RefOnAppliedHypothesis; -} - -long SMESH_Gen_i::GetRefOnAppliedAlgorithmsTag() -{ - return Tag_RefOnAppliedAlgorithms; -} - -long SMESH_Gen_i::GetSubMeshOnVertexTag() -{ - return Tag_SubMeshOnVertex; -} - -long SMESH_Gen_i::GetSubMeshOnEdgeTag() -{ - return Tag_SubMeshOnEdge; -} - -long SMESH_Gen_i::GetSubMeshOnFaceTag() -{ - return Tag_SubMeshOnFace; -} - -long SMESH_Gen_i::GetSubMeshOnSolidTag() -{ - return Tag_SubMeshOnSolid; -} - -long SMESH_Gen_i::GetSubMeshOnCompoundTag() -{ - return Tag_SubMeshOnCompound; -} - -long SMESH_Gen_i::GetSubMeshOnWireTag() -{ - return Tag_SubMeshOnWire; -} - -long SMESH_Gen_i::GetSubMeshOnShellTag() -{ - return Tag_SubMeshOnShell; -} - -long SMESH_Gen_i::GetNodeGroupsTag() -{ - return Tag_NodeGroups; -} - -long SMESH_Gen_i::GetEdgeGroupsTag() -{ - return Tag_EdgeGroups; -} - -long SMESH_Gen_i::GetFaceGroupsTag() -{ - return Tag_FaceGroups; -} - -long SMESH_Gen_i::GetVolumeGroupsTag() -{ - return Tag_VolumeGroups; -} - -//============================================================================= -/*! - * SMESH_Gen_i::CanPublishInStudy - * - * Returns true if object can be published in the study - */ -//============================================================================= - -bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) -{ - if(MYDEBUG) MESSAGE("CanPublishInStudy - "<_is_nil() ) - return true; - - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(theIOR); - if( !aSubMesh->_is_nil() ) - return true; - - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow(theIOR); - if( !aHyp->_is_nil() ) - return true; - - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(theIOR); - if( !aGroup->_is_nil() ) - return true; - - if(MYDEBUG) MESSAGE("CanPublishInStudy--CANT"); - return false; -} - -//======================================================================= -//function : ObjectToSObject -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::ObjectToSObject(SALOMEDS::Study_ptr theStudy, - CORBA::Object_ptr theObject) -{ - SALOMEDS::SObject_var aSO; - if ( !CORBA::is_nil( theStudy ) && !CORBA::is_nil( theObject )) - aSO = theStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( theObject ) ); - return aSO._retn(); -} - -//======================================================================= -//function : objectToServant -//purpose : -//======================================================================= - -template static inline T* objectToServant( CORBA::Object_ptr theIOR ) -{ - return dynamic_cast( SMESH_Gen_i::GetServant( theIOR ).in() ); -} - -//======================================================================= -//function : ShapeToGeomObject -//purpose : -//======================================================================= - -GEOM::GEOM_Object_ptr SMESH_Gen_i::ShapeToGeomObject (const TopoDS_Shape& theShape ) -{ - GEOM::GEOM_Object_var aShapeObj; - if ( !theShape.IsNull() ) { - GEOM_Client* aClient = GetShapeReader(); - TCollection_AsciiString IOR; - if ( aClient && aClient->Find( theShape, IOR )) - aShapeObj = GEOM::GEOM_Object::_narrow - ( GetORB()->string_to_object( IOR.ToCString() ) ); - } - return aShapeObj._retn(); -} - -//======================================================================= -//function : GeomObjectToShape -//purpose : -//======================================================================= - -TopoDS_Shape SMESH_Gen_i::GeomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject) -{ - TopoDS_Shape S; - if ( !theGeomObject->_is_nil() ) { - GEOM_Client* aClient = GetShapeReader(); - GEOM::GEOM_Gen_var aGeomEngine = GetGeomEngine(); - if ( aClient && !aGeomEngine->_is_nil () ) - S = aClient->GetShape( aGeomEngine, theGeomObject ); - } - return S; -} - -//======================================================================= -//function : publish -//purpose : -//======================================================================= - -static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr theStudy, - CORBA::Object_ptr theIOR, - SALOMEDS::SObject_ptr theFatherObject, - const int theTag = 0, - const char* thePixMap = 0, - const bool theSelectable = true) -{ - SALOMEDS::SObject_var SO = SMESH_Gen_i::ObjectToSObject( theStudy, theIOR ); - SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); - if ( SO->_is_nil() ) { - if ( theTag == 0 ) - SO = aStudyBuilder->NewObject( theFatherObject ); - else if ( !theFatherObject->FindSubObject( theTag, SO )) - SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag ); - } - - SALOMEDS::GenericAttribute_var anAttr; - if ( !CORBA::is_nil( theIOR )) { - anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeIOR" ); - SALOMEDS::AttributeIOR::_narrow(anAttr)->SetValue - ( SMESH_Gen_i::GetORB()->object_to_string( theIOR ) ); - } - if ( thePixMap ) { - anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributePixMap" ); - SALOMEDS::AttributePixMap::_narrow( anAttr )->SetPixMap( thePixMap ); - } - if ( !theSelectable ) { - anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeSelectable" ); - SALOMEDS::AttributeSelectable::_narrow( anAttr )->SetSelectable( false ); - } - return SO._retn(); -} - -//======================================================================= -//function : setName -//purpose : -//======================================================================= - -void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject, - const char* theName, - const char* theDefaultName) -{ - if ( !theSObject->_is_nil() ) { - SALOMEDS::StudyBuilder_var aStudyBuilder = theSObject->GetStudy()->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr = - aStudyBuilder->FindOrCreateAttribute( theSObject, "AttributeName" ); - SALOMEDS::AttributeName_var aNameAttr = SALOMEDS::AttributeName::_narrow( anAttr ); - if ( theName && strlen( theName ) != 0 ) - aNameAttr->SetValue( theName ); - else { - CORBA::String_var curName = CORBA::string_dup( aNameAttr->Value() ); - if ( strlen( curName ) == 0 ) { - TCollection_AsciiString aName( (char*) theDefaultName ); - aName += TCollection_AsciiString("_") + TCollection_AsciiString( theSObject->Tag() ); - aNameAttr->SetValue( aName.ToCString() ); - } - } - } -} - -//======================================================================= -//function : addReference -//purpose : -//======================================================================= - -static void addReference (SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theToObject, - int theTag = 0) -{ - SALOMEDS::SObject_var aToObjSO = SMESH_Gen_i::ObjectToSObject( theStudy, theToObject ); - if ( !aToObjSO->_is_nil() && !theSObject->_is_nil() ) { - SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); - SALOMEDS::SObject_var aReferenceSO; - if ( !theTag ) { - bool isReferred = false; - SALOMEDS::ChildIterator_var anIter = theStudy->NewChildIterator( theSObject ); - for ( ; !isReferred && anIter->More(); anIter->Next() ) { - if ( anIter->Value()->ReferencedObject( aReferenceSO ) && - strcmp( aReferenceSO->GetID(), aToObjSO->GetID() ) == 0 ) - isReferred = true; - } - if ( !isReferred ) { - aReferenceSO = aStudyBuilder->NewObject( theSObject ); - aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); - } - } - else { - if ( !theSObject->FindSubObject( theTag, aReferenceSO )) - aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag ); - aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); - } - } -} - -//============================================================================= -/*! - * SMESH_Gen_i::PublishInStudy - * - * Publish object in the study - */ -//============================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theIOR, - const char* theName) - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - SALOMEDS::SObject_var aSO; - if ( CORBA::is_nil( theStudy ) || CORBA::is_nil( theIOR )) - return aSO._retn(); - if(MYDEBUG) MESSAGE("PublishInStudy"); - - // Publishing a mesh - SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( theIOR ); - if( !aMesh->_is_nil() ) - aSO = PublishMesh( theStudy, aMesh, theName ); - - // Publishing a sub-mesh - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( theIOR ); - if( aSO->_is_nil() && !aSubMesh->_is_nil() ) { - GEOM::GEOM_Object_var aShapeObject = aSubMesh->GetSubShape(); - aMesh = aSubMesh->GetFather(); - aSO = PublishSubMesh( theStudy, aMesh, aSubMesh, aShapeObject, theName ); - } - - // Publishing a hypothesis or algorithm - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( theIOR ); - if ( aSO->_is_nil() && !aHyp->_is_nil() ) - aSO = PublishHypothesis( theStudy, aHyp ); - - // Publishing a group - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(theIOR); - if ( aSO->_is_nil() && !aGroup->_is_nil() ) { - GEOM::GEOM_Object_var aShapeObject; - aMesh = aGroup->GetMesh(); - aSO = PublishGroup( theStudy, aMesh, aGroup, aShapeObject, theName ); - } - if(MYDEBUG) MESSAGE("PublishInStudy_END"); - - return aSO._retn(); -} - -//======================================================================= -//function : PublishComponent -//purpose : -//======================================================================= - -SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent(SALOMEDS::Study_ptr theStudy) -{ - if ( CORBA::is_nil( theStudy )) - return SALOMEDS::SComponent::_nil(); - if(MYDEBUG) MESSAGE("PublishComponent"); - - SALOMEDS::SComponent_var father = - SALOMEDS::SComponent::_narrow( theStudy->FindComponent( ComponentDataType() ) ); - if ( !CORBA::is_nil( father ) ) - return father._retn(); - - SALOME_ModuleCatalog::ModuleCatalog_var aCat = - SALOME_ModuleCatalog::ModuleCatalog::_narrow( GetNS()->Resolve("/Kernel/ModulCatalog") ); - if ( CORBA::is_nil( aCat ) ) - return father._retn(); - - SALOME_ModuleCatalog::Acomponent_var aComp = aCat->GetComponent( ComponentDataType() ); - if ( CORBA::is_nil( aComp ) ) - return father._retn(); - - SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - father = aStudyBuilder->NewComponent( ComponentDataType() ); - aStudyBuilder->DefineComponentInstance( father, SMESH_Gen::_this() ); - anAttr = aStudyBuilder->FindOrCreateAttribute( father, "AttributePixMap" ); - aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); - aPixmap ->SetPixMap( "ICON_OBJBROWSER_SMESH" ); - SetName( father, aComp->componentusername(), "MESH" ); - if(MYDEBUG) MESSAGE("PublishComponent--END"); - - return father._retn(); -} - -//============================================================================= -/*! - * findMaxChildTag [ static internal ] - * - * Finds maximum child tag for the given object - */ -//============================================================================= - -static long findMaxChildTag( SALOMEDS::SObject_ptr theSObject ) -{ - long aTag = 0; - if ( !theSObject->_is_nil() ) { - SALOMEDS::Study_var aStudy = theSObject->GetStudy(); - if ( !aStudy->_is_nil() ) { - SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( theSObject ); - for ( ; anIter->More(); anIter->Next() ) { - long nTag = anIter->Value()->Tag(); - if ( nTag > aTag ) - aTag = nTag; - } - } - } - return aTag; -} - -//======================================================================= -//function : PublishMesh -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - const char* theName) -{ - if ( CORBA::is_nil( theStudy ) || - CORBA::is_nil( theMesh )) - return SALOMEDS::SComponent::_nil(); - if(MYDEBUG) MESSAGE("PublishMesh--IN"); - - // find or publish a mesh - - SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); - if ( aMeshSO->_is_nil() ) - { - SALOMEDS::SComponent_var father = PublishComponent( theStudy ); - if ( father->_is_nil() ) - return aMeshSO._retn(); - - // Find correct free tag - long aTag = findMaxChildTag( father.in() ); - if ( aTag <= GetAlgorithmsRootTag() ) - aTag = GetAlgorithmsRootTag() + 1; - else - aTag++; - - aMeshSO = publish (theStudy, theMesh, father, aTag, "ICON_SMESH_TREE_MESH_WARN" ); - if ( aMeshSO->_is_nil() ) - return aMeshSO._retn(); - } - SetName( aMeshSO, theName, "Mesh" ); - - // Add shape reference - - GEOM::GEOM_Object_var aShapeObject = theMesh->GetShapeToMesh(); - if ( !CORBA::is_nil( aShapeObject )) { - addReference( theStudy, aMeshSO, aShapeObject, GetRefOnShapeTag() ); - - // Publish global hypotheses - - SMESH::ListOfHypothesis * hypList = theMesh->GetHypothesisList( aShapeObject ); - if ( hypList ) - for ( int i = 0; i < hypList->length(); i++ ) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( (*hypList)[ i ]); - PublishHypothesis( theStudy, aHyp ); - AddHypothesisToShape( theStudy, theMesh, aShapeObject, aHyp ); - } - } - - // Publish submeshes - - SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); - if ( !mesh_i ) - return aMeshSO._retn(); - map& subMap = mesh_i->_mapSubMesh_i; - map::iterator subIt = subMap.begin(); - for ( ; subIt != subMap.end(); subIt++ ) { - SMESH::SMESH_subMesh_ptr aSubMesh = (*subIt).second->_this(); - if ( !CORBA::is_nil( aSubMesh )) { - aShapeObject = aSubMesh->GetSubShape(); - PublishSubMesh( theStudy, theMesh, aSubMesh, aShapeObject ); - } - } - - // Publish groups - const map& grMap = mesh_i->getGroups(); - map::const_iterator it = grMap.begin(); - for ( ; it != grMap.end(); it++ ) - { - SMESH::SMESH_GroupBase_ptr aGroup = (*it).second; - if ( !aGroup->_is_nil() ) { - GEOM::GEOM_Object_var aShapeObj; - SMESH::SMESH_GroupOnGeom_var aGeomGroup = - SMESH::SMESH_GroupOnGeom::_narrow( aGroup ); - if ( !aGeomGroup->_is_nil() ) - aShapeObj = aGeomGroup->GetShape(); - PublishGroup( theStudy, theMesh, aGroup, aShapeObj ); - } - } - - if(MYDEBUG) MESSAGE("PublishMesh_END"); - return aMeshSO._retn(); -} - -//======================================================================= -//function : PublishSubMesh -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishSubMesh (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - SMESH::SMESH_subMesh_ptr theSubMesh, - GEOM::GEOM_Object_ptr theShapeObject, - const char* theName) -{ - if (theStudy->_is_nil() || theMesh->_is_nil() || - theSubMesh->_is_nil() || theShapeObject->_is_nil() ) - return SALOMEDS::SObject::_nil(); - - SALOMEDS::SObject_var aSubMeshSO = ObjectToSObject( theStudy, theSubMesh ); - if ( aSubMeshSO->_is_nil() ) - { - SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); - if ( aMeshSO->_is_nil() ) { - aMeshSO = PublishMesh( theStudy, theMesh ); - if ( aMeshSO->_is_nil()) - return SALOMEDS::SObject::_nil(); - } - // Find submesh sub-tree tag - long aRootTag; - char* aRootName = ""; - switch ( theShapeObject->GetShapeType() ) { - case GEOM::VERTEX: - aRootTag = GetSubMeshOnVertexTag(); - aRootName = "SubMeshes on Vertex"; - break; - case GEOM::EDGE: - aRootTag = GetSubMeshOnEdgeTag(); - aRootName = "SubMeshes on Edge"; - break; - case GEOM::WIRE: - aRootTag = GetSubMeshOnWireTag(); - aRootName = "SubMeshes on Wire"; - break; - case GEOM::FACE: - aRootTag = GetSubMeshOnFaceTag(); - aRootName = "SubMeshes on Face"; - break; - case GEOM::SHELL: - aRootTag = GetSubMeshOnShellTag(); - aRootName = "SubMeshes on Shell"; - break; - case GEOM::SOLID: - aRootTag = GetSubMeshOnSolidTag(); - aRootName = "SubMeshes on Solid"; - break; - default: - aRootTag = GetSubMeshOnCompoundTag(); - aRootName = "SubMeshes on Compound"; - break; - } - - // Find or create submesh root - SALOMEDS::SObject_var aRootSO = publish (theStudy, CORBA::Object::_nil(), - aMeshSO, aRootTag, 0, false ); - SetName( aRootSO, aRootName ); - - // Add new submesh to corresponding sub-tree - aSubMeshSO = publish (theStudy, theSubMesh, aRootSO, 0, "ICON_SMESH_TREE_MESH_WARN"); - if ( aSubMeshSO->_is_nil() ) - return aSubMeshSO._retn(); - } - SetName( aSubMeshSO, theName, "SubMesh" ); - - // Add reference to theShapeObject - - addReference( theStudy, aSubMeshSO, theShapeObject, 1 ); - - // Publish hypothesis - - SMESH::ListOfHypothesis * hypList = theMesh->GetHypothesisList( theShapeObject ); - if ( hypList ) - for ( int i = 0; i < hypList->length(); i++ ) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( (*hypList)[ i ]); - PublishHypothesis( theStudy, aHyp ); - AddHypothesisToShape( theStudy, theMesh, theShapeObject, aHyp ); - } - - return aSubMeshSO._retn(); -} - -//======================================================================= -//function : PublishGroup -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - SMESH::SMESH_GroupBase_ptr theGroup, - GEOM::GEOM_Object_ptr theShapeObject, - const char* theName) -{ - if (theStudy->_is_nil() || theMesh->_is_nil() || theGroup->_is_nil() ) - return SALOMEDS::SObject::_nil(); - - SALOMEDS::SObject_var aGroupSO = ObjectToSObject( theStudy, theGroup ); - if ( aGroupSO->_is_nil() ) - { - SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); - if ( aMeshSO->_is_nil() ) { - aMeshSO = PublishInStudy( theStudy, SALOMEDS::SObject::_nil(), theMesh, ""); - if ( aMeshSO->_is_nil()) - return SALOMEDS::SObject::_nil(); - } - int aType = (int)theGroup->GetType(); - const char* aRootNames[] = { - "Compound Groups", "Groups of Nodes", - "Groups of Edges", "Groups of Faces", "Groups of Volumes" }; - - // Currently, groups with heterogenous content are not supported - if ( aType != SMESH::ALL ) { - long aRootTag = GetNodeGroupsTag() + aType - 1; - - // Find or create groups root - SALOMEDS::SObject_var aRootSO = publish (theStudy, CORBA::Object::_nil(), - aMeshSO, aRootTag, 0, false ); - if ( aType < 5 ) - SetName( aRootSO, aRootNames[aType] ); - - // Add new group to corresponding sub-tree - aGroupSO = publish (theStudy, theGroup, aRootSO, 0, "ICON_SMESH_TREE_GROUP" ); - } - if ( aGroupSO->_is_nil() ) - return aGroupSO._retn(); - } - - SetName( aGroupSO, theName, "Group" ); - - //Add reference to geometry - if ( !theShapeObject->_is_nil() ) - addReference( theStudy, aGroupSO, theShapeObject, 1 ); - - return aGroupSO._retn(); -} - -//======================================================================= -//function : PublishHypothesis -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr - SMESH_Gen_i::PublishHypothesis (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Hypothesis_ptr theHyp, - const char* theName) -{ - if(MYDEBUG) MESSAGE("PublishHypothesis") - if (theStudy->_is_nil() || theHyp->_is_nil()) - return SALOMEDS::SObject::_nil(); - - SALOMEDS::SObject_var aHypSO = ObjectToSObject( theStudy, theHyp ); - if ( aHypSO->_is_nil() ) - { - SALOMEDS::SComponent_var father = PublishComponent( theStudy ); - if ( father->_is_nil() ) - return aHypSO._retn(); - - //Find or Create Hypothesis root - bool isAlgo = ( !SMESH::SMESH_Algo::_narrow( theHyp )->_is_nil() ); - int aRootTag = isAlgo ? GetAlgorithmsRootTag() : GetHypothesisRootTag(); - SALOMEDS::SObject_var aRootSO = - publish (theStudy, CORBA::Object::_nil(),father, aRootTag, - isAlgo ? "ICON_SMESH_TREE_ALGO" : "ICON_SMESH_TREE_HYPO", false); - SetName( aRootSO, isAlgo ? "Algorithms" : "Hypotheses" ); - - // Add New Hypothesis - string aPmName = isAlgo ? "ICON_SMESH_TREE_ALGO_" : "ICON_SMESH_TREE_HYPO_"; - aPmName += theHyp->GetName(); - aHypSO = publish( theStudy, theHyp, aRootSO, 0, aPmName.c_str() ); - } - - if ( !aHypSO->_is_nil() ) { - CORBA::String_var aHypName = CORBA::string_dup( theHyp->GetName() ); - SetName( aHypSO, theName, aHypName ); - } - - if(MYDEBUG) MESSAGE("PublishHypothesis--END") - return aHypSO._retn(); -} - -//======================================================================= -//function : GetMeshOrSubmeshByShape -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr - SMESH_Gen_i::GetMeshOrSubmeshByShape (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theShape) -{ - if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape") - SALOMEDS::SObject_var aMeshOrSubMesh; - if ( theShape->_is_nil() || theMesh->_is_nil() ) - return aMeshOrSubMesh._retn(); - - TopoDS_Shape aShape = GeomObjectToShape( theShape ); - SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); - - if ( !aShape.IsNull() && mesh_i && mesh_i->GetImpl().GetMeshDS() ) { - SMESHDS_Mesh* meshDS = mesh_i->GetImpl().GetMeshDS(); - if ( aShape.IsSame( meshDS->ShapeToMesh() )) - aMeshOrSubMesh = ObjectToSObject( theStudy, theMesh ); - else { - int shapeID = meshDS->ShapeToIndex( aShape ); - SMESH::SMESH_subMesh_var aSubMesh = mesh_i->getSubMesh(shapeID); - if ( !aSubMesh->_is_nil() ) - aMeshOrSubMesh = ObjectToSObject( theStudy, aSubMesh ); - } - } - if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape--END") - return aMeshOrSubMesh._retn(); -} - -//======================================================================= -//function : AddHypothesisToShape -//purpose : -//======================================================================= - -bool SMESH_Gen_i::AddHypothesisToShape(SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theShape, - SMESH::SMESH_Hypothesis_ptr theHyp) -{ - if(MYDEBUG) MESSAGE("AddHypothesisToShape") - if (theStudy->_is_nil() || theMesh->_is_nil() || - theHyp->_is_nil() || theShape->_is_nil() ) - return false; - - SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); - if ( aMeshSO->_is_nil() ) - aMeshSO = PublishMesh( theStudy, theMesh ); - SALOMEDS::SObject_var aHypSO = PublishHypothesis( theStudy, theHyp ); - if ( aMeshSO->_is_nil() || aHypSO->_is_nil()) - return false; - - // Find a mesh or submesh refering to theShape - SALOMEDS::SObject_var aMeshOrSubMesh = - GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); - if ( aMeshOrSubMesh->_is_nil() ) - { - // publish submesh - TopoDS_Shape aShape = GeomObjectToShape( theShape ); - SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); - if ( !aShape.IsNull() && mesh_i && mesh_i->GetImpl().GetMeshDS() ) { - SMESHDS_Mesh* meshDS = mesh_i->GetImpl().GetMeshDS(); - int shapeID = meshDS->ShapeToIndex( aShape ); - SMESH::SMESH_subMesh_var aSubMesh = mesh_i->getSubMesh(shapeID); - aMeshOrSubMesh = PublishSubMesh( theStudy, theMesh, aSubMesh, theShape ); - } - if ( aMeshOrSubMesh->_is_nil() ) - return false; - } - - //Find or Create Applied Hypothesis root - bool aIsAlgo = !SMESH::SMESH_Algo::_narrow( theHyp )->_is_nil(); - SALOMEDS::SObject_var AHR = - publish (theStudy, CORBA::Object::_nil(), aMeshOrSubMesh, - aIsAlgo ? GetRefOnAppliedAlgorithmsTag() : GetRefOnAppliedHypothesisTag(), - aIsAlgo ? "ICON_SMESH_TREE_ALGO" : "ICON_SMESH_TREE_HYPO", false); - SetName( AHR, aIsAlgo ? "Applied algorithms" : "Applied hypotheses" ); - if ( AHR->_is_nil() ) - return false; - - addReference( theStudy, AHR, theHyp ); - if(MYDEBUG) MESSAGE("AddHypothesisToShape--END") - return true; -} - -//======================================================================= -//function : RemoveHypothesisFromShape -//purpose : -//======================================================================= - -bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theShape, - SMESH::SMESH_Hypothesis_ptr theHyp) -{ - if (theStudy->_is_nil() || theMesh->_is_nil() || - theHyp->_is_nil() || theShape->_is_nil() ) - return false; - - SALOMEDS::SObject_var aHypSO = ObjectToSObject( theStudy, theHyp ); - if ( aHypSO->_is_nil() ) - return false; - - // Find a mesh or submesh refering to theShape - SALOMEDS::SObject_var aMeshOrSubMesh = - GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); - if ( aMeshOrSubMesh->_is_nil() ) - return false; - - // Find and remove a reference to aHypSO - SALOMEDS::SObject_var aRef, anObj; - CORBA::String_var anID = CORBA::string_dup( aHypSO->GetID() ); - SALOMEDS::ChildIterator_var it = theStudy->NewChildIterator( aMeshOrSubMesh ); - for ( it->InitEx( true ); it->More(); it->Next() ) { - anObj = it->Value(); - if (anObj->ReferencedObject( aRef ) && strcmp( aRef->GetID(), anID ) == 0 ) { - theStudy->NewBuilder()->RemoveObject( anObj ); - break; - } - } - return true; -} - diff --git a/src/SMESH_I/SMESH_Group_i.hxx b/src/SMESH_I/SMESH_Group_i.hxx deleted file mode 100644 index e9801b258..000000000 --- a/src/SMESH_I/SMESH_Group_i.hxx +++ /dev/null @@ -1,115 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2004 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Group_i.hxx -// Author : Sergey ANIKIN, OCC -// Module : SMESH -// $Header$ - - -#ifndef SMESH_Group_i_HeaderFile -#define SMESH_Group_i_HeaderFile - -#include -#include CORBA_SERVER_HEADER(SMESH_Group) -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_CLIENT_HEADER(GEOM_Gen) - -#include "SALOME_GenericObj_i.hh" - -class SMESH_Mesh_i; -class SMESH_Group; -class SMESHDS_GroupBase; - -// =========== -// Group Base -// =========== -class SMESH_GroupBase_i: - public virtual POA_SMESH::SMESH_GroupBase, - public virtual SALOME::GenericObj_i -{ - public: - SMESH_GroupBase_i(PortableServer::POA_ptr thePOA, - SMESH_Mesh_i* theMeshServant, - const int theLocalID ); - virtual ~SMESH_GroupBase_i(); - - // CORBA interface implementation - void SetName(const char* name); - char* GetName(); - SMESH::ElementType GetType(); - CORBA::Long Size(); - CORBA::Boolean IsEmpty(); - CORBA::Boolean Contains(CORBA::Long elem_id); - CORBA::Long GetID(CORBA::Long elem_index); - SMESH::long_array* GetListOfID(); - SMESH::SMESH_Mesh_ptr GetMesh(); - - // Inherited from SMESH_IDSource interface - virtual SMESH::long_array* GetIDs(); - - // Internal C++ interface - int GetLocalID() const { return myLocalID; } - SMESH_Mesh_i* GetMeshServant() const { return myMeshServant; } - SMESH_Group* GetSmeshGroup() const; - SMESHDS_GroupBase* GetGroupDS() const; - -private: - SMESH_Mesh_i* myMeshServant; - int myLocalID; -}; - -// ====== -// Group -// ====== - -class SMESH_Group_i: - public virtual POA_SMESH::SMESH_Group, - public SMESH_GroupBase_i -{ - public: - SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID ); - - // CORBA interface implementation - void Clear(); - CORBA::Long Add( const SMESH::long_array& theIDs ); - CORBA::Long Remove( const SMESH::long_array& theIDs ); - - CORBA::Long AddByPredicate( SMESH::Predicate_ptr thePredicate ); - CORBA::Long RemoveByPredicate( SMESH::Predicate_ptr thePredicate ); -}; - -// ========================= -// Group linked to geometry -// ========================= - -class SMESH_GroupOnGeom_i: - public virtual POA_SMESH::SMESH_GroupOnGeom, - public SMESH_GroupBase_i -{ - public: - SMESH_GroupOnGeom_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID ); - - // CORBA interface implementation - GEOM::GEOM_Object_ptr GetShape(); -}; -#endif diff --git a/src/SMESH_I/SMESH_Hypothesis_i.cxx b/src/SMESH_I/SMESH_Hypothesis_i.cxx deleted file mode 100644 index d5cdce9fb..000000000 --- a/src/SMESH_I/SMESH_Hypothesis_i.cxx +++ /dev/null @@ -1,181 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_Hypothesis_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include -#include -#include "SMESH_Hypothesis_i.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * SMESH_Hypothesis_i::SMESH_Hypothesis_i - * - * Constructor - */ -//============================================================================= - -SMESH_Hypothesis_i::SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ) -{ - MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i / Début" ); - myBaseImpl = 0; - // _CS_gbo This instruction fails - // thePOA->activate_object( this ); - // _CS_gbo I keep the POA reference to activate the object in the future. - myPOA = thePOA; - - MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i / Fin" ); -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::Activate() - * - * Activation of the object - */ -//============================================================================= -void SMESH_Hypothesis_i::Activate() { - myPOA->activate_object( this ); -} - -//============================================================================= -/*! - * SMESH_Hypothesis_i::~SMESH_Hypothesis_i - * - * Destructor - */ -//============================================================================= - -SMESH_Hypothesis_i::~SMESH_Hypothesis_i() -{ - MESSAGE( "SMESH_Hypothesis_i::~SMESH_Hypothesis_i" ); - if ( myBaseImpl ) - delete myBaseImpl; -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::GetName - * - * Get type name of hypothesis - */ -//============================================================================= - -char* SMESH_Hypothesis_i::GetName() -{ - MESSAGE( "SMESH_Hypothesis_i::GetName" ); - return CORBA::string_dup( myBaseImpl->GetName() ); -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::GetLibName - * - * Get plugin library name of hypothesis (required by persistency mechanism) - */ -//============================================================================= - -char* SMESH_Hypothesis_i::GetLibName() -{ - MESSAGE( "SMESH_Hypothesis_i::GetLibName" ); - return CORBA::string_dup( myBaseImpl->GetLibName() ); -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::SetLibName - * - * Set plugin library name of hypothesis (required by persistency mechanism) - */ -//============================================================================= - -void SMESH_Hypothesis_i::SetLibName(const char* theLibName) -{ - MESSAGE( "SMESH_Hypothesis_i::SetLibName" ); - myBaseImpl->SetLibName( theLibName ); -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::GetId - * - * Get unique id of hypothesis - */ -//============================================================================= - -CORBA::Long SMESH_Hypothesis_i::GetId() -{ - MESSAGE( "SMESH_Hypothesis_i::GetId" ); - return myBaseImpl->GetID(); -} - -//============================================================================= -/*! - * SMESH_Hypothesis_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::SMESH_Hypothesis* SMESH_Hypothesis_i::GetImpl() -{ - MESSAGE( "SMESH_Hypothesis_i::GetImpl" ); - return myBaseImpl; -} - -//============================================================================= -/*! - * SMESH_Hypothesis_i::SaveTo - * - * Persistence: Dumps parameters to the string stream - */ -//============================================================================= - -char* SMESH_Hypothesis_i::SaveTo() -{ - MESSAGE( "SMESH_Hypothesis_i::SaveTo" ); - std::ostringstream os; - myBaseImpl->SaveTo( os ); - return CORBA::string_dup( os.str().c_str() ); -} - -//============================================================================= -/*! -* SMESH_Hypothesis_i::LoadFrom -* -* Persistence: Restores parameters from string -*/ -//============================================================================= - -void SMESH_Hypothesis_i::LoadFrom( const char* theStream ) -{ - MESSAGE( "SMESH_Hypothesis_i::LoadFrom" ); - std::istringstream is( theStream ); - myBaseImpl->LoadFrom( is ); -} diff --git a/src/SMESH_I/SMESH_Hypothesis_i.hxx b/src/SMESH_I/SMESH_Hypothesis_i.hxx deleted file mode 100644 index df89d82c8..000000000 --- a/src/SMESH_I/SMESH_Hypothesis_i.hxx +++ /dev/null @@ -1,115 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_Hypothesis_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_HYPOTHESIS_I_HXX_ -#define _SMESH_HYPOTHESIS_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Hypothesis.hxx" -#include "SALOME_GenericObj_i.hh" - -#include "SMESH_Gen.hxx" - -// ====================================================== -// Generic hypothesis -// ====================================================== -class SMESH_Hypothesis_i: - public virtual POA_SMESH::SMESH_Hypothesis, - public virtual SALOME::GenericObj_i -{ -public: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_Hypothesis_i(); - - // Get type name of hypothesis - char* GetName(); - - // Get plugin library name of hypothesis - char* GetLibName(); - - // Set plugin library name of hypothesis - void SetLibName( const char* theLibName ); - - // Get unique id of hypothesis - CORBA::Long GetId(); - - // Get implementation - ::SMESH_Hypothesis* GetImpl(); - - // _CS_gbo_ Activate the object using the POA - void Activate(); - - // Persistence - virtual char* SaveTo(); - virtual void LoadFrom( const char* theStream ); - -protected: - ::SMESH_Hypothesis* myBaseImpl; // base hypothesis implementation - - // _CS_gbo_070505 To keep the reference and delayed the activation - // in the methode Activate(). - PortableServer::POA_ptr myPOA; -}; - -// ====================================================== -// Generic hypothesis creator -// ====================================================== -class GenericHypothesisCreator_i -{ -public: - // Create a hypothesis - virtual SMESH_Hypothesis_i* Create(PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl) = 0; -}; - -//============================================================================= -// -// Specific Hypothesis Creators are generated with a template which inherits a -// generic hypothesis creator. Each creator returns an hypothesis of the type -// given in the template. -// -//============================================================================= -template class HypothesisCreator_i: public GenericHypothesisCreator_i -{ -public: - virtual SMESH_Hypothesis_i* Create (PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl) - { - return new T (thePOA, theStudyId, theGenImpl); - }; -}; - -#endif diff --git a/src/SMESH_I/SMESH_MEDFamily_i.cxx b/src/SMESH_I/SMESH_MEDFamily_i.cxx deleted file mode 100644 index 6e2508962..000000000 --- a/src/SMESH_I/SMESH_MEDFamily_i.cxx +++ /dev/null @@ -1,300 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_MEDFamily_i.cxx -// Module : SMESH - -using namespace std; -#include "SMESH_MEDFamily_i.hxx" -#include "utilities.h" -#include "Utils_CorbaException.hxx" - -//============================================================================= -/*! - * Default constructor - */ -//============================================================================= -SMESH_MEDFamily_i::SMESH_MEDFamily_i() -{ - BEGIN_OF("Default Constructor SMESH_MEDFamily_i"); - END_OF("Default Constructor SMESH_MEDFamily_i"); -} -//============================================================================= -/*! - * constructor par recopie - */ -//============================================================================= -SMESH_MEDFamily_i::SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f): - SMESH_MEDSupport_i(f._subMesh_i,f._name,f._description,f._entity), - _subMesh_i(f._subMesh_i), - _identifier(f._identifier), - _numberOfAttribute(f._numberOfAttribute), - _numberOfGroup(f._numberOfGroup), - _attributeValue(f._attributeValue) -{ - BEGIN_OF("Copy Constructor SMESH_MEDFamily_i"); - _attributeDescription=new string[_numberOfAttribute]; - for (int i=0;i<_numberOfAttribute;i++) { - _attributeDescription[i]=f._attributeDescription[i]; - }; - _groupName=new string[_numberOfGroup]; - for (int i=0;i<_numberOfAttribute;i++) { - _groupName[i]=f._groupName[i]; - }; - END_OF("Copy Constructor SMESH_MEDFamily_i"); -} -//============================================================================= -/*! - * Destructor - */ -//============================================================================= -SMESH_MEDFamily_i::~SMESH_MEDFamily_i() -{ -} -//============================================================================= -/*! - * Constructor - */ -//============================================================================= -SMESH_MEDFamily_i::SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm, - string name, string description, SALOME_MED::medEntityMesh entity): - SMESH_MEDSupport_i( sm, name, description, entity ), - - _subMesh_i(sm), - _identifier(identifier), - _numberOfAttribute(0), - _attributeIdentifier((int*)NULL), - _attributeValue((int*)NULL), - _attributeDescription((string*)NULL), - _numberOfGroup(0), - _groupName((string*)NULL) -{ - BEGIN_OF("Constructor SMESH_MEDFamily_i"); - END_OF("Constructor SMESH_MEDFamily_i"); -} -//============================================================================= -/*! - * CORBA: Accessor for Family's Identifier - */ -//============================================================================= - -CORBA::Long SMESH_MEDFamily_i::getIdentifier() -throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - return _identifier; - -} -//============================================================================= -/*! - * CORBA: Accessor for number of attributes - */ -//============================================================================= -CORBA::Long SMESH_MEDFamily_i::getNumberOfAttributes() -throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - return _numberOfAttribute; -} -//============================================================================= -/*! - * CORBA: Accessor for attributes identifiers - */ -//============================================================================= -SALOME_MED::long_array* SMESH_MEDFamily_i::getAttributesIdentifiers() -throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - }; - - SALOME_MED::long_array_var myseq= new SALOME_MED::long_array; - myseq->length(_numberOfAttribute); - for (int i=0;i<_numberOfAttribute;i++) - { - myseq[i]=_attributeIdentifier[i]; - }; - return myseq._retn(); - -} -//============================================================================= -/*! - * CORBA: Accessor for attribute identifier I - */ -//============================================================================= -CORBA::Long SMESH_MEDFamily_i::getAttributeIdentifier(CORBA::Long i) - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - }; - ASSERT (i <= _numberOfAttribute); - return _attributeIdentifier[i]; -} -//============================================================================= -/*! - * CORBA: Accessor for attributes values - */ -//============================================================================= -SALOME_MED::long_array* SMESH_MEDFamily_i::getAttributesValues() - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - }; - - SALOME_MED::long_array_var myseq= new SALOME_MED::long_array; - myseq->length(_numberOfAttribute); - for (int i=0;i<_numberOfAttribute;i++) - { - myseq[i]=_attributeValue[i]; - }; - return myseq._retn(); -} -//============================================================================= -/*! - * CORBA: Accessor for attribute value I - */ -//============================================================================= -CORBA::Long SMESH_MEDFamily_i::getAttributeValue(CORBA::Long i) - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - } - - ASSERT (i <= _numberOfAttribute); - return _attributeValue[i]; -} -//============================================================================= -/*! - * CORBA: Accessor for attributes desriptions - */ -//============================================================================= -SALOME_MED::string_array * SMESH_MEDFamily_i::getAttributesDescriptions() - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - } - SALOME_MED::string_array_var myseq = new SALOME_MED::string_array; - for (int i=0;i<_numberOfAttribute;i++) - { - myseq[i]=CORBA::string_dup(_attributeDescription[i].c_str()); - } - return myseq._retn(); -} -//============================================================================= -/*! - * CORBA: Accessor for attribute description i - */ -//============================================================================= -char * SMESH_MEDFamily_i::getAttributeDescription( CORBA::Long i) - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - } - ASSERT (i <= _numberOfAttribute); - return CORBA::string_dup(_attributeDescription[i].c_str()); -} -//============================================================================= -/*! - * CORBA: Accessor for the number of groups - */ -//============================================================================= -CORBA::Long SMESH_MEDFamily_i::getNumberOfGroups() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return 0; -} -//============================================================================= -/*! - * CORBA: Accessor for the name of the group i - */ -//============================================================================= -char * SMESH_MEDFamily_i::getGroupName( CORBA::Long i) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} -//============================================================================= -/*! - * CORBA: Accessor for all the groups name - */ -//============================================================================= -SALOME_MED::string_array* SMESH_MEDFamily_i::getGroupsNames() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} diff --git a/src/SMESH_I/SMESH_MEDFamily_i.hxx b/src/SMESH_I/SMESH_MEDFamily_i.hxx deleted file mode 100644 index eeeef51ee..000000000 --- a/src/SMESH_I/SMESH_MEDFamily_i.hxx +++ /dev/null @@ -1,90 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_MEDFamily_i.hxx -// Module : SMESH - -#ifndef SMESH_MED_FAMILY_I_HXX_ -#define SMESH_MED_FAMILY_I_HXX_ - -#include "SMESH_MEDSupport_i.hxx" - -#include - -class SMESH_MEDFamily_i: - public virtual POA_SALOME_MED::FAMILY, - public virtual SMESH_MEDSupport_i -{ -protected : - SMESH_MEDFamily_i(); - ~SMESH_MEDFamily_i(); - - ::SMESH_subMesh_i* _subMesh_i; - - // Values - int _identifier; - int _numberOfAttribute; - int * _attributeIdentifier; - int * _attributeValue; - string * _attributeDescription; - int _numberOfGroup ; - string * _groupName ; - - -public : - - // Constructors and associated internal methods - SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm, - string name, string description, SALOME_MED::medEntityMesh entity ); - SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f); - - // IDL Methods - void setProtocol(SALOME::TypeOfCommunication typ) {} - void release() {} - SALOME::SenderInt_ptr getSenderForNumber(long int) {return SALOME::SenderInt::_nil();} - SALOME::SenderInt_ptr getSenderForNumberIndex() {return SALOME::SenderInt::_nil();} - - CORBA::Long getIdentifier() - throw (SALOME::SALOME_Exception); - CORBA::Long getNumberOfAttributes() - throw (SALOME::SALOME_Exception); - SALOME_MED::long_array* getAttributesIdentifiers() - throw (SALOME::SALOME_Exception); - CORBA::Long getAttributeIdentifier(CORBA::Long i) - throw (SALOME::SALOME_Exception); - SALOME_MED::long_array* getAttributesValues() - throw (SALOME::SALOME_Exception); - CORBA::Long getAttributeValue(CORBA::Long i) - throw (SALOME::SALOME_Exception); - SALOME_MED::string_array* getAttributesDescriptions() - throw (SALOME::SALOME_Exception); - char* getAttributeDescription( CORBA::Long i) - throw (SALOME::SALOME_Exception); - CORBA::Long getNumberOfGroups() - throw (SALOME::SALOME_Exception); - char * getGroupName( CORBA::Long i) - throw (SALOME::SALOME_Exception); - SALOME_MED::string_array* getGroupsNames() - throw (SALOME::SALOME_Exception); -}; -#endif /* MED_FAMILY_I_HXX_ */ diff --git a/src/SMESH_I/SMESH_MEDMesh_i.cxx b/src/SMESH_I/SMESH_MEDMesh_i.cxx deleted file mode 100644 index 3f1c017d4..000000000 --- a/src/SMESH_I/SMESH_MEDMesh_i.cxx +++ /dev/null @@ -1,1206 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_MEDMesh_i.cxx -// Module : SMESH - -#include "SMESH_MEDMesh_i.hxx" -#include "SMESH_Mesh_i.hxx" - -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_SubMesh.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "utilities.h" -#include "Utils_CorbaException.hxx" - -#include "SMESH_MEDSupport_i.hxx" -#include "SMESH_MEDFamily_i.hxx" - -# include "Utils_ORB_INIT.hxx" -# include "Utils_SINGLETON.hxx" -# include "Utils_ExceptHandlers.hxx" - -extern "C" -{ -#include -} - -using namespace std; - -//============================================================================= -/*! - * Default constructor - */ -//============================================================================= -// PN Est-ce un const ? -SMESH_MEDMesh_i::SMESH_MEDMesh_i() -{ - BEGIN_OF("Default Constructor SMESH_MEDMesh_i"); - END_OF("Default Constructor SMESH_MEDMesh_i"); -} - -//============================================================================= -/*! - * Destructor - */ -//============================================================================= -SMESH_MEDMesh_i::~SMESH_MEDMesh_i() -{ -} - -//============================================================================= -/*! - * Constructor - */ -//============================================================================= -SMESH_MEDMesh_i::SMESH_MEDMesh_i(::SMESH_Mesh_i * m_i):_meshId(""), - _compte(false), - _creeFamily(false), - _famIdent(0), - _indexElts(0), - _indexEnts(0) -{ - BEGIN_OF("Constructor SMESH_MEDMesh_i"); - - _mesh_i = m_i; - _meshDS = _mesh_i->GetImpl().GetMeshDS(); - - END_OF("Constructor SMESH_MEDMesh_i"); -} - -//============================================================================= -/*! - * CORBA: Accessor for Name - */ -//============================================================================= -char *SMESH_MEDMesh_i::getName() throw(SALOME::SALOME_Exception) -{ - if (_meshDS == NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - - try - { - // A COMPLETER PAR LE NOM DU MAILLAGE - //return CORBA::string_dup(_mesh_i->getName().c_str()); - return CORBA::string_dup("toto"); - } - catch(...) - { - MESSAGE("Exception en accedant au nom"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for corbaindex cuisine interne - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA: Accessor for Space Dimension - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getSpaceDimension()throw(SALOME::SALOME_Exception) -{ - // PN : Il semblerait que la dimension soit fixee a 3 - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - return 3; -} - -//============================================================================= -/*! - * CORBA: Accessor for Mesh Dimension - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getMeshDimension()throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - // PN : Il semblerait que la dimension soit fixee a 3 - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - return 3; -} -//============================================================================= -/*! - * CORBA: Accessor for the boolean _isAGrid - */ -//============================================================================= -CORBA::Boolean SMESH_MEDMesh_i::getIsAGrid() throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return false; -} -//============================================================================= -/*! - * CORBA: Accessor for the connectivities, to see if they exist - */ -//============================================================================= -CORBA::Boolean -SMESH_MEDMesh_i::existConnectivity(SALOME_MED::medConnectivity connectivityType, - SALOME_MED::medEntityMesh entity) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!!!! IMPLEMENTED BUT ONLY PARTIALLY !!!!!!"); - - - return false; - -} -//============================================================================= -/*! - * CORBA: Accessor for Coordinate - */ -//============================================================================= -CORBA::Double SMESH_MEDMesh_i::getCoordinate(CORBA::Long Number, CORBA::Long Axis) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return 0.0; -} -//============================================================================= -/*! - * CORBA: Accessor for Coordinates System - */ -//============================================================================= -char *SMESH_MEDMesh_i::getCoordinatesSystem() throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - // PN : En dur. Non encore prevu - try - { - string systcoo = "CARTESIEN"; - return CORBA::string_dup(systcoo.c_str()); - } - catch(...) - { - MESSAGE("Exception en accedant au maillage"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for Coordinates - */ -//============================================================================= -SALOME_MED::double_array * SMESH_MEDMesh_i::getCoordinates( - SALOME_MED::medModeSwitch typeSwitch) throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - SALOME_MED::double_array_var myseq = new SALOME_MED::double_array; - try - { - // PN : En dur - int spaceDimension = 3; - int nbNodes = _meshDS->NbNodes(); - SCRUTE(nbNodes); - myseq->length(nbNodes * spaceDimension); - int i = 0; - - SMDS_NodeIteratorPtr itNodes=_meshDS->nodesIterator(); - while(itNodes->more()) - { - const SMDS_MeshNode* node = itNodes->next(); - - if (typeSwitch == SALOME_MED::MED_FULL_INTERLACE) - { - myseq[i * 3] = node->X(); - myseq[i * 3 + 1] = node->Y(); - myseq[i * 3 + 2] = node->Z(); - SCRUTE(myseq[i * 3]); - SCRUTE(myseq[i * 3 + 1]); - SCRUTE(myseq[i * 3 + 2]); - } - else - { - ASSERT(typeSwitch == SALOME_MED::MED_NO_INTERLACE); - myseq[i] = node->X(); - myseq[i + nbNodes] = node->Y(); - myseq[i + (nbNodes * 2)] = node->Z(); - SCRUTE(myseq[i]); - SCRUTE(myseq[i + nbNodes]); - SCRUTE(myseq[i + (nbNodes * 2)]); - } - i++; - } - } - catch(...) - { - MESSAGE("Exception en accedant aux coordonnees"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Accessor for Coordinates Names - */ -//============================================================================= -SALOME_MED::string_array * - SMESH_MEDMesh_i::getCoordinatesNames()throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - SALOME_MED::string_array_var myseq = new SALOME_MED::string_array; - try - { - // PN : en dur - int spaceDimension = 3; - myseq->length(spaceDimension); - myseq[0] = CORBA::string_dup("x"); - myseq[1] = CORBA::string_dup("y"); - myseq[2] = CORBA::string_dup("z"); - } - catch(...) - { - MESSAGE("Exception en accedant aux noms des coordonnees"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); - -} - -//============================================================================= -/*! - * CORBA: Accessor for Coordinates Units - */ -//============================================================================= -SALOME_MED::string_array * - SMESH_MEDMesh_i::getCoordinatesUnits()throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - SALOME_MED::string_array_var myseq = new SALOME_MED::string_array; - try - { - // PN : en dur - int spaceDimension = 3; - myseq->length(spaceDimension); - myseq[0] = CORBA::string_dup("m"); - myseq[1] = CORBA::string_dup("m"); - myseq[2] = CORBA::string_dup("m"); - } - catch(...) - { - MESSAGE("Exception en accedant aux unites des coordonnees"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Accessor for Number of Nodes - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfNodes()throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - try - { - return _meshDS->NbNodes(); - } - catch(...) - { - MESSAGE("Exception en accedant au nombre de noeuds"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for number of Types - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity) -throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - try - { - if (!_compte) - calculeNbElts(); - int retour = 0; - if (_mapNbTypes.find(entity) != _mapNbTypes.end()) - retour = _mapNbTypes[entity]; - return retour; - } - catch(...) - { - MESSAGE("Exception en accedant au nombre de Types"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for existing geometry element types - * Not implemented for MED_ALL_ENTITIES - */ -//============================================================================= -SALOME_MED::medGeometryElement_array * - SMESH_MEDMesh_i::getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME:: - SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - if (entity == SALOME_MED::MED_ALL_ENTITIES) - THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES", - SALOME::BAD_PARAM); - if (!_compte) - calculeNbElts(); - SALOME_MED::medGeometryElement_array_var myseq = - new SALOME_MED::medGeometryElement_array; - try - { - if (_mapNbTypes.find(entity) == _mapNbTypes.end()) - THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh", - SALOME::BAD_PARAM); - int nbTypes = _mapNbTypes[entity]; - - myseq->length(nbTypes); - - if (_mapIndToVectTypes.find(entity) == _mapIndToVectTypes.end()) - THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh", - SALOME::INTERNAL_ERROR); - - int index = _mapIndToVectTypes[entity]; - ASSERT(_TypesId[index].size() != 0); - int i = 0; - vector < SALOME_MED::medGeometryElement >::iterator it; - for (it = _TypesId[index].begin(); it != _TypesId[index].end(); it++) - { - myseq[i++] = *it; - }; - } - catch(...) - { - MESSAGE("Exception en accedant aux differents types"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Returns number of elements of type medGeometryElement - * Not implemented for MED_ALL_ELEMENTS - * implemented for MED_ALL_ENTITIES - * - * Dans cette implementation, il n est pas prevu de tenir compte du entity - * qui ne doit pas pouvoir avoir deux valeurs differentes pour un geomElement - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED:: - medEntityMesh entity, - SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - if (geomElement == SALOME_MED::MED_ALL_ELEMENTS) - THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ELEMENTS", - SALOME::BAD_PARAM); - if (!_compte) - calculeNbElts(); - - try - { - int retour = 0; - if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end()) - { - int index = _mapIndToSeqElts[geomElement]; - - retour = _seq_elemId[index]->length(); - } - return retour; - } - catch(...) - { - MESSAGE("Exception en accedant au nombre d élements"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for connectivities - */ -//============================================================================= -SALOME_MED::long_array * -SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch, - SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - if (mode != SALOME_MED::MED_NODAL) - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - if (typeSwitch == SALOME_MED::MED_NO_INTERLACE) - THROW_SALOME_CORBA_EXCEPTION("Not Yet Implemented", SALOME::BAD_PARAM); - if (!_compte) - calculeNbElts(); - - // Faut-il renvoyer un pointeur vide ??? - if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end()) - THROW_SALOME_CORBA_EXCEPTION("No Such Element in the mesh", - SALOME::BAD_PARAM); - - int index = _mapIndToSeqElts[geomElement]; - - return _seq_elemId[index]._retn(); -} - -//============================================================================= -/*! - * CORBA: Accessor for connectivities - */ -//============================================================================= -SALOME_MED::long_array * -SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity) - throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: Find an element corresponding to the given connectivity - */ -//============================================================================= -CORBA::Long -SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement type, - const SALOME_MED::long_array & connectivity) - throw(SALOME::SALOME_Exception) -{ - const char *LOC = "getElementNumber "; - MESSAGE(LOC << "Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return -1; -} - -//============================================================================= -/*! - * CORBA: Accessor for Ascendant connectivities - * not implemented for MED_ALL_ENTITIES and MED_MAILLE - */ -//============================================================================= -SALOME_MED::long_array * - SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED:: - medConnectivity mode) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: Accessor for connectivities - */ -//============================================================================= -SALOME_MED::long_array * - SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED:: - medConnectivity mode) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: Returns number of families within the mesh - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED:: - medEntityMesh entity) throw(SALOME::SALOME_Exception) -{ - if (_creeFamily == false) - createFamilies(); - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - return _families.size(); -} - -//============================================================================= -/*! - * CORBA: Returns number of groups within the mesh - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity) -throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - MESSAGE(" Pas d implementation des groupes dans SMESH"); - return 0; -} - -//============================================================================= -/*! - * CORBA: Returns references for families within the mesh - */ -//============================================================================= -SALOME_MED::Family_array * - SMESH_MEDMesh_i::getFamilies(SALOME_MED:: - medEntityMesh entity) throw(SALOME::SALOME_Exception) -{ - if (_creeFamily == false) - createFamilies(); - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array; - int nbfam = _families.size(); - myseq->length(nbfam); - int i = 0; - vector < SALOME_MED::FAMILY_ptr >::iterator it; - for (it = _families.begin(); it != _families.end(); it++) - { - myseq[i++] = *it; - }; - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Returns references for family i within the mesh - */ -//============================================================================= -SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED:: - medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception) -{ - if (_creeFamily == false) - createFamilies(); - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - - SCRUTE(_families[i]->getName()); - MESSAGE(" SMESH_MEDMesh_i::getFamily " << i) return _families[i]; -} - -//============================================================================= -/*! - * CORBA: Returns references for groups within the mesh - */ -//============================================================================= -SALOME_MED::Group_array * - SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity) throw(SALOME:: - SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - MESSAGE(" Pas d implementation des groupes dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA: Returns references for group i within the mesh - */ -//============================================================================= -SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED:: - medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - MESSAGE(" Pas d implementation des groupes dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM); -} -//============================================================================= -/*! - * CORBA: Returns references for the global numbering index - */ -//============================================================================= -SALOME_MED::long_array* -SMESH_MEDMesh_i::getGlobalNumberingIndex(SALOME_MED::medEntityMesh entity) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * CORBA: Returns references for the support of boundary elements of type - * entity - */ -//============================================================================= -SALOME_MED::SUPPORT_ptr -SMESH_MEDMesh_i::getBoundaryElements(SALOME_MED::medEntityMesh entity) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * CORBA: Returns references for the support of the skin of the support - * mySupport3D - */ -//============================================================================= -SALOME_MED::SUPPORT_ptr -SMESH_MEDMesh_i::getSkin(SALOME_MED::SUPPORT_ptr mySupport3D) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: add the Mesh in the StudyManager - * PN Pas Implemente - */ -//============================================================================= -void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy, - SALOME_MED::MESH_ptr myIor) throw(SALOME::SALOME_Exception) -{ - BEGIN_OF("MED_Mesh_i::addInStudy"); - if (_meshId != "") - { - MESSAGE("Mesh already in Study"); - THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study", - SALOME::BAD_PARAM); - }; - - /* - * SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder(); - * - * // Create SComponent labelled 'MED' if it doesn't already exit - * SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED"); - * if ( CORBA::is_nil(medfather) ) - * { - * MESSAGE("Add Component MED"); - * medfather = myBuilder->NewComponent("MED"); - * //myBuilder->AddAttribute (medfather,SALOMEDS::Name,"MED"); - * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow( - * myBuilder->FindOrCreateAttribute(medfather, "AttributeName")); - * aName->SetValue("MED"); - * - * myBuilder->DefineComponentInstance(medfather,myIor); - * - * } ; - * - * MESSAGE("Add a mesh Object under MED"); - * myBuilder->NewCommand(); - * SALOMEDS::SObject_var newObj = myBuilder->NewObject(medfather); - * - * ORB_INIT &init = *SINGLETON_::Instance() ; - * ASSERT(SINGLETON_::IsAlreadyExisting()) ; - * CORBA::ORB_var &orb = init(0,0); - * string iorStr = orb->object_to_string(myIor); - * //myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.c_str()); - * SALOMEDS::AttributeIOR_var aIOR = SALOMEDS::AttributeIOR::_narrow( - * myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR")); - * aIOR->SetValue(iorStr.c_str()); - * - * //myBuilder->AddAttribute(newObj,SALOMEDS::Name,_mesh_i->getName().c_str()); - * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow( - * myBuilder->FindOrCreateAttribute(newObj, "AttributeName")); - * aName->SetValue(_mesh_i->getName().c_str()); - * - * _meshId = newObj->GetID(); - * myBuilder->CommitCommand(); - * - */ - END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)"); -} - -//============================================================================= -/*! - * CORBA: write mesh in a med file - */ -//============================================================================= -void SMESH_MEDMesh_i::write(CORBA::Long i, const char *driverMeshName) -throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA: read mesh in a med file - */ -//============================================================================= -void SMESH_MEDMesh_i::read(CORBA::Long i) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA : release driver - */ -//============================================================================= -void SMESH_MEDMesh_i::rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA : attach driver - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType, - const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * Calcule le Nb d'elements par entite geometrique - */ -//============================================================================= -void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) -{ - if (!_compte) - { - _compte = true; - - _mapNbTypes[SALOME_MED::MED_NODE] = 1; - // On compte les aretes MED_SEG2 ou MED_SEG3 - // On range les elements dans les vecteurs correspondants - - _mapIndToSeqElts[SALOME_MED::MED_SEG2] = _indexElts++; - _mapIndToSeqElts[SALOME_MED::MED_SEG3] = _indexElts++; - _mapIndToVectTypes[SALOME_MED::MED_EDGE] = _indexEnts++; - - int trouveSeg2 = 0; - int trouveSeg3 = 0; - SALOME_MED::medGeometryElement medElement; - - SMDS_EdgeIteratorPtr itEdges=_meshDS->edgesIterator(); - while(itEdges->more()) - { - const SMDS_MeshEdge* elem = itEdges->next(); - int nb_of_nodes = elem->NbNodes(); - - switch (nb_of_nodes) - { - case 2: - { - medElement = SALOME_MED::MED_SEG2; - if (trouveSeg2 == 0) - { - trouveSeg2 = 1; - _TypesId[SALOME_MED::MED_EDGE]. - push_back(SALOME_MED::MED_SEG2); - } - break; - } - case 3: - { - medElement = SALOME_MED::MED_SEG3; - if (trouveSeg3 == 0) - { - trouveSeg3 = 1; - _TypesId[SALOME_MED::MED_EDGE]. - push_back(SALOME_MED::MED_SEG3); - } - break; - } - } - int index = _mapIndToSeqElts[medElement]; - SCRUTE(index); - // Traitement de l arete - - int longueur = _seq_elemId[index]->length(); - _seq_elemId[index]->length(longueur + nb_of_nodes); - - SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); - - for(int k=0; itn->more(); k++) - _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - } - - _mapNbTypes[SALOME_MED::MED_EDGE] = trouveSeg2 + trouveSeg3; - - // On compte les faces MED_TRIA3, MED_HEXA8, MED_TRIA6 - // On range les elements dans les vecteurs correspondants - int trouveTria3 = 0; - int trouveTria6 = 0; - int trouveQuad4 = 0; - - _mapIndToSeqElts[SALOME_MED::MED_TRIA3] = _indexElts++; - _mapIndToSeqElts[SALOME_MED::MED_TRIA6] = _indexElts++; - _mapIndToSeqElts[SALOME_MED::MED_QUAD4] = _indexElts++; - _mapIndToVectTypes[SALOME_MED::MED_FACE] = _indexEnts++; - - SMDS_FaceIteratorPtr itFaces=_meshDS->facesIterator(); - while(itFaces->more()) - { - const SMDS_MeshFace * elem = itFaces->next(); - int nb_of_nodes = elem->NbNodes(); - - switch (nb_of_nodes) - { - case 3: - { - medElement = SALOME_MED::MED_TRIA3; - if (trouveTria3 == 0) - { - trouveTria3 = 1; - _TypesId[SALOME_MED::MED_FACE]. - push_back(SALOME_MED::MED_TRIA3); - } - break; - } - case 4: - { - medElement = SALOME_MED::MED_QUAD4; - if (trouveQuad4 == 0) - { - trouveQuad4 = 1; - _TypesId[SALOME_MED::MED_FACE]. - push_back(SALOME_MED::MED_QUAD4); - } - break; - } - case 6: - { - medElement = SALOME_MED::MED_TRIA6; - if (trouveTria6 == 0) - { - trouveTria6 = 1; - _TypesId[SALOME_MED::MED_FACE]. - push_back(SALOME_MED::MED_TRIA6); - } - break; - } - } - int index = _mapIndToSeqElts[medElement]; - SCRUTE(index); - - // Traitement de la face - // Attention La numérotation des noeuds Med commence a 1 - - int longueur = _seq_elemId[index]->length(); - _seq_elemId[index]->length(longueur + nb_of_nodes); - - SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); - - for(int k=0; itn->more(); k++) - _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - } //itFaces - - _mapNbTypes[SALOME_MED::MED_FACE] = - trouveTria3 + trouveTria6 + trouveQuad4; - - _mapIndToSeqElts[SALOME_MED::MED_HEXA8] = _indexElts++; - _mapIndToVectTypes[SALOME_MED::MED_CELL] = _indexEnts++; - int index = _mapIndToSeqElts[medElement]; - - int trouveHexa8 = 0; - - SMDS_VolumeIteratorPtr itVolumes=_meshDS->volumesIterator(); - while(itVolumes->more()) - { - const SMDS_MeshVolume * elem = itVolumes->next(); - - int nb_of_nodes = elem->NbNodes(); - medElement = SALOME_MED::MED_HEXA8; - ASSERT(nb_of_nodes = 8); - - if (trouveHexa8 == 0) - { - trouveHexa8 = 1; - _TypesId[SALOME_MED::MED_CELL].push_back(SALOME_MED::MED_HEXA8); - }; - // Traitement de la maille - int longueur = _seq_elemId[index]->length(); - _seq_elemId[index]->length(longueur + nb_of_nodes); - - SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); - for(int k=0; itn->more(); k++) - _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - } - - _mapNbTypes[SALOME_MED::MED_CELL] = trouveHexa8; - _mapNbTypes[SALOME_MED::MED_ALL_ENTITIES] - = - trouveHexa8 + trouveTria3 + trouveTria6 + trouveQuad4 + trouveSeg2 + - trouveSeg3; - }// fin du _compte -}; - -//============================================================================= -/*! - * Creation des familles - */ -//============================================================================= -void SMESH_MEDMesh_i::createFamilies() throw(SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - string famDes = ("Je ne sais pas"); - string famName0 = "Famille_"; - string famName; - char numero[10]; - - if (_creeFamily == false) - { - _creeFamily = true; - SMESH_subMesh_i *subMeshServant; - - map < int, SMESH_subMesh_i * >::iterator it; - for (it = _mesh_i->_mapSubMesh_i.begin(); - it != _mesh_i->_mapSubMesh_i.end(); it++) - { - SMESH_subMesh_i *submesh_i = (*it).second; - int famIdent = (*it).first; - - ASSERT(famIdent < 999999999); - sprintf(numero, "%d\n", famIdent); - famName = famName0 + numero; - - SMESH_MEDFamily_i *famservant = - new SMESH_MEDFamily_i(famIdent, submesh_i, - famName, famDes, SALOME_MED::MED_NODE); - SALOME_MED::FAMILY_ptr famille = - SALOME_MED::FAMILY::_narrow(famservant-> - POA_SALOME_MED::FAMILY::_this()); - _families.push_back(famille); - } - } -}; -//============================================================================= -/*! - * Gives informations of the considered mesh. - */ -//============================================================================= -SALOME_MED::MESH::meshInfos * SMESH_MEDMesh_i::getMeshGlobal() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * Gives informations on coordinates of the considered mesh. - */ -//============================================================================= -SALOME_MED::MESH::coordinateInfos * SMESH_MEDMesh_i::getCoordGlobal() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * Gives informations on connectivities of the considered mesh for the entity - * entity. - */ -//============================================================================= -SALOME_MED::MESH::connectivityInfos * -SMESH_MEDMesh_i::getConnectGlobal(SALOME_MED::medEntityMesh entity) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * Gives the type of the element number of entity entity - */ -//============================================================================= -SALOME_MED::medGeometryElement -SMESH_MEDMesh_i::getElementType(SALOME_MED::medEntityMesh entity, - CORBA::Long number) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return (SALOME_MED::medGeometryElement) 0; -} diff --git a/src/SMESH_I/SMESH_MEDSupport_i.cxx b/src/SMESH_I/SMESH_MEDSupport_i.cxx deleted file mode 100644 index 7b5289ebb..000000000 --- a/src/SMESH_I/SMESH_MEDSupport_i.cxx +++ /dev/null @@ -1,401 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_MEDSupport_i.cxx -// Module : SMESH - -using namespace std; -#include "SMESH_MEDSupport_i.hxx" -#include "utilities.h" -#include "Utils_CorbaException.hxx" -#include "Utils_ExceptHandlers.hxx" - -#include -#include "SMESHDS_Mesh.hxx" - -#include "SMESH_subMesh.hxx" -#include "SMESH_Mesh_i.hxx" -#include "SMESH_subMesh_i.hxx" - - -//============================================================================= -/*! - * Default constructor - */ -//============================================================================= -SMESH_MEDSupport_i::SMESH_MEDSupport_i() -{ - BEGIN_OF("Default Constructor SMESH_MEDSupport_i"); - END_OF("Default Constructor SMESH_MEDSupport_i"); -} - -//============================================================================= -/*! - * Constructor - */ -//============================================================================= -SMESH_MEDSupport_i::SMESH_MEDSupport_i(SMESH_subMesh_i * sm, string name, - string description, SALOME_MED::medEntityMesh entity) - :_subMesh_i(sm), _name(name), _description(description), _entity(entity), - _seqNumber(false), _seqLength(0) -{ - BEGIN_OF("Constructor SMESH_MEDSupport_i"); - - _meshDS = _subMesh_i->_mesh_i->GetImpl().GetMeshDS(); - - int subMeshId = _subMesh_i->GetId(); - - MESSAGE(" subMeshId " << subMeshId) - - if (_subMesh_i->_mesh_i->_mapSubMesh.find(subMeshId) != - _subMesh_i->_mesh_i->_mapSubMesh.end()) - { - ::SMESH_subMesh * subMesh = _subMesh_i->_mesh_i->_mapSubMesh[subMeshId]; - _subMeshDS = subMesh->GetSubMeshDS(); - } - - if (_entity == SALOME_MED::MED_NODE) - { - _numberOfGeometricType = 1; - _geometricType = new SALOME_MED::medGeometryElement[1]; - _geometricType[0] = SALOME_MED::MED_NONE; - } - else - { - MESSAGE("Pas implemente dans cette version"); - THROW_SALOME_CORBA_EXCEPTION - ("Seules les familles de noeuds sont implementees ", - SALOME::BAD_PARAM); - } - - END_OF("Constructor SMESH_MEDSupport_i"); -} - -//============================================================================= -/*! - * Constructor - */ -//============================================================================= -SMESH_MEDSupport_i:: -SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s):_subMesh_i(s._subMesh_i), -_name(s._name), _description(s._description), _entity(s._entity), -_seqNumber(false), _seqLength(0) -{ - BEGIN_OF("Constructor SMESH_MEDSupport_i"); - - _meshDS = _subMesh_i->_mesh_i->GetImpl().GetMeshDS(); - - int subMeshId = _subMesh_i->GetId(); - if (_subMesh_i->_mesh_i->_mapSubMesh.find(subMeshId) != - _subMesh_i->_mesh_i->_mapSubMesh.end()) - { - ::SMESH_subMesh * subMesh = _subMesh_i->_mesh_i->_mapSubMesh[subMeshId]; - _subMeshDS = subMesh->GetSubMeshDS(); - } - - END_OF("Constructor SMESH_MEDSupport_i"); -} - -//============================================================================= -/*! - * Destructor - */ -//============================================================================= - -SMESH_MEDSupport_i::~SMESH_MEDSupport_i() -{ -} - -//============================================================================= -/*! - * CORBA: Accessor for Corba Index - */ -//============================================================================= - -CORBA::Long SMESH_MEDSupport_i::getCorbaIndex()throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS == NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - MESSAGE("Not implemented for SMESH_i"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented ", SALOME::BAD_PARAM); - -} - -//============================================================================= -/*! - * CORBA: Accessor for Name - */ -//============================================================================= - -char *SMESH_MEDSupport_i::getName() throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return CORBA::string_dup(_name.c_str()); - -} - -//============================================================================= -/*! - * CORBA: Accessor for Description - */ -//============================================================================= - -char *SMESH_MEDSupport_i::getDescription() throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return CORBA::string_dup(_description.c_str()); -} - -//============================================================================= -/*! - * CORBA: Accessor for Mesh - */ -//============================================================================= - -SALOME_MED::MESH_ptr SMESH_MEDSupport_i::getMesh()throw(SALOME:: - SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - - return _subMesh_i->_mesh_i->GetMEDMesh(); -} - -//============================================================================= -/*! - * CORBA: boolean indicating if support concerns all elements - */ -//============================================================================= - -CORBA::Boolean SMESH_MEDSupport_i::isOnAllElements()throw(SALOME:: - SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - if (_seqNumber == false) - { - if (_entity != SALOME_MED::MED_NONE) - { - _seqLength = _subMeshDS->NbNodes(); - _seqNumber = true; - } - else - { - MESSAGE("Only Node Families are implemented "); - THROW_SALOME_CORBA_EXCEPTION("Not implemented Yet ", - SALOME::BAD_PARAM); - } - } - try - { - _isOnAllElements = (_seqLength == _meshDS->NbNodes()); - } - catch(...) - { - MESSAGE("unable to acces related Mesh"); - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - }; - return _isOnAllElements; -} - -//============================================================================= -/*! - * CORBA: Accessor for type of support's entity - */ -//============================================================================= - -SALOME_MED::medEntityMesh SMESH_MEDSupport_i::getEntity()throw(SALOME:: - SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return _entity; -} - -//============================================================================= -/*! - * CORBA: Accessor for types of geometry elements - */ -//============================================================================= - -SALOME_MED::medGeometryElement_array * - SMESH_MEDSupport_i::getTypes()throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - SALOME_MED::medGeometryElement_array_var myseq = - new SALOME_MED::medGeometryElement_array; - try - { - int mySeqLength = _numberOfGeometricType; - myseq->length(mySeqLength); - for (int i = 0; i < mySeqLength; i++) - { - myseq[i] = _geometricType[i]; - } - } - catch(...) - { - MESSAGE("Exception lors de la recherche des differents types"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Support Types", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Number of different types of geometry elements - * existing in the support - */ -//============================================================================= -CORBA::Long SMESH_MEDSupport_i::getNumberOfElements(SALOME_MED:: - medGeometryElement geomElement) throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return _numberOfGeometricType; - -} - -//============================================================================= -/*! - * CORBA: get Nodes - */ -//============================================================================= - -SALOME_MED::long_array * SMESH_MEDSupport_i::getNumber( - SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - - // A changer s'il ne s agit plus seulement de famille de noeuds - if (geomElement != SALOME_MED::MED_NONE) - THROW_SALOME_CORBA_EXCEPTION("Not implemented", SALOME::BAD_PARAM); - - SALOME_MED::long_array_var myseq = new SALOME_MED::long_array; - - int i = 0; - myseq->length(_subMeshDS->NbNodes()); - - SMDS_NodeIteratorPtr it = _subMeshDS->GetNodes(); - while(it->more()) - { - myseq[i] = it->next()->GetID(); - i++; - }; - - SCRUTE(myseq->length()); - MESSAGE("End of SMESH_MEDSupport_i::getNumber"); - return myseq._retn(); - -} - -//============================================================================= -/*! - * CORBA: Global Nodes Index (optionnaly designed by the user) - * CORBA: ?????????????????????????????? - */ -//============================================================================= - -SALOME_MED::long_array * - SMESH_MEDSupport_i::getNumberIndex()throw(SALOME::SALOME_Exception) -{ - MESSAGE("Not implemented for SMESH_i"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} -//============================================================================= -/*! - * CORBA: Array containing indexes for elements included in the support - */ -//============================================================================= - -CORBA::Long SMESH_MEDSupport_i::getNumberOfGaussPoint(SALOME_MED:: - medGeometryElement geomElement) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Not implemented for SMESH_i"); - return 0; -} -//============================================================================= -/*! - * Gives the number of types of elements included in the support - */ -//============================================================================= -CORBA::Long SMESH_MEDSupport_i::getNumberOfTypes() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return 0; -} -//============================================================================= -/*! - * Gives CORBA: Array containing the numbers of Gauss point of elements - * included in the support - */ -//============================================================================= -SALOME_MED::long_array* SMESH_MEDSupport_i::getNumbersOfGaussPoint() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} -//============================================================================= -/*! - * build the object which will contain all the boundary elements of the mesh. - */ -//============================================================================= -void SMESH_MEDSupport_i::getBoundaryElements() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); -} -//============================================================================= -/*! - * Gives information on the support - */ -//============================================================================= -SALOME_MED::SUPPORT::supportInfos * SMESH_MEDSupport_i::getSupportGlobal() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} diff --git a/src/SMESH_I/SMESH_MEDSupport_i.hxx b/src/SMESH_I/SMESH_MEDSupport_i.hxx deleted file mode 100644 index c888661b6..000000000 --- a/src/SMESH_I/SMESH_MEDSupport_i.hxx +++ /dev/null @@ -1,111 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_MEDSupport_i.hxx -// Module : SMESH - -#ifndef _MED_SMESH_MEDSUPPORT_I_HXX_ -#define _MED_SMESH_MEDSUPPORT_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(MED) -#include - -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_SubMesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" - -#include "SMESH_MEDSupport_i.hxx" -#include "SALOME_GenericObj_i.hh" -class SMESH_subMesh_i; - -class SMESH_MEDSupport_i: - public virtual POA_SALOME_MED::SUPPORT, public virtual SALOME::GenericObj_i -{ - public: - -// Constructors and associated internal methods - SMESH_MEDSupport_i(SMESH_subMesh_i * sm, - string name, string description, SALOME_MED::medEntityMesh entity); - SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s); - -// IDL Methods - char *getName() throw(SALOME::SALOME_Exception); - char *getDescription() throw(SALOME::SALOME_Exception); - SALOME_MED::MESH_ptr getMesh() throw(SALOME::SALOME_Exception); - CORBA::Boolean isOnAllElements() throw(SALOME::SALOME_Exception); - SALOME_MED::medEntityMesh getEntity() throw(SALOME::SALOME_Exception); - CORBA::Long - getNumberOfElements(SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception); - - CORBA::Long getNumberOfTypes() throw (SALOME::SALOME_Exception); - - SALOME_MED::long_array * - getNumber(SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception); - - SALOME_MED::long_array * getNumberIndex() - throw(SALOME::SALOME_Exception); - - CORBA::Long - getNumberOfGaussPoint(SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception); - - SALOME_MED::long_array* getNumbersOfGaussPoint() - throw (SALOME::SALOME_Exception); - - SALOME_MED::medGeometryElement_array *getTypes() - throw(SALOME::SALOME_Exception); - - void getBoundaryElements() throw (SALOME::SALOME_Exception); - - CORBA::Long getCorbaIndex() throw(SALOME::SALOME_Exception); - - SALOME_MED::SUPPORT::supportInfos * getSupportGlobal() - throw (SALOME::SALOME_Exception); - - void createSeq() throw(SALOME::SALOME_Exception); - - public: //public field - const SMESHDS_SubMesh * _subMeshDS; - ::SMESH_subMesh_i * _subMesh_i; - - SMESHDS_Mesh * _meshDS; - string _name; - string _description; - bool _isOnAllElements; - bool _seqNumber; - int _seqLength; - - SALOME_MED::medEntityMesh _entity; - SALOME_MED::medGeometryElement * _geometricType; - int _numberOfGeometricType; - - protected: - SMESH_MEDSupport_i(); - ~SMESH_MEDSupport_i(); -}; - -#endif /* _MED_MEDSUPPORT_I_HXX_ */ diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx deleted file mode 100644 index 42fac7d5d..000000000 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ /dev/null @@ -1,268 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_Mesh_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MESH_I_HXX_ -#define _SMESH_MESH_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Group) -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) -#include CORBA_CLIENT_HEADER(GEOM_Gen) -#include CORBA_CLIENT_HEADER(MED) - -#include "SMESH_Hypothesis.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh_i.hxx" -#include "SMESH_subMesh.hxx" - -#include "SALOME_GenericObj_i.hh" - -class SMESH_Gen_i; -class SMESH_GroupBase_i; - -#include - -class SMESH_Mesh_i: - public virtual POA_SMESH::SMESH_Mesh, - public virtual SALOME::GenericObj_i -{ - SMESH_Mesh_i(); - SMESH_Mesh_i(const SMESH_Mesh_i&); -public: - SMESH_Mesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* myGen_i, - CORBA::Long studyId ); - - virtual ~SMESH_Mesh_i(); - - // --- CORBA - void SetShape( GEOM::GEOM_Object_ptr theShapeObject ) - throw (SALOME::SALOME_Exception); - - GEOM::GEOM_Object_ptr GetShapeToMesh() - throw (SALOME::SALOME_Exception); - - SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) - throw (SALOME::SALOME_Exception); - - SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) - throw (SALOME::SALOME_Exception); - - SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject, const char* theName) - throw (SALOME::SALOME_Exception); - - void RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr CreateGroup( SMESH::ElementType theElemType, const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_GroupOnGeom_ptr CreateGroupFromGEOM(SMESH::ElementType theElemType, - const char* theName, - GEOM::GEOM_Object_ptr theGeomObj ) - throw (SALOME::SALOME_Exception); - - void RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup ) - throw (SALOME::SALOME_Exception); - - void RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr UnionGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr IntersectGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr CutGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); - -// SMESH::string_array* GetLog(CORBA::Boolean clearAfterGet) -// throw (SALOME::SALOME_Exception); - - SMESH::log_array* GetLog(CORBA::Boolean clearAfterGet) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_MeshEditor_ptr GetMeshEditor(); - - void ClearLog() - throw (SALOME::SALOME_Exception); - - CORBA::Long GetId() - throw (SALOME::SALOME_Exception); - - CORBA::Long GetStudyId() - throw (SALOME::SALOME_Exception); - - // --- C++ interface - - void SetImpl(::SMESH_Mesh* impl); - ::SMESH_Mesh& GetImpl(); // :: force no namespace here - - SMESH_Gen_i* GetGen() { return _gen_i; } - - int ImportUNVFile( const char* theFileName ) - throw (SALOME::SALOME_Exception); - - int ImportSTLFile( const char* theFileName ) - throw (SALOME::SALOME_Exception); - - /*! - * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value - */ - SMESH::DriverMED_ReadStatus ImportMEDFile( const char* theFileName, const char* theMeshName ) - throw (SALOME::SALOME_Exception); - - void ExportToMED( const char* file, CORBA::Boolean auto_groups, SMESH::MED_VERSION theVersion ) - throw (SALOME::SALOME_Exception); - void ExportMED( const char* file, CORBA::Boolean auto_groups ) - throw (SALOME::SALOME_Exception); - - void ExportDAT( const char* file ) - throw (SALOME::SALOME_Exception); - void ExportUNV( const char* file ) - throw (SALOME::SALOME_Exception); - void ExportSTL( const char* file, const bool isascii ) - throw (SALOME::SALOME_Exception); - - SALOME_MED::MESH_ptr GetMEDMesh() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbNodes() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbElements() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbEdges() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbFaces() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbTriangles() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbQuadrangles() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbPolygons() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbVolumes() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbTetras() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbHexas() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbPyramids() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbPrisms() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbPolyhedrons() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbSubMesh() - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetElementsId() - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetNodesId() - throw (SALOME::SALOME_Exception); - - SMESH::ElementType GetElementType( const CORBA::Long id, const bool iselem ) - throw (SALOME::SALOME_Exception); - - char* Dump(); - - // Internal methods not available through CORBA - // They are called by corresponding interface methods - SMESH_Hypothesis::Hypothesis_Status addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp); - - SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp); - - int importMEDFile( const char* theFileName, const char* theMeshName ); - - SMESH::SMESH_subMesh_ptr createSubMesh( GEOM::GEOM_Object_ptr theSubShapeObject ); - - void removeSubMesh(SMESH::SMESH_subMesh_ptr theSubMesh, - GEOM::GEOM_Object_ptr theSubShapeObject ); - - SMESH::SMESH_GroupBase_ptr createGroup(SMESH::ElementType theElemType, - const char* theName, - const TopoDS_Shape& theShape = TopoDS_Shape()); - - void removeGroup( const int theId ); - - SMESH::SMESH_subMesh_ptr getSubMesh(int shapeID); - // return an existing subMesh object for the shapeID. shapeID == submeshID. - - const map& getGroups() { return _mapGroups; } - // return an existing group object. - - virtual SMESH::long_array* GetIDs(); - - map _mapSubMesh_i; //NRI - map _mapSubMesh; //NRI - -private: - static int myIdGenerator; - ::SMESH_Mesh* _impl; // :: force no namespace here - SMESH_Gen_i* _gen_i; - int _id; // id given by creator (unique within the creator instance) - int _studyId; - map _mapSubMeshIor; - map _mapGroups; - map _mapHypo; -}; - -#endif - diff --git a/src/SMESH_I/SMESH_Pattern_i.hxx b/src/SMESH_I/SMESH_Pattern_i.hxx deleted file mode 100644 index 29b5084cd..000000000 --- a/src/SMESH_I/SMESH_Pattern_i.hxx +++ /dev/null @@ -1,103 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_Pattern_i.hxx -// Created : Fri Aug 20 16:03:15 2004 -// Author : Edward AGAPOV (eap) - -// $Header: - -#ifndef SMESH_Pattern_I_HeaderFile -#define SMESH_Pattern_I_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Pattern) -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_CLIENT_HEADER(GEOM_Gen) - -#include -#include "SMESH_Pattern.hxx" - -class SMESH_Gen_i; -class SMESH_Mesh; - -class SMESH_Pattern_i: - public virtual POA_SMESH::SMESH_Pattern -{ - public: - - SMESH_Pattern_i (SMESH_Gen_i* theGen_i); - - CORBA::Boolean LoadFromFile(const char* theFileContents); - - CORBA::Boolean LoadFromFace(SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theFace, - CORBA::Boolean theProject); - - CORBA::Boolean LoadFrom3DBlock(SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theBlock); - - SMESH::point_array* ApplyToFace(GEOM::GEOM_Object_ptr theFace, - GEOM::GEOM_Object_ptr theVertexOnKeyPoint1, - CORBA::Boolean theReverse); - - SMESH::point_array* ApplyTo3DBlock(GEOM::GEOM_Object_ptr theBlock, - GEOM::GEOM_Object_ptr theVertex000, - GEOM::GEOM_Object_ptr theVertex001); - - SMESH::point_array* ApplyToMeshFaces(SMESH::SMESH_Mesh_ptr theMesh, - const SMESH::long_array& theFacesIDs, - CORBA::Long theNodeIndexOnKeyPoint1, - CORBA::Boolean theReverse); - - SMESH::point_array* ApplyToHexahedrons(SMESH::SMESH_Mesh_ptr theMesh, - const SMESH::long_array& theVolumesIDs, - CORBA::Long theNode000Index, - CORBA::Long theNode001Index); - - CORBA::Boolean MakeMesh (SMESH::SMESH_Mesh_ptr theMesh, - const CORBA::Boolean CreatePolygons, - const CORBA::Boolean CreatePolyedrs); - - SMESH::SMESH_Pattern::ErrorCode GetErrorCode(); - - char* GetString(); - - CORBA::Boolean Is2D(); - - SMESH::point_array* GetPoints(); - - SMESH::long_array* GetKeyPoints(); - - SMESH::array_of_long_array* GetElementPoints(CORBA::Boolean applied); - - - private: - - ::SMESH_Mesh* getMesh( SMESH::SMESH_Mesh_ptr & theMesh ); - - ::SMESH_Pattern myPattern; - - SMESH_Gen_i* myGen; -}; -#endif diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx deleted file mode 100644 index f8ade30f5..000000000 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ /dev/null @@ -1,487 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_subMesh_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_subMesh_i.hxx" -#include "SMESH_Gen_i.hxx" -#include "SMESH_Mesh_i.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" -#include "OpUtil.hxx" -#include "Utils_ExceptHandlers.hxx" - -#include -#include -#include - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_subMesh_i::SMESH_subMesh_i() - : SALOME::GenericObj_i( PortableServer::POA::_nil() ) -{ - MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i default, not for use"); - ASSERT(0); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_subMesh_i::SMESH_subMesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* gen_i, - SMESH_Mesh_i* mesh_i, - int localId ) - : SALOME::GenericObj_i( thePOA ) -{ - MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i"); - _gen_i = gen_i; - _mesh_i = mesh_i; - _localId = localId; - thePOA->activate_object( this ); - // **** -} -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_subMesh_i::~SMESH_subMesh_i() -{ - MESSAGE("SMESH_subMesh_i::~SMESH_subMesh_i"); - // **** -} - -//======================================================================= -//function : getSubMeshes -//purpose : for a submesh on shape to which elements are not bound directly, -// return submeshes containing elements -//======================================================================= - -typedef list TListOfSubMeshes; - -bool getSubMeshes(::SMESH_subMesh* theSubMesh, - TListOfSubMeshes& theSubMeshList) -{ - int size = theSubMeshList.size(); - - SMESH_Mesh* aMesh = theSubMesh->GetFather(); - SMESHDS_Mesh* aMeshDS = aMesh->GetMeshDS(); - SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS(); - - // nodes can be bound to either vertex, edge, face or solid_or_shell - TopoDS_Shape aShape = theSubMesh->GetSubShape(); - switch ( aShape.ShapeType() ) - { - case TopAbs_SOLID: { - // add submesh of solid itself - aSubMeshDS = aMeshDS->MeshElements( aShape ); - if ( aSubMeshDS ) - theSubMeshList.push_back( aSubMeshDS ); - // and of the first shell - TopExp_Explorer exp( aShape, TopAbs_SHELL ); - if ( exp.More() ) { - aSubMeshDS = aMeshDS->MeshElements( exp.Current() ); - if ( aSubMeshDS ) - theSubMeshList.push_back( aSubMeshDS ); - } - break; - } - case TopAbs_WIRE: - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: { - // call getSubMeshes() for sub-shapes - list shapeList; - shapeList.push_back( aShape ); - list::iterator sh = shapeList.begin(); - for ( ; sh != shapeList.end(); ++sh ) { - for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) { - ::SMESH_subMesh* aSubMesh = aMesh->GetSubMeshContaining( it.Value() ); - if ( aSubMesh ) - getSubMeshes( aSubMesh, theSubMeshList ); - else - // no submesh for a compound inside compound - shapeList.push_back( it.Value() ); - } - } - // return only unique submeshes - set smSet; - TListOfSubMeshes::iterator sm = theSubMeshList.begin(); - while ( sm != theSubMeshList.end() ) { - if ( !smSet.insert( *sm ).second ) - sm = theSubMeshList.erase( sm ); - else - ++sm; - } - break; - } - } - return size < theSubMeshList.size(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -CORBA::Long SMESH_subMesh_i::GetNumberOfElements() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetNumberOfElements"); - if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) - return 0; - - ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; - - // volumes are bound to shell - TListOfSubMeshes smList; - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - nbElems += (*sm)->NbElements(); - } - return nbElems; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetNumberOfNodes"); - if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) - return 0; - - ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - - set nodeIds; - - // nodes are bound to shell instead of solid - TListOfSubMeshes smList; - if ( all && getSubMeshes( aSubMesh, smList )) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - { - SMDS_ElemIteratorPtr eIt = (*sm)->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } - return nodeIds.size(); - } - - if ( aSubMeshDS == NULL ) - return 0; - - if ( all ) { // all nodes of submesh elements - SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - return nodeIds.size(); - } - - return aSubMeshDS->NbNodes(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::long_array* SMESH_subMesh_i::GetElementsId() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetElementsId"); - SMESH::long_array_var aResult = new SMESH::long_array(); - - if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) - return aResult._retn(); - - ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; - TListOfSubMeshes smList; - if ( nbElems ) - smList.push_back( aSubMeshDS ); - - // volumes are bound to shell - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - nbElems += (*sm)->NbElements(); - } - - aResult->length( nbElems ); - if ( nbElems ) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( int i = 0; sm != smList.end(); sm++ ) - { - SMDS_ElemIteratorPtr anIt = (*sm)->GetElements(); - for ( int n = aSubMeshDS->NbElements(); i < n && anIt->more(); i++ ) - aResult[i] = anIt->next()->GetID(); - } - } - return aResult._retn(); -} - - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetElementsByType"); - SMESH::long_array_var aResult = new SMESH::long_array(); - - if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) - return aResult._retn(); - - ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - - // PAL5440, return all nodes belonging to elements of submesh - set nodeIds; - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; - - // volumes may be bound to shell instead of solid - TListOfSubMeshes smList; - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - { - if ( theElemType == SMESH::NODE ) - { - SMDS_ElemIteratorPtr eIt = (*sm)->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } - else - { - nbElems += (*sm)->NbElements(); - } - } - aSubMeshDS = 0; - } - else - { - if ( nbElems ) - smList.push_back( aSubMeshDS ); - } - - if ( theElemType == SMESH::NODE && aSubMeshDS ) - { - SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } - - if ( theElemType == SMESH::NODE ) - aResult->length( nodeIds.size() ); - else - aResult->length( nbElems ); - - int i = 0, n = aResult->length(); - - if ( theElemType == SMESH::NODE && !nodeIds.empty() ) { - set::iterator idIt = nodeIds.begin(); - for ( ; i < n && idIt != nodeIds.end() ; i++, idIt++ ) - aResult[i] = *idIt; - } - - if ( theElemType != SMESH::NODE ) { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( i = 0; sm != smList.end(); sm++ ) - { - aSubMeshDS = *sm; - SMDS_ElemIteratorPtr anIt = aSubMeshDS->GetElements(); - while ( i < n && anIt->more() ) { - const SMDS_MeshElement* anElem = anIt->next(); - if ( theElemType == SMESH::ALL || anElem->GetType() == (SMDSAbs_ElementType)theElemType ) - aResult[i++] = anElem->GetID(); - } - } - } - - aResult->length( i ); - - return aResult._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::long_array* SMESH_subMesh_i::GetNodesId() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetNodesId"); - SMESH::long_array_var aResult = GetElementsByType( SMESH::NODE ); - return aResult._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::SMESH_Mesh_ptr SMESH_subMesh_i::GetFather() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetFather"); - return _mesh_i->_this(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -CORBA::Long SMESH_subMesh_i::GetId() -{ - MESSAGE("SMESH_subMesh_i::GetId"); - return _localId; -} - -//======================================================================= -//function : GetSubShape -//purpose : -//======================================================================= - -GEOM::GEOM_Object_ptr SMESH_subMesh_i::GetSubShape() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - GEOM::GEOM_Object_var aShapeObj; - try { - if ( _mesh_i->_mapSubMesh.find( _localId ) != _mesh_i->_mapSubMesh.end()) { - TopoDS_Shape S = _mesh_i->_mapSubMesh[ _localId ]->GetSubShape(); - if ( !S.IsNull() ) - aShapeObj = _gen_i->ShapeToGeomObject( S ); - } - } - catch(SALOME_Exception & S_ex) { - THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); - } - return aShapeObj._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -SALOME_MED::FAMILY_ptr SMESH_subMesh_i::GetFamily() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - SALOME_MED::MESH_var MEDMesh = GetFather()->GetMEDMesh(); - - SALOME_MED::Family_array_var families = - MEDMesh->getFamilies(SALOME_MED::MED_NODE); - - for ( int i = 0; i < families->length(); i++ ) { - if ( families[i]->getIdentifier() == ( _localId ) ) - return families[i]; - } - - return SALOME_MED::FAMILY::_nil(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -SMESH::long_array* SMESH_subMesh_i::GetIDs() -{ - SMESH::long_array_var aResult = GetElementsId(); - return aResult._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -SMESH::ElementType SMESH_subMesh_i::GetElementType( const CORBA::Long id, const bool iselem ) - throw (SALOME::SALOME_Exception) -{ - return GetFather()->GetElementType( id, iselem ); -} diff --git a/src/SMESH_I/SMESH_subMesh_i.hxx b/src/SMESH_I/SMESH_subMesh_i.hxx deleted file mode 100644 index e8d84b37e..000000000 --- a/src/SMESH_I/SMESH_subMesh_i.hxx +++ /dev/null @@ -1,93 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : SMESH_subMesh_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_SUBMESH_I_HXX_ -#define _SMESH_SUBMESH_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) -#include CORBA_CLIENT_HEADER(GEOM_Gen) -#include CORBA_CLIENT_HEADER(MED) - -#include "SALOME_GenericObj_i.hh" - -class SMESH_Gen_i; -class SMESH_Mesh_i; - -class SMESH_subMesh_i: - public virtual POA_SMESH::SMESH_subMesh, - public virtual SALOME::GenericObj_i -{ -public: - SMESH_subMesh_i(); - SMESH_subMesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* gen_i, - SMESH_Mesh_i* mesh_i, - int localId ); - ~SMESH_subMesh_i(); - - CORBA::Long GetNumberOfElements() - throw (SALOME::SALOME_Exception); - - CORBA::Long GetNumberOfNodes( CORBA::Boolean all ) - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetElementsId() - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception); - - SMESH::ElementType GetElementType( const CORBA::Long id, const bool iselem ) - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetNodesId() - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Mesh_ptr GetFather() - throw (SALOME::SALOME_Exception); - - GEOM::GEOM_Object_ptr GetSubShape() - throw (SALOME::SALOME_Exception); - - CORBA::Long GetId(); - - SALOME_MED::FAMILY_ptr GetFamily() - throw (SALOME::SALOME_Exception); - - virtual SMESH::long_array* GetIDs(); - - SMESH_Mesh_i* _mesh_i; //NRI - -protected: - SMESH_Gen_i* _gen_i; - int _localId; -}; - -#endif diff --git a/src/SMESH_I/smeshpy.py b/src/SMESH_I/smeshpy.py deleted file mode 100644 index 9fb4709e7..000000000 --- a/src/SMESH_I/smeshpy.py +++ /dev/null @@ -1,96 +0,0 @@ -# SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -# -# 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 : smeshpy.py -# Module : SMESH - -import salome -import SMESH - -from SALOME_utilities import * - -#============================================================================= - -class smeshpy: - _geom = None - _smesh = None - _studyId = None - - #-------------------------------------------------------------------------- - - def __init__(self): - try: - self._geom = salome.lcc.FindOrLoadComponent("FactoryServer","GEOM") - self._smesh = salome.lcc.FindOrLoadComponent("FactoryServer","SMESH") - except: - MESSAGE( "exception in smeshpy:__init__" ) - self._study = salome.myStudy - self._smesh.SetCurrentStudy(self._study) - - #-------------------------------------------------------------------------- - - def CreateMesh(self, shapeId): - try: - shape = salome.IDToObject(shapeId) - aMesh = self._smesh.CreateMesh(shape) - return aMesh - except: - MESSAGE( "exception in smeshpy:Init" ) - return None - - #-------------------------------------------------------------------------- - - def CreateHypothesis(self, name, libname): - try: - hyp = self._smesh.CreateHypothesis(name, libname) - return hyp - except: - MESSAGE( "exception in smeshpy:CreateHypothesis" ) - return None - - #-------------------------------------------------------------------------- - - def Compute(self, mesh, shapeId): - try: - shape = salome.IDToObject(shapeId) - ret=self._smesh.Compute(mesh, shape) - return ret - except: - MESSAGE( "exception in smeshpy:Compute" ) - return 0 - -#============================================================================= -## #-------------------------------------------------------------------------- - -##def SmeshInit(shapeId): -## import salome -## import SMESH -## geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -## smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -## shape = salome.IDToObject(shapeId) -## studyId = salome.myStudyId -## MESSAGE( str(studyId) ) -## aMesh = smesh.Init(geom, studyId, shape) -## return aMesh - -## #-------------------------------------------------------------------------- diff --git a/src/SMESH_SWIG/Makefile.in b/src/SMESH_SWIG/Makefile.in deleted file mode 100644 index df7e19a17..000000000 --- a/src/SMESH_SWIG/Makefile.in +++ /dev/null @@ -1,120 +0,0 @@ -# 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 : Nicolas REJNERI, Paul RASCLE -# Module : SMESH -# $Header$ - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl - - -@COMMENCE@ - -# Libraries targets - -LIB = libSMESH_Swigcmodule.la -LIB_SRC = - -SWIG_DEF = libSMESH_Swig.i -EXPORT_PYSCRIPTS = libSMESH_Swig.py \ - smesh.py \ - batchmode_smesh.py \ - batchmode_mefisto.py \ - ex00_all.py \ - ex01_cube2build.py \ - ex02_cube2primitive.py \ - ex03_cube2partition.py \ - ex04_cube5tetraHexa.py \ - ex05_hole1build.py \ - ex06_hole1boolean.py \ - ex07_hole1partition.py \ - ex08_hole2build.py \ - ex09_grid4build.py \ - ex10_grid4geometry.py \ - ex11_grid3partition.py \ - ex12_grid17partition.py \ - ex13_hole1partial.py \ - ex14_cyl1holed.py \ - ex15_cyl2geometry.py \ - ex16_cyl2complementary.py \ - ex17_dome1.py \ - ex18_dome2.py \ - ex19_sphereINcube.py \ - SMESH_test.py\ - SMESH_test0.py\ - SMESH_test1.py \ - SMESH_test2.py \ - SMESH_test3.py \ - SMESH_test4.py \ - SMESH_test5.py \ - SMESH_mechanic.py \ - SMESH_mechanic_tetra.py \ - SMESH_mechanic_editor.py \ - SMESH_fixation.py \ - SMESH_fixation_hexa.py \ - SMESH_fixation_tetra.py \ - SMESH_box_tetra.py \ - SMESH_box2_tetra.py \ - SMESH_box3_tetra.py \ - SMESH_flight_skin.py \ - SMESH_Partition1_tetra.py\ - SMESH_controls.py \ - SMESH_freebord.py \ - SMESH_blocks.py \ - SMESH_BelongToGeom.py \ - SMESH_GroupFromGeom2.py \ - SMESH_box.py \ - SMESH_demo_hexa2_upd.py \ - SMESH_hexaedre.py \ - SMESH_Sphere.py \ - SMESH_GroupFromGeom.py \ - SMESH_Nut.py \ - SMESH_GroupLyingOnGeom.py \ - PAL_MESH_041_mesh.py \ - PAL_MESH_043_2D.py \ - PAL_MESH_043_3D.py \ - SMESH_reg.py - -LIB_CLIENT_IDL = SALOMEDS.idl \ - SALOME_Exception.idl \ - GEOM_Gen.idl \ - SMESH_Gen.idl \ - SMESH_Mesh.idl \ - SMESH_Hypothesis.idl \ - SMESH_BasicHypothesis.idl \ - SMESH_Group.idl \ - SALOME_ModuleCatalog.idl \ - SALOME_Component.idl \ - SALOME_GenericObj.idl \ - MED.idl \ - SALOME_Comm.idl - -EXPORT_SHAREDPYSCRIPTS=SMESH_shared_modules.py - -CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -DHAVE_CONFIG_H -LIBS+= $(PYTHON_LIBS) -LDFLAGS+= -lSMESH -L${KERNEL_ROOT_DIR}/lib/salome -lSalomeGenericObj - -@CONCLUDE@ diff --git a/src/SMESH_SWIG/PAL_MESH_041_mesh.py b/src/SMESH_SWIG/PAL_MESH_041_mesh.py deleted file mode 100755 index 8585c9f6f..000000000 --- a/src/SMESH_SWIG/PAL_MESH_041_mesh.py +++ /dev/null @@ -1,103 +0,0 @@ -import geompy -import salome - -import StdMeshers - -#-----------------------------GEOM---------------------------------------- - -#----------Vertexes------------ -p1 = geompy.MakeVertex(20.0,30.0,40.0) -p2 = geompy.MakeVertex(90.0,80.0,0.0) -p3 = geompy.MakeVertex(30.0,80.0,200.0) - -#----------Edges--------------- -e1 = geompy.MakeEdge(p1,p2) -e2 = geompy.MakeEdge(p2,p3) -e3 = geompy.MakeEdge(p3,p1) - -#----------Wire---------------- -ListOfEdges = [] -ListOfEdges.append(e3) -ListOfEdges.append(e2) -ListOfEdges.append(e1) -wire1 = geompy.MakeWire(ListOfEdges) - - -#----------Face---------------- -WantPlanarFace = 1 -face1 = geompy.MakeFace(wire1,WantPlanarFace) - -Id_face1 = geompy.addToStudy(face1,"Face1") - - - -#-----------------------------SMESH------------------------------------------- -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -# -- Init -- -plane_mesh = salome.IDToObject( Id_face1) -smesh.SetCurrentStudy(salome.myStudy) - -mesh = smesh.CreateMesh(plane_mesh) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -id_mesh = salome.ObjectToID(mesh) -smeshgui.SetName( id_mesh, "Mesh_1") - - -print"---------------------Hypothesis" - - -#---------------- NumberOfSegments -numberOfSegment = 9 - -hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) -hypNbSeg.SetNumberOfSegments( numberOfSegment ) - -print hypNbSeg.GetName() -print hypNbSeg.GetNumberOfSegments() -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "Nb. Segments") - - -#--------------------------Max. Element Area -maxElementArea = 200 - -hypArea200 = smesh.CreateHypothesis("MaxElementArea","libStdMeshersEngine.so") -hypArea200.SetMaxElementArea( maxElementArea ) -print hypArea200.GetName() -print hypArea200.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea200), "Max. Element Area") - -print"---------------------Algorithms" - -#----------------------------Wire discretisation -algoWireDes = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) -listHyp = algoWireDes.GetCompatibleHypothesis() - -print algoWireDes.GetName() -smeshgui.SetName(salome.ObjectToID(algoWireDes), "Ware descritisation") - -#----------------------------Triangle (Mefisto) -algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" ) -listHyp = algoMef.GetCompatibleHypothesis() - -print algoMef.GetName() - -#----------------------------Add hipothesis to the plane -mesh.AddHypothesis( plane_mesh, hypNbSeg ) # nb segments -mesh.AddHypothesis( plane_mesh, hypArea200 ) # max area - -mesh.AddHypothesis( plane_mesh, algoWireDes ) # Regular 1D/wire discretisation -mesh.AddHypothesis( plane_mesh, algoMef ) # MEFISTO 2D - -smeshgui.SetName(salome.ObjectToID(algoMef), "Triangle (Mefisto)") - -print "---------------------Compute the mesh" - -smesh.Compute(mesh, plane_mesh) - -salome.sg.updateObjBrowser(1) - diff --git a/src/SMESH_SWIG/PAL_MESH_043_2D.py b/src/SMESH_SWIG/PAL_MESH_043_2D.py deleted file mode 100755 index 76ab25924..000000000 --- a/src/SMESH_SWIG/PAL_MESH_043_2D.py +++ /dev/null @@ -1,102 +0,0 @@ -# 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 : SMESH_testExtrusion2D.py -# Module : SMESH -# Description : Create meshes to test extrusion of mesh elements along path - -import salome -import geompy -import SMESH -import StdMeshers - -#----------------------------------GEOM - -# create points -p1 = geompy.MakeVertex(100, 0, 0) -p2 = geompy.MakeVertex(100, 0, 100) -p3 = geompy.MakeVertex(0, 0, 0) -p4 = geompy.MakeVertex(0, 100, 0) - - -# create two vectors -vector1 = geompy.MakeVector(p1,p2) -vector2 = geompy.MakeVector(p3,p4) - -# make two ellipses -ellipse1 = geompy.MakeEllipse(p1,vector1,50,25) -ellipse2 = geompy.MakeEllipse(p3,vector2,300,50) - -# publish circular face and second circle -id_ellipse1 = geompy.addToStudy(ellipse1, "Ellips 1") -id_ellipse2 = geompy.addToStudy(ellipse2, "Ellips 2") - - -#---------------------------------SMESH -# get smesh engine -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# get SMESH GUI -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -# create hypoteses -hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg1.SetNumberOfSegments(18) -id_hypNbSeg1 = salome.ObjectToID(hypNbSeg1) -smeshgui.SetName(id_hypNbSeg1, "NumberOfSegments 1"); - -hypNbSeg2 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg2.SetNumberOfSegments(34) -id_hypNbSeg2 = salome.ObjectToID(hypNbSeg2) -smeshgui.SetName(id_hypNbSeg2, "NumberOfSegments 2"); - -# create algorithmes -algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -id_algoReg = salome.ObjectToID(algoReg) -smeshgui.SetName(id_algoReg, "Regular_1D"); - -# create the path mesh -mesh1 = smesh.CreateMesh(ellipse1) -id_mesh1 = salome.ObjectToID(mesh1) -smeshgui.SetName(id_mesh1, "Path Mesh"); - -# set hypotheses and algos -mesh1.AddHypothesis(ellipse1,algoReg) -mesh1.AddHypothesis(ellipse1,hypNbSeg1) - -# create the tool mesh -mesh2 = smesh.CreateMesh(ellipse2) -id_mesh2 = salome.ObjectToID(mesh2) -smeshgui.SetName(id_mesh2, "Tool Mesh"); - -# set hypotheses and algos -mesh2.AddHypothesis(ellipse2,algoReg) -mesh2.AddHypothesis(ellipse2,hypNbSeg2) - -# compute meshes -smesh.Compute(mesh1,ellipse1) -smesh.Compute(mesh2,ellipse2) - - -# ---- udate object browser -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/PAL_MESH_043_3D.py b/src/SMESH_SWIG/PAL_MESH_043_3D.py deleted file mode 100755 index cfd0f45c4..000000000 --- a/src/SMESH_SWIG/PAL_MESH_043_3D.py +++ /dev/null @@ -1,104 +0,0 @@ -# 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 : SMESH_testExtrusion3D.py -# Module : SMESH -# Description : Create meshes to test extrusion of mesh elements along path - -import salome -import geompy -import SMESH -import StdMeshers - -# get smesh engine -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# create points to build two circles -p1 = geompy.MakeVertex(0, 100, 0) -p2 = geompy.MakeVertex(100, 0, 0) -p3 = geompy.MakeVertex(0, -100, 0) -p4 = geompy.MakeVertex(0, 70, 0) -p5 = geompy.MakeVertex(0, 100, 30) -p6 = geompy.MakeVertex(0, 130, 0) - -# create two circles -circle = geompy.MakeCircleThreePnt(p1, p2, p3) -cf = geompy.MakeCircleThreePnt(p4, p5, p6) - -# make circular face -wire = geompy.MakeWire([cf]) -face = geompy.MakeFace(wire, 1) - -# publish circular face and second circle -idcircle = geompy.addToStudy(circle, "Circle") -idface = geompy.addToStudy(face, "Circular face") - -# get SMESH GUI -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -# create hypoteses -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(12) -idseg = salome.ObjectToID(hypNbSeg) -smeshgui.SetName(idseg, "NumberOfSegments_10"); - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(30) -idarea = salome.ObjectToID(hypArea) -smeshgui.SetName(idarea, "MaxElementArea_20"); - -# create algorithmes -algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -idreg = salome.ObjectToID(algoReg) -smeshgui.SetName(idreg, "Regular_1D"); - -algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -idmef = salome.ObjectToID(algoMef) -smeshgui.SetName(idmef, "MEFISTO_2D"); - -# init a Mesh with the circular face -mesh1 = smesh.CreateMesh(face) -idmesh1 = salome.ObjectToID(mesh1) -smeshgui.SetName(idmesh1, "Mesh on circular face"); - -# set hypotheses and algos -mesh1.AddHypothesis(face,algoReg) -mesh1.AddHypothesis(face,hypNbSeg) -mesh1.AddHypothesis(face,algoMef) -mesh1.AddHypothesis(face,hypArea) - -# init a Mesh with the second circle -mesh2 = smesh.CreateMesh(circle) -idmesh2 = salome.ObjectToID(mesh2) -smeshgui.SetName(idmesh2, "Mesh on circular edge"); - -# set hypotheses and algos -mesh2.AddHypothesis(circle,algoReg) -mesh2.AddHypothesis(circle,hypNbSeg) - -# compute meshes -smesh.Compute(mesh1,face) -smesh.Compute(mesh2,circle) - -# ---- udate object browser -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_BelongToGeom.py b/src/SMESH_SWIG/SMESH_BelongToGeom.py deleted file mode 100644 index c4ee39dcd..000000000 --- a/src/SMESH_SWIG/SMESH_BelongToGeom.py +++ /dev/null @@ -1,28 +0,0 @@ -import SMESH -from SMESH_test1 import * - -def CheckBelongToGeomFilter(theMeshGen, theMesh, theShape, theSubShape, theElemType): - import geompy - if theShape != theSubShape: - aName = str(theSubShape) - geompy.addToStudyInFather(theShape,theSubShape,aName) - - theMeshGen.Compute(theMesh,theShape) - - aFilterMgr = theMeshGen.CreateFilterManager() - aFilter = aFilterMgr.CreateFilter() - - aBelongToGeom = aFilterMgr.CreateBelongToGeom() - aBelongToGeom.SetGeom(theSubShape) - aBelongToGeom.SetElementType(theElemType) - - aFilter.SetPredicate(aBelongToGeom) - return aFilter.GetElementsId(theMesh) - -anElemType = SMESH.ALL; -print "anElemType =", anElemType -#anIds = CheckBelongToGeomFilter(smesh,mesh,box,subShapeList[1],SMESH.FACE) -anIds = CheckBelongToGeomFilter(smesh,mesh,box,box,SMESH.FACE) -print "anIds = ", anIds - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_GroupFromGeom.py b/src/SMESH_SWIG/SMESH_GroupFromGeom.py deleted file mode 100644 index 3647c77d2..000000000 --- a/src/SMESH_SWIG/SMESH_GroupFromGeom.py +++ /dev/null @@ -1,49 +0,0 @@ -# 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 : SMESH_GroupFromGeom.py -# Module : SMESH - -from SMESH_test1 import * -import SMESH - -# Compute the mesh created in SMESH_test1 - -smesh.Compute(mesh, box) - -# Create geometry groups on plane: -aGeomGroup1 = geompy.CreateGroup(face , geompy.ShapeType["FACE"]) -geompy.AddObject(aGeomGroup1, 1) - -aGeomGroup2 = geompy.CreateGroup(face , geompy.ShapeType["EDGE"]) - -geompy.AddObject(aGeomGroup2, 3) -geompy.AddObject(aGeomGroup2, 6) -geompy.AddObject(aGeomGroup2, 8) -geompy.AddObject(aGeomGroup2, 10) - -geompy.addToStudy(aGeomGroup1, "Group on Faces") -geompy.addToStudy(aGeomGroup2, "Group on Edges") - -aSmeshGroup1 = mesh.CreateGroupFromGEOM(SMESH.FACE, "SMESHGroup1", aGeomGroup1) -aSmeshGroup2 = mesh.CreateGroupFromGEOM(SMESH.EDGE, "SMESHGroup2", aGeomGroup2) - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_GroupFromGeom2.py b/src/SMESH_SWIG/SMESH_GroupFromGeom2.py deleted file mode 100755 index 37f333d88..000000000 --- a/src/SMESH_SWIG/SMESH_GroupFromGeom2.py +++ /dev/null @@ -1,53 +0,0 @@ -#============================================================================== -# Info. -# Bug (from script, bug) : SMESH_GroupFromGeom.py, PAL6945 -# Modified : 25/11/2004 -# Author : Kovaltchuk Alexey -# Project : PAL/SALOME -#============================================================================== -from SMESH_test1 import * -import SMESH - -# Compute the mesh created in SMESH_test1 - -smesh.Compute(mesh, box) - -# Create geometry groups on plane: -aGeomGroup1 = geompy.CreateGroup(face , geompy.ShapeType["FACE"]) -geompy.AddObject(aGeomGroup1, 1) - -aGeomGroup2 = geompy.CreateGroup(face , geompy.ShapeType["EDGE"]) - -geompy.AddObject(aGeomGroup2, 3) -geompy.AddObject(aGeomGroup2, 6) -geompy.AddObject(aGeomGroup2, 8) -geompy.AddObject(aGeomGroup2, 10) - -geompy.addToStudy(aGeomGroup1, "Group on Faces") -geompy.addToStudy(aGeomGroup2, "Group on Edges") - -aSmeshGroup1 = mesh.CreateGroupFromGEOM(SMESH.FACE, "SMESHGroup1", aGeomGroup1) -aSmeshGroup2 = mesh.CreateGroupFromGEOM(SMESH.EDGE, "SMESHGroup2", aGeomGroup2) - -print "Create aGroupOnShell - a group linked to a shell" -aGroupOnShell = mesh.CreateGroupFromGEOM(SMESH.EDGE, "GroupOnShell", shell) -print "aGroupOnShell type =", aGroupOnShell.GetType() -print "aGroupOnShell size =", aGroupOnShell.Size() -print "aGroupOnShell ids :", aGroupOnShell.GetListOfID() - -print " " - -print "Modify hypothesis: 100 -> 50" -hypLen1.SetLength(50) -print "Contents of aGroupOnShell changes:" -print "aGroupOnShell size =", aGroupOnShell.Size() -print "aGroupOnShell ids :", aGroupOnShell.GetListOfID() - -print " " - -print "Re-compute mesh, contents of aGroupOnShell changes again:" -smesh.Compute(mesh, box) -print "aGroupOnShell size =", aGroupOnShell.Size() -print "aGroupOnShell ids :", aGroupOnShell.GetListOfID() - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py b/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py deleted file mode 100644 index 6a4533ea7..000000000 --- a/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py +++ /dev/null @@ -1,23 +0,0 @@ -from smesh import * - -def BuildGroupLyingOn(theMesh, theElemType, theName, theShape): - aFilterMgr = smesh.CreateFilterManager() - aFilter = aFilterMgr.CreateFilter() - - aLyingOnGeom = aFilterMgr.CreateLyingOnGeom() - aLyingOnGeom.SetGeom(theShape) - aLyingOnGeom.SetElementType(theElemType) - - aFilter.SetPredicate(aLyingOnGeom) - anIds = aFilter.GetElementsId(theMesh) - - aGroup = theMesh.CreateGroup(theElemType, theName) - aGroup.Add(anIds) - -#Example -## from SMESH_test1 import * - -## smesh.Compute(mesh, box) -## BuildGroupLyingOn(mesh, SMESH.FACE, "Group of faces lying on edge", edge ) - -## salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_Partition1_tetra.py b/src/SMESH_SWIG/SMESH_Partition1_tetra.py deleted file mode 100644 index e9bb55fa7..000000000 --- a/src/SMESH_SWIG/SMESH_Partition1_tetra.py +++ /dev/null @@ -1,200 +0,0 @@ -# -# Tetrahedrization of the geometry generated by the Python script GEOM_Partition1.py -# Hypothesis and algorithms for the mesh generation are global -# -#%Make geometry (like CEA script (A1)) using Partition algorithm% from OCC -# -- Rayon de la bariere - -import salome -import geompy -from math import sqrt - -import StdMeshers -import NETGENPlugin - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -#--------------------------------------------------------------- - -barier_height = 7.0 -barier_radius = 5.6 / 2 # Rayon de la bariere -colis_radius = 1.0 / 2 # Rayon du colis -colis_step = 2.0 # Distance s‰parant deux colis -cc_width = 0.11 # Epaisseur du complement de colisage - -# -- - -cc_radius = colis_radius + cc_width -colis_center = sqrt(2.0)*colis_step/2 - -# -- - -boolean_common = 1 -boolean_cut = 2 -boolean_fuse = 3 -boolean_section = 4 - -# -- - -p0 = geompy.MakeVertex(0.,0.,0.) -vz = geompy.MakeVectorDXDYDZ(0.,0.,1.) - -# -- - -barier = geompy.MakeCylinder(p0, vz, barier_radius, barier_height) - -# -- - -colis = geompy.MakeCylinder(p0, vz, colis_radius, barier_height) -cc = geompy.MakeCylinder(p0, vz, cc_radius, barier_height) - -colis_cc = geompy.MakeCompound([colis, cc]) -colis_cc = geompy.MakeTranslation(colis_cc, colis_center, 0.0, 0.0) - -colis_cc_multi = geompy.MultiRotate1D(colis_cc, vz, 4) - -# -- - -alveole = geompy.MakePartition([colis_cc_multi, barier]) - -print "Analysis of the geometry to mesh (right after the Partition) :" - -subShellList = geompy.SubShapeAll(alveole, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(alveole, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(alveole, geompy.ShapeType["EDGE"]) - -print "number of Shells in alveole : ", len(subShellList) -print "number of Faces in alveole : ", len(subFaceList) -print "number of Edges in alveole : ", len(subEdgeList) - -subshapes = geompy.SubShapeAll(alveole, geompy.ShapeType["SHAPE"]) - -## there are 9 subshapes - -comp1 = geompy.MakeCompound( [ subshapes[0], subshapes[1] ] ) -comp2 = geompy.MakeCompound( [ subshapes[2], subshapes[3] ] ) -comp3 = geompy.MakeCompound( [ subshapes[4], subshapes[5] ] ) -comp4 = geompy.MakeCompound( [ subshapes[6], subshapes[7] ] ) - -compGOs = [] -compGOs.append( comp1 ) -compGOs.append( comp2 ) -compGOs.append( comp3 ) -compGOs.append( comp4 ) -comp = geompy.MakeCompound( compGOs ) - -alveole = geompy.MakeCompound( [ comp, subshapes[8] ]) - -idalveole = geompy.addToStudy(alveole, "alveole") - -print "Analysis of the geometry to mesh (right after the MakeCompound) :" - -subShellList = geompy.SubShapeAll(alveole, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(alveole, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(alveole, geompy.ShapeType["EDGE"]) - -print "number of Shells in alveole : ", len(subShellList) -print "number of Faces in alveole : ", len(subFaceList) -print "number of Edges in alveole : ", len(subEdgeList) - -status = geompy.CheckShape(alveole) -print " check status ", status - -# ---- launch SMESH - -print "-------------------------- create Hypothesis (In this case global hypothesis are used)" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 0.1 - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(maxElementArea) -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_0.1") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 0.5 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_0.5") - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the alveole -shape_mesh = salome.IDToObject( idalveole ) - -mesh = smesh.CreateMesh(shape_mesh) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshAlveole") - -# ---- add hypothesis to alveole - -print "-------------------------- add hypothesis to alveole" - -mesh.AddHypothesis(shape_mesh,regular1D) -mesh.AddHypothesis(shape_mesh,hypNbSeg) - -mesh.AddHypothesis(shape_mesh,mefisto2D) -mesh.AddHypothesis(shape_mesh,hypArea) - -mesh.AddHypothesis(shape_mesh,netgen3D) -mesh.AddHypothesis(shape_mesh,hypVolume) - -print "-------------------------- compute the mesh of alveole " -ret = smesh.Compute(mesh,shape_mesh) - -if ret != 0: - log=mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the Mesh_mechanic:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "problem when computing the mesh" - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_Sphere.py b/src/SMESH_SWIG/SMESH_Sphere.py deleted file mode 100644 index 893e5441f..000000000 --- a/src/SMESH_SWIG/SMESH_Sphere.py +++ /dev/null @@ -1,111 +0,0 @@ -# GEOM GEOM_SWIG : binding of C++ omplementaion with Python -# -# 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 : GEOM_Sphere.py -# Author : Damien COQUERET, Open CASCADE -# Module : GEOM -# $Header: - -from geompy import * -from math import * - -import smesh - -# It is an example of creating a hexahedrical mesh on a sphere. -# -# Used approach allows to avoid problems with degenerated and -# seam edges without special processing of geometrical shapes - -#----------------------------------------------------------------------- -#Variables -Radius = 100. -Dist = Radius / 2. -Factor = 2.5 -Angle90 = pi / 2. -NbSeg = 10 - -PointsList = [] -ShapesList = [] - -#Basic Elements -P0 = MakeVertex(0., 0., 0.) -P1 = MakeVertex(-Dist, -Dist, -Dist) -P2 = MakeVertex(-Dist, -Dist, Dist) -P3 = MakeVertex(-Dist, Dist, Dist) -P4 = MakeVertex(-Dist, Dist, -Dist) - -VZ = MakeVectorDXDYDZ(0., 0., 1.) - -#Construction Elements -PointsList.append(P1) -PointsList.append(P2) -PointsList.append(P3) -PointsList.append(P4) -PointsList.append(P1) - -PolyLine = MakePolyline(PointsList) - -Face1 = MakeFace(PolyLine, 1) -Face2 = MakeScaleTransform(Face1, P0, Factor) -Face3 = MakeScaleTransform(Face1, P0, -1.) - -#Models -Sphere = MakeSphereR(Radius) - -Block = MakeHexa2Faces(Face1, Face2) -Cube = MakeHexa2Faces(Face1, Face3) - -Common1 = MakeBoolean(Sphere, Block, 1) -Common2 = MakeRotation(Common1, VZ, Angle90) - -MultiBlock1 = MakeMultiTransformation1D(Common1, 21, -1, 3) -MultiBlock2 = MakeMultiTransformation1D(Common2, 31, -1, 3) - -#Reconstruct sphere from several blocks -ShapesList.append(Cube) -ShapesList.append(MultiBlock1) -ShapesList.append(MultiBlock2) -Compound = MakeCompound(ShapesList) - -Result = MakeGlueFaces(Compound, 0.1) - -#addToStudy -Id_Sphere = addToStudy(Sphere, "Sphere") -Id_Cube = addToStudy(Cube, "Cube") - -Id_Common1 = addToStudy(Common1, "Common1") -Id_Common2 = addToStudy(Common2, "Common2") - -Id_MultiBlock1 = addToStudy(MultiBlock1, "MultiBlock1") -Id_MultiBlock2 = addToStudy(MultiBlock2, "MultiBlock2") - -Id_Result = addToStudy(Result, "Result") - -#----------------------------------------------------------------------- -#Meshing -my_hexa = smesh.Mesh(Result, "Sphere_Mesh") -algo = my_hexa.Segment() -algo.NumberOfSegments(NbSeg) -my_hexa.Quadrangle() -my_hexa.Hexahedron() -my_hexa.Compute() diff --git a/src/SMESH_SWIG/SMESH_blocks.py b/src/SMESH_SWIG/SMESH_blocks.py deleted file mode 100644 index 0430867fb..000000000 --- a/src/SMESH_SWIG/SMESH_blocks.py +++ /dev/null @@ -1,43 +0,0 @@ -# SMESH SMESH_SWIG : binding of C++ implementaion with Python -# -# Copyright (C) 2003 CEA -# -# 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.salome-platform.org or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_blocks.py -# Author : Julia DOROVSKIKH -# Module : SMESH -# $Header$ - -import salome -import geompy -import math - -import GEOM_Spanner - -isBlocksTest = 0 # False -isMeshTest = 1 # True -hasGUI = 1 # True - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -GEOM_Spanner.MakeSpanner(salome, geompy, math, isBlocksTest, isMeshTest, smesh, hasGUI) - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_box.py b/src/SMESH_SWIG/SMESH_box.py deleted file mode 100755 index 2902c739b..000000000 --- a/src/SMESH_SWIG/SMESH_box.py +++ /dev/null @@ -1,73 +0,0 @@ -#============================================================================== -# Info. -# Bug (from script, bug) : box.py, PAL5223 -# Modified : 25/11/2004 -# Author : Kovaltchuk Alexey -# Project : PAL/SALOME -#============================================================================== -# -# Salome geometry and meshing for a box -# -import salome -from salome import sg -import geompy - -import StdMeshers - -# ---- launch GEOM - -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -meshgenerator = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -###geom.GetCurrentStudy(salome.myStudy._get_StudyId()) -meshgenerator.SetCurrentStudy(salome.myStudy) - -# Plate - -box = geompy.MakeBox(0.,0.,0.,1.,1.,1.) -boxId = geompy.addToStudy(box,"box") - -# ---- launch SMESH - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) -# meshgenerator=smeshpy.smeshpy() - - -# Hypothesis - -hypL1=meshgenerator.CreateHypothesis("LocalLength","libStdMeshersEngine.so") -hypL1.SetLength(0.25) -hypL1Id = salome.ObjectToID(hypL1) -smeshgui.SetName(hypL1Id, "LocalLength") - -# Algorithm - -alg1D=meshgenerator.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -alg1DId = salome.ObjectToID(alg1D) -smeshgui.SetName(alg1DId, "algo1D") - -alg2D=meshgenerator.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") -alg2DId = salome.ObjectToID(alg2D) -smeshgui.SetName(alg2DId, "algo2D") - -alg3D=meshgenerator.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") -alg3DId = salome.ObjectToID(alg3D) -smeshgui.SetName(alg3DId, "algo3D") - -# ---- init a Mesh - -box_mesh=meshgenerator.CreateMesh(box) -box_meshId = salome.ObjectToID(box_mesh) -smeshgui.SetName(box_meshId, "box_mesh") - -# ---- set Hypothesis & Algorithm - -box_mesh.AddHypothesis(box,alg1D) -box_mesh.AddHypothesis(box,alg2D) -box_mesh.AddHypothesis(box,alg3D) -box_mesh.AddHypothesis(box,hypL1) - -meshgenerator.Compute(box_mesh,box) - -sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_box2_tetra.py b/src/SMESH_SWIG/SMESH_box2_tetra.py deleted file mode 100644 index e8a4afd9f..000000000 --- a/src/SMESH_SWIG/SMESH_box2_tetra.py +++ /dev/null @@ -1,160 +0,0 @@ -# -# Tetrahedrization of the geometry union of 2 boxes having a face in common -# Hypothesis and algorithms for the mesh generation are global -# - -import salome -import geompy - -import StdMeshers -import NETGENPlugin - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - -# ---- define 2 boxes box1 and box2 - -box1 = geompy.MakeBox(0., 0., 0., 100., 200., 300.) - -idbox1 = geompy.addToStudy(box1, "box1") - -print "Analysis of the geometry box1 :" -subShellList = geompy.SubShapeAll(box1, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box1, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box1, geompy.ShapeType["EDGE"]) - -print "number of Shells in box1 : ", len(subShellList) -print "number of Faces in box1 : ", len(subFaceList) -print "number of Edges in box1 : ", len(subEdgeList) - -box2 = geompy.MakeBox(100., 0., 0., 200., 200., 300.) - -idbox2 = geompy.addToStudy(box2, "box2") - -print "Analysis of the geometry box2 :" -subShellList = geompy.SubShapeAll(box2, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box2, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box2, geompy.ShapeType["EDGE"]) - -print "number of Shells in box2 : ", len(subShellList) -print "number of Faces in box2 : ", len(subFaceList) -print "number of Edges in box2 : ", len(subEdgeList) - -# append the tow boxes to make ine shel, referrencing only once -# the internal interface - -shell = geompy.MakePartition([box1, box2]) -idshell = geompy.addToStudy(shell, "shell") - -print "Analysis of the geometry shell (union of box1 and box2) :" -subShellList = geompy.SubShapeAll(shell, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(shell, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(shell, geompy.ShapeType["EDGE"]) - -print "number of Shells in shell : ", len(subShellList) -print "number of Faces in shell : ", len(subFaceList) -print "number of Edges in shell : ", len(subEdgeList) - - -### ---------------------------- SMESH -------------------------------------- - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 500 - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(maxElementArea) - -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 500 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) - -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the shell - -mesh = smesh.CreateMesh(shell) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox2") - -# ---- add hypothesis to shell - -print "-------------------------- add hypothesis to shell" - -mesh.AddHypothesis(shell,regular1D) -mesh.AddHypothesis(shell,hypNbSeg) - -mesh.AddHypothesis(shell,mefisto2D) -mesh.AddHypothesis(shell,hypArea) - -mesh.AddHypothesis(shell,netgen3D) -mesh.AddHypothesis(shell,hypVolume) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute shell" -ret = smesh.Compute(mesh,shell) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshBox2:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_box3_tetra.py b/src/SMESH_SWIG/SMESH_box3_tetra.py deleted file mode 100644 index af4082774..000000000 --- a/src/SMESH_SWIG/SMESH_box3_tetra.py +++ /dev/null @@ -1,171 +0,0 @@ -# -# Tetrahedrization of the geometry union of 3 boxes aligned where the middle -# one has a race in common with the two others. -# Hypothesis and algorithms for the mesh generation are global -# - -import salome -import geompy - -import StdMeshers -import NETGENPlugin - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - -# ---- define 3 boxes box1, box2 and box3 - -box1 = geompy.MakeBox(0., 0., 0., 100., 200., 300.) - -idbox1 = geompy.addToStudy(box1, "box1") - -print "Analysis of the geometry box1 :" -subShellList = geompy.SubShapeAll(box1, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box1, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box1, geompy.ShapeType["EDGE"]) - -print "number of Shells in box1 : ", len(subShellList) -print "number of Faces in box1 : ", len(subFaceList) -print "number of Edges in box1 : ", len(subEdgeList) - -box2 = geompy.MakeBox(100., 0., 0., 200., 200., 300.) - -idbox2 = geompy.addToStudy(box2, "box2") - -print "Analysis of the geometry box2 :" -subShellList = geompy.SubShapeAll(box2, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box2, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box2, geompy.ShapeType["EDGE"]) - -print "number of Shells in box2 : ", len(subShellList) -print "number of Faces in box2 : ", len(subFaceList) -print "number of Edges in box2 : ", len(subEdgeList) - -box3 = geompy.MakeBox(0., 0., 300., 200., 200., 500.) - -idbox3 = geompy.addToStudy(box3, "box3") - -print "Analysis of the geometry box3 :" -subShellList = geompy.SubShapeAll(box3, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box3, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box3, geompy.ShapeType["EDGE"]) - -print "number of Shells in box3 : ", len(subShellList) -print "number of Faces in box3 : ", len(subFaceList) -print "number of Edges in box3 : ", len(subEdgeList) - -shell = geompy.MakePartition([box1, box2, box3]) -idshell = geompy.addToStudy(shell,"shell") - -print "Analysis of the geometry shell (union of box1, box2 and box3) :" -subShellList = geompy.SubShapeAll(shell, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(shell, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(shell, geompy.ShapeType["EDGE"]) - -print "number of Shells in shell : ", len(subShellList) -print "number of Faces in shell : ", len(subFaceList) -print "number of Edges in shell : ", len(subEdgeList) - - -### ---------------------------- SMESH -------------------------------------- - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 500 - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(maxElementArea) - -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 500 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) - -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the shell - -mesh = smesh.CreateMesh(shell) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox3") - -# ---- add hypothesis to shell - -print "-------------------------- add hypothesis to shell" - -mesh.AddHypothesis(shell,regular1D) -mesh.AddHypothesis(shell,hypNbSeg) - -mesh.AddHypothesis(shell,mefisto2D) -mesh.AddHypothesis(shell,hypArea) - -mesh.AddHypothesis(shell,netgen3D) -mesh.AddHypothesis(shell,hypVolume) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute shell" -ret = smesh.Compute(mesh,shell) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshBox3:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_box_tetra.py b/src/SMESH_SWIG/SMESH_box_tetra.py deleted file mode 100644 index 72b45e12b..000000000 --- a/src/SMESH_SWIG/SMESH_box_tetra.py +++ /dev/null @@ -1,132 +0,0 @@ -# -# Tetrahedrization of a simple box. Hypothesis and algorithms for -# the mesh generation are global -# - -import salome -import geompy - -import StdMeshers -import NETGENPlugin - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - -# ---- define a boxe - -box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) - -idbox = geompy.addToStudy(box, "box") - -print "Analysis of the geometry box :" -subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box, geompy.ShapeType["EDGE"]) - -print "number of Shells in box : ", len(subShellList) -print "number of Faces in box : ", len(subFaceList) -print "number of Edges in box : ", len(subEdgeList) - - -### ---------------------------- SMESH -------------------------------------- - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 500 - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(maxElementArea) - -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 500 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) - -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the boxe - -mesh = smesh.CreateMesh(box) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox") - -# ---- add hypothesis to the boxe - -print "-------------------------- add hypothesis to the box" - -mesh.AddHypothesis(box,regular1D) -mesh.AddHypothesis(box,hypNbSeg) - -mesh.AddHypothesis(box,mefisto2D) -mesh.AddHypothesis(box,hypArea) - -mesh.AddHypothesis(box,netgen3D) -mesh.AddHypothesis(box,hypVolume) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute the mesh of the boxe" -ret = smesh.Compute(mesh,box) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshBox:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_controls.py b/src/SMESH_SWIG/SMESH_controls.py deleted file mode 100644 index 1d5080d87..000000000 --- a/src/SMESH_SWIG/SMESH_controls.py +++ /dev/null @@ -1,209 +0,0 @@ -# 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 : SMESH_control.py -# Author : Sergey LITONIN -# Module : SMESH - - -import SMESH -import SMESH_mechanic - -smesh = SMESH_mechanic.smesh -mesh = SMESH_mechanic.mesh -salome = SMESH_mechanic.salome - - -aFilterMgr = smesh.CreateFilterManager() - -# Criterion : AREA > 100 - -aFunctor = aFilterMgr.CreateArea() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 100 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Area > 100 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Area > 100" ) -aGroup.Add( anIds ) - - -# Criterion : Taper > 3e-15 - -aFunctor = aFilterMgr.CreateTaper() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 3e-15 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Taper > 3e-15 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Taper > 3e-15" ) -aGroup.Add( anIds ) - - -# Criterion : ASPECT RATIO > 1.3 - -aFunctor = aFilterMgr.CreateAspectRatio() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 1.3 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Aspect Ratio > 1.3 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Aspect Ratio > 1.3" ) -aGroup.Add( anIds ) - - -# Criterion : MINIMUM ANGLE < 30 - -aFunctor = aFilterMgr.CreateMinimumAngle() -aPredicate = aFilterMgr.CreateLessThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 30 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Minimum Angle < 30 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Minimum Angle < 30" ) -aGroup.Add( anIds ) - -# Criterion : Warp > 2e-13 - -aFunctor = aFilterMgr.CreateWarping() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 2e-13 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Warp > 2e-13 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Warp > 2e-13" ) -aGroup.Add( anIds ) - -# Criterion : Skew > 18 - -aFunctor = aFilterMgr.CreateSkew() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 18 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Skew > 18 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Skew > 18" ) -aGroup.Add( anIds ) - -# Criterion : Length > 10 - -aFunctor = aFilterMgr.CreateLength() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 10 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Length > 10 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.EDGE, "Length > 10" ) -aGroup.Add( anIds ) - -# Criterion : Borders at multi-connections = 2 - -aFunctor = aFilterMgr.CreateMultiConnection() -aPredicate = aFilterMgr.CreateEqualTo() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 2 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Borders at multi-connections = 2 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.EDGE, "Borders at multi-connections = 2" ) -aGroup.Add( anIds ) - - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py b/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py deleted file mode 100755 index 755214a59..000000000 --- a/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py +++ /dev/null @@ -1,210 +0,0 @@ -#============================================================================== -# Info. -# Bug (from script, bug) : SMESH_demo_hexa2_upd.py, PAL6781 -# Modified : 25/11/2004 -# Author : Kovaltchuk Alexey -# Project : PAL/SALOME -#============================================================================== -# Tetrahedrization of a geometry (box minus a inner cylinder). -# Hypothesis and algorithms for the mesh generation are not global: -# the mesh of some edges is thinner -# - -import salome -import geompy - -import StdMeshers -import NETGENPlugin - -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - -import math - -# ----------------------------------------------------------------------------- - -ShapeTypeShell = 3 -ShapeTypeFace = 4 -ShapeTypeEdge = 6 - -a = math.sqrt(2.)/4. -ma = - a -zero = 0. -un = 1. -mun= - un -demi = 1./2. - -Orig = geompy.MakeVertex(zero,zero,zero) -P0 = geompy.MakeVertex(a,a,zero) -P1 = geompy.MakeVertex(zero,demi,zero) -P2 = geompy.MakeVertex(ma,a,zero) -P3 = geompy.MakeVertex(mun,un,zero) -P4 = geompy.MakeVertex(un,un,zero) -P5 = geompy.MakeVertex(zero,zero,un) - -arc = geompy.MakeArc(P0,P1,P2) -e1 = geompy.MakeEdge(P2,P3) -e2 = geompy.MakeEdge(P3,P4) -e3 = geompy.MakeEdge(P4,P0) - -list = [] -list.append(arc) -list.append(e1) -list.append(e2) -list.append(e3) - -wire = geompy.MakeWire(list) -face = geompy.MakeFace(wire,1) - -dir = geompy.MakeVector(Orig,P5) -vol1 = geompy.MakePipe(face,dir) - -angle = math.pi/2. -#dir = geom.MakeVector(Orig,P5) -vol2 = geompy.MakeRotation(vol1,dir,angle) - -vol3 = geompy.MakeRotation(vol2,dir,angle) - -vol4 = geompy.MakeRotation(vol3,dir,angle) - -list = [] -list.append(vol1) -list.append(vol2) -list.append(vol3) -list.append(vol4) - -volComp = geompy.MakeCompound(list) - -tol3d = 1.e-3 -vol = geompy.MakeGlueFaces(volComp,tol3d) -idVol = geompy.addToStudy(vol,"volume") - -print "Analysis of the final volume:" -subShellList = geompy.SubShapeAllSorted(vol,ShapeTypeShell) -subFaceList = geompy.SubShapeAllSorted(vol,ShapeTypeFace) -subEdgeList = geompy.SubShapeAllSorted(vol,ShapeTypeEdge) - -print "number of Shells in the volume : ",len(subShellList) -print "number of Faces in the volume : ",len(subFaceList) -print "number of Edges in the volume : ",len(subEdgeList) - -idSubEdge = [] -for k in range(len(subEdgeList)): - idSubEdge.append(geompy.addToStudyInFather(vol,subEdgeList[k],"SubEdge"+str(k))) - -edgeZ = [] -edgeZ.append(subEdgeList[0]) -edgeZ.append(subEdgeList[3]) -edgeZ.append(subEdgeList[10]) -edgeZ.append(subEdgeList[11]) -edgeZ.append(subEdgeList[20]) -edgeZ.append(subEdgeList[21]) -edgeZ.append(subEdgeList[28]) -edgeZ.append(subEdgeList[31]) - -idEdgeZ = [] -for i in range(8): - idEdgeZ.append(geompy.addToStudyInFather(vol,edgeZ[i],"EdgeZ"+str(i+1))) - -### ---------------------------- SMESH -------------------------------------- - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments the global one" - -numberOfSegments = 10 - -hypNbSeg=smesh.CreateHypothesis("NumberOfSegments","libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) -hypNbSegID = hypNbSeg.GetId() -print hypNbSeg.GetName() -print hypNbSegID -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments") - -print "-------------------------- NumberOfSegments in the Z direction" - -numberOfSegmentsZ = 40 - -hypNbSegZ=smesh.CreateHypothesis("NumberOfSegments","libStdMeshersEngine.so") -hypNbSegZ.SetNumberOfSegments(numberOfSegmentsZ) -hypNbSegZID = hypNbSegZ.GetId() -print hypNbSegZ.GetName() -print hypNbSegZID -print hypNbSegZ.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSegZ), "NumberOfSegmentsZ") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- Quadrangle_2D" - -quad2D=smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(quad2D), "Quadrangle_2D") - -print "-------------------------- Hexa_3D" - -hexa3D=smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(hexa3D), "Hexa_3D") - -# ---- init a Mesh with the volume - -mesh = smesh.CreateMesh(vol) -smeshgui.SetName(salome.ObjectToID(mesh), "meshVolume") - -# ---- add hypothesis to the volume - -print "-------------------------- add hypothesis to the volume" - -ret=mesh.AddHypothesis(vol,regular1D) -print ret -ret=mesh.AddHypothesis(vol,hypNbSeg) -print ret -ret=mesh.AddHypothesis(vol,quad2D) -print ret -ret=mesh.AddHypothesis(vol,hexa3D) -print ret - -for i in range(8): - print "-------------------------- add hypothesis to edge in the Z directions", (i+1) - - subMeshEdgeZ = mesh.GetSubMesh(edgeZ[i],"SubMeshEdgeZ_"+str(i+1)) - - retZ = mesh.AddHypothesis(edgeZ[i],hypNbSegZ) - print " add hyp Z ", retZ - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute the mesh of the volume" - -ret=smesh.Compute(mesh,vol) - -print ret -if ret != 0: -## log=mesh.GetLog(0) # no erase trace -## for linelog in log: -## print linelog - print "Information about the MeshBox :" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "problem when Computing the mesh" - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_fixation.py b/src/SMESH_SWIG/SMESH_fixation.py deleted file mode 100644 index b10fcc81f..000000000 --- a/src/SMESH_SWIG/SMESH_fixation.py +++ /dev/null @@ -1,294 +0,0 @@ -# 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 : SMESH_fix_volute.py -# Author : Paul RASCLE, EDF -# Module : SMESH -# $Header$ - -import salome -import geompy -import math - -# ----------------------------------------------------------------------------- - -def MakeFace(lstEdges) : - """ - Creates a planar face from 4 edges - """ - wire = geompy.MakeWire(lstEdges) - face = geompy.MakeFace(wire, 1) - return face - -# ----------------------------------------------------------------------------- - -# ---- dimensions - -##longueurPlq = 0.686 -##largeurPlq = 0.573 -##epaisseurPlq = 0.150 - -##hauteurFlanc = 0.380 -##epaisseurFlanc = 0.112 -##rayonConge = 0.150 - epaisseurFlanc - -##epaisseurFond = 0.162 -##rayonTrou = 0.075 -##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou) -##marge = 0.01 -##tol3d = 1.e-5 - -longueurPlq = 686 -largeurPlq = 573 -epaisseurPlq = 150 - -hauteurFlanc = 380 -epaisseurFlanc = 112 -rayonConge = 150 - epaisseurFlanc - -epaisseurFond = 162 -rayonTrou = 75 -posAxeTrou = hauteurFlanc - (180 + rayonTrou) -marge = 10 -tol3d = 1.e-3 - -# ---- points, directions de base - -p0 = geompy.MakeVertex(0., 0., 0.) - -vx = geompy.MakeVectorDXDYDZ(100., 0., 0.) -vy = geompy.MakeVectorDXDYDZ(0., 100., 0.) -vz = geompy.MakeVectorDXDYDZ(0., 0., 100.) - -# ---- ellipse du flanc - -he = hauteurFlanc - 2*rayonConge -re = 0.5*(largeurPlq - epaisseurFond) - rayonConge -sine = re/he -cose = math.sqrt(1. - sine*sine) - -ve = geompy.MakeVectorDXDYDZ(sine, 0., cose) -cyl0 = geompy.MakeCylinder(p0, ve, re, 2*he) -cyl1 = geompy.MakeRotation(cyl0, ve, 0.5) -cyle = geompy.MakeTranslation(cyl1, -marge*sine, 0., -marge*cose) - -pbe = geompy.MakeVertex(3*he, -2*re, 3*he) -boxe = geompy.MakeBoxTwoPnt(p0, pbe) - -cylcoup = geompy.MakeBoolean(cyle, boxe, 2) - -aretes = [] -aretes = geompy.SubShapeAllSorted(cylcoup, geompy.ShapeType["EDGE"]) - -shape = geompy.MakeCopy(aretes[0]) -aShape = geompy.MakeTranslation(shape, 0., rayonConge + re, epaisseurPlq + 2*rayonConge) - - -# ----------------------------------------------------------------------------- -# ---- decoupage de la piece en volumes a 6 faces de 4 cotes -# ----------------------------------------------------------------------------- - -# ---- cotes x - -x0 = 0. -x0h = rayonConge -x1 = rayonConge + epaisseurFlanc -xc = longueurPlq/2 -x2 = longueurPlq - rayonConge - epaisseurFlanc -x3h = longueurPlq - rayonConge -x3 = longueurPlq - -# ---- cotes y - -y0 = 0. -y0h = rayonConge -y1 = largeurPlq - epaisseurFond -y1m = y1 - marge -y2 = largeurPlq -y2p = largeurPlq + marge - -# ---- cotes z - -z0 = 0. -z1m = epaisseurPlq - marge -z1 = epaisseurPlq -z2 = epaisseurPlq + rayonConge -z3 = epaisseurPlq + 2*rayonConge -z4 = epaisseurPlq + hauteurFlanc -z4p = epaisseurPlq + hauteurFlanc + marge - -zc = epaisseurPlq + posAxeTrou -zc2 = epaisseurPlq + (posAxeTrou - rayonTrou)/3 -zc3 = epaisseurPlq + 2*(posAxeTrou - rayonTrou)/3 - -# ---- decoupe du fond - -p11 = geompy.MakeVertex(x1, y1m, z1) -p12 = geompy.MakeVertex(x1, y1m, z2) -p13 = geompy.MakeVertex(x1, y1m, z3) -p14 = geompy.MakeVertex(x1, y1m, z4) -pc1 = geompy.MakeVertex(xc, y1m, z1) -pc2 = geompy.MakeVertex(xc, y1m, zc2) -pc3 = geompy.MakeVertex(xc, y1m, zc3) -pcc = geompy.MakeVertex(xc, y1m, zc) -pc4 = geompy.MakeVertex(xc, y1m, z4) -p21 = geompy.MakeVertex(x2, y1m, z1) -p22 = geompy.MakeVertex(x2, y1m, z2) -p23 = geompy.MakeVertex(x2, y1m, z3) -p24 = geompy.MakeVertex(x2, y1m, z4) -pcf = geompy.MakeVertex(xc, y2p, zc) - -arc2 = geompy.MakeArc(p12,pc2,p22) -arc3 = geompy.MakeArc(p13,pc3,p23) - -segz1 = geompy.MakeVector(p11,p21) -segz41 = geompy.MakeVector(p14,pc4) -segz42 = geompy.MakeVector(pc4,p24) -segx11 = geompy.MakeVector(p11,p12) -segx12 = geompy.MakeVector(p12,p13) -segx13 = geompy.MakeVector(p13,p14) -segxc2 = geompy.MakeVector(pc1,pc2) -segxc3 = geompy.MakeVector(pc2,pc3) -segxc4 = geompy.MakeVector(pcc,pc4) -segx21 = geompy.MakeVector(p21,p22) -segx22 = geompy.MakeVector(p22,p23) -segx23 = geompy.MakeVector(p23,p24) -segx1c1 = geompy.MakeVector(p13,pcc) -segx1c2 = geompy.MakeVector(p14,pcc) -segx2c1 = geompy.MakeVector(p23,pcc) -segx2c2 = geompy.MakeVector(p24,pcc) - -facef = [] -facef.append(MakeFace([segx13,segx1c2,segx1c1])) -facef.append(MakeFace([segx23,segx2c2,segx2c1])) -facef.append(MakeFace([segx2c2,segxc4,segz42])) -facef.append(MakeFace([segx1c2,segz41,segxc4])) -facef.append(MakeFace([segx1c1,arc3,segx2c1])) -facef.append(MakeFace([segx12,arc2,segx22,arc3])) -facef.append(MakeFace([segx11,segz1,segx21,arc2])) - -vcccf = geompy.MakeVector(pcc, pcf) -hcccf = y2p - y1m -decf = [] -for face in facef: - decf.append(geompy.MakePrismVecH(face,vcccf,hcccf)) - -pc = geompy.MakeVertex(xc, 0., zc) -py2 = geompy.MakeVertex(xc, y2, zc) -axeCyl = geompy.MakeVector(pc, py2) - -cylFond = geompy.MakeCylinder(pc, vy, rayonTrou, 1.1*largeurPlq) -cylFond2 = geompy.MakeRotation(cylFond, axeCyl, math.pi) - -fondec = [] -for id in (0,1,2,3): - fondec.append(geompy.MakeBoolean(decf[id], cylFond2, 2)) -fondec.append(geompy.MakeBoolean(decf[4], cylFond, 2)) -for id in (5,6): - fondec.append(decf[id]) - -p_xcy2pz4p = geompy.MakeVertex(xc,y2p,z4p) -p_x3y2pz4p = geompy.MakeVertex(x3,y2p,z4p) -pxc = geompy.MakeVertex(xc,y0,z0) -bcut1 = geompy.MakeBoxTwoPnt(p0, p_xcy2pz4p) -bcut2 = geompy.MakeBoxTwoPnt(pxc, p_x3y2pz4p) - -fondec2 = [] -for id in (0,1,2,3): - fondec2.append(fondec[id]) -for id in (4,5,6): - fondec2.append(geompy.MakeBoolean(fondec[id], bcut1, 1)) - fondec2.append(geompy.MakeBoolean(fondec[id], bcut2, 1)) - -# ----- autres blocs de decoupe - -bcong1 = geompy.MakeBox(x0,y0,z1, x1,y1,z2) -bcong2 = geompy.MakeBox(x0,y1,z1, x1,y2,z2) -bcong3 = geompy.MakeBox(x2,y0,z1, x3,y1,z2) -bcong4 = geompy.MakeBox(x2,y1,z1, x3,y2,z2) - -pcylx0 = geompy.MakeVertex(0., -marge, z2) -pcylx3 = geompy.MakeVertex(longueurPlq, -marge, z2) -pcyly0 = geompy.MakeVertex(-marge, 0., z2) - -cylcongx0 = geompy.MakeCylinder(pcylx0, vy, rayonConge, largeurPlq + 2*marge) -cylcongx3 = geompy.MakeCylinder(pcylx3, vy, rayonConge, largeurPlq + 2*marge) -cylcongy0 = geompy.MakeCylinder(pcyly0, vx, rayonConge, longueurPlq + 2*marge) - -bcong1 = geompy.MakeBoolean(bcong1,cylcongx0,2) -bcong2 = geompy.MakeBoolean(bcong2,cylcongx0,2) -bcong1 = geompy.MakeBoolean(bcong1,cylcongy0,2) -#NRI : inverse order of BOP -bcong3 = geompy.MakeBoolean(bcong3,cylcongy0,2) -bcong3 = geompy.MakeBoolean(bcong3,cylcongx3,2) -bcong4 = geompy.MakeBoolean(bcong4,cylcongx3,2) - -pf1 = geompy.MakeVertex(0., y0h, z3) -pf2 = geompy.MakeVertex(0., y1, z3) -pf3 = geompy.MakeVertex(0., y1, z4) -pf4 = geompy.MakeVertex(0., 0.5*(largeurPlq - epaisseurFond) , z4) - -vf1 = geompy.MakeEdge(pf1, pf2) -vf2 = geompy.MakeEdge(pf2, pf3) -vf3 = geompy.MakeEdge(pf3, pf4) - -faceFlanc = MakeFace([vf1,vf2,vf3,aShape]) - -flanc1 = geompy.MakePrismVecH(faceFlanc, vx, epaisseurFlanc) -flanc2 = geompy.MakeCopy(flanc1) -flanc1 = geompy.MakeTranslation(flanc1, rayonConge, 0., 0.) -flanc2 = geompy.MakeTranslation(flanc2, longueurPlq - rayonConge - epaisseurFlanc, 0., 0.) - -# ---- constitution et decoupe des blocs -boxfond2 = geompy.MakeBox(x0, y1, z0, x3, y2, z4p) - -blocs = [] -for dec in fondec2: - blocs.append(geompy.MakeBoolean(boxfond2, dec, 1)) - -blocs.append(geompy.MakeBox(x0,y1,z0, x1,y2,z1)) -blocs.append(geompy.MakeBox(x1,y1,z0, xc,y2,z1)) -blocs.append(geompy.MakeBox(xc,y1,z0, x2,y2,z1)) -blocs.append(geompy.MakeBox(x2,y1,z0, x3,y2,z1)) -blocs.append(geompy.MakeBox(x0,y0,z0, x1,y1,z1)) -blocs.append(geompy.MakeBox(x1,y0,z0, xc,y1,z1)) -blocs.append(geompy.MakeBox(xc,y0,z0, x2,y1,z1)) -blocs.append(geompy.MakeBox(x2,y0,z0, x3,y1,z1)) -blocs.append(bcong2) -blocs.append(bcong4) -blocs.append(bcong1) -blocs.append(bcong3) -blocs.append(geompy.MakeBox(x0h,y1, z2, x1, y2, z3)) -blocs.append(geompy.MakeBox(x2, y1, z2, x3h,y2, z3)) -blocs.append(geompy.MakeBox(x0h,y0h,z2, x1, y1, z3)) -blocs.append(geompy.MakeBox(x2, y0h,z2, x3h,y1, z3)) -blocs.append(geompy.MakeBox(x0h,y1, z3, x1, y2, z4)) -blocs.append(geompy.MakeBox(x2, y1, z3, x3h,y2, z4)) -blocs.append(flanc1) -blocs.append(flanc2) - -compbloc = geompy.MakeCompound(blocs) -idcomp = geompy.addToStudy(compbloc, "compbloc") - -# ---- eliminer les faces en double, solid-->shell - -compshell = geompy.MakeGlueFaces(compbloc,tol3d) -idcomp = geompy.addToStudy(compshell, "compshell") diff --git a/src/SMESH_SWIG/SMESH_fixation_hexa.py b/src/SMESH_SWIG/SMESH_fixation_hexa.py deleted file mode 100644 index 1845b2218..000000000 --- a/src/SMESH_SWIG/SMESH_fixation_hexa.py +++ /dev/null @@ -1,101 +0,0 @@ -# -# Hexahedrization of the geometry generated by the Python script -# SMESH_fixation.py -# Hypothesis and algorithms for the mesh generation are global -# - -import SMESH_fixation - -import StdMeshers - -compshell = SMESH_fixation.compshell -idcomp = SMESH_fixation.idcomp -geompy = SMESH_fixation.geompy -salome = SMESH_fixation.salome - -print "Analysis of the geometry to be meshed :" -subShellList = geompy.SubShapeAll(compshell, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(compshell, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(compshell, geompy.ShapeType["EDGE"]) - -print "number of Shells in compshell : ", len(subShellList) -print "number of Faces in compshell : ", len(subFaceList) -print "number of Edges in compshell : ", len(subEdgeList) - -status = geompy.CheckShape(compshell) -print " check status ", status - -### ---------------------------- SMESH -------------------------------------- -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 5 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_5") - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- Quadrangle_2D" - -quad2D = smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(quad2D), "Quadrangle_2D") - -print "-------------------------- Hexa_3D" - -hexa3D = smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(hexa3D), "Hexa_3D") - -# ---- init a Mesh with the compshell -shape_mesh = salome.IDToObject( idcomp ) - -mesh = smesh.CreateMesh(shape_mesh) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshCompShell") - - -print "-------------------------- add hypothesis to compshell" - -mesh.AddHypothesis(shape_mesh,regular1D) -mesh.AddHypothesis(shape_mesh,hypNbSeg) - -mesh.AddHypothesis(shape_mesh,quad2D) -mesh.AddHypothesis(shape_mesh,hexa3D) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute compshell" -ret = smesh.Compute(mesh, shape_mesh) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshcompShel:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of quadrangles : ", mesh.NbQuadrangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of hexahedrons : ", mesh.NbHexas() -else: - print "problem when Computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_fixation_tetra.py b/src/SMESH_SWIG/SMESH_fixation_tetra.py deleted file mode 100644 index 2d588bbd9..000000000 --- a/src/SMESH_SWIG/SMESH_fixation_tetra.py +++ /dev/null @@ -1,131 +0,0 @@ -# -# Tetrahedrization of the geometry generated by the Python script -# SMESH_fixation.py -# Hypothesis and algorithms for the mesh generation are global -# - -import StdMeshers -import NETGENPlugin -import SMESH_fixation - -compshell = SMESH_fixation.compshell -idcomp = SMESH_fixation.idcomp -geompy = SMESH_fixation.geompy -salome = SMESH_fixation.salome - -print "Analysis of the geometry to be meshed :" -subShellList = geompy.SubShapeAll(compshell, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(compshell, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(compshell, geompy.ShapeType["EDGE"]) - -print "number of Shells in compshell : ", len(subShellList) -print "number of Faces in compshell : ", len(subFaceList) -print "number of Edges in compshell : ", len(subEdgeList) - -status = geompy.CheckShape(compshell) -print " check status ", status - -### ---------------------------- SMESH -------------------------------------- -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 5 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_5") - -print "-------------------------- MaxElementArea" - -## maxElementArea = 80 - -## hypArea=smesh.CreateHypothesis("MaxElementArea") -## hypArea.SetMaxElementArea(maxElementArea) -## print hypArea.GetName() -## print hypArea.GetId() -## print hypArea.GetMaxElementArea() -## smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_160") - -hypLengthFromEdges = smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(hypLengthFromEdges), "LengthFromEdges") - - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 1000 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) - -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_1000") - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") - -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the compshell - -mesh = smesh.CreateMesh(compshell) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshcompShel") - -print "-------------------------- add hypothesis to compshell" - -mesh.AddHypothesis(compshell,regular1D) -mesh.AddHypothesis(compshell,hypNbSeg) - -mesh.AddHypothesis(compshell,mefisto2D) -mesh.AddHypothesis(compshell,hypLengthFromEdges) - -mesh.AddHypothesis(compshell,netgen3D) -mesh.AddHypothesis(compshell,hypVolume) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute compshell" -ret = smesh.Compute(mesh,compshell) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshcompShel:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons : ", mesh.NbTetras() - -else: - print "problem when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_freebord.py b/src/SMESH_SWIG/SMESH_freebord.py deleted file mode 100644 index d240a354f..000000000 --- a/src/SMESH_SWIG/SMESH_freebord.py +++ /dev/null @@ -1,66 +0,0 @@ -import salome -import geompy -import SMESH -import StdMeshers - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# Create box without one plane - -box = geompy.MakeBox(0., 0., 0., 10., 20., 30.) -subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) - -FaceList = [] -for i in range( 5 ): - FaceList.append( subShapeList[ i ] ) - -aComp = geompy.MakeCompound( FaceList ) -aBox = geompy.Sew( aComp, 1. ) -idbox = geompy.addToStudy( aBox, "box" ) - -aBox = salome.IDToObject( idbox ) - -# Create mesh - -hyp1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hyp1.SetNumberOfSegments(5) -hyp2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hyp2.SetMaxElementArea(20) -hyp3 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hyp3.SetMaxElementArea(50) - -algo1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -algo2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") - -mesh = smesh.CreateMesh(aBox) -mesh.AddHypothesis(aBox,hyp1) -mesh.AddHypothesis(aBox,hyp2) -mesh.AddHypothesis(aBox,algo1) -mesh.AddHypothesis(aBox,algo2) - -smesh.Compute(mesh,aBox) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); -smeshgui.SetName( salome.ObjectToID( mesh ), "Mesh_freebord" ); - -# Criterion : Free edges -aFilterMgr = smesh.CreateFilterManager() -aPredicate = aFilterMgr.CreateFreeBorders() -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Free edges Nb = ", len( anIds ) -for i in range( len( anIds ) ): - print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.EDGE, "Free edges" ) -aGroup.Add( anIds ) - - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_hexaedre.py b/src/SMESH_SWIG/SMESH_hexaedre.py deleted file mode 100755 index 1b93e1c08..000000000 --- a/src/SMESH_SWIG/SMESH_hexaedre.py +++ /dev/null @@ -1,148 +0,0 @@ -#============================================================================== -# Info. -# Bug (from script, bug) : hexaedre_modified.py, PAL6194, PAL7153 -# Modified : 25/11/2004 -# Author : Kovaltchuk Alexey -# Project : PAL/SALOME -#============================================================================== - -import salome -from salome import sg - -import geompy - -import math - -# ----------------------------------------------------------------------------- - -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -myBuilder = salome.myStudy.NewBuilder() -gg = salome.ImportComponentGUI("GEOM") -from salome import sg - -ShapeTypeCompSolid = 1 -ShapeTypeSolid = 2 -ShapeTypeShell = 3 -ShapeTypeFace = 4 -ShapeTypeWire = 5 -ShapeTypeEdge = 6 -ShapeTypeVertex = 7 - -Boolop_common = 1 -Boolop_cut = 2 -Boolop_fuse = 3 -Boolop_section = 4 - -p0 = geompy.MakeVertex(0., 0., 0.) -px = geompy.MakeVertex(100., 0., 0.) -py = geompy.MakeVertex(0., 100., 0.) -pz = geompy.MakeVertex(0., 0., 100.) -vx = geompy.MakeVector(p0, px) -vy = geompy.MakeVector(p0, py) -vz = geompy.MakeVector(p0, pz) - -sphereExt = geompy.MakeSphere( 0., 0., 0., 400.) -sphereInt = geompy.MakeSphere( 0.,-50., 0., 350.) -sphereA = geompy.MakeSphere( -400., 50., 50., 400.) -sphereB = geompy.MakeSphere( 350.,-50.,-50., 350.) -ptcyle = geompy.MakeVertex(0., -300., -450.) -cylindre = geompy.MakeCylinder(ptcyle,vz,500.,900.) - -vol1=geompy.MakeCut(sphereExt,sphereA) -vol2=geompy.MakeCut(vol1,sphereB) -vol3=geompy.MakeCut(vol2,cylindre) -blob=geompy.MakeCut(vol3,sphereInt) - -idblob = geompy.addToStudy(blob,"blob") - -aretes = [] -aretes = geompy.SubShapeAllSorted(blob, ShapeTypeEdge) -eid=0 - -# ------------------------------- -# --- numerotation des aretes -##for edge in aretes: -## edname="arete%d"%eid -## idedge=geompy.addToStudy(edge,edname) -## eid=eid+1 - -salome.sg.updateObjBrowser(1) - -# --- epaisseur 0 2 8 10 -# --- hauteur 1 3 9 11 -# --- largeur 4 5 6 7 - -# ----------------------------------------------------------------------------- - -print "-------------------------- mesh" - -import SMESH -import StdMeshers -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# ---- create Hypothesis -print "-------------------------- create Hypothesis" -numberOfSegments = 4 -hypNbSegA=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSegA.SetNumberOfSegments(numberOfSegments) -numberOfSegments = 10 -hypNbSegB=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSegB.SetNumberOfSegments(numberOfSegments) -numberOfSegments = 15 -hypNbSegC=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSegC.SetNumberOfSegments(numberOfSegments) - -# ---- create Algorithms -print "-------------------------- create Algorithms" -regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -quad2D=smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") -hexa3D=smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") - -# ---- init a Mesh with the geom shape -shape_mesh = blob -myMesh=smesh.CreateMesh(shape_mesh) - -# ---- add hypothesis and algorithms to mesh -print "-------------------------- add hypothesis to mesh" -myMesh.AddHypothesis(shape_mesh,regular1D) -myMesh.AddHypothesis(shape_mesh,quad2D) -myMesh.AddHypothesis(shape_mesh,hexa3D) - -#myMesh.AddHypothesis(shape_mesh,hypNbSeg) - -myMesh.AddHypothesis(aretes[0],hypNbSegA) -myMesh.AddHypothesis(aretes[2],hypNbSegA) -myMesh.AddHypothesis(aretes[8],hypNbSegA) -myMesh.AddHypothesis(aretes[10],hypNbSegA) - -myMesh.AddHypothesis(aretes[1],hypNbSegC) -myMesh.AddHypothesis(aretes[3],hypNbSegC) -myMesh.AddHypothesis(aretes[9],hypNbSegC) -myMesh.AddHypothesis(aretes[11],hypNbSegC) - -myMesh.AddHypothesis(aretes[4],hypNbSegB) -myMesh.AddHypothesis(aretes[5],hypNbSegB) -myMesh.AddHypothesis(aretes[6],hypNbSegB) -myMesh.AddHypothesis(aretes[7],hypNbSegB) - -# ---- compute mesh - -print "-------------------------- compute mesh" -ret=smesh.Compute(myMesh, shape_mesh) -print ret -if ret != 0: - #log=myMesh.GetLog(0) # no erase trace - #for linelog in log: - # print linelog - print "Information about the Mesh:" - print "Number of nodes : ", myMesh.NbNodes() - print "Number of edges : ", myMesh.NbEdges() - print "Number of faces : ", myMesh.NbFaces() - print "Number of quadrangles : ", myMesh.NbQuadrangles() - print "Number of volumes : ", myMesh.NbVolumes() - print "Number of hexahedrons : ", myMesh.NbHexas() -else: - print "problem when Computing the mesh" - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_mechanic.py b/src/SMESH_SWIG/SMESH_mechanic.py deleted file mode 100644 index 7c1fdbd22..000000000 --- a/src/SMESH_SWIG/SMESH_mechanic.py +++ /dev/null @@ -1,257 +0,0 @@ -# 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 : SMESH_withHole.py -# Author : Lucien PIGNOLONI -# Module : SMESH -# $Header$ - -#------------------------------------------------------------------------- - -import salome -import geompy - -import StdMeshers - -# ---------------------------- GEOM -------------------------------------- - -# ---- define contigous arcs and segment to define a closed wire -p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 ) -p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 ) -p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 ) -arc1 = geompy.MakeArc( p1, p2, p3 ) - -p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 ) -seg1 = geompy.MakeVector( p3, p4 ) - -p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 ) -p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 ) -arc2 = geompy.MakeArc( p4, p5, p6 ) - -p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 ) -arc3 = geompy.MakeArc( p6, p7, p1 ) - -# ---- define a closed wire with arcs and segment -List1 = [] -List1.append( arc1 ) -List1.append( seg1 ) -List1.append( arc2 ) -List1.append( arc3 ) - -wire1 = geompy.MakeWire( List1 ) -Id_wire1 = geompy.addToStudy( wire1, "wire1" ) - -# ---- define a planar face with wire -WantPlanarFace = 1 #True -face1 = geompy.MakeFace( wire1, WantPlanarFace ) -Id_face1 = geompy.addToStudy( face1, "face1" ) - -# ---- create a shape by extrusion -pO = geompy.MakeVertex( 0.0, 0.0, 0.0 ) -pz = geompy.MakeVertex( 0.0, 0.0, 100.0 ) -vz = geompy.MakeVector( pO, pz ) - -prism1 = geompy.MakePrismVecH( face1, vz, 100.0 ) -Id_prism1 = geompy.addToStudy( prism1, "prism1" ) - -# ---- create two cylinders -pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 ) -pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 ) - -radius = 20.0 -height = 180.0 -cyl1 = geompy.MakeCylinder( pc1, vz, radius, height ) -cyl2 = geompy.MakeCylinder( pc2, vz, radius, height ) - -Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" ) -Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" ) - -# ---- cut with cyl1 -shape = geompy.MakeBoolean( prism1, cyl1, 2 ) - -# ---- fuse with cyl2 to obtain the final mechanic piece :) -mechanic = geompy.MakeBoolean( shape, cyl2, 3 ) -Id_mechanic = geompy.addToStudy( mechanic, "mechanic" ) - -# ---- explode on faces -SubFaceL = geompy.SubShapeAllSorted(mechanic, geompy.ShapeType["FACE"]) - -# ---- add a face sub shape in study to be meshed different -sub_face1 = SubFaceL[0] -name = geompy.SubShapeName( sub_face1, mechanic ) - -Id_SubFace1 = geompy.addToStudyInFather( mechanic, sub_face1, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face2 = SubFaceL[4] -name = geompy.SubShapeName( sub_face2, mechanic ) - -Id_SubFace2 = geompy.addToStudyInFather( mechanic, sub_face2, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face3 = SubFaceL[5] -name = geompy.SubShapeName( sub_face3, mechanic ) - -Id_SubFace3 = geompy.addToStudyInFather( mechanic, sub_face3, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face4 = SubFaceL[10] -name = geompy.SubShapeName( sub_face4, mechanic ) - -Id_SubFace4 = geompy.addToStudyInFather( mechanic, sub_face4, name ) - -# ---------------------------- SMESH -------------------------------------- - -# ---- launch SMESH, init a Mesh with shape 'mechanic' - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -# -- Init -- -shape_mesh = salome.IDToObject( Id_mechanic ) -smesh.SetCurrentStudy(salome.myStudy) - -mesh = smesh.CreateMesh(shape_mesh) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -idmesh = salome.ObjectToID(mesh) -smeshgui.SetName( idmesh, "Mesh_mechanic" ) - -print "-------------------------- NumberOfSegments" - -numberOfSegment = 10 - -hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) -hypNbSeg.SetNumberOfSegments( numberOfSegment ) -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 25 - -hypArea25 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea25.SetMaxElementArea( maxElementArea ) -print hypArea25.GetName() -print hypArea25.GetId() -print hypArea25.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea25), "MaxElementArea_25") - -print "-------------------------- MaxElementArea" - -maxElementArea = 35 - -hypArea35 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea35.SetMaxElementArea( maxElementArea ) -print hypArea35.GetName() -print hypArea35.GetId() -print hypArea35.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea35), "MaxElementArea_35") - -print "-------------------------- Regular_1D" - -algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) -listHyp = algoReg1D.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoReg1D.GetName() -print algoReg1D.GetId() - -smeshgui.SetName(salome.ObjectToID(algoReg1D), "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") - -print "-------------------------- SMESH_Quadrangle_2D" - -algoQuad = smesh.CreateHypothesis( "Quadrangle_2D", "libStdMeshersEngine.so" ) -listHyp = algoQuad.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoQuad.GetName() -print algoQuad.GetId() - -smeshgui.SetName(salome.ObjectToID(algoQuad), "SMESH_Quadrangle_2D") - -print "-------------------------- add hypothesis to main shape" - -mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments -mesh.AddHypothesis( shape_mesh, hypArea25 ) # max area - -mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation -mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D - -print "-------------------------- add hypothesis and algorithm to sub face 1" - -submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1") - -mesh.AddHypothesis( sub_face1, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face1, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorithm to sub face 2" - -submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2") - -mesh.AddHypothesis( sub_face2, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face2, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorith to sub face 3" - -submesh = mesh.GetSubMesh(sub_face3, "SubMeshFace3") - -mesh.AddHypothesis( sub_face3, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face3, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorith to sub face 4" - -submesh = mesh.GetSubMesh(sub_face4, "SubMeshFace4") - -mesh.AddHypothesis( sub_face4, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face4, hypArea35 ) # max area - -print "-------------------------- compute the mesh of the mechanic piece" - -smesh.Compute(mesh, shape_mesh) - -print "Information about the Mesh_mechanic:" -print "Number of nodes : ", mesh.NbNodes() -print "Number of edges : ", mesh.NbEdges() -print "Number of faces : ", mesh.NbFaces() -print "Number of triangles : ", mesh.NbTriangles() -print "Number of quadrangles : ", mesh.NbQuadrangles() -print "Number of volumes : ", mesh.NbVolumes() -print "Number of tetrahedrons: ", mesh.NbTetras() - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_mechanic_editor.py b/src/SMESH_SWIG/SMESH_mechanic_editor.py deleted file mode 100644 index 596786ed9..000000000 --- a/src/SMESH_SWIG/SMESH_mechanic_editor.py +++ /dev/null @@ -1,308 +0,0 @@ -# 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 : SMESH_withHole.py -# Author : Lucien PIGNOLONI -# Module : SMESH -# $Header$ - -#------------------------------------------------------------------------- - -import salome -import geompy - -import StdMeshers - -import SMESH - -# ---------------------------- GEOM -------------------------------------- - -# ---- define contigous arcs and segment to define a closed wire -p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 ) -p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 ) -p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 ) -arc1 = geompy.MakeArc( p1, p2, p3 ) - -p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 ) -seg1 = geompy.MakeVector( p3, p4 ) - -p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 ) -p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 ) -arc2 = geompy.MakeArc( p4, p5, p6 ) - -p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 ) -arc3 = geompy.MakeArc( p6, p7, p1 ) - -# ---- define a closed wire with arcs and segment -List1 = [] -List1.append( arc1 ) -List1.append( seg1 ) -List1.append( arc2 ) -List1.append( arc3 ) - -wire1 = geompy.MakeWire( List1 ) -Id_wire1 = geompy.addToStudy( wire1, "wire1" ) - -# ---- define a planar face with wire -WantPlanarFace = 1 #True -face1 = geompy.MakeFace( wire1, WantPlanarFace ) -Id_face1 = geompy.addToStudy( face1, "face1" ) - -# ---- create a shape by extrusion -pO = geompy.MakeVertex( 0.0, 0.0, 0.0 ) -pz = geompy.MakeVertex( 0.0, 0.0, 100.0 ) -vz = geompy.MakeVector( pO, pz ) - -prism1 = geompy.MakePrismVecH( face1, vz, 100.0 ) -Id_prism1 = geompy.addToStudy( prism1, "prism1" ) - -# ---- create two cylinders -pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 ) -pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 ) - -radius = 20.0 -height = 180.0 -cyl1 = geompy.MakeCylinder( pc1, vz, radius, height ) -cyl2 = geompy.MakeCylinder( pc2, vz, radius, height ) - -Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" ) -Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" ) - -# ---- cut with cyl1 -shape = geompy.MakeBoolean( prism1, cyl1, 2 ) - -# ---- fuse with cyl2 to obtain the final mechanic piece :) -mechanic = geompy.MakeBoolean( shape, cyl2, 3 ) -Id_mechanic = geompy.addToStudy( mechanic, "mechanic" ) - -# ---- explode on faces -SubFaceL = geompy.SubShapeAllSorted(mechanic, geompy.ShapeType["FACE"]) - -# ---- add a face sub shape in study to be meshed different -sub_face1 = SubFaceL[0] -name = geompy.SubShapeName( sub_face1, mechanic ) - -Id_SubFace1 = geompy.addToStudyInFather( mechanic, sub_face1, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face2 = SubFaceL[4] -name = geompy.SubShapeName( sub_face2, mechanic ) - -Id_SubFace2 = geompy.addToStudyInFather( mechanic, sub_face2, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face3 = SubFaceL[5] -name = geompy.SubShapeName( sub_face3, mechanic ) - -Id_SubFace3 = geompy.addToStudyInFather( mechanic, sub_face3, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face4 = SubFaceL[10] -name = geompy.SubShapeName( sub_face4, mechanic ) - -Id_SubFace4 = geompy.addToStudyInFather( mechanic, sub_face4, name ) - -# ---------------------------- SMESH -------------------------------------- - -# ---- launch SMESH, init a Mesh with shape 'mechanic' - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -# -- Init -- -shape_mesh = salome.IDToObject( Id_mechanic ) -smesh.SetCurrentStudy(salome.myStudy) - -mesh = smesh.CreateMesh(shape_mesh) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -idmesh = salome.ObjectToID(mesh) -smeshgui.SetName( idmesh, "Mesh_mechanic" ) - -print "-------------------------- NumberOfSegments" - -numberOfSegment = 10 - -hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) -hypNbSeg.SetNumberOfSegments( numberOfSegment ) -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 25 - -hypArea25 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea25.SetMaxElementArea( maxElementArea ) -print hypArea25.GetName() -print hypArea25.GetId() -print hypArea25.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea25), "MaxElementArea_25") - -print "-------------------------- MaxElementArea" - -maxElementArea = 35 - -hypArea35 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea35.SetMaxElementArea( maxElementArea ) -print hypArea35.GetName() -print hypArea35.GetId() -print hypArea35.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea35), "MaxElementArea_35") - -print "-------------------------- Regular_1D" - -algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) -listHyp = algoReg1D.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoReg1D.GetName() -print algoReg1D.GetId() - -smeshgui.SetName(salome.ObjectToID(algoReg1D), "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") - -print "-------------------------- SMESH_Quadrangle_2D" - -algoQuad = smesh.CreateHypothesis( "Quadrangle_2D", "libStdMeshersEngine.so" ) -listHyp = algoQuad.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoQuad.GetName() -print algoQuad.GetId() - -smeshgui.SetName(salome.ObjectToID(algoQuad), "SMESH_Quadrangle_2D") - -print "-------------------------- add hypothesis to main shape" - -mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments -mesh.AddHypothesis( shape_mesh, hypArea25 ) # max area - -mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation -mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D - -print "-------------------------- add hypothesis and algorithm to sub face 1" - -submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1") - -mesh.AddHypothesis( sub_face1, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face1, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorithm to sub face 2" - -submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2") - -mesh.AddHypothesis( sub_face2, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face2, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorith to sub face 3" - -submesh = mesh.GetSubMesh(sub_face3, "SubMeshFace3") - -mesh.AddHypothesis( sub_face3, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face3, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorith to sub face 4" - -submesh = mesh.GetSubMesh(sub_face4, "SubMeshFace4") - -mesh.AddHypothesis( sub_face4, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face4, hypArea35 ) # max area - -print "-------------------------- compute the mesh of the mechanic piece" - -smesh.Compute(mesh, shape_mesh) - -print "Information about the Mesh_mechanic:" -print "Number of nodes : ", mesh.NbNodes() -print "Number of edges : ", mesh.NbEdges() -print "Number of faces : ", mesh.NbFaces() -print "Number of triangles : ", mesh.NbTriangles() -print "Number of quadrangles : ", mesh.NbQuadrangles() -print "Number of volumes : ", mesh.NbVolumes() -print "Number of tetrahedrons: ", mesh.NbTetras() - - -MeshEditor = mesh.GetMeshEditor() - -#1 cutting of quadrangles of the 'SubMeshFace2' submesh -submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2") -MeshEditor.SplitQuadObject(submesh, 1) - -#2 cutting of triangles of the group -FacesTriToQuad = [2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422] -GroupTriToQuad = mesh.CreateGroup(SMESH.FACE,"Group of faces (quad)") -GroupTriToQuad.Add(FacesTriToQuad) -MeshEditor.TriToQuadObject(GroupTriToQuad, None , 1.57) - -#3 extrusion of the group -point = SMESH.PointStruct(0, 0, 5) -vector = SMESH.DirStruct(point) -MeshEditor.ExtrusionSweepObject(GroupTriToQuad, vector, 5) - -#4 mirror object -MeshEditor.MirrorObject(mesh, SMESH.AxisStruct(0, 0, 0, 0, 0, 0), SMESH.SMESH_MeshEditor.POINT, 0) - -#5 mesh translation -point = SMESH.PointStruct(10, 10, 10) -vector = SMESH.DirStruct(point) -MeshEditor.TranslateObject(mesh, vector, 0) - -#6 mesh rotation -axisXYZ = SMESH.AxisStruct(0, 0, 0, 10, 10, 10) -angle180 = 180*3.141/180 -MeshEditor.RotateObject(mesh, axisXYZ, angle180, 0) - -#7 group smoothing -FacesSmooth = [864, 933, 941, 950, 1005, 1013] -GroupSmooth = mesh.CreateGroup(SMESH.FACE,"Group of faces (smooth)") -GroupSmooth.Add(FacesSmooth) -MeshEditor.SmoothObject(GroupSmooth, [], 20, 2, SMESH.SMESH_MeshEditor.CENTROIDAL_SMOOTH) - -#8 rotation sweep object -FacesRotate = [492, 493, 502, 503] -GroupRotate = mesh.CreateGroup(SMESH.FACE,"Group of faces (rotate)") -GroupRotate.Add(FacesRotate) -angle45 = 45*3.141/180 -axisXYZ = SMESH.AxisStruct(-38.3128, -73.3658, -133.321, -13.3402, -13.3265, 6.66632) -MeshEditor.RotationSweepObject(GroupRotate, axisXYZ, angle45, 4, 1e-5) - -#9 reorientation of the whole mesh -submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1") -MeshEditor.ReorientObject(submesh) - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_mechanic_tetra.py b/src/SMESH_SWIG/SMESH_mechanic_tetra.py deleted file mode 100644 index eee3f87d8..000000000 --- a/src/SMESH_SWIG/SMESH_mechanic_tetra.py +++ /dev/null @@ -1,212 +0,0 @@ -# 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 : SMESH_withHole.py -# Author : Lucien PIGNOLONI -# Module : SMESH -# $Header$ - -import salome -import geompy - -geom = geompy.geom -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -import StdMeshers -import NETGENPlugin - -# ---------------------------- GEOM -------------------------------------- - -# ---- define contigous arcs and segment to define a closed wire -p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 ) -p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 ) -p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 ) -arc1 = geompy.MakeArc( p1, p2, p3 ) - -p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 ) -seg1 = geompy.MakeVector( p3, p4 ) - -p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 ) -p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 ) -arc2 = geompy.MakeArc( p4, p5, p6 ) - -p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 ) -arc3 = geompy.MakeArc( p6, p7, p1 ) - -# ---- define a closed wire with arcs and segment -List1 = [] -List1.append( arc1 ) -List1.append( seg1 ) -List1.append( arc2 ) -List1.append( arc3 ) - -wire1 = geompy.MakeWire( List1 ) -Id_wire1 = geompy.addToStudy( wire1, "wire1" ) - -# ---- define a planar face with wire -WantPlanarFace = 1 #True -face1 = geompy.MakeFace( wire1, WantPlanarFace ) -Id_face1 = geompy.addToStudy( face1, "face1" ) - -# ---- create a shape by extrusion -pO = geompy.MakeVertex( 0.0, 0.0, 0.0 ) -pz = geompy.MakeVertex( 0.0, 0.0, 100.0 ) -vz = geompy.MakeVector( pO, pz ) - -prism1 = geompy.MakePrismVecH( face1, vz, 100.0 ) -Id_prism1 = geompy.addToStudy( prism1, "prism1") - -# ---- create two cylinders - -pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 ) -pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 ) -radius = 20.0 -height = 180.0 -cyl1 = geompy.MakeCylinder( pc1, vz, radius, height ) -cyl2 = geompy.MakeCylinder( pc2, vz, radius, height ) - -Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" ) -Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" ) - -# ---- cut with cyl1 -shape = geompy.MakeBoolean( prism1, cyl1, 2 ) - -# ---- fuse with cyl2 to obtain the final mechanic piece :) -mechanic = geompy.MakeBoolean( shape, cyl2, 3 ) -Id_mechanic = geompy.addToStudy( mechanic, "mechanic" ) - -# ---- Analysis of the geometry - -print "Analysis of the geometry mechanic :" - -subShellList = geompy.SubShapeAll(mechanic,geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(mechanic,geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(mechanic,geompy.ShapeType["EDGE"]) - -print "number of Shells in mechanic : ",len(subShellList) -print "number of Faces in mechanic : ",len(subFaceList) -print "number of Edges in mechanic : ",len(subEdgeList) - -### ---------------------------- SMESH -------------------------------------- - -print "-------------------------- NumberOfSegments" - -numberOfSegment = 10 - -hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) -hypNbSeg.SetNumberOfSegments( numberOfSegment ) -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 20 - -hypArea = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea.SetMaxElementArea( maxElementArea ) -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_20") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 20 - -hypVolume = smesh.CreateHypothesis( "MaxElementVolume", "libStdMeshersEngine.so" ) -hypVolume.SetMaxElementVolume( maxElementVolume ) -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_20") - -print "-------------------------- Regular_1D" - -algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) -listHyp =algoReg1D.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoReg1D.GetName() -print algoReg1D.GetId() - -smeshgui.SetName(salome.ObjectToID(algoReg1D), "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") - -print "-------------------------- NETGEN_3D" - -algoNg = smesh.CreateHypothesis( "NETGEN_3D", "libNETGENEngine.so" ) -listHyp = algoNg.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoNg.GetName() -print algoNg.GetId() - -smeshgui.SetName(salome.ObjectToID(algoNg), "NETGEN_3D") - -print "-------------------------- add hypothesis to main mechanic" - -shape_mesh = salome.IDToObject( Id_mechanic ) - -mesh = smesh.CreateMesh(shape_mesh) - -idmesh = salome.ObjectToID(mesh) -smeshgui.SetName( idmesh, "Mesh_mechanic_tetra" ) - -mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments -mesh.AddHypothesis( shape_mesh, hypArea ) # max area -mesh.AddHypothesis( shape_mesh, hypVolume ) # max volume - -mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation -mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D -mesh.AddHypothesis( shape_mesh, algoNg ) # NETGEN 3D - -print "-------------------------- compute the mesh of the mechanic piece" -smesh.Compute(mesh,shape_mesh) - -print "Information about the Mesh_mechanic_tetra:" -print "Number of nodes : ", mesh.NbNodes() -print "Number of edges : ", mesh.NbEdges() -print "Number of faces : ", mesh.NbFaces() -print "Number of triangles : ", mesh.NbTriangles() -print "Number of quadrangles: ", mesh.NbQuadrangles() -print "Number of volumes : ", mesh.NbVolumes() -print "Number of tetrahedrons: ", mesh.NbTetras() - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_shared_modules.py b/src/SMESH_SWIG/SMESH_shared_modules.py deleted file mode 100644 index e40362fff..000000000 --- a/src/SMESH_SWIG/SMESH_shared_modules.py +++ /dev/null @@ -1,19 +0,0 @@ -""" - -""" - -# force SMESH importation at interpretor initialization -# see salome_shared_modules.py -# (avoids incomplete import at run time) - -print "============== import SMESH =======================" - -import SMESH - -# this function is required - -def init_shared_modules(): - """ - This function initializes shared modules that need to be - """ - pass diff --git a/src/SMESH_SWIG/SMESH_test.py b/src/SMESH_SWIG/SMESH_test.py deleted file mode 100644 index d2385f3a9..000000000 --- a/src/SMESH_SWIG/SMESH_test.py +++ /dev/null @@ -1,200 +0,0 @@ -# SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -# -# 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 : SMESH_test.py -# Module : SMESH - -import salome -import geompy -import smeshpy - -import SMESH -import StdMeshers - -# ---- define a box - -box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) -idb = geompy.addToStudy(box, "box") - -# ---- add first face of box in study - -subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) -face = subShapeList[0] -name = geompy.SubShapeName(face, box) -idf = geompy.addToStudyInFather(box, face, name) - -# ---- add shell from box in study - -subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"]) -shell = subShellList[0] -name = geompy.SubShapeName(shell, box) -ids = geompy.addToStudyInFather(box, shell, name) - -# ---- add first edge of face in study - -edgeList = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"]) -edge = edgeList[0]; -name = geompy.SubShapeName(edge, face) -ide = geompy.addToStudyInFather(face, edge, name) - -# ---- launch SMESH, init a Mesh with the box - -gen = smeshpy.smeshpy() -mesh = gen.CreateMesh(idb) - -print "-------------------------- create Hypothesis" - -print "-------------------------- LocalLength" - -hypo1 = gen.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") -print hypo1.GetName() -print hypo1.GetId() -print hypo1.GetLength() -hypo1.SetLength(100) -print hypo1.GetLength() - -print "-------------------------- bidon" - -hyp3 = gen.CreateHypothesis("bidon", "") - -print "-------------------------- NumberOfSegments" - -hypo3 = gen.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypo3.SetNumberOfSegments(7) -print hypo3.GetName() -print hypo3.GetNumberOfSegments() -print hypo3.GetId() - -print "-------------------------- MaxElementArea" - -hypo4 = gen.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypo4.SetMaxElementArea(5000) -print hypo4.GetName() -print hypo4.GetMaxElementArea() -print hypo4.GetId() - -print "-------------------------- Regular_1D" - -algo_1 = gen.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -print algo_1.GetName() -print algo_1.GetId() -listHyp = algo_1.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algo_1.GetId() - -print "-------------------------- MEFISTO_2D" - -algo_2 = gen.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -print algo_2.GetName() -print algo_2.GetId() -listHyp = algo_2.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algo_2.GetId() - -print "-------------------------- add hypothesis to edge" - -edge = salome.IDToObject(ide) -submesh = mesh.GetSubMesh(edge, "SubMeshEdge") -ret = mesh.AddHypothesis(edge,algo_1) -print ret -ret = mesh.AddHypothesis(edge,hypo1) -print ret - -##print "-------------------------- compute edge" -##ret=gen.Compute(mesh,ide) -##print ret -##log=mesh.GetLog(1); -##for a in log: -## print a - -print "-------------------------- add hypothesis to box" - -box = salome.IDToObject(idb) -submesh = mesh.GetSubMesh(box, "SubMeshBox") -ret = mesh.AddHypothesis(box,algo_1) -print ret -ret = mesh.AddHypothesis(box,hypo1) -print ret -ret = mesh.AddHypothesis(box,algo_2) -print ret -ret = mesh.AddHypothesis(box,hypo4) -print ret - -print "-------------------------- compute face" - -ret = gen.Compute(mesh,idf) -print ret -log = mesh.GetLog(0) # 0 - GetLog without ClearLog after, else if 1 - ClearLog after -for a in log: - print "-------" - ii = 0 - ir = 0 - comType = a.commandType - if comType == 0: - for i in range(a.number): - ind = a.indexes[ii] - ii = ii+1 - r1 = a.coords[ir] - ir = ir+1 - r2 = a.coords[ir] - ir = ir+1 - r3 = a.coords[ir] - ir = ir+1 - print "AddNode %i - %g %g %g" % (ind, r1, r2, r3) - elif comType == 1: - for i in range(a.number): - ind = a.indexes[ii] - ii = ii+1 - i1 = a.indexes[ii] - ii = ii+1 - i2 = a.indexes[ii] - ii = ii+1 - print "AddEdge %i - %i %i" % (ind, i1, i2) - elif comType == 2: - for i in range(a.number): - ind = a.indexes[ii] - ii = ii+1 - i1 = a.indexes[ii] - ii = ii+1 - i2 = a.indexes[ii] - ii = ii+1 - i3 = a.indexes[ii] - ii = ii+1 - print "AddTriangle %i - %i %i %i" % (ind, i1, i2, i3) - -##print "-------------------------- compute box" -##ret=gen.Compute(mesh,idb) -##print ret -##log=mesh.GetLog(1); -##print log - -##shell=salome.IDToObject(ids) -##submesh=mesh.GetElementsOnShape(shell) -##ret=mesh.AddHypothesis(shell,algo_1) -##print ret -##ret=mesh.AddHypothesis(shell,hypo1) -##print ret -##ret=gen.Compute(mesh,ids) -##print ret diff --git a/src/SMESH_SWIG/SMESH_test0.py b/src/SMESH_SWIG/SMESH_test0.py deleted file mode 100644 index a7a5282a5..000000000 --- a/src/SMESH_SWIG/SMESH_test0.py +++ /dev/null @@ -1,63 +0,0 @@ -# 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 : SMESH_test0.py -# Module : SMESH - -import salome -import geompy -from geompy import geom -from geompy import gg - -import SMESH - -myBuilder = salome.myStudy.NewBuilder() - -# ---- 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, geompy.ShapeType["FACE"]) -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, geompy.ShapeType["SHELL"]) -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, geompy.ShapeType["EDGE"]) -edge = edgeList[0] -name = geompy.SubShapeName(edge, face) -print name -idedge = geompy.addToStudyInFather(face, edge, name) - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_test1.py b/src/SMESH_SWIG/SMESH_test1.py deleted file mode 100644 index c0b04299a..000000000 --- a/src/SMESH_SWIG/SMESH_test1.py +++ /dev/null @@ -1,157 +0,0 @@ -# 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 : SMESH_test1.py -# Module : SMESH - -import salome -import geompy - -import StdMeshers - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# ---- 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, geompy.ShapeType["FACE"]) -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, geompy.ShapeType["SHELL"]) -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, geompy.ShapeType["EDGE"]) -edge = edgeList[0] -name = geompy.SubShapeName(edge, face) -print name -idedge = geompy.addToStudyInFather(face, edge, name) - -# ---- launch SMESH - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -print "-------------------------- create Hypothesis" - -print "-------------------------- LocalLength" -hypLen1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") -hypLen1.SetLength(100) -print hypLen1.GetName() -print hypLen1.GetId() -print hypLen1.GetLength() - -idlength = salome.ObjectToID(hypLen1) -smeshgui.SetName(idlength, "Local_Length_100"); - -print "-------------------------- NumberOfSegments" -hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg1.SetNumberOfSegments(7) -print hypNbSeg1.GetName() -print hypNbSeg1.GetId() -print hypNbSeg1.GetNumberOfSegments() - -idseg = salome.ObjectToID(hypNbSeg1) -smeshgui.SetName(idseg, "NumberOfSegments_7"); - -print "-------------------------- MaxElementArea" -hypArea1 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea1.SetMaxElementArea(2500) -print hypArea1.GetName() -print hypArea1.GetId() -print hypArea1.GetMaxElementArea() - -idarea1 = salome.ObjectToID(hypArea1) -smeshgui.SetName(idarea1, "MaxElementArea_2500"); - -print "-------------------------- MaxElementArea" -hypArea2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea2.SetMaxElementArea(500) -print hypArea2.GetName() -print hypArea2.GetId() -print hypArea2.GetMaxElementArea() - -idarea2 = salome.ObjectToID(hypArea2) -smeshgui.SetName(idarea2, "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() - -idreg = salome.ObjectToID(algoReg) -smeshgui.SetName(idreg, "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() - -idmef = salome.ObjectToID(algoMef) -smeshgui.SetName(idmef, "MEFISTO_2D"); - -# ---- Init a Mesh with the box - -box = salome.IDToObject(idbox) -mesh = smesh.CreateMesh(box) -idmesh = salome.ObjectToID(mesh) -smeshgui.SetName(idmesh, "Meshbox"); - -print "-------------------------- add hypothesis to box" -mesh.AddHypothesis(box,algoReg) -mesh.AddHypothesis(box,hypNbSeg1) -mesh.AddHypothesis(box,algoMef) -mesh.AddHypothesis(box,hypArea1) - -# ---- add hypothesis to edge - -print "-------------------------- add hypothesis to edge" -edge = salome.IDToObject(idedge) -submesh = mesh.GetSubMesh(edge, "SubMeshEdge") -mesh.AddHypothesis(edge, algoReg) -mesh.AddHypothesis(edge, hypLen1) - -print "-------------------------- add hypothesis to face" -face = salome.IDToObject(idface) -submesh = mesh.GetSubMesh(face, "SubMeshFace") -mesh.AddHypothesis(face, hypArea2) - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_test2.py b/src/SMESH_SWIG/SMESH_test2.py deleted file mode 100644 index b552a1490..000000000 --- a/src/SMESH_SWIG/SMESH_test2.py +++ /dev/null @@ -1,65 +0,0 @@ -# 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 : SMESH_test2.py -# Module : SMESH - -from SMESH_test1 import * - -# ---- compute box - -print "-------------------------- compute box" -ret = smesh.Compute(mesh,box) -print ret -log = mesh.GetLog(0); # no erase trace -for linelog in log: - print linelog - -salome.sg.updateObjBrowser(1); - -# ---- compute edge - -##print "-------------------------- compute edge" -##ret=gen.Compute(mesh,idedge) -##print ret -##log=mesh.GetLog(1); -##for a in log: -## print a - -# ---- add hypothesis to face - -# ---- compute face - -#print "-------------------------- compute face" -#ret=gen.Compute(mesh,idface) -#print ret -#log=mesh.GetLog(1); -#for a in log: -# print a - -##shell=salome.IDToObject(ids) -##submesh=mesh.GetElementsOnShape(shell) -##ret=mesh.AddHypothesis(shell,algoReg) -##print ret -##ret=mesh.AddHypothesis(shell,hypLen1) -##print ret -##ret=gen.Compute(mesh,ids) -##print ret diff --git a/src/SMESH_SWIG/SMESH_test3.py b/src/SMESH_SWIG/SMESH_test3.py deleted file mode 100644 index e10501858..000000000 --- a/src/SMESH_SWIG/SMESH_test3.py +++ /dev/null @@ -1,94 +0,0 @@ -# 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 : SMESH_test3.py -# Module : SMESH - -#import salome -import math -import geompy - -pi = math.pi - -# --------------------------------------------- -xa = math.sin(pi/12) -ya = 0 -za = math.cos(pi/12) - -xb = 0 -yb = math.sin(pi/18) -zb = math.cos(pi/18) - -xc = math.cos(-pi/18) -yc = 0 -zc = math.sin(-pi/18) - -rc1 = 150 -rc2 = 150 -rc3 = 150 -rc4 = 300 - -hc1 = 300 -hc2 = 2*hc1 -hc3 = 2*hc1 -hc4 = 2*hc1 - -# --------------------------------------------- -point_0 = geompy.MakeVertex(0, 0, 0) -point_z = geompy.MakeVertex(0, 0, 1) - -point_a = geompy.MakeVertex(xa, ya, za) -point_b = geompy.MakeVertex(xb, yb, zb) -point_c = geompy.MakeVertex(xc, yc, zc) - -dir_z = geompy.MakeVector(point_0, point_z) -dir_a = geompy.MakeVector(point_0, point_a) -dir_b = geompy.MakeVector(point_0, point_b) -dir_c = geompy.MakeVector(point_0, point_c) - -axe_z = dir_z -axe_a = dir_a -axe_b = dir_b -axe_c = dir_c - -cyl_1 = geompy.MakeCylinder(point_0, dir_z, rc1, hc1) - -cyl_t = geompy.MakeCylinder(point_0, dir_a, rc2, hc2) -cyl_a = geompy.MakeTranslation(cyl_t, 1.2*rc1, 0.1*rc1, -0.5*hc1) - -cyl_t = geompy.MakeCylinder(point_0, dir_b, rc3, hc3) -cyl_b = geompy.MakeTranslation(cyl_t, -1.2*rc1, -0.1*rc1, -0.5*hc1) - -cyl_t = geompy.MakeCylinder(point_0, dir_c, rc4, hc4) -cyl_t = geompy.MakeRotation(cyl_t, axe_c, pi/2) -cyl_c = geompy.MakeTranslation(cyl_t, -hc1, 0, 0) -cyl_d = geompy.MakeTranslation(cyl_t, -hc1, 0, 1.3*rc4) - -inter_t = geompy.MakeBoolean(cyl_c,cyl_d, 1) # common - -blob_t = geompy.MakeBoolean(cyl_1, cyl_a, 2) # cut -blob_t = geompy.MakeBoolean(blob_t, cyl_b, 2) - -blob = geompy.MakeBoolean(blob_t, inter_t, 1) # common - -idblob = geompy.addToStudy(blob,"blob") -#idc = geompy.addToStudy(cyl_c,"cyl_c") -#idd = geompy.addToStudy(cyl_d,"cyl_d") diff --git a/src/SMESH_SWIG/SMESH_test4.py b/src/SMESH_SWIG/SMESH_test4.py deleted file mode 100755 index 09271b6f1..000000000 --- a/src/SMESH_SWIG/SMESH_test4.py +++ /dev/null @@ -1,52 +0,0 @@ -import salome -import geompy -import SMESH -import StdMeshers - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) -idbox = geompy.addToStudy(box, "box") - -subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) -face = subShapeList[0] -name = geompy.SubShapeName(face, box) -idface = geompy.addToStudyInFather(box, face, name) - -box = salome.IDToObject(idbox) -face = salome.IDToObject(idface) - -hyp1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hyp1.SetNumberOfSegments(10) -hyp2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hyp2.SetMaxElementArea(10) -hyp3 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hyp3.SetMaxElementArea(100) - -algo1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -algo2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") - -mesh = smesh.CreateMesh(box) -mesh.AddHypothesis(box,hyp1) -mesh.AddHypothesis(box,hyp2) -mesh.AddHypothesis(box,algo1) -mesh.AddHypothesis(box,algo2) - -submesh = mesh.GetSubMesh(face, "SubMeshFace") -mesh.AddHypothesis(face,hyp1) -mesh.AddHypothesis(face,hyp3) -mesh.AddHypothesis(face,algo1) -mesh.AddHypothesis(face,algo2) - -smesh.Compute(mesh,box) - -faces = submesh.GetElementsByType(SMESH.FACE) -if len(faces) > 1: - print len(faces), len(faces)/2 - group1 = mesh.CreateGroup(SMESH.FACE,"Group of faces") - group2 = mesh.CreateGroup(SMESH.FACE,"Another group of faces") - group1.Add(faces[:int(len(faces)/2)]) - group2.Add(faces[int(len(faces)/2):]) - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/batchmode_mefisto.py b/src/SMESH_SWIG/batchmode_mefisto.py deleted file mode 100644 index 203b1602e..000000000 --- a/src/SMESH_SWIG/batchmode_mefisto.py +++ /dev/null @@ -1,136 +0,0 @@ -import os -import re - -import batchmode_salome -import batchmode_geompy -import batchmode_smesh -import StdMeshers - -smesh = batchmode_smesh.smesh -smesh.SetCurrentStudy(batchmode_salome.myStudy) - -def CreateMesh (theFileName, area, len = None, nbseg = None): - - if not(os.path.isfile(theFileName)) or re.search("\.brep$", theFileName) is None : - print "Incorrect file name !" - return - - if (len is None) and (nbseg is None): - print "Define length or number of segments !" - return - - if (len is not None) and (nbseg is not None): - print "Only one Hypothesis (from length and number of segments) can be defined !" - return - - - # ---- Import shape from BREP file and add it to the study - shape_mesh = batchmode_geompy.Import(theFileName, "BREP") - Id_shape = batchmode_geompy.addToStudy(shape_mesh, "shape_mesh") - - - # ---- SMESH - - print "-------------------------- create Hypothesis" - if (len is not None): - print "-------------------------- LocalLength" - hypLength1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") - hypLength1.SetLength(len) - print "Hypothesis type : ", hypLength1.GetName() - print "Hypothesis ID : ", hypLength1.GetId() - print "Hypothesis Value: ", hypLength1.GetLength() - - if (nbseg is not None): - print "-------------------------- NumberOfSegments" - hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") - hypNbSeg1.SetNumberOfSegments(nbseg) - print "Hypothesis type : ", hypNbSeg1.GetName() - print "Hypothesis ID : ", hypNbSeg1.GetId() - print "Hypothesis Value: ", hypNbSeg1.GetNumberOfSegments() - - if (area == "LengthFromEdges"): - print "-------------------------- LengthFromEdges" - hypLengthFromEdges = smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so") - hypLengthFromEdges.SetMode(1) - print "Hypothesis type : ", hypLengthFromEdges.GetName() - print "Hypothesis ID : ", hypLengthFromEdges.GetId() - print "LengthFromEdges Mode: ", hypLengthFromEdges.GetMode() - - else: - print "-------------------------- MaxElementArea" - hypArea1 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") - hypArea1.SetMaxElementArea(area) - print "Hypothesis type : ", hypArea1.GetName() - print "Hypothesis ID : ", hypArea1.GetId() - print "Hypothesis Value: ", hypArea1.GetMaxElementArea() - - - print "-------------------------- Regular_1D" - algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") - - listHyp = algoReg.GetCompatibleHypothesis() - for hyp in listHyp: - print hyp - - print "Algo name: ", algoReg.GetName() - print "Algo ID : ", algoReg.GetId() - - print "-------------------------- MEFISTO_2D" - algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") - - listHyp = algoMef.GetCompatibleHypothesis() - for hyp in listHyp: - print hyp - - print "Algo name: ", algoMef.GetName() - print "Algo ID : ", algoMef.GetId() - - - # ---- add hypothesis to shape - - print "-------------------------- add hypothesis to shape" - mesh = smesh.CreateMesh(shape_mesh) - - ret = mesh.AddHypothesis(shape_mesh, algoReg) - print "Add Regular_1D algo .... ", - print ret - - if (nbseg is not None): - ret = mesh.AddHypothesis(shape_mesh, hypNbSeg1) - print "Add Number Of Segements algo .... ", - print ret - - if (len is not None): - ret = mesh.AddHypothesis(shape_mesh,hypLength1) - print "Add Local Length algo .... ", - print ret - - ret = mesh.AddHypothesis(shape_mesh, algoMef) - print "Add MEFISTO_2D algo....", - print ret - - if (area == "LengthFromEdges"): - ret = mesh.AddHypothesis( shape_mesh, hypLengthFromEdges) # length from edge - print "Add Length From Edges algo .... ", - print ret - else: - ret = mesh.AddHypothesis(shape_mesh, hypArea1) - print "Add Max Triangle Area algo .... ", - print ret - - print "-------------------------- compute mesh" - ret = smesh.Compute(mesh,shape_mesh) - print "Compute Mesh .... ", - print ret - log = mesh.GetLog(0); # no erase trace - #for linelog in log: - # print linelog - - print "------------ INFORMATION ABOUT MESH ------------" - - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles: ", mesh.NbTriangles() - - return mesh diff --git a/src/SMESH_SWIG/batchmode_smesh.py b/src/SMESH_SWIG/batchmode_smesh.py deleted file mode 100644 index 4964c8b0c..000000000 --- a/src/SMESH_SWIG/batchmode_smesh.py +++ /dev/null @@ -1,304 +0,0 @@ -# Copyright (C) 2003 CEA/DEN, EDF R&D -# -# -# -# File : batchmode_smesh.py -# Author : Oksana TCHEBANOVA -# Module : SMESH -# $Header$ - -from batchmode_salome import * -from batchmode_geompy import ShapeType -import SMESH - -#-------------------------------------------------------------------------- -modulecatalog = naming_service.Resolve("/Kernel/ModulCatalog") - -smesh = lcc.FindOrLoadComponent("FactoryServer", "SMESH") -myStudyBuilder = myStudy.NewBuilder() - -if myStudyBuilder is None: - raise RuntimeError, " Null myStudyBuilder" - -father = myStudy.FindComponent("SMESH") -if father is None: - father = myStudyBuilder.NewComponent("SMESH") - FName = myStudyBuilder.FindOrCreateAttribute(father, "AttributeName") - Comp = modulecatalog.GetComponent("SMESH") - FName.SetValue(Comp._get_componentusername()) - aPixmap = myStudyBuilder.FindOrCreateAttribute(father, "AttributePixMap") - aPixmap.SetPixMap("ICON_OBJBROWSER_Mesh") - -myStudyBuilder.DefineComponentInstance(father,smesh) - -mySComponentMesh = father._narrow(SALOMEDS.SComponent) - -Tag_HypothesisRoot = 1 -Tag_AlgorithmsRoot = 2 - -Tag_RefOnShape = 1 -Tag_RefOnAppliedHypothesis = 2 -Tag_RefOnAppliedAlgorithms = 3 - -Tag_SubMeshOnVertex = 4 -Tag_SubMeshOnEdge = 5 -Tag_SubMeshOnFace = 6 -Tag_SubMeshOnSolid = 7 -Tag_SubMeshOnCompound = 8 - -Tag = {"HypothesisRoot":1,"AlgorithmsRoot":2,"RefOnShape":1,"RefOnAppliedHypothesis":2,"RefOnAppliedAlgorithms":3,"SubMeshOnVertex":4,"SubMeshOnEdge":5,"SubMeshOnFace":6,"SubMeshOnSolid":7,"SubMeshOnCompound":8} - -#------------------------------------------------------------ -def Init(): - pass -#------------------------------------------------------------ -def AddNewMesh(IOR): - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - - res,HypothesisRoot = mySComponentMesh.FindSubObject ( Tag_HypothesisRoot ) - if HypothesisRoot is None or res == 0: - HypothesisRoot = myStudyBuilder.NewObjectToTag(mySComponentMesh, Tag_HypothesisRoot) - aName = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName") - aName.SetValue("Hypotheses") - aPixmap = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_hypo.png" ) - aSelAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - - res, AlgorithmsRoot = mySComponentMesh.FindSubObject (Tag_AlgorithmsRoot) - if AlgorithmsRoot is None or res == 0: - AlgorithmsRoot = myStudyBuilder.NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot) - aName = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName") - aName.SetValue("Algorithms") - aPixmap = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_algo.png" ) - aSelAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - - HypothesisRoot = HypothesisRoot._narrow(SALOMEDS.SObject) - newMesh = myStudyBuilder.NewObject(mySComponentMesh) - aPixmap = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_mesh.png" ) - anIOR = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributeIOR") - anIOR.SetValue(IOR) - return newMesh.GetID() - -#------------------------------------------------------------ -def AddNewHypothesis(IOR): - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - - res, HypothesisRoot = mySComponentMesh.FindSubObject (Tag_HypothesisRoot) - if HypothesisRoot is None or res == 0: - HypothesisRoot = myStudyBuilder.NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot) - aName = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName") - aName.SetValue("Hypotheses") - aSelAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - aPixmap = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_hypo.png" ) - - # Add New Hypothesis - newHypo = myStudyBuilder.NewObject(HypothesisRoot) - aPixmap = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap") - H = orb.string_to_object(IOR) - aType = H.GetName() - aPixmap.SetPixMap( "mesh_tree_hypo.png_" + aType ) - anIOR = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR") - anIOR.SetValue(IOR) - return newHypo.GetID() - -#------------------------------------------------------------ -def AddNewAlgorithms(IOR): - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - - res, AlgorithmsRoot = mySComponentMesh.FindSubObject (Tag_AlgorithmsRoot) - if AlgorithmsRoot is None or res == 0: - AlgorithmsRoot = myStudyBuilde.NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot) - aName = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName") - aName.SetValue("Algorithms") - aSelAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - aPixmap = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_algo.png" ) - - # Add New Algorithms - newHypo = myStudyBuilder.NewObject(AlgorithmsRoot) - aPixmap = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap") - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap) - H = orb.string_to_object(IOR) - aType = H.GetName(); #QString in fact - aPixmap.SetPixMap( "mesh_tree_algo.png_" + aType ) - anIOR = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR") - anIOR.SetValue(IOR) - return newHypo.GetID() - - -#------------------------------------------------------------ -def SetShape(ShapeEntry, MeshEntry): - SO_MorSM = myStudy.FindObjectID( MeshEntry ) - SO_GeomShape = myStudy.FindObjectID( ShapeEntry ) - - if SO_MorSM is not None and SO_GeomShape is not None : - # VSR: added temporarily - shape reference is published automatically by the engine - res, Ref = SO_MorSM.FindSubObject( Tag_RefOnShape ) - if res == 1 : - return - # VSR ###################################################################### - - SO = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnShape) - myStudyBuilder.Addreference (SO,SO_GeomShape) - - -#------------------------------------------------------------ -def SetHypothesis(Mesh_Or_SubMesh_Entry, Hypothesis_Entry): - SO_MorSM = myStudy.FindObjectID( Mesh_Or_SubMesh_Entry ) - SO_Hypothesis = myStudy.FindObjectID( Hypothesis_Entry ) - - if SO_MorSM is not None and SO_Hypothesis is not None : - - #Find or Create Applied Hypothesis root - res, AHR = SO_MorSM.FindSubObject (Tag_RefOnAppliedHypothesis) - if AHR is None or res == 0: - AHR = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis) - aName = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName") - - # The same name as in SMESH_Mesh_i::AddHypothesis() ################## - aName.SetValue("Applied hypotheses") - - aSelAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable") - aSelAttr.SetSelectable(0) - aPixmap = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_hypo.png" ) - - # VSR: added temporarily - reference to applied hypothesis is published automatically by the engine - else : - it = myStudy.NewChildIterator(AHR) - while it.More() : - res, Ref = it.Value().ReferencedObject() - if res and Ref is not None and Ref.GetID() == Hypothesis_Entry : - return - it.Next() - # VSR ###################################################################### - - SO = myStudyBuilder.NewObject(AHR) - myStudyBuilder.Addreference (SO,SO_Hypothesis) - -#------------------------------------------------------------ -def SetAlgorithms(Mesh_Or_SubMesh_Entry, Algorithms_Entry): - SO_MorSM = myStudy.FindObjectID( Mesh_Or_SubMesh_Entry ) - SO_Algorithms = myStudy.FindObjectID( Algorithms_Entry ) - if SO_MorSM != None and SO_Algorithms != None : - #Find or Create Applied Algorithms root - res, AHR = SO_MorSM.FindSubObject (Tag_RefOnAppliedAlgorithms) - if AHR is None or res == 0: - AHR = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms) - aName = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName") - - # The same name as in SMESH_Mesh_i::AddHypothesis() ################## - aName.SetValue("Applied algorithms") - - aSelAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable") - aSelAttr.SetSelectable(0) - aPixmap = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_algo.png" ) - - # VSR: added temporarily - reference to applied hypothesis is published automatically by the engine - else : - it = myStudy.NewChildIterator(AHR) - while it.More() : - res, Ref = it.Value().ReferencedObject() - if res and Ref is not None and Ref.GetID() == Algorithms_Entry : - return - it.Next() - # VSR ###################################################################### - - SO = myStudyBuilder.NewObject(AHR) - myStudyBuilder.Addreference (SO,SO_Algorithms) - - -#------------------------------------------------------------ -def UnSetHypothesis( Applied_Hypothesis_Entry ): - SO_Applied_Hypothesis = myStudy.FindObjectID( Applied_Hypothesis_Entry ) - if SO_Applied_Hypothesis : - myStudyBuilder.RemoveObject(SO_Applied_Hypothesis) - - -#------------------------------------------------------------ -def AddSubMesh ( SO_Mesh_Entry, SM_IOR, ST): - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( SM_IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - - SO_Mesh = myStudy.FindObjectID( SO_Mesh_Entry ) - if ( SO_Mesh ) : - - if ST == ShapeType["COMPSOLID"] : - Tag_Shape = Tag_SubMeshOnSolid - Name = "SubMeshes on Solid" - elif ST == ShapeType["FACE"] : - Tag_Shape = Tag_SubMeshOnFace - Name = "SubMeshes on Face" - elif ST == ShapeType["EDGE"] : - Tag_Shape = Tag_SubMeshOnEdge - Name = "SubMeshes on Edge" - elif ST == ShapeType["VERTEX"] : - Tag_Shape = Tag_SubMeshOnVertex - Name = "SubMeshes on Vertex" - else : - Tag_Shape = Tag_SubMeshOnCompound - Name = "SubMeshes on Compound" - - res, SubmeshesRoot = SO_Mesh.FindSubObject (Tag_Shape) - if SubmeshesRoot is None or res == 0: - SubmeshesRoot = myStudyBuilder.NewObjectToTag (SO_Mesh, Tag_Shape) - aName = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeName") - aName.SetValue(Name) - aSelAttr = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - - SO = myStudyBuilder.NewObject (SubmeshesRoot) - anIOR = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeIOR") - anIOR.SetValue(SM_IOR) - return SO.GetID() - - return None - -#------------------------------------------------------------ -def AddSubMeshOnShape (Mesh_Entry, GeomShape_Entry, SM_IOR, ST) : - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( SM_IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - SO_GeomShape = myStudy.FindObjectID( GeomShape_Entry ) - if SO_GeomShape != None : - SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST) - SO_SM = myStudy.FindObjectID( SM_Entry ) - - if SO_SM != None : - SetShape (GeomShape_Entry, SM_Entry) - return SM_Entry - - return None - - -#------------------------------------------------------------ -def SetName(Entry, Name): - SO = myStudy.FindObjectID( Entry ) - if SO != None : - aName = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeName") - aName.SetValue(Name) diff --git a/src/SMESH_SWIG/ex00_all.py b/src/SMESH_SWIG/ex00_all.py deleted file mode 100644 index b1aa726b2..000000000 --- a/src/SMESH_SWIG/ex00_all.py +++ /dev/null @@ -1,25 +0,0 @@ -# CEA/LGLS 2005, Francis KLOSS (OCC) -# ================================== - -# Load all examples -# ----------------- - -import ex01_cube2build -import ex02_cube2primitive -import ex03_cube2partition -import ex04_cube5tetraHexa -import ex05_hole1build -import ex06_hole1boolean -import ex07_hole1partition -import ex08_hole2build -import ex09_grid4build -import ex10_grid4geometry -import ex11_grid3partition -import ex12_grid17partition -import ex13_hole1partial -import ex14_cyl1holed -import ex15_cyl2geometry -import ex16_cyl2complementary -import ex17_dome1 -import ex18_dome2 -import ex19_sphereINcube diff --git a/src/SMESH_SWIG/ex01_cube2build.py b/src/SMESH_SWIG/ex01_cube2build.py deleted file mode 100644 index 02b5b1506..000000000 --- a/src/SMESH_SWIG/ex01_cube2build.py +++ /dev/null @@ -1,293 +0,0 @@ -# CEA/LGLS 2004-2005, Francis KLOSS (OCC) -# ======================================= - -from geompy import * - -import smesh - -# Geometry -# ======== - -# A small cube centered and put on a great cube build by points, edges, faces and solids - -# Points -# ------ - -greatPoint111 = MakeVertex( 0, 0, 0) -greatPoint211 = MakeVertex(10, 0, 0) -greatPoint311 = MakeVertex(20, 0, 0) -greatPoint411 = MakeVertex(30, 0, 0) - -greatPoint121 = MakeVertex( 0, 10, 0) -greatPoint221 = MakeVertex(10, 10, 0) -greatPoint321 = MakeVertex(20, 10, 0) -greatPoint421 = MakeVertex(30, 10, 0) - -greatPoint112 = MakeVertex( 0, 0, 10) -greatPoint212 = MakeVertex(10, 0, 10) -greatPoint312 = MakeVertex(20, 0, 10) -greatPoint412 = MakeVertex(30, 0, 10) - -greatPoint122 = MakeVertex( 0, 10, 10) -greatPoint222 = MakeVertex(10, 10, 10) -greatPoint322 = MakeVertex(20, 10, 10) -greatPoint422 = MakeVertex(30, 10, 10) - -greatPoint113 = MakeVertex( 0, 0, 20) -greatPoint213 = MakeVertex(10, 0, 20) -greatPoint313 = MakeVertex(20, 0, 20) -greatPoint413 = MakeVertex(30, 0, 20) - -greatPoint123 = MakeVertex( 0, 10, 20) -greatPoint223 = MakeVertex(10, 10, 20) -greatPoint323 = MakeVertex(20, 10, 20) -greatPoint423 = MakeVertex(30, 10, 20) - -greatPoint114 = MakeVertex( 0, 0, 30) -greatPoint214 = MakeVertex(10, 0, 30) -greatPoint314 = MakeVertex(20, 0, 30) -greatPoint414 = MakeVertex(30, 0, 30) - -greatPoint124 = MakeVertex( 0, 10, 30) -greatPoint224 = MakeVertex(10, 10, 30) -greatPoint324 = MakeVertex(20, 10, 30) -greatPoint424 = MakeVertex(30, 10, 30) - - -smallPoint111 = greatPoint222 -smallPoint211 = greatPoint322 -smallPoint121 = MakeVertex(10, 20, 10) -smallPoint221 = MakeVertex(20, 20, 10) - -smallPoint112 = greatPoint223 -smallPoint212 = greatPoint323 -smallPoint122 = MakeVertex(10, 20, 20) -smallPoint222 = MakeVertex(20, 20, 20) - -# Edges -# ----- - -smallEdgeX11 = MakeEdge(smallPoint111, smallPoint211) -smallEdgeX21 = MakeEdge(smallPoint121, smallPoint221) -smallEdgeX12 = MakeEdge(smallPoint112, smallPoint212) -smallEdgeX22 = MakeEdge(smallPoint122, smallPoint222) - -smallEdgeY11 = MakeEdge(smallPoint111, smallPoint121) -smallEdgeY21 = MakeEdge(smallPoint211, smallPoint221) -smallEdgeY12 = MakeEdge(smallPoint112, smallPoint122) -smallEdgeY22 = MakeEdge(smallPoint212, smallPoint222) - -smallEdgeZ11 = MakeEdge(smallPoint111, smallPoint112) -smallEdgeZ21 = MakeEdge(smallPoint211, smallPoint212) -smallEdgeZ12 = MakeEdge(smallPoint121, smallPoint122) -smallEdgeZ22 = MakeEdge(smallPoint221, smallPoint222) - - -greatEdgeX111 = MakeEdge(greatPoint111, greatPoint211) -greatEdgeX211 = MakeEdge(greatPoint211, greatPoint311) -greatEdgeX311 = MakeEdge(greatPoint311, greatPoint411) -greatEdgeX121 = MakeEdge(greatPoint121, greatPoint221) -greatEdgeX221 = MakeEdge(greatPoint221, greatPoint321) -greatEdgeX321 = MakeEdge(greatPoint321, greatPoint421) - -greatEdgeX112 = MakeEdge(greatPoint112, greatPoint212) -greatEdgeX212 = MakeEdge(greatPoint212, greatPoint312) -greatEdgeX312 = MakeEdge(greatPoint312, greatPoint412) -greatEdgeX122 = MakeEdge(greatPoint122, greatPoint222) -greatEdgeX222 = smallEdgeX11 -greatEdgeX322 = MakeEdge(greatPoint322, greatPoint422) - -greatEdgeX113 = MakeEdge(greatPoint113, greatPoint213) -greatEdgeX213 = MakeEdge(greatPoint213, greatPoint313) -greatEdgeX313 = MakeEdge(greatPoint313, greatPoint413) -greatEdgeX123 = MakeEdge(greatPoint123, greatPoint223) -greatEdgeX223 = smallEdgeX12 -greatEdgeX323 = MakeEdge(greatPoint323, greatPoint423) - -greatEdgeX114 = MakeEdge(greatPoint114, greatPoint214) -greatEdgeX214 = MakeEdge(greatPoint214, greatPoint314) -greatEdgeX314 = MakeEdge(greatPoint314, greatPoint414) -greatEdgeX124 = MakeEdge(greatPoint124, greatPoint224) -greatEdgeX224 = MakeEdge(greatPoint224, greatPoint324) -greatEdgeX324 = MakeEdge(greatPoint324, greatPoint424) - -greatEdgeY11 = MakeEdge(greatPoint111, greatPoint121) -greatEdgeY21 = MakeEdge(greatPoint211, greatPoint221) -greatEdgeY31 = MakeEdge(greatPoint311, greatPoint321) -greatEdgeY41 = MakeEdge(greatPoint411, greatPoint421) - -greatEdgeY12 = MakeEdge(greatPoint112, greatPoint122) -greatEdgeY22 = MakeEdge(greatPoint212, greatPoint222) -greatEdgeY32 = MakeEdge(greatPoint312, greatPoint322) -greatEdgeY42 = MakeEdge(greatPoint412, greatPoint422) - -greatEdgeY13 = MakeEdge(greatPoint113, greatPoint123) -greatEdgeY23 = MakeEdge(greatPoint213, greatPoint223) -greatEdgeY33 = MakeEdge(greatPoint313, greatPoint323) -greatEdgeY43 = MakeEdge(greatPoint413, greatPoint423) - -greatEdgeY14 = MakeEdge(greatPoint114, greatPoint124) -greatEdgeY24 = MakeEdge(greatPoint214, greatPoint224) -greatEdgeY34 = MakeEdge(greatPoint314, greatPoint324) -greatEdgeY44 = MakeEdge(greatPoint414, greatPoint424) - -greatEdgeZ111 = MakeEdge(greatPoint111, greatPoint112) -greatEdgeZ211 = MakeEdge(greatPoint211, greatPoint212) -greatEdgeZ311 = MakeEdge(greatPoint311, greatPoint312) -greatEdgeZ411 = MakeEdge(greatPoint411, greatPoint412) - -greatEdgeZ121 = MakeEdge(greatPoint121, greatPoint122) -greatEdgeZ221 = MakeEdge(greatPoint221, greatPoint222) -greatEdgeZ321 = MakeEdge(greatPoint321, greatPoint322) -greatEdgeZ421 = MakeEdge(greatPoint421, greatPoint422) - -greatEdgeZ112 = MakeEdge(greatPoint112, greatPoint113) -greatEdgeZ212 = MakeEdge(greatPoint212, greatPoint213) -greatEdgeZ312 = MakeEdge(greatPoint312, greatPoint313) -greatEdgeZ412 = MakeEdge(greatPoint412, greatPoint413) - -greatEdgeZ122 = MakeEdge(greatPoint122, greatPoint123) -greatEdgeZ222 = smallEdgeZ11 -greatEdgeZ322 = smallEdgeZ21 -greatEdgeZ422 = MakeEdge(greatPoint422, greatPoint423) - -greatEdgeZ113 = MakeEdge(greatPoint113, greatPoint114) -greatEdgeZ213 = MakeEdge(greatPoint213, greatPoint214) -greatEdgeZ313 = MakeEdge(greatPoint313, greatPoint314) -greatEdgeZ413 = MakeEdge(greatPoint413, greatPoint414) - -greatEdgeZ123 = MakeEdge(greatPoint123, greatPoint124) -greatEdgeZ223 = MakeEdge(greatPoint223, greatPoint224) -greatEdgeZ323 = MakeEdge(greatPoint323, greatPoint324) -greatEdgeZ423 = MakeEdge(greatPoint423, greatPoint424) - -# Faces -# ----- - -smallFaceX1 = MakeQuad(smallEdgeY11, smallEdgeZ11, smallEdgeY12, smallEdgeZ12) -smallFaceX2 = MakeQuad(smallEdgeY21, smallEdgeZ21, smallEdgeY22, smallEdgeZ22) -smallFaceY1 = MakeQuad(smallEdgeX11, smallEdgeZ11, smallEdgeX12, smallEdgeZ21) -smallFaceY2 = MakeQuad(smallEdgeX21, smallEdgeZ12, smallEdgeX22, smallEdgeZ22) -smallFaceZ1 = MakeQuad(smallEdgeX11, smallEdgeY11, smallEdgeX21, smallEdgeY21) -smallFaceZ2 = MakeQuad(smallEdgeX12, smallEdgeY12, smallEdgeX22, smallEdgeY22) - - -greatFaceX11 = MakeQuad(greatEdgeY11, greatEdgeZ111, greatEdgeY12, greatEdgeZ121) -greatFaceX21 = MakeQuad(greatEdgeY21, greatEdgeZ211, greatEdgeY22, greatEdgeZ221) -greatFaceX31 = MakeQuad(greatEdgeY31, greatEdgeZ311, greatEdgeY32, greatEdgeZ321) -greatFaceX41 = MakeQuad(greatEdgeY41, greatEdgeZ411, greatEdgeY42, greatEdgeZ421) - -greatFaceX12 = MakeQuad(greatEdgeY12, greatEdgeZ112, greatEdgeY13, greatEdgeZ122) -greatFaceX22 = MakeQuad(greatEdgeY22, greatEdgeZ212, greatEdgeY23, greatEdgeZ222) -greatFaceX32 = MakeQuad(greatEdgeY32, greatEdgeZ312, greatEdgeY33, greatEdgeZ322) -greatFaceX42 = MakeQuad(greatEdgeY42, greatEdgeZ412, greatEdgeY43, greatEdgeZ422) - -greatFaceX13 = MakeQuad(greatEdgeY13, greatEdgeZ113, greatEdgeY14, greatEdgeZ123) -greatFaceX23 = MakeQuad(greatEdgeY23, greatEdgeZ213, greatEdgeY24, greatEdgeZ223) -greatFaceX33 = MakeQuad(greatEdgeY33, greatEdgeZ313, greatEdgeY34, greatEdgeZ323) -greatFaceX43 = MakeQuad(greatEdgeY43, greatEdgeZ413, greatEdgeY44, greatEdgeZ423) - -greatFaceY111 = MakeQuad(greatEdgeX111, greatEdgeZ111, greatEdgeX112, greatEdgeZ211) -greatFaceY211 = MakeQuad(greatEdgeX211, greatEdgeZ211, greatEdgeX212, greatEdgeZ311) -greatFaceY311 = MakeQuad(greatEdgeX311, greatEdgeZ311, greatEdgeX312, greatEdgeZ411) -greatFaceY121 = MakeQuad(greatEdgeX121, greatEdgeZ121, greatEdgeX122, greatEdgeZ221) -greatFaceY221 = MakeQuad(greatEdgeX221, greatEdgeZ221, greatEdgeX222, greatEdgeZ321) -greatFaceY321 = MakeQuad(greatEdgeX321, greatEdgeZ321, greatEdgeX322, greatEdgeZ421) - -greatFaceY112 = MakeQuad(greatEdgeX112, greatEdgeZ112, greatEdgeX113, greatEdgeZ212) -greatFaceY212 = MakeQuad(greatEdgeX212, greatEdgeZ212, greatEdgeX213, greatEdgeZ312) -greatFaceY312 = MakeQuad(greatEdgeX312, greatEdgeZ312, greatEdgeX313, greatEdgeZ412) -greatFaceY122 = MakeQuad(greatEdgeX122, greatEdgeZ122, greatEdgeX123, greatEdgeZ222) -greatFaceY222 = smallFaceY1 -greatFaceY322 = MakeQuad(greatEdgeX322, greatEdgeZ322, greatEdgeX323, greatEdgeZ422) - -greatFaceY113 = MakeQuad(greatEdgeX113, greatEdgeZ113, greatEdgeX114, greatEdgeZ213) -greatFaceY213 = MakeQuad(greatEdgeX213, greatEdgeZ213, greatEdgeX214, greatEdgeZ313) -greatFaceY313 = MakeQuad(greatEdgeX313, greatEdgeZ313, greatEdgeX314, greatEdgeZ413) -greatFaceY123 = MakeQuad(greatEdgeX123, greatEdgeZ123, greatEdgeX124, greatEdgeZ223) -greatFaceY223 = MakeQuad(greatEdgeX223, greatEdgeZ223, greatEdgeX224, greatEdgeZ323) -greatFaceY323 = MakeQuad(greatEdgeX323, greatEdgeZ323, greatEdgeX324, greatEdgeZ423) - -greatFaceZ11 = MakeQuad(greatEdgeX111, greatEdgeY11, greatEdgeX121, greatEdgeY21) -greatFaceZ21 = MakeQuad(greatEdgeX211, greatEdgeY21, greatEdgeX221, greatEdgeY31) -greatFaceZ31 = MakeQuad(greatEdgeX311, greatEdgeY31, greatEdgeX321, greatEdgeY41) - -greatFaceZ12 = MakeQuad(greatEdgeX112, greatEdgeY12, greatEdgeX122, greatEdgeY22) -greatFaceZ22 = MakeQuad(greatEdgeX212, greatEdgeY22, greatEdgeX222, greatEdgeY32) -greatFaceZ32 = MakeQuad(greatEdgeX312, greatEdgeY32, greatEdgeX322, greatEdgeY42) - -greatFaceZ13 = MakeQuad(greatEdgeX113, greatEdgeY13, greatEdgeX123, greatEdgeY23) -greatFaceZ23 = MakeQuad(greatEdgeX213, greatEdgeY23, greatEdgeX223, greatEdgeY33) -greatFaceZ33 = MakeQuad(greatEdgeX313, greatEdgeY33, greatEdgeX323, greatEdgeY43) - -greatFaceZ14 = MakeQuad(greatEdgeX114, greatEdgeY14, greatEdgeX124, greatEdgeY24) -greatFaceZ24 = MakeQuad(greatEdgeX214, greatEdgeY24, greatEdgeX224, greatEdgeY34) -greatFaceZ34 = MakeQuad(greatEdgeX314, greatEdgeY34, greatEdgeX324, greatEdgeY44) - -# Solids -# ------ - -smallBlock = MakeHexa(smallFaceX1, smallFaceX2, smallFaceY1, smallFaceY2, smallFaceZ1, smallFaceZ2) - -greatBlock11 = MakeHexa(greatFaceX11, greatFaceX21, greatFaceY111, greatFaceY121, greatFaceZ11, greatFaceZ12) -greatBlock21 = MakeHexa(greatFaceX21, greatFaceX31, greatFaceY211, greatFaceY221, greatFaceZ21, greatFaceZ22) -greatBlock31 = MakeHexa(greatFaceX31, greatFaceX41, greatFaceY311, greatFaceY321, greatFaceZ31, greatFaceZ32) - -greatBlock12 = MakeHexa(greatFaceX12, greatFaceX22, greatFaceY112, greatFaceY122, greatFaceZ12, greatFaceZ13) -greatBlock22 = MakeHexa(greatFaceX22, greatFaceX32, greatFaceY212, greatFaceY222, greatFaceZ22, greatFaceZ23) -greatBlock32 = MakeHexa(greatFaceX32, greatFaceX42, greatFaceY312, greatFaceY322, greatFaceZ32, greatFaceZ33) - -greatBlock13 = MakeHexa(greatFaceX13, greatFaceX23, greatFaceY113, greatFaceY123, greatFaceZ13, greatFaceZ14) -greatBlock23 = MakeHexa(greatFaceX23, greatFaceX33, greatFaceY213, greatFaceY223, greatFaceZ23, greatFaceZ24) -greatBlock33 = MakeHexa(greatFaceX33, greatFaceX43, greatFaceY313, greatFaceY323, greatFaceZ33, greatFaceZ34) - -# Compound -# -------- - -c_l = [] -c_l.append(smallBlock) -c_l.append(greatBlock11) -c_l.append(greatBlock21) -c_l.append(greatBlock31) -c_l.append(greatBlock12) -c_l.append(greatBlock22) -c_l.append(greatBlock32) -c_l.append(greatBlock13) -c_l.append(greatBlock23) -c_l.append(greatBlock33) - -piece = MakeCompound(c_l) - -# Add in study -# ------------ - -piece_id = addToStudy(piece, "ex01_cube2build") - -# Meshing -# ======= - -# Create hexahedrical mesh on piece -# --------------------------------- - -hexa = smesh.Mesh(piece, "ex01_cube2build:hexa") - -algo = hexa.Segment() -algo.NumberOfSegments(4) - -hexa.Quadrangle() - -hexa.Hexahedron() - -# Create local hypothesis -# ----------------------- - -algo = hexa.Segment(greatEdgeX111) - -algo.Arithmetic1D(1, 4) - -algo.Propagation() - -# Compute the mesh -# ---------------- - -hexa.Compute() diff --git a/src/SMESH_SWIG/ex02_cube2primitive.py b/src/SMESH_SWIG/ex02_cube2primitive.py deleted file mode 100644 index 747507211..000000000 --- a/src/SMESH_SWIG/ex02_cube2primitive.py +++ /dev/null @@ -1,95 +0,0 @@ -# CEA/LGLS 2004-2005, Francis KLOSS (OCC) -# ======================================= - -from geompy import * - -import smesh - -# Geometry -# ======== - -# A small cube centered and put on a great cube build by primitive geometric functionalities - -# Values -# ------ - -ox = 0 -oy = 0 -oz = 0 - -arete = 10 - -# Points -# ------ - -blockPoint111 = MakeVertex(ox , oy, oz) -blockPoint211 = MakeVertex(ox+arete, oy, oz) -blockPoint112 = MakeVertex(ox , oy, oz+arete) -blockPoint212 = MakeVertex(ox+arete, oy, oz+arete) - -# Face and solid -# -------------- - -blockFace1 = MakeQuad4Vertices(blockPoint111, blockPoint211, blockPoint212, blockPoint112) - -blockSolid11 = MakePrismVecH(blockFace1, MakeVectorDXDYDZ(0, 1, 0), arete) - -# Translations -# ------------ - -blockSolid21 = MakeTranslation(blockSolid11, arete, 0, 0) -blockSolid31 = MakeTranslation(blockSolid21, arete, 0, 0) - -blockSolid12 = MakeTranslation(blockSolid11, 0, 0, arete) -blockSolid22 = MakeTranslation(blockSolid12, arete, 0, 0) -blockSolid32 = MakeTranslation(blockSolid22, arete, 0, 0) - -blockSolid13 = MakeTranslation(blockSolid12, 0, 0, arete) -blockSolid23 = MakeTranslation(blockSolid13, arete, 0, 0) -blockSolid33 = MakeTranslation(blockSolid23, arete, 0, 0) - -blockSolid111 = MakeTranslation(blockSolid22, 0, arete, 0) - -# Compound and glue -# ----------------- - -c_l = [] -c_l.append(blockSolid11) -c_l.append(blockSolid21) -c_l.append(blockSolid31) -c_l.append(blockSolid12) -c_l.append(blockSolid22) -c_l.append(blockSolid32) -c_l.append(blockSolid13) -c_l.append(blockSolid23) -c_l.append(blockSolid33) -c_l.append(blockSolid111) - -c_cpd = MakeCompound(c_l) - -piece = MakeGlueFaces(c_cpd, 1.e-5) - -# Add in study -# ------------ - -piece_id = addToStudy(piece, "ex02_cube2primitive") - -# Meshing -# ======= - -# Create hexahedrical mesh on piece -# --------------------------------- - -hexa = smesh.Mesh(piece, "ex02_cube2primitive:hexa") - -algo = hexa.Segment() -algo.LocalLength(1) - -hexa.Quadrangle() - -hexa.Hexahedron() - -# Compute the mesh -# ---------------- - -hexa.Compute() diff --git a/src/SMESH_SWIG/ex03_cube2partition.py b/src/SMESH_SWIG/ex03_cube2partition.py deleted file mode 100644 index cc566893c..000000000 --- a/src/SMESH_SWIG/ex03_cube2partition.py +++ /dev/null @@ -1,82 +0,0 @@ -# CEA/LGLS 2004-2005, Francis KLOSS (OCC) -# ======================================= - -from geompy import * - -import smesh - -# Geometry -# ======== - -# A small cube centered and put on a great cube build with partition - -# Values -# ------ - -g_ox = 0 -g_oy = 0 -g_oz = 0 - -g_arete = 10 - -g_trim = 1000 - -# Points -# ------ - -v_arete2 = g_arete*2 -v_arete3 = g_arete*3 - -v_1 = MakeVertex(g_ox , g_oy , g_oz ) -v_2 = MakeVertex(g_ox+v_arete3, g_oy+g_arete , g_oz+v_arete3) - -v_3 = MakeVertex(g_ox+g_arete , g_oy+g_arete , g_oz+g_arete ) -v_4 = MakeVertex(g_ox+v_arete2, g_oy+v_arete2, g_oz+v_arete2) - -# Solids -# ------ - -s_base = MakeBoxTwoPnt(v_1, v_2) -s_haut = MakeBoxTwoPnt(v_3, v_4) - -# Partition -# --------- - -p_dir1 = MakeVectorDXDYDZ(1, 0, 0) -p_dir2 = MakeVectorDXDYDZ(0, 0, 1) -p_dir3 = MakeVectorDXDYDZ(0, 1, 0) - -p_tools = [] - -p_tools.append(MakePlane(v_3, p_dir1, g_trim)) -p_tools.append(MakePlane(v_4, p_dir1, g_trim)) -p_tools.append(MakePlane(v_3, p_dir2, g_trim)) -p_tools.append(MakePlane(v_4, p_dir2, g_trim)) -p_tools.append(MakePlane(v_3, p_dir3, g_trim)) - -piece = MakePartition([s_base, s_haut], p_tools, [], [], ShapeType["SOLID"]) - -# Study -# ----- - -piece_id = addToStudy(piece, "ex03_cube2partition") - -# Meshing -# ======= - -# Create hexahedrical mesh on piece -# --------------------------------- - -hexa = smesh.Mesh(piece, "ex03_cube2partition:hexa") - -algo = hexa.Segment() -algo.NumberOfSegments(5) - -hexa.Quadrangle() - -hexa.Hexahedron() - -# Compute the mesh -# ---------------- - -hexa.Compute() diff --git a/src/SMESH_SWIG/ex04_cube5tetraHexa.py b/src/SMESH_SWIG/ex04_cube5tetraHexa.py deleted file mode 100644 index 5bb4a1c89..000000000 --- a/src/SMESH_SWIG/ex04_cube5tetraHexa.py +++ /dev/null @@ -1,87 +0,0 @@ -# CEA/LGLS 2004-2005, Francis KLOSS (OCC) -# ======================================= - -from geompy import * - -import smesh - -# Geometry -# ======== - -# 5 box with a hexahedral mesh and with 2 box in tetrahedral mesh - -# Values -# ------ - -arete = 100 - -arete0 = 0 -arete1 = arete -arete2 = arete*2 -arete3 = arete*3 - -# Solids -# ------ - -box_tetra1 = MakeBox(arete0, arete0, 0, arete1, arete1, arete) - -box_ijk1 = MakeBox(arete1, arete0, 0, arete2, arete1, arete) - -box_hexa = MakeBox(arete1, arete1, 0, arete2, arete2, arete) - -box_ijk2 = MakeBox(arete2, arete1, 0, arete3, arete2, arete) - -box_tetra2 = MakeBox(arete2, arete2, 0, arete3 ,arete3, arete) - -# Piece -# ----- - -piece_cpd = MakeCompound([box_tetra1, box_ijk1, box_hexa, box_ijk2, box_tetra2]) - -piece = MakeGlueFaces(piece_cpd, 1e-4) - -piece_id = addToStudy(piece, "ex04_cube5tetraHexa") - -# Meshing -# ======= - -# Create a hexahedral mesh -# ------------------------ - -mixed = smesh.Mesh(piece, "ex04_cube5tetraHexa:mixed") - -algo = mixed.Segment() - -algo.StartEndLength(3, 25) - -mixed.Quadrangle() - -mixed.Hexahedron() - -# Tetrahedral local mesh -# ---------------------- - -def localMesh(b, hyp): - box = GetInPlace(piece, b) - faces = SubShapeAll(box, ShapeType["FACE"]) - - i = 0 - n = len(faces) - while i> _begLength); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - isOK = (load >> _endLength); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_Arithmetic1D & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_Arithmetic1D & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_Arithmetic1D.hxx b/src/StdMeshers/StdMeshers_Arithmetic1D.hxx deleted file mode 100644 index ca49df175..000000000 --- a/src/StdMeshers/StdMeshers_Arithmetic1D.hxx +++ /dev/null @@ -1,55 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_Arithmetic1D.hxx -// Author : Damien COQUERET, OCC -// Module : SMESH -// $Header$ - -#ifndef _SMESH_ARITHMETIC1D_HXX_ -#define _SMESH_ARITHMETIC1D_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_Arithmetic1D: - public SMESH_Hypothesis -{ -public: - StdMeshers_Arithmetic1D(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_Arithmetic1D(); - - void SetLength(double length, bool isStartLength) throw(SALOME_Exception); - - double GetLength(bool isStartLength) const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream& operator << (ostream & save, StdMeshers_Arithmetic1D & hyp); - friend istream& operator >> (istream & load, StdMeshers_Arithmetic1D & hyp); - -protected: - double _begLength, _endLength; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_Deflection1D.cxx b/src/StdMeshers/StdMeshers_Deflection1D.cxx deleted file mode 100644 index f6e54691c..000000000 --- a/src/StdMeshers/StdMeshers_Deflection1D.cxx +++ /dev/null @@ -1,136 +0,0 @@ -// SMESH StdMeshers_Deflection1D : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_Deflection1D.cxx -// Module : SMESH -// $Header$ - -using namespace std; - -#include "StdMeshers_Deflection1D.hxx" -#include "utilities.h" - - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_Deflection1D::StdMeshers_Deflection1D(int hypId, - int studyId, - SMESH_Gen * gen) - :SMESH_Hypothesis(hypId, studyId, gen) -{ - _value = 1.; - _name = "Deflection1D"; - _param_algo_dim = 1; // is used by SMESH_Regular_1D -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_Deflection1D::~StdMeshers_Deflection1D() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_Deflection1D::SetDeflection(double value) - throw(SALOME_Exception) -{ - if (_value != value) { - if (value <= 0.) - throw SALOME_Exception(LOCALIZED("Value must be positive")); - - NotifySubMeshesHypothesisModification(); - - _value = value; - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_Deflection1D::GetDeflection() const -{ - return _value; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_Deflection1D::SaveTo(ostream & save) -{ - save << _value; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_Deflection1D::LoadFrom(istream & load) -{ - bool isOK = (load >> _value); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_Deflection1D & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_Deflection1D & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_Deflection1D.hxx b/src/StdMeshers/StdMeshers_Deflection1D.hxx deleted file mode 100644 index 1ed43cb7d..000000000 --- a/src/StdMeshers/StdMeshers_Deflection1D.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_Deflection1D.hxx -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_Deflection1D_HXX_ -#define _StdMeshers_Deflection1D_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_Deflection1D:public SMESH_Hypothesis -{ - public: - StdMeshers_Deflection1D(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_Deflection1D(); - - void SetDeflection(double value) throw(SALOME_Exception); - - double GetDeflection() const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_Deflection1D & hyp); - friend istream & operator >>(istream & load, StdMeshers_Deflection1D & hyp); - - protected: - double _value; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_Hexa_3D.cxx b/src/StdMeshers/StdMeshers_Hexa_3D.cxx deleted file mode 100644 index a3ed4f11a..000000000 --- a/src/StdMeshers/StdMeshers_Hexa_3D.cxx +++ /dev/null @@ -1,1068 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_Hexa_3D.cxx -// Moved here from SMESH_Hexa_3D.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Hexa_3D.hxx" -#include "StdMeshers_Quadrangle_2D.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" - -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_FacePosition.hxx" -#include "SMDS_VolumeTool.hxx" -#include "SMDS_VolumeOfNodes.hxx" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "utilities.h" -#include "Utils_ExceptHandlers.hxx" - -//modified by NIZNHY-PKV Wed Nov 17 15:31:58 2004 f -#include "StdMeshers_Penta_3D.hxx" - -static bool ComputePentahedralMesh(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape); -//modified by NIZNHY-PKV Wed Nov 17 15:32:00 2004 t - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_Hexa_3D::StdMeshers_Hexa_3D(int hypId, int studyId, - SMESH_Gen * gen):SMESH_3D_Algo(hypId, studyId, gen) -{ - MESSAGE("StdMeshers_Hexa_3D::StdMeshers_Hexa_3D"); - _name = "Hexa_3D"; -// _shapeType = TopAbs_SOLID; - _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type -// MESSAGE("_shapeType octal " << oct << _shapeType); - for (int i = 0; i < 6; i++) - _quads[i] = 0; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D() -{ - MESSAGE("StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D"); - for (int i = 0; i < 6; i++) - StdMeshers_Quadrangle_2D::QuadDelete(_quads[i]); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool StdMeshers_Hexa_3D::CheckHypothesis - (SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - SMESH_Hypothesis::Hypothesis_Status& aStatus) -{ - //MESSAGE("StdMeshers_Hexa_3D::CheckHypothesis"); - - bool isOk = true; - aStatus = SMESH_Hypothesis::HYP_OK; - - // nothing to check - - return isOk; -} - -//======================================================================= -//function : findIJ -//purpose : return i,j of the node -//======================================================================= - -static bool findIJ (const SMDS_MeshNode* node, const FaceQuadStruct * quad, int& I, int& J) -{ - I = J = 0; - const SMDS_FacePosition* fpos = - static_cast(node->GetPosition().get()); - if ( ! fpos ) return false; - gp_Pnt2d uv( fpos->GetUParameter(), fpos->GetVParameter() ); - - double minDist = DBL_MAX; - int nbhoriz = Min(quad->nbPts[0], quad->nbPts[2]); - int nbvertic = Min(quad->nbPts[1], quad->nbPts[3]); - for (int i = 1; i < nbhoriz - 1; i++) { - for (int j = 1; j < nbvertic - 1; j++) { - int ij = j * nbhoriz + i; - gp_Pnt2d uv2( quad->uv_grid[ij].u, quad->uv_grid[ij].v ); - double dist = uv.SquareDistance( uv2 ); - if ( dist < minDist ) { - minDist = dist; - I = i; - J = j; - } - } - } - return true; -} - -//============================================================================= -/*! - * Hexahedron mesh on hexaedron like form - * -0. - shape and face mesh verification - * -1. - identify faces and vertices of the "cube" - * -2. - Algorithm from: - * "Application de l'interpolation transfinie à la création de maillages - * C0 ou G1 continus sur des triangles, quadrangles, tetraedres, pentaedres - * et hexaedres déformés." - * Alain PERONNET - 8 janvier 1999 - */ -//============================================================================= - -bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape)throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - MESSAGE("StdMeshers_Hexa_3D::Compute"); - //bool isOk = false; - SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - //SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape); - //const SMESHDS_SubMesh *& subMeshDS = theSubMesh->GetSubMeshDS(); - - // 0. - shape and face mesh verification - // 0.1 - shape must be a solid (or a shell) with 6 faces - //MESSAGE("---"); - - vector < SMESH_subMesh * >meshFaces; - for (TopExp_Explorer exp(aShape, TopAbs_FACE); exp.More(); exp.Next()) - { - SMESH_subMesh *aSubMesh = aMesh.GetSubMeshContaining(exp.Current()); - ASSERT(aSubMesh); - meshFaces.push_back(aSubMesh); - } - if (meshFaces.size() != 6) - { - SCRUTE(meshFaces.size()); -// ASSERT(0); - return false; - } - - // 0.2 - is each face meshed with Quadrangle_2D? (so, with a wire of 4 edges) - //MESSAGE("---"); - - for (int i = 0; i < 6; i++) - { - TopoDS_Shape aFace = meshFaces[i]->GetSubShape(); - SMESH_Algo *algo = _gen->GetAlgo(aMesh, aFace); - string algoName = algo->GetName(); - bool isAllQuad = false; - if (algoName == "Quadrangle_2D") { - SMESHDS_SubMesh * sm = meshDS->MeshElements( aFace ); - if ( sm ) { - isAllQuad = true; - SMDS_ElemIteratorPtr eIt = sm->GetElements(); - while ( isAllQuad && eIt->more() ) - isAllQuad = ( eIt->next()->NbNodes() == 4 ); - } - } - if ( ! isAllQuad ) { - //modified by NIZNHY-PKV Wed Nov 17 15:31:37 2004 f - bool bIsOk; - // - bIsOk=ComputePentahedralMesh(aMesh, aShape); - if (bIsOk) { - return true; - } - //modified by NIZNHY-PKV Wed Nov 17 15:31:42 2004 t - SCRUTE(algoName); - // ASSERT(0); - return false; - } - StdMeshers_Quadrangle_2D *quadAlgo = - dynamic_cast < StdMeshers_Quadrangle_2D * >(algo); - ASSERT(quadAlgo); - try - { - _quads[i] = quadAlgo->CheckAnd2Dcompute(aMesh, aFace); - // *** to delete after usage - } - catch(SALOME_Exception & S_ex) - { - // *** delete _quads - // *** throw exception - // ASSERT(0); - return false; - } - - // 0.2.1 - number of points on the opposite edges must be the same - if (_quads[i]->nbPts[0] != _quads[i]->nbPts[2] || - _quads[i]->nbPts[1] != _quads[i]->nbPts[3]) - { - MESSAGE("different number of points on the opposite edges of face " << i); - // ASSERT(0); - return false; - } - } - - // 1. - identify faces and vertices of the "cube" - // 1.1 - ancestor maps vertex->edges in the cube - //MESSAGE("---"); - - TopTools_IndexedDataMapOfShapeListOfShape MS; - TopExp::MapShapesAndAncestors(aShape, TopAbs_VERTEX, TopAbs_EDGE, MS); - - // 1.2 - first face is choosen as face Y=0 of the unit cube - //MESSAGE("---"); - - const TopoDS_Shape & aFace = meshFaces[0]->GetSubShape(); - const TopoDS_Face & F = TopoDS::Face(aFace); - - // 1.3 - identify the 4 vertices of the face Y=0: V000, V100, V101, V001 - //MESSAGE("---"); - - int i = 0; - TopoDS_Edge E = _quads[0]->edge[i]; //edge will be Y=0,Z=0 on unit cube - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - TopoDS_Vertex VFirst, VLast; - TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l - bool isForward = - (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0); - - if (isForward) - { - _cube.V000 = VFirst; // will be (0,0,0) on the unit cube - _cube.V100 = VLast; // will be (1,0,0) on the unit cube - } - else - { - _cube.V000 = VLast; - _cube.V100 = VFirst; - } - - i = 1; - E = _quads[0]->edge[i]; - C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - TopExp::Vertices(E, VFirst, VLast); - isForward = (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0); - if (isForward) - _cube.V101 = VLast; // will be (1,0,1) on the unit cube - else - _cube.V101 = VFirst; - - i = 2; - E = _quads[0]->edge[i]; - C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - TopExp::Vertices(E, VFirst, VLast); - isForward = (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0); - if (isForward) - _cube.V001 = VLast; // will be (0,0,1) on the unit cube - else - _cube.V001 = VFirst; - - // 1.4 - find edge X=0, Z=0 (ancestor of V000 not in face Y=0) - // - find edge X=1, Z=0 (ancestor of V100 not in face Y=0) - // - find edge X=1, Z=1 (ancestor of V101 not in face Y=0) - // - find edge X=0, Z=1 (ancestor of V001 not in face Y=0) - //MESSAGE("---"); - - TopoDS_Edge E_0Y0 = EdgeNotInFace(aMesh, aShape, F, _cube.V000, MS); - ASSERT(!E_0Y0.IsNull()); - - TopoDS_Edge E_1Y0 = EdgeNotInFace(aMesh, aShape, F, _cube.V100, MS); - ASSERT(!E_1Y0.IsNull()); - - TopoDS_Edge E_1Y1 = EdgeNotInFace(aMesh, aShape, F, _cube.V101, MS); - ASSERT(!E_1Y1.IsNull()); - - TopoDS_Edge E_0Y1 = EdgeNotInFace(aMesh, aShape, F, _cube.V001, MS); - ASSERT(!E_0Y1.IsNull()); - - // 1.5 - identify the 4 vertices in face Y=1: V010, V110, V111, V011 - //MESSAGE("---"); - - TopExp::Vertices(E_0Y0, VFirst, VLast); - if (VFirst.IsSame(_cube.V000)) - _cube.V010 = VLast; - else - _cube.V010 = VFirst; - - TopExp::Vertices(E_1Y0, VFirst, VLast); - if (VFirst.IsSame(_cube.V100)) - _cube.V110 = VLast; - else - _cube.V110 = VFirst; - - TopExp::Vertices(E_1Y1, VFirst, VLast); - if (VFirst.IsSame(_cube.V101)) - _cube.V111 = VLast; - else - _cube.V111 = VFirst; - - TopExp::Vertices(E_0Y1, VFirst, VLast); - if (VFirst.IsSame(_cube.V001)) - _cube.V011 = VLast; - else - _cube.V011 = VFirst; - - // 1.6 - find remaining faces given 4 vertices - //MESSAGE("---"); - - _indY0 = 0; - _cube.quad_Y0 = _quads[_indY0]; - - _indY1 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V010, _cube.V011, _cube.V110, _cube.V111); - _cube.quad_Y1 = _quads[_indY1]; - - _indZ0 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V000, _cube.V010, _cube.V100, _cube.V110); - _cube.quad_Z0 = _quads[_indZ0]; - - _indZ1 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V001, _cube.V011, _cube.V101, _cube.V111); - _cube.quad_Z1 = _quads[_indZ1]; - - _indX0 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V000, _cube.V001, _cube.V010, _cube.V011); - _cube.quad_X0 = _quads[_indX0]; - - _indX1 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V100, _cube.V101, _cube.V110, _cube.V111); - _cube.quad_X1 = _quads[_indX1]; - - //MESSAGE("---"); - - // 1.7 - get convertion coefs from face 2D normalized to 3D normalized - - Conv2DStruct cx0; // for face X=0 - Conv2DStruct cx1; // for face X=1 - Conv2DStruct cy0; - Conv2DStruct cy1; - Conv2DStruct cz0; - Conv2DStruct cz1; - - GetConv2DCoefs(*_cube.quad_X0, meshFaces[_indX0]->GetSubShape(), - _cube.V000, _cube.V010, _cube.V011, _cube.V001, cx0); - GetConv2DCoefs(*_cube.quad_X1, meshFaces[_indX1]->GetSubShape(), - _cube.V100, _cube.V110, _cube.V111, _cube.V101, cx1); - GetConv2DCoefs(*_cube.quad_Y0, meshFaces[_indY0]->GetSubShape(), - _cube.V000, _cube.V100, _cube.V101, _cube.V001, cy0); - GetConv2DCoefs(*_cube.quad_Y1, meshFaces[_indY1]->GetSubShape(), - _cube.V010, _cube.V110, _cube.V111, _cube.V011, cy1); - GetConv2DCoefs(*_cube.quad_Z0, meshFaces[_indZ0]->GetSubShape(), - _cube.V000, _cube.V100, _cube.V110, _cube.V010, cz0); - GetConv2DCoefs(*_cube.quad_Z1, meshFaces[_indZ1]->GetSubShape(), - _cube.V001, _cube.V101, _cube.V111, _cube.V011, cz1); - - // 1.8 - create a 3D structure for normalized values - - //MESSAGE("---"); - int nbx = _cube.quad_Z0->nbPts[0]; - if (cz0.a1 == 0.) nbx = _cube.quad_Z0->nbPts[1]; - - int nby = _cube.quad_X0->nbPts[0]; - if (cx0.a1 == 0.) nby = _cube.quad_X0->nbPts[1]; - - int nbz = _cube.quad_Y0->nbPts[0]; - if (cy0.a1 != 0.) nbz = _cube.quad_Y0->nbPts[1]; - - int i1, j1, nbxyz = nbx * nby * nbz; - Point3DStruct *np = new Point3DStruct[nbxyz]; - - // 1.9 - store node indexes of faces - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indX0]->GetSubShape()); - - faceQuadStruct *quad = _cube.quad_X0; - int i = 0; // j = x/face , k = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int j = cx0.ia * i1 + cx0.ib * j1 + cx0.ic; // j = x/face - int k = cx0.ja * i1 + cx0.jb * j1 + cx0.jc; // k = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indX1]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_X1; - int i = nbx - 1; // j = x/face , k = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int j = cx1.ia * i1 + cx1.ib * j1 + cx1.ic; // j = x/face - int k = cx1.ja * i1 + cx1.jb * j1 + cx1.jc; // k = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indY0]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_Y0; - int j = 0; // i = x/face , k = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int i = cy0.ia * i1 + cy0.ib * j1 + cy0.ic; // i = x/face - int k = cy0.ja * i1 + cy0.jb * j1 + cy0.jc; // k = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indY1]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_Y1; - int j = nby - 1; // i = x/face , k = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int i = cy1.ia * i1 + cy1.ib * j1 + cy1.ic; // i = x/face - int k = cy1.ja * i1 + cy1.jb * j1 + cy1.jc; // k = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indZ0]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_Z0; - int k = 0; // i = x/face , j = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int i = cz0.ia * i1 + cz0.ib * j1 + cz0.ic; // i = x/face - int j = cz0.ja * i1 + cz0.jb * j1 + cz0.jc; // j = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indZ1]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_Z1; - int k = nbz - 1; // i = x/face , j = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int i = cz1.ia * i1 + cz1.ib * j1 + cz1.ic; // i = x/face - int j = cz1.ja * i1 + cz1.jb * j1 + cz1.jc; // j = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - // 2.0 - for each node of the cube: - // - get the 8 points 3D = 8 vertices of the cube - // - get the 12 points 3D on the 12 edges of the cube - // - get the 6 points 3D on the 6 faces with their ID - // - compute the point 3D - // - store the point 3D in SMESHDS, store its ID in 3D structure - - int shapeID = meshDS->ShapeToIndex( aShape ); - - Pt3 p000, p001, p010, p011, p100, p101, p110, p111; - Pt3 px00, px01, px10, px11; - Pt3 p0y0, p0y1, p1y0, p1y1; - Pt3 p00z, p01z, p10z, p11z; - Pt3 pxy0, pxy1, px0z, px1z, p0yz, p1yz; - - GetPoint(p000, 0, 0, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p001, 0, 0, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(p010, 0, nby - 1, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p011, 0, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(p100, nbx - 1, 0, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p101, nbx - 1, 0, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(p110, nbx - 1, nby - 1, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p111, nbx - 1, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS); - - for (int i = 1; i < nbx - 1; i++) - { - for (int j = 1; j < nby - 1; j++) - { - for (int k = 1; k < nbz - 1; k++) - { - // *** seulement maillage regulier - // 12 points on edges - GetPoint(px00, i, 0, 0, nbx, nby, nbz, np, meshDS); - GetPoint(px01, i, 0, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(px10, i, nby - 1, 0, nbx, nby, nbz, np, meshDS); - GetPoint(px11, i, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS); - - GetPoint(p0y0, 0, j, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p0y1, 0, j, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(p1y0, nbx - 1, j, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p1y1, nbx - 1, j, nbz - 1, nbx, nby, nbz, np, meshDS); - - GetPoint(p00z, 0, 0, k, nbx, nby, nbz, np, meshDS); - GetPoint(p01z, 0, nby - 1, k, nbx, nby, nbz, np, meshDS); - GetPoint(p10z, nbx - 1, 0, k, nbx, nby, nbz, np, meshDS); - GetPoint(p11z, nbx - 1, nby - 1, k, nbx, nby, nbz, np, meshDS); - - // 12 points on faces - GetPoint(pxy0, i, j, 0, nbx, nby, nbz, np, meshDS); - GetPoint(pxy1, i, j, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(px0z, i, 0, k, nbx, nby, nbz, np, meshDS); - GetPoint(px1z, i, nby - 1, k, nbx, nby, nbz, np, meshDS); - GetPoint(p0yz, 0, j, k, nbx, nby, nbz, np, meshDS); - GetPoint(p1yz, nbx - 1, j, k, nbx, nby, nbz, np, meshDS); - - int ijk = k * nbx * nby + j * nbx + i; - double x = double (i) / double (nbx - 1); // *** seulement - double y = double (j) / double (nby - 1); // *** maillage - double z = double (k) / double (nbz - 1); // *** regulier - - Pt3 X; - for (int i = 0; i < 3; i++) - { - X[i] = - (1 - x) * p0yz[i] + x * p1yz[i] - + (1 - y) * px0z[i] + y * px1z[i] - + (1 - z) * pxy0[i] + z * pxy1[i] - - (1 - x) * ((1 - y) * p00z[i] + y * p01z[i]) - - x * ((1 - y) * p10z[i] + y * p11z[i]) - - (1 - y) * ((1 - z) * px00[i] + z * px01[i]) - - y * ((1 - z) * px10[i] + z * px11[i]) - - (1 - z) * ((1 - x) * p0y0[i] + x * p1y0[i]) - - z * ((1 - x) * p0y1[i] + x * p1y1[i]) - + (1 - x) * ((1 - y) * ((1 - z) * p000[i] + z * p001[i]) - + y * ((1 - z) * p010[i] + z * p011[i])) - + x * ((1 - y) * ((1 - z) * p100[i] + z * p101[i]) - + y * ((1 - z) * p110[i] + z * p111[i])); - } - - SMDS_MeshNode * node = meshDS->AddNode(X[0], X[1], X[2]); - np[ijk].node = node; - meshDS->SetNodeInVolume(node, shapeID); - } - } - } - - // find orientation of furute volumes according to MED convention - vector< bool > forward( nbx * nby ); - SMDS_VolumeTool vTool; - for (int i = 0; i < nbx - 1; i++) - for (int j = 0; j < nby - 1; j++) - { - int n1 = j * nbx + i; - int n2 = j * nbx + i + 1; - int n3 = (j + 1) * nbx + i + 1; - int n4 = (j + 1) * nbx + i; - int n5 = nbx * nby + j * nbx + i; - int n6 = nbx * nby + j * nbx + i + 1; - int n7 = nbx * nby + (j + 1) * nbx + i + 1; - int n8 = nbx * nby + (j + 1) * nbx + i; - - SMDS_VolumeOfNodes tmpVol (np[n1].node,np[n2].node,np[n3].node,np[n4].node, - np[n5].node,np[n6].node,np[n7].node,np[n8].node); - vTool.Set( &tmpVol ); - forward[ n1 ] = vTool.IsForward(); - } - - //2.1 - for each node of the cube (less 3 *1 Faces): - // - store hexahedron in SMESHDS - MESSAGE("Storing hexahedron into the DS"); - for (int i = 0; i < nbx - 1; i++) - for (int j = 0; j < nby - 1; j++) - { - bool isForw = forward.at( j * nbx + i ); - for (int k = 0; k < nbz - 1; k++) - { - int n1 = k * nbx * nby + j * nbx + i; - int n2 = k * nbx * nby + j * nbx + i + 1; - int n3 = k * nbx * nby + (j + 1) * nbx + i + 1; - int n4 = k * nbx * nby + (j + 1) * nbx + i; - int n5 = (k + 1) * nbx * nby + j * nbx + i; - int n6 = (k + 1) * nbx * nby + j * nbx + i + 1; - int n7 = (k + 1) * nbx * nby + (j + 1) * nbx + i + 1; - int n8 = (k + 1) * nbx * nby + (j + 1) * nbx + i; - - SMDS_MeshVolume * elt; - if ( isForw ) - elt = meshDS->AddVolume(np[n1].node, - np[n2].node, - np[n3].node, - np[n4].node, - np[n5].node, - np[n6].node, - np[n7].node, - np[n8].node); - else - elt = meshDS->AddVolume(np[n1].node, - np[n4].node, - np[n3].node, - np[n2].node, - np[n5].node, - np[n8].node, - np[n7].node, - np[n6].node); - - meshDS->SetMeshElementOnShape(elt, shapeID); - } - } - if ( np ) delete [] np; - //MESSAGE("End of StdMeshers_Hexa_3D::Compute()"); - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_Hexa_3D::GetPoint(Pt3 p, int i, int j, int k, int nbx, int nby, - int nbz, Point3DStruct * np, const SMESHDS_Mesh * meshDS) -{ - int ijk = k * nbx * nby + j * nbx + i; - const SMDS_MeshNode * node = np[ijk].node; - p[0] = node->X(); - p[1] = node->Y(); - p[2] = node->Z(); - //MESSAGE(" "<&meshFaces, - const TopoDS_Vertex & V0, - const TopoDS_Vertex & V1, - const TopoDS_Vertex & V2, const TopoDS_Vertex & V3) -{ - //MESSAGE("StdMeshers_Hexa_3D::GetFaceIndex"); - int faceIndex = -1; - for (int i = 1; i < 6; i++) - { - const TopoDS_Shape & aFace = meshFaces[i]->GetSubShape(); - //const TopoDS_Face& F = TopoDS::Face(aFace); - TopTools_IndexedMapOfShape M; - TopExp::MapShapes(aFace, TopAbs_VERTEX, M); - bool verticesInShape = false; - if (M.Contains(V0)) - if (M.Contains(V1)) - if (M.Contains(V2)) - if (M.Contains(V3)) - verticesInShape = true; - if (verticesInShape) - { - faceIndex = i; - break; - } - } - ASSERT(faceIndex > 0); - //SCRUTE(faceIndex); - return faceIndex; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -TopoDS_Edge - StdMeshers_Hexa_3D::EdgeNotInFace(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape, - const TopoDS_Face & aFace, - const TopoDS_Vertex & aVertex, - const TopTools_IndexedDataMapOfShapeListOfShape & MS) -{ - //MESSAGE("StdMeshers_Hexa_3D::EdgeNotInFace"); - TopTools_IndexedDataMapOfShapeListOfShape MF; - TopExp::MapShapesAndAncestors(aFace, TopAbs_VERTEX, TopAbs_EDGE, MF); - const TopTools_ListOfShape & ancestorsInSolid = MS.FindFromKey(aVertex); - const TopTools_ListOfShape & ancestorsInFace = MF.FindFromKey(aVertex); -// SCRUTE(ancestorsInSolid.Extent()); -// SCRUTE(ancestorsInFace.Extent()); - ASSERT(ancestorsInSolid.Extent() == 6); // 6 (edges doublees) - ASSERT(ancestorsInFace.Extent() == 2); - - TopoDS_Edge E; - E.Nullify(); - TopTools_ListIteratorOfListOfShape its(ancestorsInSolid); - for (; its.More(); its.Next()) - { - TopoDS_Shape ancestor = its.Value(); - TopTools_ListIteratorOfListOfShape itf(ancestorsInFace); - bool isInFace = false; - for (; itf.More(); itf.Next()) - { - TopoDS_Shape ancestorInFace = itf.Value(); - if (ancestorInFace.IsSame(ancestor)) - { - isInFace = true; - break; - } - } - if (!isInFace) - { - E = TopoDS::Edge(ancestor); - break; - } - } - return E; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_Hexa_3D::GetConv2DCoefs(const faceQuadStruct & quad, - const TopoDS_Shape & aShape, - const TopoDS_Vertex & V0, - const TopoDS_Vertex & V1, - const TopoDS_Vertex & V2, const TopoDS_Vertex & V3, Conv2DStruct & conv) -{ -// MESSAGE("StdMeshers_Hexa_3D::GetConv2DCoefs"); - const TopoDS_Face & F = TopoDS::Face(aShape); - TopoDS_Edge E = quad.edge[0]; - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - TopoDS_Vertex VFirst, VLast; - TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l - bool isForward = (((l - f) * (quad.last[0] - quad.first[0])) > 0); - TopoDS_Vertex VA, VB; - if (isForward) - { - VA = VFirst; - VB = VLast; - } - else - { - VA = VLast; - VB = VFirst; - } - int a1, b1, c1, a2, b2, c2; - if (VA.IsSame(V0)) - if (VB.IsSame(V1)) - { - a1 = 1; - b1 = 0; - c1 = 0; // x - a2 = 0; - b2 = 1; - c2 = 0; // y - } - else - { - ASSERT(VB.IsSame(V3)); - a1 = 0; - b1 = 1; - c1 = 0; // y - a2 = 1; - b2 = 0; - c2 = 0; // x - } - if (VA.IsSame(V1)) - if (VB.IsSame(V2)) - { - a1 = 0; - b1 = -1; - c1 = 1; // 1-y - a2 = 1; - b2 = 0; - c2 = 0; // x - } - else - { - ASSERT(VB.IsSame(V0)); - a1 = -1; - b1 = 0; - c1 = 1; // 1-x - a2 = 0; - b2 = 1; - c2 = 0; // y - } - if (VA.IsSame(V2)) - if (VB.IsSame(V3)) - { - a1 = -1; - b1 = 0; - c1 = 1; // 1-x - a2 = 0; - b2 = -1; - c2 = 1; // 1-y - } - else - { - ASSERT(VB.IsSame(V1)); - a1 = 0; - b1 = -1; - c1 = 1; // 1-y - a2 = -1; - b2 = 0; - c2 = 1; // 1-x - } - if (VA.IsSame(V3)) - if (VB.IsSame(V0)) - { - a1 = 0; - b1 = 1; - c1 = 0; // y - a2 = -1; - b2 = 0; - c2 = 1; // 1-x - } - else - { - ASSERT(VB.IsSame(V2)); - a1 = 1; - b1 = 0; - c1 = 0; // x - a2 = 0; - b2 = -1; - c2 = 1; // 1-y - } -// MESSAGE("X = " << c1 << "+ " << a1 << "*x + " << b1 << "*y"); -// MESSAGE("Y = " << c2 << "+ " << a2 << "*x + " << b2 << "*y"); - conv.a1 = a1; - conv.b1 = b1; - conv.c1 = c1; - conv.a2 = a2; - conv.b2 = b2; - conv.c2 = c2; - - int nbdown = quad.nbPts[0]; - int nbright = quad.nbPts[1]; - conv.ia = int (a1); - conv.ib = int (b1); - conv.ic = - int (c1 * a1 * a1) * (nbdown - 1) + int (c1 * b1 * b1) * (nbright - 1); - conv.ja = int (a2); - conv.jb = int (b2); - conv.jc = - int (c2 * a2 * a2) * (nbdown - 1) + int (c2 * b2 * b2) * (nbright - 1); -// MESSAGE("I " << conv.ia << " " << conv.ib << " " << conv.ic); -// MESSAGE("J " << conv.ja << " " << conv.jb << " " << conv.jc); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_Hexa_3D::SaveTo(ostream & save) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_Hexa_3D::LoadFrom(istream & load) -{ - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_Hexa_3D & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_Hexa_3D & hyp) -{ - return hyp.LoadFrom( load ); -} - -//modified by NIZNHY-PKV Wed Nov 17 15:34:13 2004 f -/////////////////////////////////////////////////////////////////////////////// -//ZZ -//#include - -//======================================================================= -//function : ComputePentahedralMesh -//purpose : -//======================================================================= -bool ComputePentahedralMesh(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) -{ - //printf(" ComputePentahedralMesh HERE\n"); - // - bool bOK; - //int iErr; - StdMeshers_Penta_3D anAlgo; - // - bOK=anAlgo.Compute(aMesh, aShape); - /* - iErr=anAlgo.ErrorStatus(); - - if (iErr) { - printf(" *** Error# %d\n", iErr); - } - else { - printf(" *** No errors# %d\n", iErr); - } - */ - return bOK; -} - diff --git a/src/StdMeshers/StdMeshers_Hexa_3D.hxx b/src/StdMeshers/StdMeshers_Hexa_3D.hxx deleted file mode 100644 index a9e20459c..000000000 --- a/src/StdMeshers/StdMeshers_Hexa_3D.hxx +++ /dev/null @@ -1,140 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_Hexa_3D.hxx -// Moved here from SMESH_Hexa_3D.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_HEXA_3D_HXX_ -#define _SMESH_HEXA_3D_HXX_ - -#include "SMESH_3D_Algo.hxx" -#include "SMESH_Mesh.hxx" -#include "StdMeshers_Quadrangle_2D.hxx" -#include "Utils_SALOME_Exception.hxx" - -typedef struct point3Dstruct -{ - const SMDS_MeshNode * node; -} Point3DStruct; - -typedef double Pt3[3]; - -typedef struct conv2dstruct -{ - double a1; // X = a1*x + b1*y + c1 - double b1; // Y = a2*x + b2*y + c2 - double c1; // a1, b1 a2, b2 in {-1,0,1} - double a2; // c1, c2 in {0,1} - double b2; - double c2; - int ia; // I = ia*i + ib*j + ic - int ib; - int ic; - int ja; // J = ja*i + jb*j + jc - int jb; - int jc; -} Conv2DStruct; - -typedef struct cubeStruct -{ - TopoDS_Vertex V000; - TopoDS_Vertex V001; - TopoDS_Vertex V010; - TopoDS_Vertex V011; - TopoDS_Vertex V100; - TopoDS_Vertex V101; - TopoDS_Vertex V110; - TopoDS_Vertex V111; - faceQuadStruct* quad_X0; - faceQuadStruct* quad_X1; - faceQuadStruct* quad_Y0; - faceQuadStruct* quad_Y1; - faceQuadStruct* quad_Z0; - faceQuadStruct* quad_Z1; - Point3DStruct* np; // normalised 3D coordinates -} CubeStruct; - -class StdMeshers_Hexa_3D: - public SMESH_3D_Algo -{ -public: - StdMeshers_Hexa_3D(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_Hexa_3D(); - - virtual bool CheckHypothesis(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - SMESH_Hypothesis::Hypothesis_Status& aStatus); - - virtual bool Compute(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape) - throw (SALOME_Exception); - - ostream & SaveTo(ostream & save); - istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_Hexa_3D & hyp); - friend istream & operator >> (istream & load, StdMeshers_Hexa_3D & hyp); - -protected: - TopoDS_Edge - EdgeNotInFace(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - const TopoDS_Face& aFace, - const TopoDS_Vertex& aVertex, - const TopTools_IndexedDataMapOfShapeListOfShape& MS); - - int GetFaceIndex(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - const vector& meshFaces, - const TopoDS_Vertex& V0, - const TopoDS_Vertex& V1, - const TopoDS_Vertex& V2, - const TopoDS_Vertex& V3); - - void GetConv2DCoefs(const faceQuadStruct& quad, - const TopoDS_Shape& aShape, - const TopoDS_Vertex& V0, - const TopoDS_Vertex& V1, - const TopoDS_Vertex& V2, - const TopoDS_Vertex& V3, - Conv2DStruct& conv); - - void GetPoint(Pt3 p, - int i, int j, int k, - int nbx, int nby, int nbz, - Point3DStruct *np, - const SMESHDS_Mesh* meshDS); - - CubeStruct _cube; - FaceQuadStruct* _quads[6]; - int _indX0; - int _indX1; - int _indY0; - int _indY1; - int _indZ0; - int _indZ1; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_LengthFromEdges.cxx b/src/StdMeshers/StdMeshers_LengthFromEdges.cxx deleted file mode 100644 index f21f199f5..000000000 --- a/src/StdMeshers/StdMeshers_LengthFromEdges.cxx +++ /dev/null @@ -1,139 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_LengthFromEdges.cxx -// Moved here from SMESH_LengthFromEdges.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_LengthFromEdges.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_LengthFromEdges::StdMeshers_LengthFromEdges(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _mode =1; - _name = "LengthFromEdges"; -// SCRUTE(_name); -// SCRUTE(&_name); - _param_algo_dim = 2; // is used by SMESH_MEFISTO_2D -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_LengthFromEdges::~StdMeshers_LengthFromEdges() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_LengthFromEdges::SetMode(int mode) - throw (SALOME_Exception) -{ - int oldMode = _mode; - if (mode <= 0) - throw SALOME_Exception(LOCALIZED("mode must be positive")); - _mode = mode; - if (oldMode != _mode) - NotifySubMeshesHypothesisModification(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int StdMeshers_LengthFromEdges::GetMode() -{ - return _mode; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_LengthFromEdges::SaveTo(ostream & save) -{ - save << this->_mode; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_LengthFromEdges::LoadFrom(istream & load) -{ - bool isOK = true; - int a; - isOK = (load >> a); - if (isOK) - this->_mode = a; - else - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator << (ostream & save, StdMeshers_LengthFromEdges & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >> (istream & load, StdMeshers_LengthFromEdges & hyp) -{ - return hyp.LoadFrom( load ); -} - diff --git a/src/StdMeshers/StdMeshers_LengthFromEdges.hxx b/src/StdMeshers/StdMeshers_LengthFromEdges.hxx deleted file mode 100644 index d514e7c94..000000000 --- a/src/StdMeshers/StdMeshers_LengthFromEdges.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_LengthFromEdges.hxx -// Moved here from SMESH_LengthFromEdges.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_LENGTHFROMEDGES_HXX_ -#define _SMESH_LENGTHFROMEDGES_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_LengthFromEdges: - public SMESH_Hypothesis -{ -public: - StdMeshers_LengthFromEdges(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_LengthFromEdges(); - - void SetMode(int mode) - throw (SALOME_Exception); - - int GetMode(); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_LengthFromEdges & hyp); - friend istream & operator >> (istream & load, StdMeshers_LengthFromEdges & hyp); - -protected: - int _mode; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_LocalLength.cxx b/src/StdMeshers/StdMeshers_LocalLength.cxx deleted file mode 100644 index 457d8d80c..000000000 --- a/src/StdMeshers/StdMeshers_LocalLength.cxx +++ /dev/null @@ -1,137 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_LocalLength.cxx -// Moved here from SMESH_LocalLength.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_LocalLength.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_LocalLength::StdMeshers_LocalLength(int hypId, int studyId, - SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen) -{ - _length = 1.; - _name = "LocalLength"; -// SCRUTE(_name); -// SCRUTE(&_name); - _param_algo_dim = 1; // is used by SMESH_Regular_1D -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_LocalLength::~StdMeshers_LocalLength() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_LocalLength::SetLength(double length) throw(SALOME_Exception) -{ - double oldLength = _length; - if (length <= 0) - throw SALOME_Exception(LOCALIZED("length must be positive")); - _length = length; - if (oldLength != _length) - NotifySubMeshesHypothesisModification(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_LocalLength::GetLength() const -{ - return _length; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_LocalLength::SaveTo(ostream & save) -{ - save << this->_length; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_LocalLength::LoadFrom(istream & load) -{ - bool isOK = true; - double a; - isOK = (load >> a); - if (isOK) - this->_length = a; - else - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_LocalLength & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_LocalLength & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_LocalLength.hxx b/src/StdMeshers/StdMeshers_LocalLength.hxx deleted file mode 100644 index aba58e51a..000000000 --- a/src/StdMeshers/StdMeshers_LocalLength.hxx +++ /dev/null @@ -1,55 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_LocalLength.hxx -// Moved here from SMESH_LocalLength.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_LOCALLENGTH_HXX_ -#define _SMESH_LOCALLENGTH_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_LocalLength:public SMESH_Hypothesis -{ - public: - StdMeshers_LocalLength(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_LocalLength(); - - void SetLength(double length) throw(SALOME_Exception); - - double GetLength() const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_LocalLength & hyp); - friend istream & operator >>(istream & load, StdMeshers_LocalLength & hyp); - - protected: - double _length; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx b/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx deleted file mode 100644 index ed166fc03..000000000 --- a/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx +++ /dev/null @@ -1,872 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_MEFISTO_2D.cxx -// Moved here from SMESH_MEFISTO_2D.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_MEFISTO_2D.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" - -#include "StdMeshers_MaxElementArea.hxx" -#include "StdMeshers_LengthFromEdges.hxx" - -#include "Rn.h" -#include "aptrte.h" - -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_EdgePosition.hxx" -#include "SMDS_FacePosition.hxx" - -#include "utilities.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -//#include - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D(int hypId, int studyId, - SMESH_Gen * gen):SMESH_2D_Algo(hypId, studyId, gen) -{ - MESSAGE("StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D"); - _name = "MEFISTO_2D"; -// _shapeType = TopAbs_FACE; - _shapeType = (1 << TopAbs_FACE); - _compatibleHypothesis.push_back("MaxElementArea"); - _compatibleHypothesis.push_back("LengthFromEdges"); - - _edgeLength = 0; - _maxElementArea = 0; - _hypMaxElementArea = NULL; - _hypLengthFromEdges = NULL; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D() -{ - MESSAGE("StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool StdMeshers_MEFISTO_2D::CheckHypothesis - (SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - SMESH_Hypothesis::Hypothesis_Status& aStatus) -{ - //MESSAGE("StdMeshers_MEFISTO_2D::CheckHypothesis"); - - _hypMaxElementArea = NULL; - _hypLengthFromEdges = NULL; - - list ::const_iterator itl; - const SMESHDS_Hypothesis *theHyp; - - const list &hyps = GetUsedHypothesis(aMesh, aShape); - int nbHyp = hyps.size(); - if (!nbHyp) - { - aStatus = SMESH_Hypothesis::HYP_MISSING; - return false; // can't work with no hypothesis - } - - itl = hyps.begin(); - theHyp = (*itl); // use only the first hypothesis - - string hypName = theHyp->GetName(); - //int hypId = theHyp->GetID(); - //SCRUTE(hypName); - - bool isOk = false; - - if (hypName == "MaxElementArea") - { - _hypMaxElementArea = static_cast(theHyp); - ASSERT(_hypMaxElementArea); - _maxElementArea = _hypMaxElementArea->GetMaxArea(); - _edgeLength = 0; - isOk = true; - aStatus = SMESH_Hypothesis::HYP_OK; - } - - else if (hypName == "LengthFromEdges") - { - _hypLengthFromEdges = static_cast(theHyp); - ASSERT(_hypLengthFromEdges); - _edgeLength = 0; - _maxElementArea = 0; - isOk = true; - aStatus = SMESH_Hypothesis::HYP_OK; - } - else - aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE; - - if (isOk) - { - isOk = false; - if (_maxElementArea > 0) - { -// _edgeLength = 2 * sqrt(_maxElementArea); // triangles : minorant - _edgeLength = 2 * sqrt(_maxElementArea/sqrt(3.0)); - isOk = true; - } - else - isOk = (_hypLengthFromEdges != NULL); // **** check mode - if (!isOk) - aStatus = SMESH_Hypothesis::HYP_BAD_PARAMETER; - } - - //SCRUTE(_edgeLength); - //SCRUTE(_maxElementArea); - return isOk; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) -{ - MESSAGE("StdMeshers_MEFISTO_2D::Compute"); - - if (_hypLengthFromEdges) - _edgeLength = ComputeEdgeElementLength(aMesh, aShape); - - bool isOk = false; - //const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - //SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape); - - const TopoDS_Face & FF = TopoDS::Face(aShape); - bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD); - TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD)); - - Z nblf; //nombre de lignes fermees (enveloppe en tete) - Z *nudslf = NULL; //numero du dernier sommet de chaque ligne fermee - R2 *uvslf = NULL; - Z nbpti = 0; //nombre points internes futurs sommets de la triangulation - R2 *uvpti = NULL; - - Z nbst; - R2 *uvst = NULL; - Z nbt; - Z *nust = NULL; - Z ierr = 0; - - Z nutysu = 1; // 1: il existe un fonction areteideale_() - // Z nutysu=0; // 0: on utilise aretmx - R aretmx = _edgeLength; // longueur max aretes future triangulation - - nblf = NumberOfWires(F); - - nudslf = new Z[1 + nblf]; - nudslf[0] = 0; - int iw = 1; - int nbpnt = 0; - - myOuterWire = BRepTools::OuterWire(F); - nbpnt += NumberOfPoints(aMesh, myOuterWire); - if ( nbpnt < 3 ) // ex: a circle with 2 segments - return false; - nudslf[iw++] = nbpnt; - - for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next()) - { - const TopoDS_Wire & W = TopoDS::Wire(exp.Current()); - if (!myOuterWire.IsSame(W)) - { - nbpnt += NumberOfPoints(aMesh, W); - nudslf[iw++] = nbpnt; - } - } - - // avoid passing same uv points for a vertex common to 2 wires - TopTools_IndexedDataMapOfShapeListOfShape VWMap; - if ( iw - 1 > 1 ) // nbofWires > 1 - TopExp::MapShapesAndAncestors( F , TopAbs_VERTEX, TopAbs_WIRE, VWMap ); - - uvslf = new R2[nudslf[nblf]]; - int m = 0; - - double scalex, scaley; - ComputeScaleOnFace(aMesh, F, scalex, scaley); - - map mefistoToDS; // correspondence mefisto index--> points IDNodes - if ( !LoadPoints(aMesh, F, myOuterWire, uvslf, m, - mefistoToDS, scalex, scaley, VWMap)) - return false; - - for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next()) - { - const TopoDS_Wire & W = TopoDS::Wire(exp.Current()); - if (!myOuterWire.IsSame(W)) - { - if (! LoadPoints(aMesh, F, W, uvslf, m, - mefistoToDS, scalex, scaley, VWMap )) - return false; - } - } - - uvst = NULL; - nust = NULL; - aptrte(nutysu, aretmx, - nblf, nudslf, uvslf, nbpti, uvpti, nbst, uvst, nbt, nust, ierr); - - if (ierr == 0) - { - MESSAGE("... End Triangulation Generated Triangle Number " << nbt); - MESSAGE(" Node Number " << nbst); - StoreResult(aMesh, nbst, uvst, nbt, nust, F, - faceIsForward, mefistoToDS, scalex, scaley); - isOk = true; - } - else - { - MESSAGE("Error in Triangulation"); - isOk = false; - } - if (nudslf != NULL) - delete[]nudslf; - if (uvslf != NULL) - delete[]uvslf; - if (uvst != NULL) - delete[]uvst; - if (nust != NULL) - delete[]nust; - return isOk; -} - -//======================================================================= -//function : fixOverlappedLinkUV -//purpose : prevent failure due to overlapped adjacent links -//======================================================================= - -static bool fixOverlappedLinkUV( R2& uv0, const R2& uv1, const R2& uv2 ) -{ - gp_XY v1( uv0.x - uv1.x, uv0.y - uv1.y ); - gp_XY v2( uv2.x - uv1.x, uv2.y - uv1.y ); - - double tol2 = DBL_MIN * DBL_MIN; - double sqMod1 = v1.SquareModulus(); - if ( sqMod1 <= tol2 ) return false; - double sqMod2 = v2.SquareModulus(); - if ( sqMod2 <= tol2 ) return false; - - double dot = v1*v2; - - // check sinus >= 1.e-3 - const double minSin = 1.e-3; - if ( dot > 0 && 1 - dot * dot / ( sqMod1 * sqMod2 ) < minSin * minSin ) { - MESSAGE(" ___ FIX UV ____" << uv0.x << " " << uv0.y); - v1.SetCoord( -v1.Y(), v1.X() ); - double delta = sqrt( sqMod1 ) * minSin; - if ( v1.X() < 0 ) - uv0.x -= delta; - else - uv0.x += delta; - if ( v1.Y() < 0 ) - uv0.y -= delta; - else - uv0.y += delta; -// MESSAGE(" -> " << uv0.x << " " << uv0.y << " "); -// MESSAGE("v1( " << v1.X() << " " << v1.Y() << " ) " << -// "v2( " << v2.X() << " " << v2.Y() << " ) "); -// MESSAGE("SIN: " << sqrt(1 - dot * dot / (sqMod1 * sqMod2))); -// v1.SetCoord( uv0.x - uv1.x, uv0.y - uv1.y ); -// v2.SetCoord( uv2.x - uv1.x, uv2.y - uv1.y ); -// gp_XY v3( uv2.x - uv0.x, uv2.y - uv0.y ); -// sqMod1 = v1.SquareModulus(); -// sqMod2 = v2.SquareModulus(); -// dot = v1*v2; -// double sin = sqrt(1 - dot * dot / (sqMod1 * sqMod2)); -// MESSAGE("NEW SIN: " << sin); - return true; - } - return false; -} - -//======================================================================= -//function : fixCommonVertexUV -//purpose : -//======================================================================= - -static bool fixCommonVertexUV (gp_Pnt2d & theUV, - const TopoDS_Vertex& theV, - const TopoDS_Wire& theW, - const TopoDS_Wire& theOW, - const TopoDS_Face& theF, - const TopTools_IndexedDataMapOfShapeListOfShape & theVWMap, - SMESH_Mesh & theMesh) -{ - if( theW.IsSame( theOW ) || - !theVWMap.Contains( theV )) return false; - - // check if there is another wire sharing theV - const TopTools_ListOfShape& WList = theVWMap.FindFromKey( theV ); - TopTools_ListIteratorOfListOfShape aWIt; - for ( aWIt.Initialize( WList ); aWIt.More(); aWIt.Next() ) - if ( !theW.IsSame( aWIt.Value() )) - break; - if ( !aWIt.More() ) return false; - - TopTools_ListOfShape EList; - list< double > UList; - - // find edges of theW sharing theV - // and find 2d normal to them at theV - gp_Vec2d N(0.,0.); - TopoDS_Iterator itE( theW ); - for ( ; itE.More(); itE.Next() ) - { - const TopoDS_Edge& E = TopoDS::Edge( itE.Value() ); - TopoDS_Iterator itV( E ); - for ( ; itV.More(); itV.Next() ) - { - const TopoDS_Vertex & V = TopoDS::Vertex( itV.Value() ); - if ( !V.IsSame( theV )) - continue; - EList.Append( E ); - Standard_Real u = BRep_Tool::Parameter( V, E ); - UList.push_back( u ); - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, theF, f, l); - gp_Vec2d d1; - gp_Pnt2d p; - C2d->D1( u, p, d1 ); - gp_Vec2d n( d1.Y(), -d1.X() ); - if ( E.Orientation() == TopAbs_REVERSED ) - n.Reverse(); - N += n.Normalized(); - } - } - - // define step size by which to move theUV - - gp_Pnt2d nextUV; // uv of next node on edge, most distant of the four - double maxDist = -DBL_MAX; - TopTools_ListIteratorOfListOfShape aEIt (EList); - list< double >::iterator aUIt = UList.begin(); - for ( ; aEIt.More(); aEIt.Next(), aUIt++ ) - { - const TopoDS_Edge& E = TopoDS::Edge( aEIt.Value() ); - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, theF, f, l); - - double umin = DBL_MAX, umax = -DBL_MAX; - SMDS_NodeIteratorPtr nIt = theMesh.GetSubMesh(E)->GetSubMeshDS()->GetNodes(); - if ( !nIt->more() ) // no nodes on edge, only on vertices - { - umin = l; - umax = f; - } - else - { - while ( nIt->more() ) { - const SMDS_MeshNode* node = nIt->next(); - const SMDS_EdgePosition* epos = - static_cast(node->GetPosition().get()); - double u = epos->GetUParameter(); - if ( u < umin ) - umin = u; - if ( u > umax ) - umax = u; - } - } - bool isFirstCommon = ( *aUIt == f ); - gp_Pnt2d uv = C2d->Value( isFirstCommon ? umin : umax ); - double dist = theUV.SquareDistance( uv ); - if ( dist > maxDist ) { - maxDist = dist; - nextUV = uv; - } - } - R2 uv0, uv1, uv2; - uv0.x = theUV.X(); uv0.y = theUV.Y(); - uv1.x = nextUV.X(); uv1.y = nextUV.Y(); - uv2.x = uv0.x; uv2.y = uv0.y; - if ( fixOverlappedLinkUV( uv0, uv1, uv2 )) - { - double step = theUV.Distance( gp_Pnt2d( uv0.x, uv0.y )); - - // move theUV along the normal by the step - - N *= step; - - MESSAGE("--fixCommonVertexUV move(" << theUV.X() << " " << theUV.Y() - << ") by (" << N.X() << " " << N.Y() << ")" - << endl << "--- MAX DIST " << maxDist); - - theUV.SetXY( theUV.XY() + N.XY() ); - - return true; - } - return false; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool StdMeshers_MEFISTO_2D::LoadPoints(SMESH_Mesh & aMesh, - const TopoDS_Face & FF, - const TopoDS_Wire & WW, - R2 * uvslf, - int & m, - map&mefistoToDS, - double scalex, - double scaley, - const TopTools_IndexedDataMapOfShapeListOfShape& VWMap) -{ -// MESSAGE("StdMeshers_MEFISTO_2D::LoadPoints"); - - //SMDS_Mesh * meshDS = aMesh.GetMeshDS(); - - TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD)); - - int mInit = m, mFirst, iEdge; - gp_XY scale( scalex, scaley ); - - TopoDS_Wire W = TopoDS::Wire(WW.Oriented(TopAbs_FORWARD)); - BRepTools_WireExplorer wexp(W, F); - for (wexp.Init(W, F), iEdge = 0; wexp.More(); wexp.Next(), iEdge++) - { - const TopoDS_Edge & E = wexp.Current(); - - // --- IDNodes of first and last Vertex - - TopoDS_Vertex VFirst, VLast; - TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l - - ASSERT(!VFirst.IsNull()); - SMDS_NodeIteratorPtr lid= - aMesh.GetSubMesh(VFirst)->GetSubMeshDS()->GetNodes(); - if ( !lid->more() ) { - MESSAGE (" NO NODE BUILT ON VERTEX "); - return false; - } - const SMDS_MeshNode* idFirst = lid->next(); - - ASSERT(!VLast.IsNull()); - lid=aMesh.GetSubMesh(VLast)->GetSubMeshDS()->GetNodes(); - if ( !lid->more() ) { - MESSAGE (" NO NODE BUILT ON VERTEX "); - return false; - } - const SMDS_MeshNode* idLast = lid->next(); - - // --- edge internal IDNodes (relies on good order storage, not checked) - - int nbPoints = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes(); - - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - - SMDS_NodeIteratorPtr ite= aMesh.GetSubMesh(E)->GetSubMeshDS()->GetNodes(); - - //bool isForward = (E.Orientation() == TopAbs_FORWARD); - map params; - - while(ite->more()) - { - const SMDS_MeshNode * node = ite->next(); - const SMDS_EdgePosition* epos = - static_cast(node->GetPosition().get()); - double param = epos->GetUParameter(); - params[param] = node; - } - if ( nbPoints != params.size()) - { - MESSAGE( "BAD NODE ON EDGE POSITIONS" ); - return false; - } - - mFirst = m; - - // --- load 2D values into MEFISTO structure, - // add IDNodes in mefistoToDS map - if (E.Orientation() == TopAbs_FORWARD) - { - gp_Pnt2d p = C2d->Value(f).XY().Multiplied( scale ); // first point = Vertex Forward - if ( fixCommonVertexUV( p, VFirst, W, myOuterWire, F, VWMap, aMesh )) - myNodesOnCommonV.push_back( idFirst ); - uvslf[m].x = p.X(); - uvslf[m].y = p.Y(); - mefistoToDS[m + 1] = idFirst; - //MESSAGE(" "<::iterator itp = params.begin(); - for (int i = 1; i <= nbPoints; i++) // nbPoints internal - { - double param = (*itp).first; - gp_Pnt2d p = C2d->Value(param).XY().Multiplied( scale ); - uvslf[m].x = p.X(); - uvslf[m].y = p.Y(); - mefistoToDS[m + 1] = (*itp).second; - //MESSAGE(" "<Value(l).XY().Multiplied( scale ); // last point = Vertex Reversed - if ( fixCommonVertexUV( p, VLast, W, myOuterWire, F, VWMap, aMesh )) - myNodesOnCommonV.push_back( idLast ); - uvslf[m].x = p.X(); - uvslf[m].y = p.Y(); - mefistoToDS[m + 1] = idLast; - //MESSAGE(" "<::reverse_iterator itp = params.rbegin(); - for (int i = nbPoints; i >= 1; i--) - { - double param = (*itp).first; - gp_Pnt2d p = C2d->Value(param).XY().Multiplied( scale ); - uvslf[m].x = p.X(); - uvslf[m].y = p.Y(); - mefistoToDS[m + 1] = (*itp).second; - //MESSAGE(" "< 0 ) - fixOverlappedLinkUV (uvslf[ mFirst - 1], - uvslf[ mFirst ], - uvslf[ mFirst + 1 ]); - - } // for wexp - - fixOverlappedLinkUV (uvslf[ m - 1], - uvslf[ mInit ], - uvslf[ mInit + 1 ]); - - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_MEFISTO_2D::ComputeScaleOnFace(SMESH_Mesh & aMesh, - const TopoDS_Face & aFace, double &scalex, double &scaley) -{ - //MESSAGE("StdMeshers_MEFISTO_2D::ComputeScaleOnFace"); - TopoDS_Face F = TopoDS::Face(aFace.Oriented(TopAbs_FORWARD)); - TopoDS_Wire W = BRepTools::OuterWire(F); - - double xmin = 1.e300; // min & max of face 2D parametric coord. - double xmax = -1.e300; - double ymin = 1.e300; - double ymax = -1.e300; - int nbp = 23; - scalex = 1; - scaley = 1; - - TopExp_Explorer wexp(W, TopAbs_EDGE); - for ( ; wexp.More(); wexp.Next()) - { - const TopoDS_Edge & E = TopoDS::Edge( wexp.Current() ); - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - if ( C2d.IsNull() ) continue; - double du = (l - f) / double (nbp); - for (int i = 0; i <= nbp; i++) - { - double param = f + double (i) * du; - gp_Pnt2d p = C2d->Value(param); - if (p.X() < xmin) - xmin = p.X(); - if (p.X() > xmax) - xmax = p.X(); - if (p.Y() < ymin) - ymin = p.Y(); - if (p.Y() > ymax) - ymax = p.Y(); - // MESSAGE(" "<< f<<" "<Value(xmin, ymoy); - gp_Pnt PY0 = S->Value(xmoy, ymin); - double dx = xsize / double (nbp); - double dy = ysize / double (nbp); - for (int i = 1; i <= nbp; i++) - { - double x = xmin + double (i) * dx; - gp_Pnt PX = S->Value(x, ymoy); - double y = ymin + double (i) * dy; - gp_Pnt PY = S->Value(xmoy, y); - length_x += PX.Distance(PX0); - length_y += PY.Distance(PY0); - PX0 = PX; - PY0 = PY; - } - scalex = length_x / xsize; - scaley = length_y / ysize; -// SCRUTE(xsize); -// SCRUTE(ysize); - double xyratio = xsize*scalex/(ysize*scaley); - const double maxratio = 1.e2; - //SCRUTE(xyratio); - if (xyratio > maxratio) { - SCRUTE( scaley ); - scaley *= xyratio / maxratio; - SCRUTE( scaley ); - } - else if (xyratio < 1./maxratio) { - SCRUTE( scalex ); - scalex *= 1 / xyratio / maxratio; - SCRUTE( scalex ); - } - ASSERT(scalex); - ASSERT(scaley); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_MEFISTO_2D::StoreResult(SMESH_Mesh & aMesh, - Z nbst, R2 * uvst, Z nbt, Z * nust, - const TopoDS_Face & F, bool faceIsForward, - map&mefistoToDS, - double scalex, double scaley) -{ - SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - int faceID = meshDS->ShapeToIndex( F ); - - Z n, m; - Handle(Geom_Surface) S = BRep_Tool::Surface(F); - - for (n = 0; n < nbst; n++) - { - if (mefistoToDS.find(n + 1) == mefistoToDS.end()) - { - double u = uvst[n][0] / scalex; - double v = uvst[n][1] / scaley; - gp_Pnt P = S->Value(u, v); - - SMDS_MeshNode * node = meshDS->AddNode(P.X(), P.Y(), P.Z()); - meshDS->SetNodeOnFace(node, faceID, u, v); - - //MESSAGE(P.X()<<" "<AddFace(n1, n2, n3); - else - elt = meshDS->AddFace(n1, n3, n2); - - meshDS->SetMeshElementOnShape(elt, faceID); - m++; - } - - // remove bad elements build on vertices shared by wires - - list::iterator itN = myNodesOnCommonV.begin(); - for ( ; itN != myNodesOnCommonV.end(); itN++ ) - { - const SMDS_MeshNode* node = *itN; - SMDS_ElemIteratorPtr invElemIt = node->GetInverseElementIterator(); - while ( invElemIt->more() ) - { - const SMDS_MeshElement* elem = invElemIt->next(); - SMDS_ElemIteratorPtr itN = elem->nodesIterator(); - int nbSame = 0; - while ( itN->more() ) - if ( itN->next() == node) - nbSame++; - if (nbSame > 1) { - MESSAGE( "RM bad element " << elem->GetID()); - meshDS->RemoveElement( elem ); - } - } - } - -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_MEFISTO_2D::ComputeEdgeElementLength(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape) -{ - //MESSAGE("StdMeshers_MEFISTO_2D::ComputeEdgeElementLength"); - // **** a mettre dans SMESH_2D_Algo ? - - const TopoDS_Face & FF = TopoDS::Face(aShape); - //bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD); - TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD)); - - double meanElementLength = 100; - double wireLength = 0; - int wireElementsNumber = 0; - for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next()) - { - const TopoDS_Wire & W = TopoDS::Wire(exp.Current()); - for (TopExp_Explorer expe(W, TopAbs_EDGE); expe.More(); expe.Next()) - { - const TopoDS_Edge & E = TopoDS::Edge(expe.Current()); - int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes(); - double length = EdgeLength(E); - wireLength += length; - wireElementsNumber += nb; - } - } - if (wireElementsNumber) - meanElementLength = wireLength / wireElementsNumber; - //SCRUTE(meanElementLength); - return meanElementLength; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_MEFISTO_2D::SaveTo(ostream & save) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_MEFISTO_2D::LoadFrom(istream & load) -{ - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_MEFISTO_2D & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_MEFISTO_2D & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_MEFISTO_2D.hxx b/src/StdMeshers/StdMeshers_MEFISTO_2D.hxx deleted file mode 100644 index fac85f07d..000000000 --- a/src/StdMeshers/StdMeshers_MEFISTO_2D.hxx +++ /dev/null @@ -1,100 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_MEFISTO_2D.hxx -// Moved here from SMESH_MEFISTO_2D.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_MEFISTO_2D_HXX_ -#define _StdMeshers_MEFISTO_2D_HXX_ - -#include "SMESH_2D_Algo.hxx" -#include - -class SMDS_MeshNode; -class TopTools_IndexedDataMapOfShapeListOfShape; -class TopoDS_Face; -class TopoDS_WIre; -class StdMeshers_MaxElementArea; -class StdMeshers_LengthFromEdges; -class SMDS_MeshNode; - -#include -#include -#include "Rn.h" - -class StdMeshers_MEFISTO_2D: - public SMESH_2D_Algo -{ -public: - StdMeshers_MEFISTO_2D(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_MEFISTO_2D(); - - virtual bool CheckHypothesis(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - SMESH_Hypothesis::Hypothesis_Status& aStatus); - - virtual bool Compute(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape); - - double ComputeEdgeElementLength(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape); - - bool LoadPoints(SMESH_Mesh& aMesh, - const TopoDS_Face& F, - const TopoDS_Wire& W, - R2* uvslf, - int& m, - map& mefistoToDS, - double scalex, double scaley, - const TopTools_IndexedDataMapOfShapeListOfShape& VWMap); - - void ComputeScaleOnFace(SMESH_Mesh& aMesh, - const TopoDS_Face& aFace, - double& scalex, - double& scaley); - - void StoreResult (SMESH_Mesh& aMesh, - Z nbst, R2* uvst, Z nbt, Z* nust, - const TopoDS_Face& F, bool faceIsForward, - map& mefistoToDS, - double scalex, double scaley); - - ostream & SaveTo(ostream & save); - istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_MEFISTO_2D & hyp); - friend istream & operator >> (istream & load, StdMeshers_MEFISTO_2D & hyp); - -protected: - double _edgeLength; - double _maxElementArea; - const StdMeshers_MaxElementArea* _hypMaxElementArea; - const StdMeshers_LengthFromEdges* _hypLengthFromEdges; - - TopoDS_Wire myOuterWire; - std::list myNodesOnCommonV; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_MaxElementArea.cxx b/src/StdMeshers/StdMeshers_MaxElementArea.cxx deleted file mode 100644 index c4a2d5e17..000000000 --- a/src/StdMeshers/StdMeshers_MaxElementArea.cxx +++ /dev/null @@ -1,139 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_MaxElementArea.cxx -// Moved here from SMESH_MaxElementArea.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_MaxElementArea.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MaxElementArea::StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _maxArea =1.; - _name = "MaxElementArea"; -// SCRUTE(_name); -// SCRUTE(&_name); - _param_algo_dim = 2; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MaxElementArea::~StdMeshers_MaxElementArea() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_MaxElementArea::SetMaxArea(double maxArea) - throw (SALOME_Exception) -{ - double oldArea = _maxArea; - if (maxArea <= 0) - throw SALOME_Exception(LOCALIZED("maxArea must be positive")); - _maxArea = maxArea; - if (_maxArea != oldArea) - NotifySubMeshesHypothesisModification(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_MaxElementArea::GetMaxArea() const -{ - return _maxArea; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_MaxElementArea::SaveTo(ostream & save) -{ - save << this->_maxArea; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_MaxElementArea::LoadFrom(istream & load) -{ - bool isOK = true; - double a; - isOK = (load >> a); - if (isOK) - this->_maxArea = a; - else - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator << (ostream & save, StdMeshers_MaxElementArea & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >> (istream & load, StdMeshers_MaxElementArea & hyp) -{ - return hyp.LoadFrom( load ); -} - diff --git a/src/StdMeshers/StdMeshers_MaxElementArea.hxx b/src/StdMeshers/StdMeshers_MaxElementArea.hxx deleted file mode 100644 index 52af887c8..000000000 --- a/src/StdMeshers/StdMeshers_MaxElementArea.hxx +++ /dev/null @@ -1,55 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_MaxElementArea.hxx -// Moved here from SMESH_MaxElementArea.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MAXELEMENTAREA_HXX_ -#define _SMESH_MAXELEMENTAREA_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_MaxElementArea:public SMESH_Hypothesis -{ - public: - StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_MaxElementArea(); - - void SetMaxArea(double maxArea) throw(SALOME_Exception); - - double GetMaxArea() const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_MaxElementArea & hyp); - friend istream & operator >>(istream & load, StdMeshers_MaxElementArea & hyp); - - protected: - double _maxArea; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_MaxElementVolume.cxx b/src/StdMeshers/StdMeshers_MaxElementVolume.cxx deleted file mode 100644 index f9f6b6322..000000000 --- a/src/StdMeshers/StdMeshers_MaxElementVolume.cxx +++ /dev/null @@ -1,141 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_MaxElementVolume.cxx -// Moved here from SMESH_MaxElementVolume.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; - -#include "StdMeshers_MaxElementVolume.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MaxElementVolume::StdMeshers_MaxElementVolume(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _maxVolume =1.; - _name = "MaxElementVolume"; -// SCRUTE(_name); - SCRUTE(&_name); - _param_algo_dim = 3; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MaxElementVolume::~StdMeshers_MaxElementVolume() -{ - MESSAGE("StdMeshers_MaxElementVolume::~StdMeshers_MaxElementVolume"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_MaxElementVolume::SetMaxVolume(double maxVolume) - throw (SALOME_Exception) -{ - double oldVolume = _maxVolume; - if (maxVolume <= 0) - throw SALOME_Exception(LOCALIZED("maxVolume must be positive")); - _maxVolume = maxVolume; - if (_maxVolume != oldVolume) - NotifySubMeshesHypothesisModification(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_MaxElementVolume::GetMaxVolume() const -{ - return _maxVolume; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_MaxElementVolume::SaveTo(ostream & save) -{ - save << this->_maxVolume; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_MaxElementVolume::LoadFrom(istream & load) -{ - bool isOK = true; - double a; - isOK = (load >> a); - if (isOK) - this->_maxVolume = a; - else - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator << (ostream & save, StdMeshers_MaxElementVolume & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >> (istream & load, StdMeshers_MaxElementVolume & hyp) -{ - return hyp.LoadFrom( load ); -} - diff --git a/src/StdMeshers/StdMeshers_MaxElementVolume.hxx b/src/StdMeshers/StdMeshers_MaxElementVolume.hxx deleted file mode 100644 index ee9986f1f..000000000 --- a/src/StdMeshers/StdMeshers_MaxElementVolume.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_MaxElementVolume.hxx -// Moved here from SMESH_MaxElementVolume.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MAXELEMENTVOLUME_HXX_ -#define _SMESH_MAXELEMENTVOLUME_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_MaxElementVolume: - public SMESH_Hypothesis -{ -public: - StdMeshers_MaxElementVolume(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_MaxElementVolume(); - - void SetMaxVolume(double maxVolume) - throw (SALOME_Exception); - - double GetMaxVolume() const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_MaxElementVolume & hyp); - friend istream & operator >> (istream & load, StdMeshers_MaxElementVolume & hyp); - -protected: - double _maxVolume; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_NotConformAllowed.cxx b/src/StdMeshers/StdMeshers_NotConformAllowed.cxx deleted file mode 100644 index 5c471b2a0..000000000 --- a/src/StdMeshers/StdMeshers_NotConformAllowed.cxx +++ /dev/null @@ -1,98 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_NotConformAllowed.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_NotConformAllowed.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_NotConformAllowed::StdMeshers_NotConformAllowed(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _name = "NotConformAllowed"; - _param_algo_dim = -1; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_NotConformAllowed::~StdMeshers_NotConformAllowed() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_NotConformAllowed::SaveTo(ostream & save) -{ - return save << this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_NotConformAllowed::LoadFrom(istream & load) -{ - return load >> (*this); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator << (ostream & save, StdMeshers_NotConformAllowed & hyp) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >> (istream & load, StdMeshers_NotConformAllowed & hyp) -{ - return load; -} diff --git a/src/StdMeshers/StdMeshers_NotConformAllowed.hxx b/src/StdMeshers/StdMeshers_NotConformAllowed.hxx deleted file mode 100644 index 079742458..000000000 --- a/src/StdMeshers/StdMeshers_NotConformAllowed.hxx +++ /dev/null @@ -1,48 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_NotConformAllowed.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_NotConformAllowed_HXX_ -#define _StdMeshers_NotConformAllowed_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_NotConformAllowed: - public SMESH_Hypothesis -{ -public: - StdMeshers_NotConformAllowed(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_NotConformAllowed(); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_NotConformAllowed & hyp); - friend istream & operator >> (istream & load, StdMeshers_NotConformAllowed & hyp); -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_Penta_3D.cxx b/src/StdMeshers/StdMeshers_Penta_3D.cxx deleted file mode 100644 index ad6ebc831..000000000 --- a/src/StdMeshers/StdMeshers_Penta_3D.cxx +++ /dev/null @@ -1,1582 +0,0 @@ -// SMESH StdMeshers_Penta_3D implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_Penta_3D.cxx -// Module : SMESH - -#include "StdMeshers_Penta_3D.hxx" - -#include "utilities.h" -#include "Utils_ExceptHandlers.hxx" - -#include "SMDS_EdgePosition.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDS_VolumeOfNodes.hxx" -#include "SMDS_VolumeTool.hxx" -#include "SMESHDS_SubMesh.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" -#include "SMESH_MeshEditor.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -using namespace std; - -typedef map < int, int, less >::iterator \ - StdMeshers_IteratorOfDataMapOfIntegerInteger; - -//======================================================================= -//function : StdMeshers_Penta_3D -//purpose : -//======================================================================= -StdMeshers_Penta_3D::StdMeshers_Penta_3D() -: myErrorStatus(1) -{ - myTol3D=0.1; - myWallNodesMaps.resize( SMESH_Block::NbFaces() ); - myShapeXYZ.resize( SMESH_Block::NbSubShapes() ); -} -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -bool StdMeshers_Penta_3D::Compute(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape) -{ - MESSAGE("StdMeshers_Penta_3D::Compute()"); - // - myErrorStatus=0; - // - bool bOK=false; - // - myShape=aShape; - SetMesh(aMesh); - // - CheckData(); - if (myErrorStatus){ - return bOK; - } - // - MakeBlock(); - if (myErrorStatus){ - return bOK; - } - // - MakeNodes(); - if (myErrorStatus){ - return bOK; - } - // - MakeConnectingMap(); - // - ClearMeshOnFxy1(); - if (myErrorStatus) { - return bOK; - } - // - MakeMeshOnFxy1(); - if (myErrorStatus) { - return bOK; - } - // - MakeVolumeMesh(); - // - return !bOK; -} -//======================================================================= -//function : MakeNodes -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeNodes() -{ - myErrorStatus=0; - // - const int aNbSIDs=9; - int i, j, k, ij, iNbN, aNodeID, aSize, iErr; - double aX, aY, aZ; - SMESH_Block::TShapeID aSID, aSIDs[aNbSIDs]={ - SMESH_Block::ID_V000, SMESH_Block::ID_V100, - SMESH_Block::ID_V110, SMESH_Block::ID_V010, - SMESH_Block::ID_Ex00, SMESH_Block::ID_E1y0, - SMESH_Block::ID_Ex10, SMESH_Block::ID_E0y0, - SMESH_Block::ID_Fxy0 - }; - // - SMESH_Mesh* pMesh=GetMesh(); - // - // 1. Define the sizes of mesh - // - // 1.1 Horizontal size - myJSize=0; - for (i=0; iGetSubMeshContaining(aS); - ASSERT(aSubMesh); - SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS(); - iNbN=aSM->NbNodes(); - myJSize+=iNbN; - } - //printf("*** Horizontal: number of nodes summary=%d\n", myJSize); - // - // 1.2 Vertical size - myISize=2; - { - const TopoDS_Shape& aS=myBlock.Shape(SMESH_Block::ID_E00z); - SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aS); - ASSERT(aSubMesh); - SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS(); - iNbN=aSM->NbNodes(); - myISize+=iNbN; - } - //printf("*** Vertical: number of nodes on edges and vertices=%d\n", myISize); - // - aSize=myISize*myJSize; - myTNodes.resize(aSize); - // - StdMeshers_TNode aTNode; - gp_XYZ aCoords; - gp_Pnt aP3D; - // - // 2. Fill the repers on base face (Z=0) - i=0; j=0; - // vertices - for (k=0; kGetSubMeshContaining(aS)->GetSubMeshDS()->GetNodes(); - while(ite->more()) { - const SMDS_MeshNode* aNode = ite->next(); - aNodeID=aNode->GetID(); - // - aTNode.SetNode(aNode); - aTNode.SetShapeSupportID(aSID); - aTNode.SetBaseNodeID(aNodeID); - // - if ( SMESH_Block::IsEdgeID (aSID)) - { - const SMDS_EdgePosition* epos = - static_cast(aNode->GetPosition().get()); - myBlock.ComputeParameters( epos->GetUParameter(), aS, aCoords ); - } - else { - aX=aNode->X(); - aY=aNode->Y(); - aZ=aNode->Z(); - aP3D.SetCoord(aX, aY, aZ); - myBlock.ComputeParameters(aP3D, aS, aCoords); - } - iErr=myBlock.ErrorStatus(); - if (iErr) { - MESSAGE("StdMeshers_Penta_3D::MakeNodes()," << - "SMESHBlock: ComputeParameters operation failed"); - myErrorStatus=101; // SMESHBlock: ComputeParameters operation failed - return; - } - aTNode.SetNormCoord(aCoords); - ij=i*myJSize+j; - myTNodes[ij]=aTNode; - ++j; - } - } - /* - //DEB - { - int iShapeSupportID, iBaseNodeID; - // - //printf("\n\n*** Base Face\n"); - i=0; - for (j=0; j aZL(myISize); -// vector::iterator aItZL1, aItZL2 ; -// // -// const TopoDS_Shape& aE00z=myBlock.Shape(SMESH_Block::ID_E00z); -// SMDS_NodeIteratorPtr aItaE00z = -// pMesh->GetSubMeshContaining(aE00z)->GetSubMeshDS()->GetNodes(); -// // -// aZL[0]=0.; -// i=1; -// while (aItaE00z->more()) { -// const SMDS_MeshNode* aNode=aItaE00z->next(); -// const SMDS_EdgePosition* epos = -// static_cast(aNode->GetPosition().get()); -// myBlock.ComputeParameters( epos->GetUParameter(), aE00z, aCoords ); -// iErr=myBlock.ErrorStatus(); -// if (iErr) { -// MESSAGE("StdMeshers_Penta_3D::MakeNodes()," << -// "SMESHBlock: ComputeParameters operation failed"); -// myErrorStatus=101; // SMESHBlock: ComputeParameters operation failed -// return; -// } -// aZL[i]=aCoords.Z(); -// ++i; -// } -// aZL[i]=1.; -// // -// aItZL1=aZL.begin(); -// aItZL2=aZL.end(); -// // -// // Sorting the layers -// sort(aItZL1, aItZL2); - //DEB - /* - printf("** \n\n Layers begin\n"); - for(i=0, aItZL=aItZL1; aItZL!=aItZL2; ++aItZL, ++i) { - printf(" #%d : %lf\n", i, *aItZL); - } - printf("** Layers end\n"); - */ - //DEB - // - // - - // 3.1 Fill maps of wall nodes - SMESH_Block::TShapeID wallFaceID[4] = { - SMESH_Block::ID_Fx0z, SMESH_Block::ID_Fx1z, - SMESH_Block::ID_F0yz, SMESH_Block::ID_F1yz - }; - SMESH_Block::TShapeID baseEdgeID[4] = { - SMESH_Block::ID_Ex00, SMESH_Block::ID_Ex10, - SMESH_Block::ID_E0y0, SMESH_Block::ID_E1y0 - }; - for ( i = 0; i < 4; ++i ) { - int fIndex = SMESH_Block::ShapeIndex( wallFaceID[ i ]); - bool ok = LoadIJNodes (myWallNodesMaps[ fIndex ], - TopoDS::Face( myBlock.Shape( wallFaceID[ i ] )), - TopoDS::Edge( myBlock.Shape( baseEdgeID[ i ] )), - pMesh->GetMeshDS()); - if ( !ok ) { - myErrorStatus = i + 1; - MESSAGE(" Cant LoadIJNodes() from a wall face " << myErrorStatus ); - return; - } - } - - // 3.2 find node columns for vertical edges and edge IDs - vector * verticEdgeNodes[ 4 ]; - SMESH_Block::TShapeID verticEdgeID [ 4 ]; - for ( i = 0; i < 4; ++i ) { // 4 first base nodes are nodes on vertices - // edge ID - SMESH_Block::TShapeID eID, vID = aSIDs[ i ]; - ShapeSupportID(false, vID, eID); - verticEdgeID[ i ] = eID; - // column nodes - StdMeshers_TNode& aTNode = myTNodes[ i ]; - verticEdgeNodes[ i ] = 0; - for ( j = 0; j < 4; ++j ) { // loop on 4 wall faces - int fIndex = SMESH_Block::ShapeIndex( wallFaceID[ j ]); - StdMeshers_IJNodeMap & ijNodes= myWallNodesMaps[ fIndex ]; - if ( ijNodes.begin()->second[0] == aTNode.Node() ) - verticEdgeNodes[ i ] = & ijNodes.begin()->second; - else if ( ijNodes.rbegin()->second[0] == aTNode.Node() ) - verticEdgeNodes[ i ] = & ijNodes.rbegin()->second; - if ( verticEdgeNodes[ i ] ) - break; - } - } - - // 3.3 set XYZ of vertices, and initialize of the rest - SMESHDS_Mesh* aMesh = GetMesh()->GetMeshDS(); - for ( int id = SMESH_Block::ID_V000; id < SMESH_Block::ID_Shell; ++id ) - { - if ( SMESH_Block::IsVertexID( id )) { - TopoDS_Shape V = myBlock.Shape( id ); - SMESHDS_SubMesh* sm = aMesh->MeshElements( V ); - const SMDS_MeshNode* n = sm->GetNodes()->next(); - myShapeXYZ[ id ].SetCoord( n->X(), n->Y(), n->Z() ); - } - else - myShapeXYZ[ id ].SetCoord( 0., 0., 0. ); - } - - - // 4. Fill the rest repers - bool bIsUpperLayer; - int iBNID; - SMESH_Block::TShapeID aSSID, aBNSSID; - StdMeshers_TNode aTN; - // - for (j=0; j* nColumns[8]; - double ratio[4]; // base node position between columns [0.-1.] - if ( createNode ) - for ( k = 0; k < 4; ++k ) - ratio[ k ] = SetHorizEdgeXYZ (aBNXYZ, wallFaceID[ k ], - nColumns[k*2], nColumns[k*2+1]); - // - // XYZ on the bottom and top faces - const SMDS_MeshNode* n = aBN.Node(); - myShapeXYZ[ SMESH_Block::ID_Fxy0 ].SetCoord( n->X(), n->Y(), n->Z() ); - myShapeXYZ[ SMESH_Block::ID_Fxy1 ].SetCoord( 0., 0., 0. ); - // - // first create or find a top node, then the rest ones in a column - for (i=myISize-1; i>0; --i) - { - if ( createNode ) { - // set XYZ on vertical edges and faces - for ( k = 0; k < 4; ++k ) { - const SMDS_MeshNode* n = (*verticEdgeNodes[ k ]) [ i ]; - myShapeXYZ[ verticEdgeID[ k ] ].SetCoord( n->X(), n->Y(), n->Z() ); - // - n = (*nColumns[k*2]) [ i ]; - gp_XYZ xyz( n->X(), n->Y(), n->Z() ); - myShapeXYZ[ wallFaceID[ k ]] = ( 1. - ratio[ k ]) * xyz; - n = (*nColumns[k*2+1]) [ i ]; - xyz.SetCoord( n->X(), n->Y(), n->Z() ); - myShapeXYZ[ wallFaceID[ k ]] += ratio[ k ] * xyz; - } - } - // fill current node info - // -index in aTNodes - ij=i*myJSize+j; - // -normalized coordinates - aX=aBNXYZ.X(); - aY=aBNXYZ.Y(); - //aZ=aZL[i]; - aZ=(double)i/(double)(myISize-1); - aCoords.SetCoord(aX, aY, aZ); - // - // suporting shape ID - bIsUpperLayer=(i==(myISize-1)); - ShapeSupportID(bIsUpperLayer, aBNSSID, aSSID); - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeNodes() "); - return; - } - // - aTN.SetShapeSupportID(aSSID); - aTN.SetNormCoord(aCoords); - aTN.SetBaseNodeID(iBNID); - // - if (aSSID!=SMESH_Block::ID_NONE){ - // try to find the node - const TopoDS_Shape& aS=myBlock.Shape((int)aSSID); - FindNodeOnShape(aS, aCoords, i, aTN); - } - else{ - // create node and get it id - CreateNode (bIsUpperLayer, aCoords, aTN); - // - if ( bIsUpperLayer ) { - const SMDS_MeshNode* n = aTN.Node(); - myShapeXYZ[ SMESH_Block::ID_Fxy1 ].SetCoord( n->X(), n->Y(), n->Z() ); - } - } - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeNodes() "); - return; - } - // - myTNodes[ij]=aTN; - } - } - //DEB - /* - { - int iSSID, iBNID, aID; - // - for (i=0; iGetID(); - aX=aNode->X(); - aY=aNode->Y(); - aZ=aNode->Z(); - printf("*** j:%d BNID#%d iSSID:%d ID:%d { %lf %lf %lf }, { %lf %lf %lf }\n", - j, iBNID, iSSID, aID, aXYZ.X(), aXYZ.Y(), aXYZ.Z(), aX, aY, aZ); - } - } - } - */ - //DEB t -} -//======================================================================= -//function : FindNodeOnShape -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::FindNodeOnShape(const TopoDS_Shape& aS, - const gp_XYZ& aParams, - const int z, - StdMeshers_TNode& aTN) -{ - myErrorStatus=0; - // - double aX, aY, aZ, aD, aTol2, minD; - gp_Pnt aP1, aP2; - // - SMESH_Mesh* pMesh=GetMesh(); - aTol2=myTol3D*myTol3D; - minD = 1.e100; - SMDS_MeshNode* pNode=NULL; - // - if ( aS.ShapeType() == TopAbs_FACE || - aS.ShapeType() == TopAbs_EDGE ) - { - // find a face ID to which aTN belongs to - int faceID; - if ( aS.ShapeType() == TopAbs_FACE ) - faceID = myBlock.ShapeID( aS ); - else { // edge maybe vertical or top horizontal - gp_XYZ aCoord = aParams; - if ( aCoord.Z() == 1. ) - aCoord.SetZ( 0.5 ); // move from top down - else - aCoord.SetX( 0.5 ); // move along X - faceID = SMESH_Block::GetShapeIDByParams( aCoord ); - } - ASSERT( SMESH_Block::IsFaceID( faceID )); - int fIndex = SMESH_Block::ShapeIndex( faceID ); - StdMeshers_IJNodeMap & ijNodes= myWallNodesMaps[ fIndex ]; - // look for a base node in ijNodes - const SMDS_MeshNode* baseNode = pMesh->GetMeshDS()->FindNode( aTN.BaseNodeID() ); - StdMeshers_IJNodeMap::const_iterator par_nVec = ijNodes.begin(); - for ( ; par_nVec != ijNodes.end(); par_nVec++ ) - if ( par_nVec->second[ 0 ] == baseNode ) { - pNode=(SMDS_MeshNode*)par_nVec->second.at( z ); - aTN.SetNode(pNode); - return; - } - } - // - myBlock.Point(aParams, aS, aP1); - // - SMDS_NodeIteratorPtr ite= - pMesh->GetSubMeshContaining(aS)->GetSubMeshDS()->GetNodes(); - while(ite->more()) { - const SMDS_MeshNode* aNode = ite->next(); - aX=aNode->X(); - aY=aNode->Y(); - aZ=aNode->Z(); - aP2.SetCoord(aX, aY, aZ); - aD=(double)aP1.SquareDistance(aP2); - //printf("** D=%lf ", aD, aTol2); - if (aD < minD) { - pNode=(SMDS_MeshNode*)aNode; - aTN.SetNode(pNode); - minD = aD; - //printf(" Ok\n"); - if (aD*& aCol1, - vector*& aCol2) -{ - // find base and top edges of the face - vector< int > edgeVec; // 0-base, 1-top - SMESH_Block::GetFaceEdgesIDs( aFaceID, edgeVec ); - // - int coord = SMESH_Block::GetCoordIndOnEdge( edgeVec[ 0 ] ); - double param = aBaseNodeParams.Coord( coord ); - if ( !myBlock.IsForwadEdge( edgeVec[ 0 ] )) - param = 1. - param; - // - // look for columns around param - StdMeshers_IJNodeMap & ijNodes = - myWallNodesMaps[ SMESH_Block::ShapeIndex( aFaceID )]; - StdMeshers_IJNodeMap::iterator par_nVec_1 = ijNodes.begin(); - while ( par_nVec_1->first < param ) - par_nVec_1++; - StdMeshers_IJNodeMap::iterator par_nVec_2 = par_nVec_1; - // - double r = 0; - if ( par_nVec_1 != ijNodes.begin() ) { - par_nVec_1--; - r = ( param - par_nVec_1->first ) / ( par_nVec_2->first - par_nVec_1->first ); - } - aCol1 = & par_nVec_1->second; - aCol2 = & par_nVec_2->second; - - // base edge - const SMDS_MeshNode* n1 = aCol1->front(); - const SMDS_MeshNode* n2 = aCol2->front(); - gp_XYZ xyz1( n1->X(), n1->Y(), n1->Z() ), xyz2( n2->X(), n2->Y(), n2->Z() ); - myShapeXYZ[ edgeVec[ 0 ] ] = ( 1. - r ) * xyz1 + r * xyz2; - - // top edge - n1 = aCol1->back(); - n2 = aCol2->back(); - xyz1.SetCoord( n1->X(), n1->Y(), n1->Z() ); - xyz2.SetCoord( n2->X(), n2->Y(), n2->Z() ); - myShapeXYZ[ edgeVec[ 1 ] ] = ( 1. - r ) * xyz1 + r * xyz2; - - return r; -} - -//======================================================================= -//function : MakeVolumeMesh -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeVolumeMesh() -{ - myErrorStatus=0; - // - int i, j, ij, ik, i1, i2, aSSID; - // - SMESH_Mesh* pMesh =GetMesh(); - SMESHDS_Mesh* meshDS=pMesh->GetMeshDS(); - // - int shapeID = meshDS->ShapeToIndex( myShape ); - // - // 1. Set Node In Volume - ik=myISize-1; - for (i=1; iSetNodeInVolume(aNode, shapeID); - } - } - } - // - // 2. Make pentahedrons - int aID0, k , aJ[3]; - vector aN; - // - SMDS_ElemIteratorPtr itf, aItNodes; - // - const TopoDS_Face& aFxy0= - TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy0)); - SMESH_subMesh *aSubMesh0 = pMesh->GetSubMeshContaining(aFxy0); - SMESHDS_SubMesh *aSM0=aSubMesh0->GetSubMeshDS(); - // - itf=aSM0->GetElements(); - while(itf->more()) { - const SMDS_MeshElement* pE0=itf->next(); - // - int nbFaceNodes = pE0->NbNodes(); - if ( aN.size() < nbFaceNodes * 2 ) - aN.resize( nbFaceNodes * 2 ); - // - k=0; - aItNodes=pE0->nodesIterator(); - while (aItNodes->more()) { - const SMDS_MeshElement* pNode=aItNodes->next(); - aID0=pNode->GetID(); - aJ[k]=GetIndexOnLayer(aID0); - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeVolumeMesh"); - return; - } - // - ++k; - } - // - bool forward = true; - for (i=0; iAddVolume(aN[0], aN[1], aN[2], - aN[3], aN[4], aN[5]); - else - aV = meshDS->AddVolume(aN[0], aN[2], aN[1], - aN[3], aN[5], aN[4]); - break; - case 4: - if ( forward ) - aV = meshDS->AddVolume(aN[0], aN[1], aN[2], aN[3], - aN[4], aN[5], aN[6], aN[7]); - else - aV = meshDS->AddVolume(aN[0], aN[3], aN[2], aN[1], - aN[4], aN[7], aN[6], aN[5]); - break; - default: - continue; - } - meshDS->SetMeshElementOnShape(aV, shapeID); - } - } -} - -//======================================================================= -//function : MakeMeshOnFxy1 -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeMeshOnFxy1() -{ - myErrorStatus=0; - // - int aID0, aJ, aLevel, ij, aNbNodes, k; - // - SMDS_NodeIteratorPtr itn; - SMDS_ElemIteratorPtr itf, aItNodes; - SMDSAbs_ElementType aElementType; - // - const TopoDS_Face& aFxy0= - TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy0)); - const TopoDS_Face& aFxy1= - TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy1)); - // - SMESH_Mesh* pMesh=GetMesh(); - SMESHDS_Mesh * meshDS = pMesh->GetMeshDS(); - // - SMESH_subMesh *aSubMesh0 = pMesh->GetSubMeshContaining(aFxy0); - SMESHDS_SubMesh *aSM0=aSubMesh0->GetSubMeshDS(); - // - // set nodes on aFxy1 - aLevel=myISize-1; - itn=aSM0->GetNodes(); - aNbNodes=aSM0->NbNodes(); - //printf("** aNbNodes=%d\n", aNbNodes); - while(itn->more()) { - const SMDS_MeshNode* aN0=itn->next(); - aID0=aN0->GetID(); - aJ=GetIndexOnLayer(aID0); - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeMeshOnFxy1() "); - return; - } - // - ij=aLevel*myJSize+aJ; - const StdMeshers_TNode& aTN1=myTNodes[ij]; - SMDS_MeshNode* aN1=(SMDS_MeshNode*)aTN1.Node(); - // - meshDS->SetNodeOnFace(aN1, aFxy1); - } - // - // set elements on aFxy1 - vector aNodes1; - // - itf=aSM0->GetElements(); - while(itf->more()) { - const SMDS_MeshElement * pE0=itf->next(); - aElementType=pE0->GetType(); - if (!aElementType==SMDSAbs_Face) { - continue; - } - aNbNodes=pE0->NbNodes(); -// if (aNbNodes!=3) { -// continue; -// } - if ( aNodes1.size() < aNbNodes ) - aNodes1.resize( aNbNodes ); - // - k=aNbNodes-1; // reverse a face - aItNodes=pE0->nodesIterator(); - while (aItNodes->more()) { - const SMDS_MeshElement* pNode=aItNodes->next(); - aID0=pNode->GetID(); - aJ=GetIndexOnLayer(aID0); - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeMeshOnFxy1() "); - return; - } - // - ij=aLevel*myJSize+aJ; - const StdMeshers_TNode& aTN1=myTNodes[ij]; - const SMDS_MeshNode* aN1=aTN1.Node(); - aNodes1[k]=aN1; - --k; - } - SMDS_MeshFace * face = 0; - switch ( aNbNodes ) { - case 3: - face = meshDS->AddFace(aNodes1[0], aNodes1[1], aNodes1[2]); - break; - case 4: - face = meshDS->AddFace(aNodes1[0], aNodes1[1], aNodes1[2], aNodes1[3]); - break; - default: - continue; - } - meshDS->SetMeshElementOnShape(face, aFxy1); - } -} -//======================================================================= -//function : ClearMeshOnFxy1 -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::ClearMeshOnFxy1() -{ - myErrorStatus=0; - // - SMESH_subMesh* aSubMesh; - SMESH_Mesh* pMesh=GetMesh(); - // - const TopoDS_Shape& aFxy1=myBlock.Shape(SMESH_Block::ID_Fxy1); - aSubMesh = pMesh->GetSubMeshContaining(aFxy1); - if (aSubMesh) - aSubMesh->ComputeStateEngine( SMESH_subMesh::CLEAN ); -} - -//======================================================================= -//function : GetIndexOnLayer -//purpose : -//======================================================================= -int StdMeshers_Penta_3D::GetIndexOnLayer(const int aID) -{ - myErrorStatus=0; - // - int j=-1; - StdMeshers_IteratorOfDataMapOfIntegerInteger aMapIt; - // - aMapIt=myConnectingMap.find(aID); - if (aMapIt==myConnectingMap.end()) { - myErrorStatus=200; - return j; - } - j=(*aMapIt).second; - return j; -} -//======================================================================= -//function : MakeConnectingMap -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeConnectingMap() -{ - int j, aBNID; - // - for (j=0; jGetMeshDS(); - // - pNode = pMeshDS->AddNode(aX, aY, aZ); - aTN.SetNode(pNode); -} -//======================================================================= -//function : ShapeSupportID -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::ShapeSupportID(const bool bIsUpperLayer, - const SMESH_Block::TShapeID aBNSSID, - SMESH_Block::TShapeID& aSSID) -{ - myErrorStatus=0; - // - switch (aBNSSID) { - case SMESH_Block::ID_V000: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V001 : SMESH_Block::ID_E00z; - break; - case SMESH_Block::ID_V100: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V101 : SMESH_Block::ID_E10z; - break; - case SMESH_Block::ID_V110: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V111 : SMESH_Block::ID_E11z; - break; - case SMESH_Block::ID_V010: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V011 : SMESH_Block::ID_E01z; - break; - case SMESH_Block::ID_Ex00: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_Ex01 : SMESH_Block::ID_Fx0z; - break; - case SMESH_Block::ID_Ex10: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_Ex11 : SMESH_Block::ID_Fx1z; - break; - case SMESH_Block::ID_E0y0: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_E0y1 : SMESH_Block::ID_F0yz; - break; - case SMESH_Block::ID_E1y0: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_E1y1 : SMESH_Block::ID_F1yz; - break; - case SMESH_Block::ID_Fxy0: - aSSID=SMESH_Block::ID_NONE;//(bIsUpperLayer) ? Shape_ID_Fxy1 : Shape_ID_NONE; - break; - default: - aSSID=SMESH_Block::ID_NONE; - myErrorStatus=10; // Can not find supporting shape ID - break; - } - return; -} -//======================================================================= -//function : MakeBlock -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeBlock() -{ - myErrorStatus=0; - // - bool bFound; - int i, j, iNbEV, iNbE, iErr, iCnt, iNbNodes, iNbF; - // - TopoDS_Vertex aV000, aV001; - TopoDS_Shape aFTr; - TopTools_IndexedDataMapOfShapeListOfShape aMVES; - TopTools_IndexedMapOfShape aME ,aMEV, aM; - TopTools_ListIteratorOfListOfShape aIt; - // - TopExp::MapShapes(myShape, TopAbs_FACE, aM); - // - // 0. Find triangulated face aFTr - SMDSAbs_ElementType aElementType; - SMESH_Mesh* pMesh=GetMesh(); - // - iCnt=0; - iNbF=aM.Extent(); - for (i=1; i<=iNbF; ++i) { - const TopoDS_Shape& aF=aM(i); - SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aF); - ASSERT(aSubMesh); - SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS(); - SMDS_ElemIteratorPtr itf=aSM->GetElements(); - while(itf->more()) { - const SMDS_MeshElement * pElement=itf->next(); - aElementType=pElement->GetType(); - if (aElementType==SMDSAbs_Face) { - iNbNodes=pElement->NbNodes(); - if (iNbNodes==3) { - aFTr=aF; - ++iCnt; - if (iCnt>1) { - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=5; // more than one face has triangulation - return; - } - break; // next face - } - } - } - } - // - // 1. Vetrices V00, V001; - // - TopExp::MapShapes(aFTr, TopAbs_EDGE, aME); - TopExp::MapShapesAndAncestors(myShape, TopAbs_VERTEX, TopAbs_EDGE, aMVES); - // - // 1.1 Base vertex V000 - iNbE=aME.Extent(); - if (iNbE!=4){ - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=7; // too few edges are in base face aFTr - return; - } - const TopoDS_Edge& aE1=TopoDS::Edge(aME(1)); - aV000=TopExp::FirstVertex(aE1); - // - const TopTools_ListOfShape& aLE=aMVES.FindFromKey(aV000); - aIt.Initialize(aLE); - for (; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aEx=aIt.Value(); - aMEV.Add(aEx); - } - iNbEV=aMEV.Extent(); - if (iNbEV!=3){ - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=7; // too few edges meet in base vertex - return; - } - // - // 1.2 Vertex V001 - bFound=false; - for (j=1; j<=iNbEV; ++j) { - const TopoDS_Shape& aEx=aMEV(j); - if (!aME.Contains(aEx)) { - TopoDS_Vertex aV[2]; - // - const TopoDS_Edge& aE=TopoDS::Edge(aEx); - TopExp::Vertices(aE, aV[0], aV[1]); - for (i=0; i<2; ++i) { - if (!aV[i].IsSame(aV000)) { - aV001=aV[i]; - bFound=!bFound; - break; - } - } - } - } - // - if (!bFound) { - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=8; // can not find reper V001 - return; - } - //DEB - //gp_Pnt aP000, aP001; - // - //aP000=BRep_Tool::Pnt(TopoDS::Vertex(aV000)); - //printf("*** aP000 { %lf, %lf, %lf }\n", aP000.X(), aP000.Y(), aP000.Z()); - //aP001=BRep_Tool::Pnt(TopoDS::Vertex(aV001)); - //printf("*** aP001 { %lf, %lf, %lf }\n", aP001.X(), aP001.Y(), aP001.Z()); - //DEB - // - aME.Clear(); - TopExp::MapShapes(myShape, TopAbs_SHELL, aME); - iNbE=aME.Extent(); - if (iNbE!=1) { - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=9; // number of shells in source shape !=1 - return; - } - // - // 2. Load Block - const TopoDS_Shell& aShell=TopoDS::Shell(aME(1)); - myBlock.Load(aShell, aV000, aV001); - iErr=myBlock.ErrorStatus(); - if (iErr) { - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=100; // SMESHBlock: Load operation failed - return; - } -} -//======================================================================= -//function : CheckData -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::CheckData() -{ - myErrorStatus=0; - // - int i, iNb; - int iNbEx[]={8, 12, 6}; - // - TopAbs_ShapeEnum aST; - TopAbs_ShapeEnum aSTEx[]={ - TopAbs_VERTEX, TopAbs_EDGE, TopAbs_FACE - }; - TopTools_IndexedMapOfShape aM; - // - if (myShape.IsNull()){ - MESSAGE("StdMeshers_Penta_3D::CheckData() "); - myErrorStatus=2; // null shape - return; - } - // - aST=myShape.ShapeType(); - if (!(aST==TopAbs_SOLID || aST==TopAbs_SHELL)) { - MESSAGE("StdMeshers_Penta_3D::CheckData() "); - myErrorStatus=3; // not compatible type of shape - return; - } - // - for (i=0; i<3; ++i) { - aM.Clear(); - TopExp::MapShapes(myShape, aSTEx[i], aM); - iNb=aM.Extent(); - if (iNb!=iNbEx[i]){ - MESSAGE("StdMeshers_Penta_3D::CheckData() "); - myErrorStatus=4; // number of subshape is not compatible - return; - } - } -} - -//======================================================================= -//function : LoadIJNodes -//purpose : Load nodes bound to theFace into column (vectors) and rows -// of theIJNodes. -// The value of theIJNodes map is a vector of ordered nodes so -// that the 0-the one lies on theBaseEdge. -// The key of theIJNodes map is a normalized parameter of each -// 0-the node on theBaseEdge. -//======================================================================= - -bool StdMeshers_Penta_3D::LoadIJNodes(StdMeshers_IJNodeMap & theIJNodes, - const TopoDS_Face& theFace, - const TopoDS_Edge& theBaseEdge, - SMESHDS_Mesh* theMesh) -{ - // get vertices of theBaseEdge - TopoDS_Vertex vfb, vlb, vft; // first and last, bottom and top vertices - TopoDS_Edge eFrw = TopoDS::Edge( theBaseEdge.Oriented( TopAbs_FORWARD )); - TopExp::Vertices( eFrw, vfb, vlb ); - - // find the other edges of theFace and orientation of e1 - TopoDS_Edge e1, e2, eTop; - bool rev1, CumOri = false; - TopExp_Explorer exp( theFace, TopAbs_EDGE ); - int nbEdges = 0; - for ( ; exp.More(); exp.Next() ) - { - if ( ++nbEdges > 4 ) - return false; // more than 4 edges in theFace - TopoDS_Edge e = TopoDS::Edge( exp.Current() ); - if ( theBaseEdge.IsSame( e )) - continue; - TopoDS_Vertex vCommon; - if ( !TopExp::CommonVertex( theBaseEdge, e, vCommon )) - eTop = e; - else if ( vCommon.IsSame( vfb )) { - e1 = e; - vft = TopExp::LastVertex( e1, CumOri ); - rev1 = vfb.IsSame( vft ); - if ( rev1 ) - vft = TopExp::FirstVertex( e1, CumOri ); - } - else - e2 = e; - } - if ( nbEdges < 4 ) - return false; // lass than 4 edges in theFace - - // submeshes corresponding to shapes - SMESHDS_SubMesh* smFace = theMesh->MeshElements( theFace ); - SMESHDS_SubMesh* smb = theMesh->MeshElements( theBaseEdge ); - SMESHDS_SubMesh* smt = theMesh->MeshElements( eTop ); - SMESHDS_SubMesh* sm1 = theMesh->MeshElements( e1 ); - SMESHDS_SubMesh* sm2 = theMesh->MeshElements( e2 ); - SMESHDS_SubMesh* smVfb = theMesh->MeshElements( vfb ); - SMESHDS_SubMesh* smVlb = theMesh->MeshElements( vlb ); - SMESHDS_SubMesh* smVft = theMesh->MeshElements( vft ); - if (!smFace || !smb || !smt || !sm1 || !sm2 || !smVfb || !smVlb || !smVft ) { - MESSAGE( "NULL submesh " <NbNodes() != smt->NbNodes() || sm1->NbNodes() != sm2->NbNodes() ) { - MESSAGE(" Diff nb of nodes on opposite edges" ); - return false; - } - if (smVfb->NbNodes() != 1 || smVlb->NbNodes() != 1 || smVft->NbNodes() != 1) { - MESSAGE("Empty submesh of vertex"); - return false; - } - if ( sm1->NbNodes() * smb->NbNodes() != smFace->NbNodes() ) { - MESSAGE( "Wrong nb face nodes: " << - sm1->NbNodes()<<" "<NbNodes()<<" "<NbNodes()); - return false; - } - // IJ size - int vsize = sm1->NbNodes() + 2; - int hsize = smb->NbNodes() + 2; - - // load nodes from theBaseEdge - - set loadedNodes; - const SMDS_MeshNode* nullNode = 0; - - vector & nVecf = theIJNodes[ 0.]; - nVecf.resize( vsize, nullNode ); - loadedNodes.insert( nVecf[ 0 ] = smVfb->GetNodes()->next() ); - - vector & nVecl = theIJNodes[ 1.]; - nVecl.resize( vsize, nullNode ); - loadedNodes.insert( nVecl[ 0 ] = smVlb->GetNodes()->next() ); - - double f, l; - BRep_Tool::Range( eFrw, f, l ); - double range = l - f; - SMDS_NodeIteratorPtr nIt = smb->GetNodes(); - const SMDS_MeshNode* node; - while ( nIt->more() ) - { - node = nIt->next(); - const SMDS_EdgePosition* pos = - dynamic_cast( node->GetPosition().get() ); - if ( !pos ) return false; - double u = ( pos->GetUParameter() - f ) / range; - vector & nVec = theIJNodes[ u ]; - nVec.resize( vsize, nullNode ); - loadedNodes.insert( nVec[ 0 ] = node ); - } - if ( theIJNodes.size() != hsize ) { - MESSAGE( "Wrong node positions on theBaseEdge" ); - return false; - } - - // load nodes from e1 - - map< double, const SMDS_MeshNode*> sortedNodes; // sort by param on edge - nIt = sm1->GetNodes(); - while ( nIt->more() ) - { - node = nIt->next(); - const SMDS_EdgePosition* pos = - dynamic_cast( node->GetPosition().get() ); - if ( !pos ) return false; - sortedNodes.insert( make_pair( pos->GetUParameter(), node )); - } - loadedNodes.insert( nVecf[ vsize - 1 ] = smVft->GetNodes()->next() ); - map< double, const SMDS_MeshNode*>::iterator u_n = sortedNodes.begin(); - int row = rev1 ? vsize - 1 : 0; - for ( ; u_n != sortedNodes.end(); u_n++ ) - { - if ( rev1 ) row--; - else row++; - loadedNodes.insert( nVecf[ row ] = u_n->second ); - } - - // try to load the rest nodes - - // get all faces from theFace - set allFaces, foundFaces; - SMDS_ElemIteratorPtr eIt = smFace->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* e = eIt->next(); - if ( e->GetType() == SMDSAbs_Face ) - allFaces.insert( e ); - } - // Starting from 2 neighbour nodes on theBaseEdge, look for a face - // the nodes belong to, and between the nodes of the found face, - // look for a not loaded node considering this node to be the next - // in a column of the starting second node. Repeat, starting - // from nodes next to the previous starting nodes in their columns, - // and so on while a face can be found. Then go the the next pair - // of nodes on theBaseEdge. - StdMeshers_IJNodeMap::iterator par_nVec_1 = theIJNodes.begin(); - StdMeshers_IJNodeMap::iterator par_nVec_2 = par_nVec_1; - // loop on columns - int col = 0; - for ( par_nVec_2++; par_nVec_2 != theIJNodes.end(); par_nVec_1++, par_nVec_2++ ) - { - col++; - row = 0; - const SMDS_MeshNode* n1 = par_nVec_1->second[ row ]; - const SMDS_MeshNode* n2 = par_nVec_2->second[ row ]; - const SMDS_MeshElement* face = 0; - do { - // look for a face by 2 nodes - face = SMESH_MeshEditor::FindFaceInSet( n1, n2, allFaces, foundFaces ); - if ( face ) - { - int nbFaceNodes = face->NbNodes(); - if ( nbFaceNodes > 4 ) { - MESSAGE(" Too many nodes in a face: " << nbFaceNodes ); - return false; - } - // look for a not loaded node of the - bool found = false; - const SMDS_MeshNode* n3 = 0; // a node defferent from n1 and n2 - eIt = face->nodesIterator() ; - while ( !found && eIt->more() ) { - node = static_cast( eIt->next() ); - found = loadedNodes.insert( node ).second; - if ( !found && node != n1 && node != n2 ) - n3 = node; - } - if ( found ) { - if ( ++row > vsize - 1 ) { - MESSAGE( "Too many nodes in column "<< col <<": "<< row+1); - return false; - } - par_nVec_2->second[ row ] = node; - foundFaces.insert( face ); - n2 = node; - if ( nbFaceNodes == 4 ) - n1 = par_nVec_1->second[ row ]; - } - else if (nbFaceNodes == 3 && - n3 == par_nVec_1->second[ row ] ) - n1 = n3; - else { - MESSAGE( "Not quad mesh, column "<< col ); - return false; - } - } - } while ( face && n1 && n2 ); - - if ( row < vsize - 1 ) { - MESSAGE( "Too few nodes in column "<< col <<": "<< row+1); - MESSAGE( "Base node 1: "<< par_nVec_1->second[0]); - MESSAGE( "Base node 2: "<< par_nVec_2->second[0]); - MESSAGE( "Current node 1: "<< n1); - MESSAGE( "Current node 2: "<< n2); - MESSAGE( "first base node: "<< theIJNodes.begin()->second[0]); - MESSAGE( "last base node: "<< theIJNodes.rbegin()->second[0]); - return false; - } - } // loop on columns - - return true; -} - -////////////////////////////////////////////////////////////////////////// -// -// StdMeshers_SMESHBlock -// -////////////////////////////////////////////////////////////////////////// - -//======================================================================= -//function : StdMeshers_SMESHBlock -//purpose : -//======================================================================= -StdMeshers_SMESHBlock::StdMeshers_SMESHBlock() -{ - myErrorStatus=1; - myIsEdgeForward.resize( SMESH_Block::NbEdges(), -1 ); -} - -//======================================================================= -//function : IsForwadEdge -//purpose : -//======================================================================= - -bool StdMeshers_SMESHBlock::IsForwadEdge(const int theEdgeID) -{ - int index = myTBlock.ShapeIndex( theEdgeID ); - if ( !myTBlock.IsEdgeID( theEdgeID )) - return false; - - if ( myIsEdgeForward[ index ] < 0 ) - myIsEdgeForward[ index ] = - myTBlock.IsForwardEdge( TopoDS::Edge( Shape( theEdgeID )), myShapeIDMap ); - - return myIsEdgeForward[ index ]; -} - -//======================================================================= -//function : ErrorStatus -//purpose : -//======================================================================= -int StdMeshers_SMESHBlock::ErrorStatus() const -{ - return myErrorStatus; -} -//======================================================================= -//function : Load -//purpose : -//======================================================================= -void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell) -{ - - TopoDS_Vertex aV000, aV001; - // - Load(theShell, aV000, aV001); -} -//======================================================================= -//function : Load -//purpose : -//======================================================================= -void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell, - const TopoDS_Vertex& theV000, - const TopoDS_Vertex& theV001) -{ - myErrorStatus=0; - // - myShell=theShell; - // - bool bOk; - // - myShapeIDMap.Clear(); - bOk=myTBlock.LoadBlockShapes(myShell, theV000, theV001, myShapeIDMap); - if (!bOk) { - myErrorStatus=2; - return; - } -} -//======================================================================= -//function : ComputeParameters -//purpose : -//======================================================================= -void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt, - gp_XYZ& theXYZ) -{ - ComputeParameters(thePnt, myShell, theXYZ); -} -//======================================================================= -//function : ComputeParameters -//purpose : -//======================================================================= -void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt, - const TopoDS_Shape& theShape, - gp_XYZ& theXYZ) -{ - myErrorStatus=0; - // - int aID; - bool bOk; - // - aID=ShapeID(theShape); - if (myErrorStatus) { - return; - } - bOk=myTBlock.ComputeParameters(thePnt, theXYZ, aID); - if (!bOk) { - myErrorStatus=4; // problems with computation Parameters - return; - } -} - -//======================================================================= -//function : ComputeParameters -//purpose : -//======================================================================= - -void StdMeshers_SMESHBlock::ComputeParameters(const double& theU, - const TopoDS_Shape& theShape, - gp_XYZ& theXYZ) -{ - myErrorStatus=0; - // - int aID; - bool bOk=false; - // - aID=ShapeID(theShape); - if (myErrorStatus) { - return; - } - if ( SMESH_Block::IsEdgeID( aID )) - bOk=myTBlock.EdgeParameters( aID, theU, theXYZ ); - if (!bOk) { - myErrorStatus=4; // problems with computation Parameters - return; - } -} - -//======================================================================= -//function : Point -//purpose : -//======================================================================= - void StdMeshers_SMESHBlock::Point(const gp_XYZ& theParams, - gp_Pnt& aP3D) -{ - TopoDS_Shape aS; - // - Point(theParams, aS, aP3D); -} -//======================================================================= -//function : Point -//purpose : -//======================================================================= - void StdMeshers_SMESHBlock::Point(const gp_XYZ& theParams, - const TopoDS_Shape& theShape, - gp_Pnt& aP3D) -{ - myErrorStatus=0; - // - int aID; - bool bOk=false; - gp_XYZ aXYZ(99.,99.,99.); - aP3D.SetXYZ(aXYZ); - // - if (theShape.IsNull()) { - bOk=myTBlock.ShellPoint(theParams, aXYZ); - } - // - else { - aID=ShapeID(theShape); - if (myErrorStatus) { - return; - } - // - if (SMESH_Block::IsVertexID(aID)) { - bOk=myTBlock.VertexPoint(aID, aXYZ); - } - else if (SMESH_Block::IsEdgeID(aID)) { - bOk=myTBlock.EdgePoint(aID, theParams, aXYZ); - } - // - else if (SMESH_Block::IsFaceID(aID)) { - bOk=myTBlock.FacePoint(aID, theParams, aXYZ); - } - } - if (!bOk) { - myErrorStatus=4; // problems with point computation - return; - } - aP3D.SetXYZ(aXYZ); -} -//======================================================================= -//function : ShapeID -//purpose : -//======================================================================= -int StdMeshers_SMESHBlock::ShapeID(const TopoDS_Shape& theShape) -{ - myErrorStatus=0; - // - int aID=-1; - TopoDS_Shape aSF, aSR; - // - aSF=theShape; - aSF.Orientation(TopAbs_FORWARD); - aSR=theShape; - aSR.Orientation(TopAbs_REVERSED); - // - if (myShapeIDMap.Contains(aSF)) { - aID=myShapeIDMap.FindIndex(aSF); - return aID; - } - if (myShapeIDMap.Contains(aSR)) { - aID=myShapeIDMap.FindIndex(aSR); - return aID; - } - myErrorStatus=2; // unknown shape; - return aID; -} -//======================================================================= -//function : Shape -//purpose : -//======================================================================= -const TopoDS_Shape& StdMeshers_SMESHBlock::Shape(const int theID) -{ - myErrorStatus=0; - // - int aNb; - // - aNb=myShapeIDMap.Extent(); - if (theID<1 || theID>aNb) { - myErrorStatus=3; // ID is out of range - return myEmptyShape; - } - // - const TopoDS_Shape& aS=myShapeIDMap.FindKey(theID); - return aS; -} diff --git a/src/StdMeshers/StdMeshers_Penta_3D.hxx b/src/StdMeshers/StdMeshers_Penta_3D.hxx deleted file mode 100644 index dc8ba72cf..000000000 --- a/src/StdMeshers/StdMeshers_Penta_3D.hxx +++ /dev/null @@ -1,256 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_Penta_3D.hxx -// Module : SMESH - -#ifndef StdMeshers_Penta_3D_HeaderFile -#define StdMeshers_Penta_3D_HeaderFile - -#include - -//////////////////////////////////////////////////////////////////////// -// -// class StdMeshers_SMESHBlock -// -//////////////////////////////////////////////////////////////////////// -#include -#include -#include -#include -#include - -#include "SMESH_Block.hxx" - -typedef std::map< double, std::vector > StdMeshers_IJNodeMap; - -class StdMeshers_SMESHBlock { - -public: - // - StdMeshers_SMESHBlock(); - - void Load (const TopoDS_Shell& theShell); - - void Load (const TopoDS_Shell& theShell, - const TopoDS_Vertex& theV000, - const TopoDS_Vertex& theV001); - - void ComputeParameters(const gp_Pnt& thePnt, - gp_XYZ& theXYZ); - - void ComputeParameters(const gp_Pnt& thePnt, - const TopoDS_Shape& theShape, - gp_XYZ& theXYZ); - - void ComputeParameters(const double& theU, - const TopoDS_Shape& theShape, - gp_XYZ& theXYZ); - - void Point(const gp_XYZ& theParams, - gp_Pnt& thePnt); - - void Point(const gp_XYZ& theParams, - const TopoDS_Shape& theShape, - gp_Pnt& thePnt); - - int ShapeID(const TopoDS_Shape& theShape); - - const TopoDS_Shape& Shape(const int theID); - - SMESH_Block & Block() { return myTBlock; } - - bool IsForwadEdge(const int theEdgeID); - - int ErrorStatus() const; - - -protected: - TopoDS_Shell myShell; - TopTools_IndexedMapOfOrientedShape myShapeIDMap; - SMESH_Block myTBlock; - TopoDS_Shape myEmptyShape; - vector myIsEdgeForward; - // - int myErrorStatus; -}; - -//////////////////////////////////////////////////////////////////////// -// -// class StdMeshers_TNode -// -//////////////////////////////////////////////////////////////////////// -#include "SMDS_MeshNode.hxx" - -class StdMeshers_TNode { - -public: - - StdMeshers_TNode(){ - myNode=NULL; - myXYZ.SetCoord(99., 99., 99.); - myShapeSupportID=-1; - myBaseNodeID=-1; - } - - void SetNode(const SMDS_MeshNode* theNode) { - myNode=(SMDS_MeshNode*) theNode; - } - - const SMDS_MeshNode* Node()const { - return myNode; - } - - void SetShapeSupportID (const int theID) { - myShapeSupportID=theID; - } - - int ShapeSupportID()const { - return myShapeSupportID; - } - - void SetNormCoord (const gp_XYZ& theXYZ) { - myXYZ=theXYZ; - } - - const gp_XYZ& NormCoord ()const{ - return myXYZ; - } - - void SetBaseNodeID (const int theID) { - myBaseNodeID=theID; - } - - int BaseNodeID ()const{ - return myBaseNodeID; - } - -private: - SMDS_MeshNode* myNode; - int myShapeSupportID; - gp_XYZ myXYZ; - int myBaseNodeID; -}; - -//////////////////////////////////////////////////////////////////////// -// -// class StdMeshers_Penta_3D -// -//////////////////////////////////////////////////////////////////////// -#include "SMESH_Mesh.hxx" -#include -// -class StdMeshers_Penta_3D { -// - public: // methods - StdMeshers_Penta_3D(); - - //~StdMeshers_Penta_3D(); - - bool Compute(SMESH_Mesh& , const TopoDS_Shape& ); - - int ErrorStatus() const { - return myErrorStatus; - } - - void SetTolerance(const double theTol3D) { - myTol3D=theTol3D; - } - - double Tolerance() const { - return myTol3D; - } - - static bool LoadIJNodes(StdMeshers_IJNodeMap & theIJNodes, - const TopoDS_Face& theFace, - const TopoDS_Edge& theBaseEdge, - SMESHDS_Mesh* theMesh); - // Load nodes bound to theFace into column (vectors) and rows - // of theIJNodes. - // The value of theIJNodes map is a vector of ordered nodes so - // that the 0-the one lies on theBaseEdge. - // The key of theIJNodes map is a normalized parameter of each - // 0-the node on theBaseEdge. - - - protected: // methods - - void CheckData(); - - void MakeBlock(); - - void MakeNodes(); - - double SetHorizEdgeXYZ(const gp_XYZ& aBNXYZ, - const int aFaceID, - vector*& aCol1, - vector*& aCol2); - - void ShapeSupportID(const bool theIsUpperLayer, - const SMESH_Block::TShapeID theBNSSID, - SMESH_Block::TShapeID& theSSID); - - void FindNodeOnShape(const TopoDS_Shape& aS, - const gp_XYZ& aParams, - const int z, - StdMeshers_TNode& aTN); - - void CreateNode(const bool theIsUpperLayer, - const gp_XYZ& aParams, - StdMeshers_TNode& aTN); - - void ClearMeshOnFxy1(); - - void MakeMeshOnFxy1(); - - void MakeConnectingMap(); - - int GetIndexOnLayer(const int aID); - - void MakeVolumeMesh(); - - void SetMesh(SMESH_Mesh& theMesh) { - myMesh=(void *)&theMesh; - } - - SMESH_Mesh* GetMesh()const { - return (SMESH_Mesh*)myMesh; - } - - protected: // fields - TopoDS_Shape myShape; - StdMeshers_SMESHBlock myBlock; - void * myMesh; - int myErrorStatus; - // - vector myTNodes; - int myISize; - int myJSize; - double myTol3D; // Tolerance value - std::map < int, int > myConnectingMap; - // - vector myWallNodesMaps; // nodes on a face - vector myShapeXYZ; // point on each sub-shape -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_Propagation.cxx b/src/StdMeshers/StdMeshers_Propagation.cxx deleted file mode 100644 index f314b4c28..000000000 --- a/src/StdMeshers/StdMeshers_Propagation.cxx +++ /dev/null @@ -1,102 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Propagation.cxx -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Propagation.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= -StdMeshers_Propagation::StdMeshers_Propagation (int hypId, int studyId, - SMESH_Gen * gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _name = GetName(); - _param_algo_dim = -2; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -StdMeshers_Propagation::~StdMeshers_Propagation() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_Propagation::SaveTo (ostream & save) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -istream & StdMeshers_Propagation::LoadFrom (istream & load) -{ - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -ostream & operator << (ostream & save, StdMeshers_Propagation & hyp) -{ - return hyp.SaveTo(save); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -istream & operator >> (istream & load, StdMeshers_Propagation & hyp) -{ - return hyp.LoadFrom(load); -} - -//============================================================================= -/*! - * GetName - */ -//============================================================================= -std::string StdMeshers_Propagation::GetName () -{ - return "Propagation"; -} diff --git a/src/StdMeshers/StdMeshers_Propagation.hxx b/src/StdMeshers/StdMeshers_Propagation.hxx deleted file mode 100644 index 4ee7c5628..000000000 --- a/src/StdMeshers/StdMeshers_Propagation.hxx +++ /dev/null @@ -1,47 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Propagation.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESH_PROPAGATION_HXX_ -#define _SMESH_PROPAGATION_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_Propagation:public SMESH_Hypothesis -{ - public: - StdMeshers_Propagation(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_Propagation(); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_Propagation & hyp); - friend istream & operator >>(istream & load, StdMeshers_Propagation & hyp); - - static std::string GetName (); -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_StartEndLength.cxx b/src/StdMeshers/StdMeshers_StartEndLength.cxx deleted file mode 100644 index 1d7016206..000000000 --- a/src/StdMeshers/StdMeshers_StartEndLength.cxx +++ /dev/null @@ -1,143 +0,0 @@ -// SMESH StdMeshers_StartEndLength : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_StartEndLength.cxx -// Module : SMESH -// $Header$ - -using namespace std; - -#include "StdMeshers_StartEndLength.hxx" -#include "utilities.h" - - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_StartEndLength::StdMeshers_StartEndLength(int hypId, - int studyId, - SMESH_Gen * gen) - :SMESH_Hypothesis(hypId, studyId, gen) -{ - _begLength = 1.; - _endLength = 1.; - _name = "StartEndLength"; - _param_algo_dim = 1; // is used by SMESH_Regular_1D -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_StartEndLength::~StdMeshers_StartEndLength() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_StartEndLength::SetLength(double length, bool isStartLength) - throw(SALOME_Exception) -{ - if ( (isStartLength ? _begLength : _endLength) != length ) { - if (length <= 0) - throw SALOME_Exception(LOCALIZED("length must be positive")); - if ( isStartLength ) - _begLength = length; - else - _endLength = length; - - NotifySubMeshesHypothesisModification(); - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_StartEndLength::GetLength(bool isStartLength) const -{ - return isStartLength ? _begLength : _endLength; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_StartEndLength::SaveTo(ostream & save) -{ - save << _begLength << " " <<_endLength; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_StartEndLength::LoadFrom(istream & load) -{ - bool isOK = true; - isOK = (load >> _begLength); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - isOK = (load >> _endLength); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_StartEndLength & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_StartEndLength & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_StartEndLength.hxx b/src/StdMeshers/StdMeshers_StartEndLength.hxx deleted file mode 100644 index 05bd2e0bb..000000000 --- a/src/StdMeshers/StdMeshers_StartEndLength.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// 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 : StdMeshers_StartEndLength.hxx -// Module : SMESH -// $Header$ - -#ifndef _STDMESHERS_STARTENDLENGTH_HXX_ -#define _STDMESHERS_STARTENDLENGTH_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_StartEndLength:public SMESH_Hypothesis -{ - public: - StdMeshers_StartEndLength(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_StartEndLength(); - - void SetLength(double length, bool isStartLength) throw(SALOME_Exception); - - double GetLength(bool isStartLength) const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_StartEndLength & hyp); - friend istream & operator >>(istream & load, StdMeshers_StartEndLength & hyp); - - protected: - double _begLength, _endLength; -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx b/src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx deleted file mode 100644 index 090f0a7d2..000000000 --- a/src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx +++ /dev/null @@ -1,66 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_Arithmetic1D_i.hxx -// Author : Damien COQUERET, OCC -// Module : SMESH -// $Header$ - -#ifndef _SMESH_ARITHMETIC1D_I_HXX_ -#define _SMESH_ARITHMETIC1D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_Arithmetic1D.hxx" - -// ====================================================== -// Arithmetic 1D hypothesis -// ====================================================== -class StdMeshers_Arithmetic1D_i: - public virtual POA_StdMeshers::StdMeshers_Arithmetic1D, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_Arithmetic1D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_Arithmetic1D_i(); - - // Set length - void SetLength( CORBA::Double theLength, CORBA::Boolean theIsStart ) - throw ( SALOME::SALOME_Exception ); - // Get length - CORBA::Double GetLength(CORBA::Boolean theIsStart); - - // Get implementation - ::StdMeshers_Arithmetic1D* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx b/src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx deleted file mode 100644 index 138b1d9cf..000000000 --- a/src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx +++ /dev/null @@ -1,70 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_Deflection1D_i.hxx -// Moved here from SMESH_LocalLength_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_Deflection1D_I_HXX_ -#define _SMESH_Deflection1D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_Deflection1D.hxx" - -class SMESH_Gen; - -// ====================================================== -// Local Length hypothesis -// ====================================================== -class StdMeshers_Deflection1D_i: - public virtual POA_StdMeshers::StdMeshers_Deflection1D, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_Deflection1D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_Deflection1D_i(); - - // Set deflection - void SetDeflection( CORBA::Double theLength ) - throw ( SALOME::SALOME_Exception ); - // Get deflection - CORBA::Double GetDeflection(); - - // Get implementation - ::StdMeshers_Deflection1D* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif - diff --git a/src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx b/src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx deleted file mode 100644 index 0ca4839ba..000000000 --- a/src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx +++ /dev/null @@ -1,84 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_Hexa_3D_i.cxx -// Moved here from SMESH_Hexa_3D_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Hexa_3D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_3D_Algo_i( thePOA ) -{ - MESSAGE( "StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i" ); - myBaseImpl = new ::StdMeshers_Hexa_3D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i - * - * Destructor - */ -//============================================================================= - -StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i() -{ - MESSAGE( "StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i" ); -} - -//============================================================================= -/*! - * StdMeshers_Hexa_3D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_Hexa_3D* StdMeshers_Hexa_3D_i::GetImpl() -{ - MESSAGE( "StdMeshers_Hexa_3D_i::GetImpl" ); - return ( ::StdMeshers_Hexa_3D* )myBaseImpl; -} diff --git a/src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx b/src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx deleted file mode 100644 index 91bcabdb8..000000000 --- a/src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_Hexa_3D_i.hxx -// Moved here from SMESH_Hexa_3D_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_HEXA_3D_I_HXX_ -#define _SMESH_HEXA_3D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_3D_Algo_i.hxx" -#include "StdMeshers_Hexa_3D.hxx" - -class SMESH_Gen; - -// ====================================================== -// Hexaedron 3d algorithm -// ====================================================== -class StdMeshers_Hexa_3D_i: - public virtual POA_StdMeshers::StdMeshers_Hexa_3D, - public virtual SMESH_3D_Algo_i -{ -public: - // Constructor - StdMeshers_Hexa_3D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - - // Destructor - virtual ~StdMeshers_Hexa_3D_i(); - - // Get implementation - ::StdMeshers_Hexa_3D* GetImpl(); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx b/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx deleted file mode 100644 index 35d871c56..000000000 --- a/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx +++ /dev/null @@ -1,135 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_LengthFromEdges_i.cxx -// Moved here from SMESH_LengthFromEdges_i.cxx -// Author : Nadir BOUHAMOU CEA/DEN, Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_LengthFromEdges_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ) -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i" ); - myBaseImpl = new ::StdMeshers_LengthFromEdges( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i - * - * Destructor - */ -//============================================================================= - -StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i() -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i" ); -} - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::SetMode - * - * Set mode - */ -//============================================================================= - -void StdMeshers_LengthFromEdges_i::SetMode( CORBA::Long theMode ) - throw (SALOME::SALOME_Exception) -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::SetMode" ); - ASSERT( myBaseImpl ); - try { - this->GetImpl()->SetMode( theMode ); - } - catch ( SALOME_Exception& S_ex ) { - THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), - SALOME::BAD_PARAM ); - } -} - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::GetMode - * - * Get mode - */ -//============================================================================= - -CORBA::Long StdMeshers_LengthFromEdges_i::GetMode() -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::GetMode" ); - ASSERT( myBaseImpl ); - return this->GetImpl()->GetMode(); -} - - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_LengthFromEdges* StdMeshers_LengthFromEdges_i::GetImpl() -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::GetImpl" ); - return ( ::StdMeshers_LengthFromEdges* )myBaseImpl; -} - -//================================================================================ -/*! - * \brief Verify whether hypothesis supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean StdMeshers_LengthFromEdges_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_2D; -} - diff --git a/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx b/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx deleted file mode 100644 index 1075278d7..000000000 --- a/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx +++ /dev/null @@ -1,68 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_LengthFromEdges_i.hxx -// Moved here from SMESH_LengthFromEdges_i.hxx -// Author : Nadir BOUHAMOU CEA/DEN, Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_LENGTHFROMEDGES_I_HXX_ -#define _SMESH_LENGTHFROMEDGES_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_LengthFromEdges.hxx" - -// ====================================================== -// Length from edges hypothesis -// ====================================================== -class StdMeshers_LengthFromEdges_i: - public virtual POA_StdMeshers::StdMeshers_LengthFromEdges, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_LengthFromEdges_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_LengthFromEdges_i(); - - // Set mode - void SetMode( CORBA::Long theMode ) - throw ( SALOME::SALOME_Exception ); - // Get mode - CORBA::Long GetMode(); - - // Get implementation - ::StdMeshers_LengthFromEdges* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif - diff --git a/src/StdMeshers_I/StdMeshers_LocalLength_i.hxx b/src/StdMeshers_I/StdMeshers_LocalLength_i.hxx deleted file mode 100644 index f0b6b21e6..000000000 --- a/src/StdMeshers_I/StdMeshers_LocalLength_i.hxx +++ /dev/null @@ -1,70 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_LocalLength_i.hxx -// Moved here from SMESH_LocalLength_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_LOCALLENGTH_I_HXX_ -#define _SMESH_LOCALLENGTH_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_LocalLength.hxx" - -class SMESH_Gen; - -// ====================================================== -// Local Length hypothesis -// ====================================================== -class StdMeshers_LocalLength_i: - public virtual POA_StdMeshers::StdMeshers_LocalLength, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_LocalLength_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_LocalLength_i(); - - // Set length - void SetLength( CORBA::Double theLength ) - throw ( SALOME::SALOME_Exception ); - // Get length - CORBA::Double GetLength(); - - // Get implementation - ::StdMeshers_LocalLength* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif - diff --git a/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx b/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx deleted file mode 100644 index efcc37c5c..000000000 --- a/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_MEFISTO_2D_i.cxx -// Moved here from SMESH_MEFISTO_2D_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_MEFISTO_2D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_2D_Algo_i( thePOA ) -{ - MESSAGE( "StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i" ); - myBaseImpl = new ::StdMeshers_MEFISTO_2D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i - * - * Destructor - */ -//============================================================================= - -StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i() -{ - MESSAGE( "StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i" ); -} - -//============================================================================= -/*! - * StdMeshers_MEFISTO_2D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_MEFISTO_2D* StdMeshers_MEFISTO_2D_i::GetImpl() -{ - MESSAGE( "StdMeshers_MEFISTO_2D_i::GetImpl" ); - return ( ::StdMeshers_MEFISTO_2D* )myBaseImpl; -} - diff --git a/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx b/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx deleted file mode 100644 index d7021df8a..000000000 --- a/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_MEFISTO_2D_i.hxx -// Moved here from SMESH_MEFISTO_2D_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_MEFISTO_2D_I_HXX_ -#define _StdMeshers_MEFISTO_2D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_2D_Algo_i.hxx" -#include "StdMeshers_MEFISTO_2D.hxx" - -class SMESH_Gen; - -// ====================================================== -// Triangle (MEFISTO) 2d algorithm -// ====================================================== -class StdMeshers_MEFISTO_2D_i: - public virtual POA_StdMeshers::StdMeshers_MEFISTO_2D, - public virtual SMESH_2D_Algo_i -{ -public: - // Constructor - StdMeshers_MEFISTO_2D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - - // Destructor - virtual ~StdMeshers_MEFISTO_2D_i(); - - // Get implementation - ::StdMeshers_MEFISTO_2D* GetImpl(); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx b/src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx deleted file mode 100644 index 39dde7639..000000000 --- a/src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_MaxElementArea_i.hxx -// Moved here from SMESH_MaxElementArea_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MAXELEMENTAREA_I_HXX_ -#define _SMESH_MAXELEMENTAREA_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_MaxElementArea.hxx" - -// ====================================================== -// Maximum Element Area hypothesis -// ====================================================== -class StdMeshers_MaxElementArea_i: - public virtual POA_StdMeshers::StdMeshers_MaxElementArea, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_MaxElementArea_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_MaxElementArea_i(); - - // Set maximum element area - void SetMaxElementArea( CORBA::Double theArea ) - throw ( SALOME::SALOME_Exception ); - // Get maximum element area - CORBA::Double GetMaxElementArea(); - - // Get implementation - ::StdMeshers_MaxElementArea* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx b/src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx deleted file mode 100644 index 928fab59a..000000000 --- a/src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_MaxElementVolume_i.hxx -// Moved here from SMESH_MaxElementVolume_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MAXELEMENTVOLUME_I_HXX_ -#define _SMESH_MAXELEMENTVOLUME_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_MaxElementVolume.hxx" - -// ====================================================== -// Maximum Element Volume hypothesis -// ====================================================== -class StdMeshers_MaxElementVolume_i: - public virtual POA_StdMeshers::StdMeshers_MaxElementVolume, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_MaxElementVolume_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_MaxElementVolume_i(); - - // Set maximum element volume - void SetMaxElementVolume( CORBA::Double theVolume ) - throw (SALOME::SALOME_Exception); - // Get maximum element volume - CORBA::Double GetMaxElementVolume(); - - // Get implementation - ::StdMeshers_MaxElementVolume* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx b/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx deleted file mode 100644 index 8940cf7a7..000000000 --- a/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx +++ /dev/null @@ -1,81 +0,0 @@ -// SMESH StdMeshers_I : idl implementation based on 'SMESH' unit's classes -// -// 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 : StdMeshers_NotConformAllowed_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -using namespace std; -#include "StdMeshers_NotConformAllowed_i.hxx" -#include "SMESH_Gen.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * Constructor: - * _name is related to the class name: prefix = SMESH_ ; suffix = _i . - */ -//============================================================================= - -StdMeshers_NotConformAllowed_i::StdMeshers_NotConformAllowed_i - (PortableServer::POA_ptr thePOA, - int studyId, - ::SMESH_Gen* genImpl) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ) -{ - MESSAGE("StdMeshers_NotConformAllowed_i::StdMeshers_NotConformAllowed_i"); - myBaseImpl = new ::StdMeshers_NotConformAllowed(genImpl->GetANewId(), - studyId, - genImpl); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_NotConformAllowed_i::~StdMeshers_NotConformAllowed_i() -{ -} - -//================================================================================ -/*! - * \brief Verify whether hypothesis supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean StdMeshers_NotConformAllowed_i::IsDimSupported( SMESH::Dimension /*type*/ ) -{ - return true; -} - - - diff --git a/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx b/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx deleted file mode 100644 index ceddb3287..000000000 --- a/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH StdMeshers_I : idl implementation based on 'SMESH' unit's classes -// -// 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 : StdMeshers_NotConformAllowed_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_NotConformAllowed_I_HXX_ -#define _StdMeshers_NotConformAllowed_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" - -#include "StdMeshers_NotConformAllowed.hxx" - -class StdMeshers_NotConformAllowed_i: - public POA_StdMeshers::StdMeshers_NotConformAllowed, - public SMESH_Hypothesis_i -{ -public: - StdMeshers_NotConformAllowed_i(PortableServer::POA_ptr thePOA, - int studyId, - ::SMESH_Gen* genImpl); - virtual ~StdMeshers_NotConformAllowed_i(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); - -protected: - ::StdMeshers_NotConformAllowed* _impl; -}; - -#endif - diff --git a/src/StdMeshers_I/StdMeshers_Propagation_i.cxx b/src/StdMeshers_I/StdMeshers_Propagation_i.cxx deleted file mode 100644 index 4e038748c..000000000 --- a/src/StdMeshers_I/StdMeshers_Propagation_i.cxx +++ /dev/null @@ -1,91 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Propagation_i.cxx -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Propagation_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_Propagation_i::StdMeshers_Propagation_i - * - * Constructor - */ -//============================================================================= -StdMeshers_Propagation_i::StdMeshers_Propagation_i (PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ) -{ - MESSAGE( "StdMeshers_Propagation_i::StdMeshers_Propagation_i" ); - myBaseImpl = new ::StdMeshers_Propagation(theGenImpl->GetANewId(), - theStudyId, - theGenImpl); -} - -//============================================================================= -/*! - * StdMeshers_Propagation_i::~StdMeshers_Propagation_i - * - * Destructor - */ -//============================================================================= -StdMeshers_Propagation_i::~StdMeshers_Propagation_i() -{ - MESSAGE( "StdMeshers_Propagation_i::~StdMeshers_Propagation_i" ); -} - -//============================================================================= -/*! - * StdMeshers_Propagation_i::GetImpl - * - * Get implementation - */ -//============================================================================= -::StdMeshers_Propagation* StdMeshers_Propagation_i::GetImpl() -{ - MESSAGE( "StdMeshers_Propagation_i::GetImpl" ); - return ( ::StdMeshers_Propagation* )myBaseImpl; -} - -//================================================================================ -/*! - * \brief Verify whether hypothesis supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean StdMeshers_Propagation_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_1D; -} - diff --git a/src/StdMeshers_I/StdMeshers_Propagation_i.hxx b/src/StdMeshers_I/StdMeshers_Propagation_i.hxx deleted file mode 100644 index ca130bc2f..000000000 --- a/src/StdMeshers_I/StdMeshers_Propagation_i.hxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 CEA -// -// 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.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Propagation_i.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESH_PROPAGATION_I_HXX_ -#define _SMESH_PROPAGATION_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_Propagation.hxx" - -class SMESH_Gen; - -// ====================================================== -// Propagation hypothesis -// ====================================================== -class StdMeshers_Propagation_i: - public virtual POA_StdMeshers::StdMeshers_Propagation, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_Propagation_i (PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl); - // Destructor - virtual ~StdMeshers_Propagation_i(); - - // Get implementation - ::StdMeshers_Propagation* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx b/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx deleted file mode 100644 index 059eac91f..000000000 --- a/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx +++ /dev/null @@ -1,86 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_Quadrangle_2D_i.cxx -// Moved here from SMESH_Quadrangle_2D_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Quadrangle_2D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_2D_Algo_i( thePOA ) -{ - MESSAGE( "StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i" ); - myBaseImpl = new ::StdMeshers_Quadrangle_2D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i - * - * Destructor - * - */ -//============================================================================= - -StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i() -{ - MESSAGE( "StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i" ); -} - -//============================================================================= -/*! - * StdMeshers_Quadrangle_2D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_Quadrangle_2D* StdMeshers_Quadrangle_2D_i::GetImpl() -{ - MESSAGE( "StdMeshers_Quadrangle_2D_i::GetImpl" ); - return ( ::StdMeshers_Quadrangle_2D* )myBaseImpl; -} - diff --git a/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx b/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx deleted file mode 100644 index a8c1e281f..000000000 --- a/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_Quadrangle_2D_i.hxx -// Moved here from SMESH_Quadrangle_2D_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_QUADRANGLE_2D_I_HXX_ -#define _SMESH_QUADRANGLE_2D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_2D_Algo_i.hxx" -#include "StdMeshers_Quadrangle_2D.hxx" - -class SMESH_Gen; - -// ====================================================== -// Quadrangle (Mapping) 2d algorithm -// ====================================================== -class StdMeshers_Quadrangle_2D_i: - public virtual POA_StdMeshers::StdMeshers_Quadrangle_2D, - public virtual SMESH_2D_Algo_i -{ -public: - // Constructor - StdMeshers_Quadrangle_2D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - - // Destructor - virtual ~StdMeshers_Quadrangle_2D_i(); - - // Get implementation - ::StdMeshers_Quadrangle_2D* GetImpl(); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx b/src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx deleted file mode 100644 index 24f322c58..000000000 --- a/src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_Regular_1D_i.cxx -// Moved here from SMESH_Regular_1D_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Regular_1D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_1D_Algo_i( thePOA ) -{ - MESSAGE( "StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i" ); - myBaseImpl = new ::StdMeshers_Regular_1D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i - * - * Destructor - */ -//============================================================================= - -StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i() -{ - MESSAGE( "StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i" ); -} - -//============================================================================= -/*! - * StdMeshers_Regular_1D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_Regular_1D* StdMeshers_Regular_1D_i::GetImpl() -{ - MESSAGE( "StdMeshers_Regular_1D_i::GetImpl" ); - return ( ::StdMeshers_Regular_1D* )myBaseImpl; -} - diff --git a/src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx b/src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx deleted file mode 100644 index 3231532fd..000000000 --- a/src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx +++ /dev/null @@ -1,58 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_Regular_1D_i.hxx -// Moved here from SMESH_Regular_1D_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_REGULAR_1D_I_HXX_ -#define _SMESH_REGULAR_1D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_1D_Algo_i.hxx" -#include "StdMeshers_Regular_1D.hxx" - -// ====================================================== -// Wire Discretization 1d algorithm -// ====================================================== -class StdMeshers_Regular_1D_i: - public virtual POA_StdMeshers::StdMeshers_Regular_1D, - public virtual SMESH_1D_Algo_i -{ -public: - // Constructor - StdMeshers_Regular_1D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_Regular_1D_i(); - - // Get implementation - ::StdMeshers_Regular_1D* GetImpl(); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx b/src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx deleted file mode 100644 index d937f9390..000000000 --- a/src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx +++ /dev/null @@ -1,70 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// 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 : StdMeshers_StartEndLength_i.hxx -// Moved here from SMESH_LocalLength_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_StartEndLength_I_HXX_ -#define _SMESH_StartEndLength_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_StartEndLength.hxx" - -class SMESH_Gen; - -// ====================================================== -// Local Length hypothesis -// ====================================================== -class StdMeshers_StartEndLength_i: - public virtual POA_StdMeshers::StdMeshers_StartEndLength, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_StartEndLength_i(PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_StartEndLength_i(); - - // Set length - void SetLength( CORBA::Double theLength, CORBA::Boolean theIsStart ) - throw ( SALOME::SALOME_Exception ); - // Get length - CORBA::Double GetLength(CORBA::Boolean theIsStart); - - // Get implementation - ::StdMeshers_StartEndLength* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif -